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

使用PyAudio录制音频并写入磁盘时遇TypeError问题求助

问题解决:PyAudio录制音频写入磁盘报错处理

错误原因

你遇到的TypeError: a bytes-like object is required, not 'list'是因为voc_frames是存储音频片段的列表,每个元素是bytes类型,但file.write()只接受单个bytes对象,不能直接传入列表。

另外还有一个隐藏问题:直接写入原始PCM数据生成的文件不是标准WAV格式,播放器无法正常识别播放,必须添加WAV文件头。

修复后的完整代码

#!/usr/bin/env python3

import pyaudio, signal, sys, wave

global mic_stream

voc_frames = []
voc_rate = 44100
# 提前定义格式和通道数,后续写WAV头会用到
voc_format = pyaudio.get_format_from_width(2)
voc_channels = 1 if sys.platform == 'darwin' else 2

def vocrec_callback(in_data, frame_count, time_info, status):
    global voc_frames
    voc_frames.append(in_data)
    return (in_data, pyaudio.paContinue)

def vocrec_start():
    global mic_stream
    mic_stream = pa.open(format=voc_format,
                    channels=voc_channels,
                    rate=voc_rate,
                    input=True,
                    output=False,
                    stream_callback=vocrec_callback)
    return mic_stream

def vocrec_stop():
    mic_stream.close()
    pa.terminate()

def vocrec_write():
    # 将列表中的bytes片段拼接成单个完整的bytes对象
    audio_data = b''.join(voc_frames)
    # 使用wave模块写入标准WAV文件
    with wave.open("output.wav", "wb") as wf:
        wf.setnchannels(voc_channels)
        wf.setsampwidth(pyaudio.get_sample_size(voc_format))
        wf.setframerate(voc_rate)
        wf.writeframes(audio_data)

class SIGINT_handler():
    def __init__(self):
        self.SIGINT = False
    def signal_handler(self, signal, frame):
        self.SIGINT = True
        print('You pressed Ctrl+C!')
        vocrec_stop()
        vocrec_write()  # 捕获中断时也保存录制数据
        sys.exit()

def get_data():
    vocrec_start()
    input("按回车键停止录制...")
    vocrec_stop()
    vocrec_write()
    print("录制完成,音频已保存为output.wav")

handler = SIGINT_handler()
signal.signal(signal.SIGINT, handler.signal_handler)
pa = pyaudio.PyAudio()

get_data()

关键修复点

  • 列表转bytes对象:用b''.join(voc_frames)把分散的音频片段列表合并成一个完整的bytes对象,满足文件写入的参数要求。
  • 生成标准WAV文件:借助Python标准库wave模块,设置通道数、采样宽度、采样率等关键参数,确保输出的音频文件能被播放器正常识别播放。
  • 完善中断处理:捕获Ctrl+C信号时也会执行写入操作,避免录制数据丢失。

内容的提问来源于stack exchange,提问作者bozolino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:31:35