繁体   English   中英

如何直接从麦克风播放输入数据

[英]How to play input data from microphone directly

我想在不缓冲的情况下播放麦克风中的许多输入数据。 我试过了,但是有缓冲。 这是我的代码。

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()
#-------------------------------------------

该代码执行以下操作:以1s的间隔保存来自麦克风的输入数据,将字节数据转换为nparray数据(np.transform()),并使用扬声器播放数据(sd.play())。 这段代码有效,但是在for循环再次启动时有缓冲。 我想平稳地播放麦克风的声音。 当我首先询问时,有人建议使用回调函数,所以我添加了它,但是,我不知道如何使用它。 如何摆脱缓冲? 有一些例子吗? 我应该使用线程还是多处理?

延迟是由于缓冲区大小造成的...按照以下方式使用1k缓冲区将得到可忽略不计的延迟

# Window_Size = 22050 # Point
Window_Size = 1024 # Point

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM