Python

Pythonで音を監視して一定以上の音量を録音する

More than 1 year has passed since last update.


はじめに

「音をテーマに機械学習の題材を調査する」という宿題を頂いたことから、一定のルールで継続的に音を収集する方法を検討したのでメモします。

ちなみに、環境設定などは以下の記事をご参照下さい。

Pythonで音を録音して可視化する


閾値を超えたら2秒間録音

以下のスクリプトを作成する。


record2sec.py

#!/usr/bin/env python

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.01

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)
x = np.frombuffer(data, dtype="int16") / 32768.0
if x.max() > threshold:
filename = datetime.today().strftime("%Y%m%d%H%M%S") + ".wav"
print(cnt, filename)

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
if cnt > 5:
break

stream.close()
p.terminate()



動作確認と閾値調整

以下のコマンドを実行すると、閾値以上の音量の音が鳴ると自動的に発生日時をファイル名としたWAVファイルが出力されます。

chmod a+x record2sec.py

./record2sec.py

検出したい音量が検出できるよう閾値(threshold)を調整。


データ収集

調整ができたら以下のとおりスクリプトを変更。

    #    cnt += 1

#if cnt > 5:
# break

コメントアウト後、以下のコマンドを実行すると継続的に音を収集し、WAVファイルを生成します。

./record2sec.py &

できた!

これをRaspberry PIなどを使って自動的に実行させれば、音が収集できて機械学習に利用できるかも...(続く)