使用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
相关产品推荐
相关产品推荐

