2016-03-25 11 views
1

こんにちは私はリアルタイムでオーディオを録音し再生するアプリケーションを構築するためにpyaudioを使って、オーディオ信号にローパスフィルタを追加しています。私はこのコードを実行しようとすると 以下、このエラーが表示されます。Pyaudio:再生エラー:4

Pyaudioを:再生エラー:4

from pyaudio import PyAudio, paContinue, paFloat32 
from time import sleep 
from numpy import array, random, arange, float32, float64, zeros 
import sounddevice as sd 

fs   = 44100 # Hz 
threshold  = 0.8  # absolute gain 
delay   = 40  # samples 
signal_length = 1  # second 
release_coeff = 0.5555 # release time factor 
attack_coeff = 0.5  # attack time factor 
dtype   = float32 # default data type 
block_length = 1024 # samples 


class Limiter: 
    def __init__(self, attack_coeff, release_coeff, delay, dtype=float32): 
    self.delay_index = 0 
    self.envelope = 0 
    self.gain = 1 
    self.delay = delay 
    self.delay_line = zeros(delay, dtype=dtype) 
    self.release_coeff = release_coeff 
    self.attack_coeff = attack_coeff 

def limit(self, signal, threshold): 
    for i in arange(len(signal)): 
     self.delay_line[self.delay_index] = signal[i] 
     self.delay_index = (self.delay_index + 1) % self.delay 

     # calculate an envelope of the signal 
     self.envelope *= self.release_coeff 
     self.envelope = max(abs(signal[i]), self.envelope) 

     # have self.gain go towards a desired limiter gain 
     if self.envelope > threshold: 
      target_gain = (1+threshold-self.envelope) 
     else: 
      target_gain = 1.0 
     self.gain = (self.gain*self.attack_coeff + 
         target_gain*(1-self.attack_coeff)) 

     # limit the delayed signal 
     signal[i] = self.delay_line[self.delay_index] * self.gain 




    print "Recording Audio" 
    signal = sd.rec(signal_length * fs, samplerate=fs, channels=1, dtype=dtype) 
    sd.wait() 
    print "Audio recording complete , Play Audio" 





original_signal = array(signal, copy=True, dtype=dtype) 
limiter = Limiter(attack_coeff, release_coeff, delay, dtype) 

def callback(in_data, frame_count, time_info, flag): 
    if flag: 
     print("Playback Error: %i" % flag) 
     played_frames = callback.counter 
     callback.counter += frame_count 
     limiter.limit(signal[played_frames:callback.counter], threshold) 
    return signal[played_frames:callback.counter], paContinue 

callback.counter = 0 

pa = PyAudio() 

stream = pa.open(format = paFloat32, 
       channels = 1, 
       rate = fs, 
       frames_per_buffer = block_length, 
       output = True, 
       stream_callback = callback) 

while stream.is_active(): 
    sleep(0.1) 

stream.close() 
pa.terminate() 
+1

フルトレースバック –

+0

こんにちは。私はPythonに慣れていません。トレースを取得するためのコードとトレースバックコードを追加する必要があります。ありがとうございました。 –

+0

トレースバックは通常、シェルで見られる赤色の完全なエラーです。トレースバックの最後の行はエラーでなければなりません: 'Pyaudio:再生エラー:4' –

答えて

1

あなたがPyAudioとsounddeviceを混在させるべきではありません!

それにかかわらず、関数sounddevice.rec()sounddevice.wait()は、コールバック関数内で呼び出された場合(独自のコールバック関数で内部的に独自の「ストリーム」を使用しているため)正しく動作しません。

+0

だから何が解決策になるかもしれない。このコードでは、基本的にマイクと再生オーディオをローパスフィルタで録音して、マブリングエフェクトを作成することになっています。 –

+0

これは2つの別々の質問です。ローパスフィルタのコードを表示すると、 'sounddevice'でどのように使用するのかを見ることができます。基本的には、["wire"の例(http://python-sounddevice.readthedocs.org/en/latest/#callback-streams)]を使用して、ローパスフィルタを 'indata'に適用して結果を代入するだけです'outdata [:]'に変換します。連続したコールバックコールの間にフィルタの状態が保持されるようにするだけで十分です。 – Matthias

+0

Hello Matthias。上記のコードを、ローパスフィルターに似たリミッターを追加する方法として挙げました。人にマッブリング効果を作り出す方法で、マイクで話す。同様のことをするコードをお持ちの場合は、共有してください。ありがとう。 –

関連する問題