2017-05-23 1 views
0

コンピュータのキーボードでサンプル音を再生するプログラムを作成したいと思います。サウンドデバイスモジュールを使用してコマンドラインからサウンドサンプルを再生するときに待ち時間が長すぎる

私のプログラム:

import numpy as np 
import sounddevice as sd 
import soundfile as sf 
import msvcrt 

sd.default.latency = 'low' 

samplesarray = [] 

def load_samples(num): 
    filename='sample'+str(num)+'.wav' 
    data, fs = sf.read(filename, dtype='float32') 
    sd.default.samplerate = fs 
    samplesarray.append(data) 
    return 

numberofsamples=3 

for i in range(numberofsamples):  
    load_samples(i+1) 

def play_session(): 
    while 0==0: 
     key = int(msvcrt.getch()) 
     sd.play(samplesarray[key-1]) 
    return 

play_session() 

プログラムフォルダは、インスタンスキックドラムやスネアのために、sample1.wav、sample2.wav、などという名前の「ワンショット」の短いサンプルの数が含まれています。この例では簡単のために3つだけがロードされています。 ターミナルで私の現在のプログラムを起動し、自分の鍵で「マップされた」サンプルを再生することができます。 唯一の問題はレイテンシです。巨大ではありませんが、それは間違いありません。

サンプルをライブ再生するには、理想的にはレイテンシを認識できないようにする必要があります(数十ミリ秒のオーダー)。

これをどのように達成できますか?

+0

おそらく*ミリ秒*秒ですか?おかげさまで – Matthias

答えて

0

可能な限り低いレイテンシーは、使用しているホストAPIによって異なります。 msvcrtモジュールをインポートしているので、Windowsを使用していると思います。

通常、いくつかのホストAPIの中から選択できます。 WASAPI、WDM/KS、またはASIOを使用すると、通常は最低のレイテンシに達することができます。

WASAPIを使用している場合は、exclusive modeを試すことができますが、待ち時間は短くて済みますが、わかりません。

latency'low'に設定してください(でもそうです)。しかし、あなたはblocksizeの異なる値を試してみることもできます。ただし、ブロックサイズが小さすぎるとバッファアンダーフローが発生し、可聴クリックが発生する可能性があります。

最後に、最後のビットを絞って設定したい場合は、sd.play()(それぞれの呼び出しで新しいsd.OutputStreamを開きます)を取り除き、代わりに独自のコールバック関数で再生ロジックを実装してください。

+0

プログラムの最初に 'wasapi_exclusive = sd.WasapiSettings(exclusive = True)'と 'sd.default.extra_settings = wasapi_exclusive'を追加しました。関数 'play_session()'を呼び出さないとうまく動作しますが、呼び出すと "sounddevice.PortAudioError:OutputStreamを開く際にエラーが発生します:互換性のないホストAPI固有のストリーム情報"が返されます。私は役に立たない解決策をgoogleにしようとしました。提案? – skyfish

+0

@skyfish実際にWASAPIデバイスを使用していますか?はいの場合、エラーはhttps://github.com/spatialaudio/python-sounddevice/issues/35に似ています。 'extra_settings'を使用していない場合のレイテンシはどうですか? – Matthias

関連する問題