如何解决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

