2017-11-08 16 views
1

私はラップトップコンピュータからPythonを使用してマイク入力をストリーミングしています。私は現在、PyAudioと.wavを使って2秒のバッチ(下のコード)を作成し、新しく作成された.wavファイルのフレーム表現をループで読み込みます。Pythonでストリーミングマイク入力を維持する

しかし、私は実際には、np.ndarrayが.wavファイルのInt16表現であるコードに "signal"で表されることを望みます。 .wavに完全に書き込みをバイパスして、アプリケーションをマイクロバッチではなく「リアルタイム」に見えるようにする方法はありますか?

import pyaudio 

import wave 

#AUDIO INPUT 

FORMAT = pyaudio.paInt16 

CHANNELS = 1 

RATE = 44100 

CHUNK = 1024 

RECORD_SECONDS = 2 

WAVE_OUTPUT_FILENAME = "output.wav" 

audio = pyaudio.PyAudio() 

# start Recording 

stream = audio.open(format=FORMAT, channels=CHANNELS, 

       rate=RATE, input=True, 

       frames_per_buffer=CHUNK) 
while(1): 
    print "recording" 

    frames = [] 

    for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 

     data = stream.read(CHUNK) 

     frames.append(data) 

    waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 

    waveFile.setnchannels(CHANNELS) 

    waveFile.setsampwidth(audio.get_sample_size(FORMAT)) 

    waveFile.setframerate(RATE) 

    waveFile.writeframes(b''.join(frames)) 

    waveFile.close() 

    spf = wave.open(WAVE_OUTPUT_FILENAME,'r') 

    #Extract Raw Audio from Wav File 
    signal = spf.readframes(-1) 
    signal = np.fromstring(signal, 'Int16') 
    copy= signal.copy() 

#ストップはい、あなたはstream変数にコールバックを与えることができます

stream.stop_stream()

stream.close() audio.terminate()

答えて

0

を記録し、あなたが好きなものでそのオーディオをどうぞ:

def callback(input_data, frame_count, time_info, flags): 
    ... 

    return input_data, pyaudio.paContinue 

stream = audio.open(format=FORMAT, 
        channels=CHANNELS, 
        rate=RATE, 
        input=True, 
        stream_callback=callback, 
        frames_per_buffer=CHUNK) 

More here.

+0

データが利用可能なときはいつでもコールバックが実行されるようですか? audio.openに関して、input_dataとは正確に何ですか? stream.read()と同じですか? – knowads

+0

これはnp.int16のようです。 'np.fromstring(input_data、dtype = np.int16)'を使って読むことができます –

+0

もっと一般的には、 'audio.open'に渡される' FORMAT'に基づいていると思います。これは、そのデータ型に対応するnumpy形式になります。 –

関連する問題