2017-11-23 22 views
2

マイクから多くの入力データをバッファリングせずに再生したい。私は試しましたが、バッファリングがあります。ここに私のコードです。マイクから直接入力データを再生する方法

import pyaudio 
import wave 
import urllib.request 
import struct 
import numpy as np 
import sounddevice as sd 
import matplotlib.pyplot as plt 

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

# Parameters ---------------------------------------------- 
Window_Size = 22050 # Point 
FORMAT_D = pyaudio.paFloat32; FORMAT_W = pyaudio.paInt32 
CHANNELS = 1 # Mono 
Sample_Rate = 22050 # Hz 
dT = 1/Sample_Rate 
RECORD_SECONDS = 20 # s 
NOFFRAMES = int(Sample_Rate/Window_Size * RECORD_SECONDS) 
WAVE_OUTPUT_FILENAME = "output.wav" 
#----------------------------------------------------------- 

p = pyaudio.PyAudio() 

stream_D = p.open(format=FORMAT_D, 
       channels=CHANNELS, 
       rate=Sample_Rate, 
       input=True, 
       frames_per_buffer=Window_Size) 

stream_W = p.open(format=FORMAT_W, 
      channels=CHANNELS, 
      rate=Sample_Rate, 
      input=True, 
      frames_per_buffer=Window_Size) 

print("* recording") 

frames = [] 

# "I think the problem appears from here"------------------------------ 
for i in range(0, int(Sample_Rate/Window_Size * RECORD_SECONDS)): 
    data_D = stream_D.read(Window_Size) 
# data_W = stream_W.read(Window_Size) 
    decoded = np.fromstring(data_D, 'Float32') 
# np.savetxt(str(i)+'ttt.txt',transform) 
    sd.play(decoded,22050) 
# frames.append(data_W) 
#------------------------------------------------------- 

print("* done recording") 

stream_D.stop_stream() 
stream_D.close() 
p.terminate() 

#plt.plot(transform) 
#plt.show() 

# Save as a wave file--------------------------- 
#wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') 
#wf.setnchannels(CHANNELS) 
#wf.setsampwidth(p.get_sample_size(FORMAT_W)) 
#wf.setframerate(Sample_Rate) 
#wf.writeframes(b''.join(frames)) 
#wf.close() 
#------------------------------------------- 

このコードは()sd.play()(np.transform())のデータをnparrayするバイトデータを変換し、1秒間隔でマイクからの入力データを保存し、スピーカーとデータを再生するために実行されます。このコードは機能しますが、forループが再び開始されるとバッファリングが発生します。マイクからの音をスムーズに鳴らしたい。私が最初に尋ねたところ、誰かがコールバック関数を使うことを勧めたので、私はそれを追加しました。しかし、私はそれを使う方法を知らない。どのようにバッファリングを取り除くのですか?いくつかの例はありますか?スレッドやマルチプロセッシングを使うべきですか?遅延がバッファサイズが原因である

答えて

0

...あなたは

# Window_Size = 22050 # Point 
Window_Size = 1024 # Point 
ごとに1kのバッファを使用して無視できる程度の遅延を取得します
関連する問題