ゆるプロ!番外編「PyAudioで録音するときに応答(無音)を待つ判定」
ゆるいプログラミング講座、略して「ゆるプロ!」
これは気軽に気楽に試せるゆるーいプログラミング学習コンテンツである。今回のお題は「PyAudioで録音するときに応答(無音)を待つ判定」
一言)
以前、スピーキングのでデモを作ったのだが、任意のタイミングで語り掛け(音声の録音)を終了するにはどうしたらいいか考えたのだが始まり。結果的に無音が数秒続いたら話すことが完了したとみなすことにした。その実装を書く
例)PyAudioで録音するときに応答(無音)を待つ判定
import pyaudio
import numpy
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
WAITSECONDS=2
INPUT_DEVICE_INDEX=2 #Micは2番だった
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK,
input_device_index=INPUT_DEVICE_INDEX)
print("話しかけてください...")
frames = []
cnt = 0
while True:
# 音声データの読み込み
data = stream.read(CHUNK)
frames.append(data)
# 音量の算出
x = numpy.frombuffer(data, dtype="int16") / 32768.0
# 音量が閾値以下であれば、無音とみなす
if x.max() < 0.05:
cnt += 1
print("無音") #後程コメントアウト
else:
cnt = 0
print("有音") #後程でコメントアウト
# 無音状態が一定時間続いた場合に、無音状態と判定
if cnt > WAITSECONDS / (CHUNK / RATE):
cnt=0
break
print("会話の終了")
stream.stop_stream()
stream.close()
audio.terminate()
他人のコードをみて自分も理解が追い付いていないのだが、Google Bardに解釈を求めたところ少し理解が進んだ(面白い)、要は下記の計算がミソとなる、32768は16bitの0を含めた正の桁数であるがこれで音量が計算できる
x = numpy.frombuffer(data, dtype="int16") / 32768.0
結果)
設定した音量より入力の音声が低ければ無音と判断するようになった
感想)
今回はちょっと緩くはなかったな・・・。まあ、自分が入用だったからてのはあるが、科学をAIに聞いて学べるのは面白かった
参考)
numpy.frombuffer
参考にしたブログ
無音の表現について勉強させてもらった元ネタ
おわり!