PyTorch中torchaudio.load加载的波形是否为原始PCM音频数据?
torchaudio.load返回波形的属性判定 - 你通过
torchaudio.load获取到的波形不是.ogg文件中存储的原始字节数据,也不是文件原生存储的PCM数据。 - 具体原理:
.ogg属于有损压缩的音频容器格式(通常封装Vorbis编码的音频流),文件内部存储的是经过压缩编码的音频帧,不存在直接存储的PCM字节。torchaudio.load在加载时会自动调用后端解码器完成压缩格式解码,返回的是归一化到[-1, 1]区间的浮点型张量,对应解码重建后的音频振幅序列——本质是PCM调制对应的振幅值,但做了浮点归一化处理,不是整数型的原始PCM字节流。
从.ogg文件提取PCM数据的实现方式
首先明确前提:所有从.ogg这类有损压缩格式中得到的PCM,都是解码重建后的结果,和音频录制时生成的未压缩原始PCM存在编码失真,这是有损压缩的固有特性,无法逆转。
根据你需要的PCM格式,可选择对应实现方式:
- 场景1:深度学习训练/推理用的PCM振幅序列
你直接拿到的torchaudio.load返回值就是可用的浮点型PCM序列,不需要额外解码。如果需要整数格式的PCM数值,根据目标位深反归一化即可,以最常用的16位PCM为例:import torchaudio waveform, sample_rate = torchaudio.load("your_audio.ogg") # 转换为16位有符号整数型PCM pcm_16bit = (waveform * 32767).to(torch.int16) - 场景2:提取无封装头的裸PCM字节流/文件
方法一:基于PyTorch生态直接转换,不需要额外依赖:
方法二:通过ffmpeg命令行直接提取,适合批量处理场景:import torchaudio waveform, sr = torchaudio.load("your_audio.ogg") pcm_16bit = (waveform * 32767).to(torch.int16) # 转为PCM原始字节 pcm_raw_bytes = pcm_16bit.numpy().tobytes() # 写入裸PCM文件 with open("output.pcm", "wb") as f: f.write(pcm_raw_bytes)
上述命令会提取16位小端有符号整数格式的裸PCM数据,输出文件不带任何音频容器头信息。ffmpeg -i input.ogg -f s16le -acodec pcm_s16le output.pcm
补充说明:如果你加载的是未压缩的wav格式(存储原生PCM数据),
torchaudio.load默认依然会返回归一化的浮点张量,不会直接返回文件内存储的整数PCM字节,需要PCM整数时同样用上述反归一化方法转换即可。
内容的提问来源于stack exchange,提问作者Slim Shady
相关产品推荐
相关产品推荐

