2017-11-21 4 views
0

多くのnumpy配列を再生したいですが、いくつかのバッファリングがあります。例えば、この場合、バッファリングなしで多くのnumpy配列を再生する方法

import numpy as np 
import sounddevice as sd 

fs=44100 
data = 0.5*np.random.uniform(-1,1,fs) 
for i in range(5): 
    sd.play(data, 44100) 

は、私はちょうど1 numpyのアレイを使用したが、連続して再生したいです。

実際に、マイクを使って数十マイクロ秒間サウンドを録音し、いくつかのアプリケーションで変換して(正弦波を加えて...)、変換したデータを連続して再生しようとします。

どのようにバッファリングを削除できますか?

答えて

0

連続して録音して再生する場合は、コールバック機能を使用する必要があります。

import sounddevice as sd 
duration = 5.5 # seconds 

def callback(indata, outdata, frames, time, status): 
    if status: 
     print(status) 
    outdata[:] = indata 

with sd.Stream(channels=2, callback=callback): 
    sd.sleep(int(duration * 1000)) 

この例では、単にコピーし、出力バッファへの入力バッファをしていますが、当然の出力に戻ってそれを割り当てる前に、任意の信号を操作することができます。example in the documentationを見てください 、私はここでそれを繰り返しますよ。

処理のいずれかが固定ブロックサイズに依存している場合は、ブロックサイズをsd.Stream()コンストラクタに明示的に設定する必要があります。 blocksize=1024

コールバックで処理が多すぎる(またはブロックサイズが小さすぎる)場合は、バッファのオーバー/アンダーランが発生していることを通知するので、常にstatus引数をチェックすることを忘れないでください。

関連する問題