[英]How to play input data from microphone directly
I want to play many input data from a microphone without buffering. 我想在不缓冲的情况下播放麦克风中的许多输入数据。 I tried, but there is buffering.
我试过了,但是有缓冲。 Here is my code.
这是我的代码。
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()
#-------------------------------------------
This code performs to save input data from a microphone at 1s intervals, transform byte data to nparray data (np.transform()), and play the data with a speaker (sd.play()). 该代码执行以下操作:以1s的间隔保存来自麦克风的输入数据,将字节数据转换为nparray数据(np.transform()),并使用扬声器播放数据(sd.play())。 This code works, but there is buffering when for loop start again.
这段代码有效,但是在for循环再次启动时有缓冲。 I want to play the sound from a microphone smoothly.
我想平稳地播放麦克风的声音。 When I asked first, someone recommended to use callback function, so I added it, But, I don't know how to use it.
当我首先询问时,有人建议使用回调函数,所以我添加了它,但是,我不知道如何使用它。 How do I get rid of the buffering?
如何摆脱缓冲? Is there some examples?
有一些例子吗? Should I use Threads or multiprocessing?
我应该使用线程还是多处理?
The delay is due to buffer size ... you will get a negligible delay using a 1k buffer as per 延迟是由于缓冲区大小造成的...按照以下方式使用1k缓冲区将得到可忽略不计的延迟
# Window_Size = 22050 # Point
Window_Size = 1024 # Point
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.