使用soundevice与scipy.io.wavfile录制音频存为WAV文件报错求助
问题解决步骤
1. 修复numpy数组初始化错误
你遇到的array() missing required argument 'object' (pos 0)错误,核心原因是初始化audio_data时调用np.array()未传入初始对象。numpy的array()构造函数必须接收可迭代对象(比如空列表)才能创建数组,仅指定dtype不满足要求。
将这行代码:
audio_data = np.array(dtype='int16')
修改为:
audio_data = np.array([], dtype='int16')
2. 修正np.append的使用逻辑
np.append()不会直接修改原数组,而是返回新数组,因此需要将返回值重新赋值给audio_data。另外,sd.InputStream.read()返回的是元组(录制的音频数据, 是否溢出),需要提取第一个有效数据部分:
把循环内的代码:
np.append(audio_data, audio_input_stream.read(frames = frame_size))
替换为:
data, overflow = audio_input_stream.read(frames=frame_size) # 可选:处理溢出警告 if overflow: print("警告:音频输入出现溢出") audio_data = np.append(audio_data, data)
3. 补充WAV文件保存逻辑
你的函数仅返回音频数据,需添加scipy.io.wavfile.write()完成文件导出。示例代码如下(可放在函数返回后或调用函数时):
from scipy.io import wavfile # 调用record函数后保存 sample_rate = 44100 # 根据你的采样率调整 recorded_audio = record(sample_rate, device_id) wavfile.write("录制音频.wav", sample_rate, recorded_audio)
4. 性能优化建议
循环中频繁调用np.append()会反复分配内存,录制长音频时效率较低。建议用列表暂存数据,最后合并为numpy数组:
# 初始化空列表替代空数组 audio_data_list = [] while keyboardHandler.get_status() != "submit": data, overflow = audio_input_stream.read(frames=frame_size) if overflow: print("警告:音频输入出现溢出") audio_data_list.append(data) # 最后合并数据 audio_data = np.concatenate(audio_data_list, dtype=np.int16)
修正后的完整示例代码:
import numpy as np import sounddevice as sd from scipy.io import wavfile def record(sample_rate: int, device_id: int): input_latency = get_input_latency(device_id) # 确保该函数返回有效延迟值 frame_size = 1024 audio_data_list = [] audio_input_stream = sd.InputStream( samplerate=sample_rate, channels=1, dtype=np.int16, device=device_id, latency=input_latency ) audio_input_stream.start() while keyboardHandler.get_status() != "submit": data, overflow = audio_input_stream.read(frames=frame_size) if overflow: print("警告:音频输入出现溢出") audio_data_list.append(data) audio_input_stream.stop() audio_input_stream.close() audio_data = np.concatenate(audio_data_list, dtype=np.int16) return audio_data # 调用示例 sample_rate = 44100 device_id = 0 # 替换为你的实际设备ID recorded_audio = record(sample_rate, device_id) wavfile.write("output.wav", sample_rate, recorded_audio)
内容的提问来源于stack exchange,提问作者Vytautas Ziedelis
相关产品推荐
相关产品推荐

