質問編集履歴

1

変更

2023/03/26 18:52

投稿

hunburger1
hunburger1

スコア3

test CHANGED
File without changes
test CHANGED
@@ -12,100 +12,6 @@
12
12
  停止ボタンを押したらフラグをfalseに変更して音量測定を停止させたいのですが、処理が止まらなくて困っています。
13
13
  停止ボタンを押して止めるとしたらどのようにすればよろしいのでしょうか。
14
14
 
15
- ### 該当のソースコード
16
-
17
- ```ここに言語名を入力
18
- import pyaudio
19
- import numpy as np
20
- import sys
21
- import time
22
- import tkinter as tk
23
- import tkinter.ttk as ttk
24
- import tkinter.scrolledtext as tkst
25
-
26
- class MainApp(tk.Tk):
27
- def __init__(self):
28
- super(MainApp, self).__init__()
29
-
30
- p = pyaudio.PyAudio()
31
-
32
- # set prams
33
- INPUT_DEVICE_INDEX = 1
34
- CHUNK = 128
35
- FORMAT = pyaudio.paInt16
36
- CHANNELS = int(p.get_device_info_by_index(INPUT_DEVICE_INDEX)["maxInputChannels"])
37
- SAMPLING_RATE = int(p.get_device_info_by_index(INPUT_DEVICE_INDEX)["defaultSampleRate"])
38
- RECORD_SECONDS = 1
39
- RECORDING = False
40
-
41
- self.title("騒音測定")
42
-
43
-
44
- # 測定開始ボタン押下時処理
45
- def StartBtnClicked():
46
- RECORDING = True
47
- RecordValume()
48
-
49
-
50
-
51
- # 測定終了ボタン押下時処理
52
- def StopBtnClicked():
53
- if RECORDING is True:
54
- RECORDING = False
55
-
56
-
57
- # ボタンの配置
58
- self.start_btn = ttk.Button(self, text="開始", command = StartBtnClicked, )
59
- self.stop_btn = ttk.Button(self, text="終了", command = StopBtnClicked, )
60
-
61
- self.start_btn.grid(row=0, column=2, sticky=tk.W, padx=15, pady=10, ipady=10)
62
- self.stop_btn.grid(row=0, column=4, sticky=tk.N, padx=15, pady=10, ipady=10)
63
-
64
-
65
- # amp to db
66
- def to_db(x, base=1):
67
- y=20*np.log10(x/base)
68
- return y
69
-
70
- # record audio valume
71
- def RecordValume():
72
- while self.AudioRecording is True:
73
- start = time.time()
74
-
75
- stream = p.open(format = FORMAT,
76
- channels = CHANNELS,
77
- rate = SAMPLING_RATE,
78
- input = True,
79
- frames_per_buffer = CHUNK,
80
- input_device_index = INPUT_DEVICE_INDEX
81
- )
82
-
83
- # get specified range of data. size of data equals (CHUNK * (SAMPLING_RATE / CHUNK) * RECORD_SECONDS)
84
- data = np.empty(0)
85
- for i in range(0, int(SAMPLING_RATE / CHUNK * RECORD_SECONDS)):
86
- elm = stream.read(CHUNK, exception_on_overflow = False)
87
- elm = np.frombuffer(elm, dtype="int16")/float((np.power(2,16)/2)-1)
88
- data = np.hstack([data, elm])
89
- # calc RMS
90
- rms = np.sqrt(np.mean([elm * elm for elm in data]))
91
- # RMS to db
92
- db = to_db(rms, 20e-6)
93
- stream.close()
94
-
95
- elapsed_time = time.time() - start
96
- print("elapsed_time:{:.3f}[sec], DB:{:.3f}[db]".format(elapsed_time, db))
97
-
98
-
99
-
100
-
101
-
102
- # イベント監視開始処理
103
- def start(self):
104
- self.mainloop()
105
-
106
- if __name__ == "__main__":
107
- app = MainApp()
108
- app.start()
109
15
 
110
16
  ```
111
17