在 Python 中保持流式麦克风输入
Maintain a streaming microphone input in Python
我正在使用 Python 从我的笔记本电脑流式传输麦克风输入。我目前正在使用 PyAudio 和 .wav 创建一个 2 秒的批次(下面的代码),然后循环读出新创建的 .wav 文件的帧表示。
但是我真的只想要 np.ndarray
在代码中由 "signal" 表示,即 .wav 文件的 Int16 表示。有没有办法完全绕过写入 .wav 并使我的应用程序看起来是 "real-time" 而不是微批处理?
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.stop_stream()
stream.close()
audio.terminate()
是的,您可以给 stream
变量一个回调,然后随心所欲地处理该音频:
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)
更多here.
我正在使用 Python 从我的笔记本电脑流式传输麦克风输入。我目前正在使用 PyAudio 和 .wav 创建一个 2 秒的批次(下面的代码),然后循环读出新创建的 .wav 文件的帧表示。
但是我真的只想要 np.ndarray
在代码中由 "signal" 表示,即 .wav 文件的 Int16 表示。有没有办法完全绕过写入 .wav 并使我的应用程序看起来是 "real-time" 而不是微批处理?
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.stop_stream() stream.close() audio.terminate()
是的,您可以给 stream
变量一个回调,然后随心所欲地处理该音频:
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)
更多here.