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()
#-------------------------------------------
이 코드는 스피커와 데이터를 1 개 초 간격으로 마이크로부터 입력 된 데이터를 저장하는 데이터 nparray 행 (np.transform을()) 바이트의 데이터를 변환하고, 재생 수행 (sd.play()). 이 코드는 작동하지만 for 루프가 다시 시작될 때 버퍼링이 발생합니다. 마이크에서 소리를 부드럽게 재생하고 싶습니다. 먼저 물었을 때 누군가 콜백 함수를 사용하도록 권장 했으므로 추가했습니다. 그러나이를 사용하는 방법을 모르겠습니다. 어떻게 버퍼링을 제거 할 수 있습니까? 몇 가지 예가 있습니까? 스레드 또는 다중 처리를 사용해야합니까?