本文档记录 facebook/encodec_24khz EnCodec 神经音频编解码器在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
EnCodec(End-to-End Neural Audio Codec)是 Meta 提出的神经网络音频压缩模型,由 CNN Encoder + Residual Vector Quantizer(RVQ)+ CNN Decoder 三部分组成。该模型将 24kHz 音频波形编码为多层级离散 codebook indices,实现高压缩比(~6kbps)音频传输,同时保持高质量还原。EnCodec 广泛应用于语音合成、音乐生成和低带宽音频通信场景。
该模型在 24kHz 单声道条件下,8 层 RVQ 量化的带宽为 6.0 kbps,支持可变比特率编码。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3decorator、scipy、attrs、psutil 等运行时包conda create -n encodec_24khz python=3.11 -y
conda activate encodec_24khz
pip install torch==2.8.0 torch_npu==2.8.0.post4 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers torchaudio numpy \
decorator scipy attrs psutil \
-i https://pypi.tuna.tsinghua.edu.cn/simpleNPU 上的 EnCodec CNN 算子编译需要
decorator、scipy、attrs等运行时依赖。缺少这些包会导致 ACL 初始化失败。
HF_ENDPOINT=https://hf-mirror.com \
huggingface-cli download facebook/encodec_24khz \
--local-dir ./encodec_24khzpython inference.py --device npu编程接口:
from inference import EncodecCodec
import numpy as np
codec = EncodecCodec(model_path="./encodec_24khz", device="npu")
audio = np.random.randn(24000).astype(np.float32) * 0.01 # 1秒 @ 24kHz
codes = codec.encode(audio)
# codes → list of (1, num_codebooks, frames) arrayspython inference.py --device npu预期输出:编码后的 codebook indices 形状信息(如 [(1, 8, 75)]),无运行时错误。
测试条件:3 段 1 秒合成音频(24000 采样点),NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 4.9 audio/s |
| NPU 吞吐量 | 30.7 audio/s |
| CPU/NPU 加速比 | 6.3 × |
EnCodec 的 CNN Encoder/Decoder 在 NPU 上获得 6.3× 加速。音频信号处理(Conv1d 层)在 NPU 上的加速效果不如 Transformer 模型显著,但总体延迟可满足实时编码需求。
分别在 CPU 和 NPU 上对 3 段合成音频进行编码,比较多层级 RVQ codebook indices 的展平余弦相似度和 MAE。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 1.000000 |
| 精度误差率 | 0.0000% |
结论:精度误差率 0.0000%,NPU 与 CPU 编码输出完全一致,评测通过。
EnCodec 由三个核心组件构成:
EncodecModel.from_pretrained() 加载,model.to("npu:0") 迁移(samples,),不能是 (1, samples) 或 (samples, 1)AutoProcessor 处理音频格式转换,encode() 返回 structure AudioEncoderOutput 含 audio_codestorch_npu → ACL → GE → 需要 decorator、scipy、attrs 等 Python 包import torch, torch_npu
import numpy as np
from transformers import EncodecModel, AutoProcessor
model = EncodecModel.from_pretrained("encodec_24khz").to("npu:0")
processor = AutoProcessor.from_pretrained("encodec_24khz")
audio = np.random.randn(24000).astype(np.float32) * 0.01
inputs = processor(raw_audio=audio, sampling_rate=24000, return_tensors="pt")
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
encoded = model.encode(inputs["input_values"], inputs.get("padding_mask"))
codes = encoded.audio_codes # list of tensors, one per RVQ layertorchaudio.functional.resample())raw_audio 参数须为 (samples,) 一维数组。二维 (1, samples) 格式会报 Expected mono audio 错误decorator scipy attrs psutil。缺少这些包会导致 ACL_PRECISION_MODE 错误bandwidth 参数控制 RVQ 层数(1.5/3.0/6.0/12.0/24.0 kbps),带宽越高音质越好但编码量越大