◆注意
この投稿のスクリプトはpython3.6で動かすこと。
pyaudioがpython3.6と相性が良い模様。(というか、python3.7と相性が悪い模様。)
◆まずはpyaudioのインストールなのですが、次の記事(2019年5月時点)によると
python3.6でないと、上手くインストールできないらしいです。
watlab-blog.com
◆ということで、python3.6で環境を作ってpyaudioをインストールしてみます。
C:\python>py -3.6 -m venv espo36 C:\python>cd espo36 C:\python\espo36>Scripts\activate (espo36) C:\python\espo36>mkdir src (espo36) C:\python\espo36>cd src (espo36) C:\python\espo36\src>mkdir zd (espo36) C:\python\espo36\src>cd zd (espo36) C:\python\espo36\src\zd> (espo36) C:\python\espo36\src\zd>pip install pyaudio Collecting pyaudio Downloading https://files.pythonhosted.org/packages/ff/4f/d8e286d94e51e4c8eb18cf41caec6ac354698056894192e51f3343b6beac/PyAudio-0.2.11-cp36-cp36m-win_amd64.whl (52kB) 100% |████████████████████████████████| 61kB 2.5MB/s Installing collected packages: pyaudio Successfully installed pyaudio-0.2.11
・・・うまくインストールできましたね!
◆numpy
numpyも必要みたいで、以前はwindowsへのインストールが難しい印象でしたが、今は簡単みたいです。
gammasoft.jp
(espo36) C:\python\espo36\src\zd>py -m pip install numpy Collecting numpy Downloading https://files.pythonhosted.org/packages/33/26/c448c5203823d744b7e71b81c2b6dcbcd4bff972897ce989b437ee836b2b/numpy-1.19.4-cp36-cp36m-win_amd64.whl (12.9MB) 100% |████████████████████████████████| 12.9MB 3.2MB/s Installing collected packages: numpy Successfully installed numpy-1.19.4 You are using pip version 18.1, however version 20.3.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command. (espo36) C:\python\espo36\src\zd>python -m pip install --upgrade pip Collecting pip Downloading https://files.pythonhosted.org/packages/ab/11/2dc62c5263d9eb322f2f028f7b56cd9d096bb8988fcf82d65fa2e4057afe/pip-20.3.1-py2.py3-none-any.whl (1.5MB) 100% |████████████████████████████████| 1.5MB 9.3MB/s Installing collected packages: pip Found existing installation: pip 18.1 Uninstalling pip-18.1: Successfully uninstalled pip-18.1 Successfully installed pip-20.3.1 (espo36) C:\python\espo36\src\zd>pip freeze numpy==1.19.4 PyAudio==0.2.11
あとは、冒頭のスクリプトの引用ですが、
プログラム内の「x.max()」で0~1の間の数値で音量を取得できます。
とりあえず、threshold(スレッショルド)は0.5に設定しておくか。
audioTesting.py
import pyaudio import wave import numpy as np from datetime import datetime # 音データフォーマット chunk = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100 RECORD_SECONDS = 2 # 閾値 threshold = 0.50 # 音の取込開始 p = pyaudio.PyAudio() stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, frames_per_buffer = chunk ) cnt = 0 while True: # 音データの取得 data = stream.read(chunk) # ndarrayに変換 x = np.frombuffer(data, dtype="int16") / 32768.0 # 閾値以上の場合はファイルに保存 print(x.max()) if x.max() > threshold: filename = datetime.today().strftime("%Y%m%d%H%M%S") + ".wav" print(cnt, filename) # 2秒間の音データを取込 all = [] all.append(data) for i in range(0, int(RATE / chunk * int(RECORD_SECONDS))): data = stream.read(chunk) all.append(data) data = b''.join(all) # 音声ファイルとして出力 out = wave.open(filename,'w') out.setnchannels(CHANNELS) out.setsampwidth(2) out.setframerate(RATE) out.writeframes(data) out.close() print("Saved.") cnt += 1 # 5回検出したら終了 if cnt > 5: break stream.close() p.terminate()
コチラのスクリプトをそのまま参考にさせて頂きました。
qiita.com
◆実験
teamsなどのWeb会議システム利用中でも音量は検知可能か?
⇒ 検知可能でした。Web会議システムをmuteにしてもunmuteにしても音量を検知できています。良いね。