You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:15:28