提取FLAC音频转float32数组异常及梅尔频谱报错求助
问题解决思路与修复方案
核心问题1:音频数据解码错误
你用ffmpeg输出的是s32le格式(32位有符号小端整数),但直接用np.frombuffer(audio, np.float32)解析,导致二进制数据被错误解释,产生NaN和极端数值——这是引发后续librosa错误的根本原因。
修复代码:
cmd = ( ffmpeg .input(video_path, ss=start, t=end-start) .output("pipe:", ac=1, ar=sampling_rate, format="s32le") ) audio, _ = cmd.run(capture_stdout=True, quiet=True) # 先按32位有符号整数解析,再归一化到[-1.0, 1.0]的float32范围 audio_int32 = np.frombuffer(audio, np.int32) audio = audio_int32.astype(np.float32) / 2**31
核心问题2:librosa参数错误
调用melspectrogram时存在两个明显问题:
window=25参数无效:window接受窗口函数(如'hann')或数组,不是整数。如果要设置窗口长度,需用n_fft参数(建议设为2的幂次,比如n_fft=256,符合音频处理常规)。- FutureWarning提示需用关键字参数传递音频数据,避免后续版本报错。
修复后的librosa调用代码:
mel_spec = librosa.feature.melspectrogram( y=audio, sr=16000, hop_length=10, n_mels=128, n_fft=256, window='hann' )
额外验证步骤
修复后可先检查音频数组是否正常:
print("音频数组是否含NaN:", np.isnan(audio).any()) print("音频数组极值范围:", audio.min(), audio.max()) # 正常情况下极值应在[-1.0, 1.0]之间,且无NaN
内容的提问来源于stack exchange,提问作者Shreya Gupta
相关产品推荐
相关产品推荐

