質問編集履歴
1
変更
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
|
|