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

Python中如何将多频率合成的音频数据写入WAV文件?

WAV文件写入失败的解决方法

你的代码存在几个关键问题,修正后的代码及问题说明如下:

问题分析

  • 参数设置顺序错误:setparams需要在写入帧之前调用,否则文件头参数未初始化就写入数据会导致文件损坏。
  • 数据打包错误:struct.pack传入列表时需要用*解包,否则会把整个列表当作单个参数传入,引发打包失败。
  • 写入帧参数错误:writeframes需要传入打包后的二进制数据,而非样本数量,且不能将其返回值(None)重新赋值给data。
  • 未定义变量:nframes和sampling_rate需要确保已正确定义,nframes应等于样本数量num_samples。

修正后的代码

import wave
import struct

# 确保sampling_rate已定义,比如48000
sampling_rate = 48000
file = "total.wav"
comptype = "NONE"
compname = "not compressed"
num_samples = 48000
nchannels = 1
sampwidth = 2
nframes = num_samples  # 定义nframes为样本数量

wav_file = wave.open(file, 'w')
# 先设置文件参数
wav_file.setparams((nchannels, sampwidth, int(sampling_rate), nframes, comptype, compname))

# 打包数据:注意用*data解包你的音频数据列表
# 假设data是你合成后的音频数据列表,值范围要符合sampwidth=2的要求(-32768到32767)
packed_data = struct.pack(f'{num_samples}h', *data)
# 写入打包后的二进制数据
wav_file.writeframes(packed_data)

# 记得关闭文件
wav_file.close()

额外注意事项

  • 确保你的合成音频数据data中的每个值都在16位有符号整数范围内(-32768 到 32767),因为sampwidth=2对应16位PCM格式,超出范围会导致音频失真或写入失败。
  • 检查sampling_rate是否为有效数值(比如44100、48000等标准采样率)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:15:38