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

如何解决wav.read报错“File format b'file' not understood. Only 'RIFF' and 'RIFX' supported.”的问题?

问题:wav.read无法处理文件,报错“File format b'file' not understood. Only 'RIFF' and 'RIFX' supported.”

我编写了如下Python代码用于提取音频特征:

f= open("my.dat" ,'wb')
i=0
for folder in os.listdir(directory):
    i+=1
    if i==11 :
        break
    for file in os.listdir(directory):
        (rate,sig) = wav.read(directory+"/"+file)
        mfcc_feat = mfcc(sig,rate ,winlen=0.020, appendEnergy = False)
        covariance = np.cov(np.matrix.transpose(mfcc_feat))
        mean_matrix = mfcc_feat.mean(0)
        feature = (mean_matrix , covariance , i)
        pickle.dump(feature , f)
f.close()

运行代码时,wav.read无法处理目标文件,出现错误提示:

File format b'file' not understood. Only 'RIFF' and 'RIFX' supported.

请问如何修复该错误?


解决方案

这个错误本质上是你读取的文件要么路径逻辑错误(读到了文件夹而非音频文件),要么不是标准的RIFF格式WAV文件,下面分步骤修复:

1. 修正核心的文件遍历逻辑错误

你的代码里有个明显的逻辑bug:外层循环遍历directory下的文件夹,但内层循环又去遍历directory下的所有内容,这会导致你重复读取根目录的文件,甚至把文件夹当成文件传入wav.read,这肯定会触发格式错误。

修正后的循环应该是:外层遍历根目录的文件夹,内层遍历当前文件夹下的文件,同时先判断当前路径是不是文件夹,避免误读。

2. 过滤非WAV格式文件

目录里可能存在非音频文件(比如临时文件、配置文件),必须通过后缀名过滤,只处理.wav文件。

3. 修正后的完整代码

import os
import numpy as np
import pickle
from scipy.io import wavfile  # 假设你用的是scipy的wavfile.read
from python_speech_features import mfcc

f = open("my.dat", 'wb')
i = 0
directory = "你的音频根目录路径"  # 记得替换成实际路径

for folder in os.listdir(directory):
    i += 1
    if i == 11:
        break
    
    # 拼接当前文件夹的完整路径
    folder_path = os.path.join(directory, folder)
    # 跳过非文件夹的项
    if not os.path.isdir(folder_path):
        continue
    
    # 遍历当前文件夹下的所有文件
    for file in os.listdir(folder_path):
        file_path = os.path.join(folder_path, file)
        # 只处理WAV文件,忽略其他格式
        if not file.lower().endswith('.wav'):
            continue
        
        try:
            # 读取音频文件
            rate, sig = wavfile.read(file_path)
            # 提取MFCC特征
            mfcc_feat = mfcc(sig, rate, winlen=0.020, appendEnergy=False)
            # 计算协方差和均值矩阵
            covariance = np.cov(np.matrix.transpose(mfcc_feat))
            mean_matrix = mfcc_feat.mean(0)
            # 保存特征
            feature = (mean_matrix, covariance, i)
            pickle.dump(feature, f)
        except Exception as e:
            # 捕获单个文件的错误,避免整个程序崩溃
            print(f"处理文件 {file_path} 时出错: {e}")

f.close()

4. 额外排查:确认文件是否为标准WAV格式

如果还是报错,说明某些WAV文件本身不是标准的RIFF格式(比如是MP3重命名成.wav,或者其他非标准格式),可以用Python标准库的wave模块验证单个文件:

import wave

def check_wav_validity(file_path):
    try:
        with wave.open(file_path, 'r') as wf:
            print(f"✅ {file_path} 是标准WAV文件")
            return True
    except wave.Error as e:
        print(f"❌ {file_path} 不是标准WAV文件: {e}")
        return False

# 测试单个文件
check_wav_validity("你的音频文件路径")

5. 可选:用更健壮的音频库读取

如果你的音频文件是合法但非RIFF格式的音频,可以用librosa或pydub来读取,它们支持更多格式:

  • 使用librosa(推荐,专门用于音频处理):

    import librosa
    sig, rate = librosa.load(file_path, sr=None)  # sr=None保留原始采样率
    

    需要先安装:pip install librosa

  • 使用pydub:

    from pydub import AudioSegment
    import numpy as np
    
    audio = AudioSegment.from_file(file_path)
    sig = np.array(audio.get_array_of_samples())
    rate = audio.frame_rate
    

    需要先安装:pip install pydub,同时需要安装ffmpeg(可以从官网下载后添加到系统PATH)


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:39:07