サーバレス練習帳

着眼大局着手小局

python音量検知

◆注意
この投稿のスクリプトはpython3.6で動かすこと。
pyaudioがpython3.6と相性が良い模様。(というか、python3.7と相性が悪い模様。)

◆このスクリプトを参考にします。
qiita.com


◆まずは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にしても音量を検知できています。良いね。