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

使用PyAudio播放wav文件时出现wave.Error: unknown format:3报错如何解决

问题修复方案

错误根因

wave.Error: unknown format: 3 报错指向WAV文件编码不兼容问题:错误码3对应32位IEEE浮点编码的WAV格式,Python标准库的wave模块仅支持线性PCM整数编码(格式标签为1,常见的8位、16位、24位PCM都属于这类)的WAV文件,无法直接读取浮点编码的WAV。

修复方法

方法一:转码WAV文件(操作最简单)

将你的DP.wav转换为16位PCM编码即可兼容原代码,用免费工具Audacity就能完成:

  • 用Audacity打开目标WAV文件
  • 点击顶部菜单栏「文件」→「导出」→「导出为WAV」
  • 保存弹窗的编码选项选择「Signed 16-bit PCM」后保存,用新生成的WAV运行原代码即可。

提示:原代码存在Python3适配问题:wave.readframes在Python3中返回bytes类型,判断data != ''永远为真,播放完后会进入死循环,需要把循环条件改成while data != b''。

方法二:修改代码适配浮点编码WAV

不想转码的话可以替换音频读取库,用支持浮点编码的soundfile库读取WAV,搭配pyaudio播放即可:

  1. 先安装依赖库:
pip install soundfile numpy pyaudio
  1. 替换为以下代码:
import pyaudio
import soundfile as sf
import numpy as np

class AudioFile:
    chunk = 1024

    def __init__(self, file):
        """ 初始化音频流 """ 
        # soundfile支持浮点编码WAV读取
        self.audio_data, self.sample_rate = sf.read(file, dtype='float32')
        self.channel_num = self.audio_data.shape[1] if len(self.audio_data.shape) > 1 else 1
        self.p = pyaudio.PyAudio()
        self.stream = self.p.open(
            format = pyaudio.paFloat32,
            channels = self.channel_num,
            rate = self.sample_rate,
            output = True
        )
        # 按chunk大小拆分音频
        self.frame_list = np.array_split(self.audio_data, np.ceil(len(self.audio_data)/self.chunk))
        self.play_index = 0

    def play(self):
        """ 播放完整音频 """
        while self.play_index < len(self.frame_list):
            self.stream.write(self.frame_list[self.play_index].tobytes())
            self.play_index += 1

    def close(self):
        """ 优雅关闭资源 """ 
        self.stream.close()
        self.p.terminate()

# 调用示例
a = AudioFile("DP.wav")
a.play()
a.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:39:00