Python中如何将大容量音频数据保存为w64格式
Python 保存numpy音频数组为W64格式方法
W64格式突破了标准RIFF WAV的4GB文件大小上限,完全适配你总时长83小时的音频存储需求,推荐用soundfile库实现写入,该库也是librosa的底层IO依赖,和你现有读取逻辑兼容性最好,不会出现采样率、精度不匹配的问题。
第一步:修正原有读取代码的问题
你给出的读取代码有三处容易运行报错的问题,先做修正:
- 列表推导式存在语法笔误:
for f i sorted应为for f in sorted - 没有拼接文件完整路径:如果
root不是当前Python工作目录,librosa会找不到目标文件 - 没有过滤非音频文件:如果目录下存在隐藏文件、其他格式文件,读取会直接报错
修正后的读取代码:
import os import librosa import numpy as np x = np.array([ librosa.load(os.path.join(root, f), sr=16000)[0] for f in sorted(os.listdir(root)) if f.lower().endswith('.wav') ])
第二步:安装依赖
如果你的环境没有装soundfile,执行以下命令安装:
pip install soundfile
第三步:写入W64文件
场景1:将所有音频合并为单个长W64文件
W64是单文件音频格式,如果要把10000段30秒音频拼接为完整的83小时长音频,直接调用soundfile.write并显式指定格式为W64即可:
import soundfile as sf # 将二维的分段音频数组展平为一维长序列 combined_audio = x.flatten() sf.write( file="full_audio.w64", data=combined_audio, samplerate=16000, subtype="PCM_16", # 保持和原WAV一致的16位采样精度,无音质损失 format="W64" # 显式指定格式,避免依赖后缀识别出错 )
场景2:批量将原WAV文件转为独立W64文件
如果你不需要合并音频,只是想把原文件逐个转成W64格式规避大小限制,不需要把所有音频加载到内存拼接,逐文件读写即可,内存占用更低:
import os import librosa import soundfile as sf output_root = "./w64_files" os.makedirs(output_root, exist_ok=True) for f in sorted(os.listdir(root)): if not f.lower().endswith('.wav'): continue audio, sr = librosa.load(os.path.join(root, f), sr=16000) output_name = os.path.splitext(f)[0] + ".w64" sf.write( os.path.join(output_root, output_name), data=audio, samplerate=sr, subtype="PCM_16", format="W64" )
注意事项
- 不要使用
scipy.io.wavfile模块写入W64,该模块不原生支持W64格式,写入超过4GB的文件会出现截断损坏。 - 写入时显式指定
format="W64"参数,不要只靠.w64后缀让库自动识别格式,避免部分版本的soundfile识别错误写成标准WAV格式。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

