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

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生态直接转换,不需要额外依赖:
    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)
    
    方法二:通过ffmpeg命令行直接提取,适合批量处理场景:
    ffmpeg -i input.ogg -f s16le -acodec pcm_s16le output.pcm
    
    上述命令会提取16位小端有符号整数格式的裸PCM数据,输出文件不带任何音频容器头信息。

补充说明:如果你加载的是未压缩的wav格式(存储原生PCM数据),torchaudio.load默认依然会返回归一化的浮点张量,不会直接返回文件内存储的整数PCM字节,需要PCM整数时同样用上述反归一化方法转换即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:54:25