12

このプログラムを使用して、Python でサウンドを録音しています。

Python でオーディオを検出して録音する

サウンドカード入力で音を検知したら録音を開始するようにプログラムを変更したい。おそらくチャンクで入力音レベルを比較する必要がありますが、これはどのように行うのでしょうか?

4

3 に答える 3

13

次のようなことを試すことができます:

この質問/回答に基づいて

# 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
于 2010-04-19T17:03:25.627 に答える
5

無音でない場合の検出は、通常、サウンドの一部のチャンクの二乗平均平方根(RMS) を使用し、それを設定したしきい値と比較することによって行われます (値は、マイクの感度などによって異なります。調整する必要があります)。また、録音する音声をマイクが検出する速度に応じて、チャンク サイズを小さくするか、重複するデータ チャンクの RMS を計算することもできます。

于 2010-04-19T15:30:26.243 に答える
1

それを行う方法はあなたが与えるリンクに示されています:

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つはその後のサウンドデータチャンクを継続的に保存します。

于 2010-04-19T17:15:41.183 に答える