このプログラムを使用して、Python でサウンドを録音しています。
サウンドカード入力で音を検知したら録音を開始するようにプログラムを変更したい。おそらくチャンクで入力音レベルを比較する必要がありますが、これはどのように行うのでしょうか?
このプログラムを使用して、Python でサウンドを録音しています。
サウンドカード入力で音を検知したら録音を開始するようにプログラムを変更したい。おそらくチャンクで入力音レベルを比較する必要がありますが、これはどのように行うのでしょうか?
次のようなことを試すことができます:
この質問/回答に基づいて
# this is the threshold that determines whether or not sound is detected
THRESHOLD = 0
#open your audio stream
# wait until the sound data breaks some level threshold
while True:
data = stream.read(chunk)
# check level against threshold, you'll have to write getLevel()
if getLevel(data) > THRESHOLD:
break
# record for however long you want
# close the stream
目的の動作が得られるまで、チャンク サイズとしきい値を調整することをお勧めします。
編集:
組み込みのaudioopパッケージを使用して、サンプルの二乗平均平方根 (rms) を見つけることができます。これは通常、レベルを取得する方法です。
import audioop
import pyaudio
chunk = 1024
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=44100,
input=True,
frames_per_buffer=chunk)
data = stream.read(chunk)
rms = audioop.rms(data, 2) #width=2 for format=paInt16
無音でない場合の検出は、通常、サウンドの一部のチャンクの二乗平均平方根(RMS) を使用し、それを設定したしきい値と比較することによって行われます (値は、マイクの感度などによって異なります。調整する必要があります)。また、録音する音声をマイクが検出する速度に応じて、チャンク サイズを小さくするか、重複するデータ チャンクの RMS を計算することもできます。
それを行う方法はあなたが与えるリンクに示されています:
print "* recording"
for i in range(0, 44100 / chunk * RECORD_SECONDS):
data = stream.read(chunk)
# check for silence here by comparing the level with 0 (or some threshold) for
# the contents of data.
# then write data or not to a file
ループで読み取られるたびに、しきい値変数を設定し、データの平均値(振幅)またはその他の関連パラメーターと比較する必要があります。
ネストされたループを2つ持つことができます。最初のループは録音をトリガーし、もう1つはその後のサウンドデータチャンクを継続的に保存します。