0

PyAudioで見ているものを理解しようとしています。200ミリ秒のオーディオのサンプルを取得し、数秒待ってから、さらに3つの200ミリ秒のオーディオのサンプルを取得しようとしています。このコードを考えてみましょう:

import pyaudio
import time

p = pyaudio.PyAudio()
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1 #chan
RATE = 11025
stream = p.open(format = FORMAT,
            channels = CHANNELS,
            rate = RATE,
            input = True,
            output = False,
            frames_per_buffer = chunk,
            input_device_index = 0,
            output_device_index = 0)

def record(seconds):
all = []
for i in range(0, int(RATE / chunk * seconds)):
    data = stream.read(chunk)

    all.append(data)
data = ''.join(all)
return data

#record 200ms of sound
print "pre-record 1 " + str(time.time())
data = record(.2)
print "post-record 1 " + str(time.time())

#sleep for one second
#time.sleep(1)

#record 200ms of sound
print "pre-record 2 " + str(time.time())
data = record(.2)
print "post-record 2 " + str(time.time())

print "pre-record 3 " + str(time.time())
data = record(.2)
print "post-record 3 " + str(time.time())

print "pre-record 4 " + str(time.time())
data = record(.2)
print "post-record 4 " + str(time.time())

これを「現状のまま」(つまり、time.sleep()コメントアウトして)実行すると、次のようになります。これは理にかなっています。

pre-record 1 1357526364.46
post-record 1 1357526364.67
pre-record 2 1357526364.67
post-record 2 1357526364.86
pre-record 3 1357526364.86
post-record 3 1357526365.03
pre-record 4 1357526365.03
post-record 4 1357526365.22

次に、time.sleep()行のコメントを解除して、最初の記録と2番目の記録の間に1秒の遅延を追加すると、次のようになります。

pre-record 1 1357525897.09
post-record 1 1357525897.28
pre-record 2 1357525898.28
post-record 2 1357525898.28
pre-record 3 1357525898.28
post-record 3 1357525898.28
pre-record 4 1357525898.28
post-record 4 1357525898.47

最初の録音と2番目の録音の間のタイムスタンプには1秒の遅延がありますが、録音2と3の間にはまったく遅延がなく、ゼロ時間で取得されたように見えます(実際には200ミリ秒のデータ)。4回目の録音は取得に200msかかったようですが、2回目と3回目の録音と同時に開始されました。

に置き換えtime.sleep(1)た場合record(1)(1秒の記録からのデータを保存/使用しない場合)、プログラムは期待どおりに動作します。

pre-record 1 1357526802.57
post-record 1 1357526802.77
pre-record 2 1357526803.69
post-record 2 1357526803.88
pre-record 3 1357526803.88
post-record 3 1357526804.06
pre-record 4 1357526804.06
post-record 4 1357526804.25

したがって、の間でもtime.sleep(1)、どこかのバッファにオーディオが供給されているように見えます。スリープ後にrecord関数を呼び出すと、そのバッファからオーディオが取得されますが、これは必要なオーディオではありません。睡眠中ではなく、睡眠後に音声が必要です。誰かがPyAudioとそこにあるバッファとの相互作用を理解するのを手伝ってくれますか?また、私のオーディオが実際にキャプチャされた時刻をよりよく知る方法はありますか?

4

1 に答える 1

0

オーディオデバイスは、1秒あたりのRATEサンプルをバッファに継続的に追加し、コードはこのバッファから読み取られます。

したがって、バッファから読み取ることなくsleep(1)を実行することはできません。サンプルをスキップするコードを書くことができます:

def skip(seconds):
    samples = int(seconds * RATE)
    count = 0
    while count < samples:
        stream.read(chunk)
        count += chunk
        time.sleep(0.01)
于 2013-01-07T03:42:39.273 に答える