z
zkx_/encodec_24khz-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

facebook/encodec_24khz on Ascend NPU

1. 简介

本文档记录 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,支持可变比特率编码。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/facebook/encodec_24khz

2. 验证环境

组件版本
torch2.8.0
torch_npu2.8.0.post4
transformers5.8.1
CANN8.5.1
  • NPU:8 × Ascend 910B3
  • 精度对比基准:CPU(x86, PyTorch 2.8.0)
  • 额外依赖:NPU 算子编译需要 decorator、scipy、attrs、psutil 等运行时包

3. 部署使用流程

3.1 环境准备

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/simple

NPU 上的 EnCodec CNN 算子编译需要 decorator、scipy、attrs 等运行时依赖。缺少这些包会导致 ACL 初始化失败。

3.2 模型权重下载

HF_ENDPOINT=https://hf-mirror.com \
    huggingface-cli download facebook/encodec_24khz \
    --local-dir ./encodec_24khz

3.3 推理脚本使用

python 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) arrays

4. Smoke 验证

python inference.py --device npu

预期输出:编码后的 codebook indices 形状信息(如 [(1, 8, 75)]),无运行时错误。

5. 性能参考

测试条件: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 模型显著,但总体延迟可满足实时编码需求。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 3 段合成音频进行编码,比较多层级 RVQ codebook indices 的展平余弦相似度和 MAE。

6.2 评测结果

指标数值
平均余弦相似度1.000000
精度误差率0.0000%

结论:精度误差率 0.0000%,NPU 与 CPU 编码输出完全一致,评测通过。

7. 迁移适配说明

7.1 模型结构

EnCodec 由三个核心组件构成:

  1. CNN Encoder:多层 Conv1d + ELU 激活 + 下采样,将 24kHz 波形编码为每帧 128 维的潜在表示(时间分辨率降低 320×)
  2. Residual Vector Quantizer(RVQ):8 层级联 VQ,每层对残差进行量化。每帧输出 8 个离散 codebook index(codebook size=1024),总带宽约 6 kbps
  3. CNN Decoder:ConvTranspose1d 上采样 + ELU,从量化 code 重建音频波形

7.2 适配要点

  1. 使用 EncodecModel.from_pretrained() 加载,model.to("npu:0") 迁移
  2. 音频输入需为 24kHz 单声道格式 (samples,),不能是 (1, samples) 或 (samples, 1)
  3. AutoProcessor 处理音频格式转换,encode() 返回 structure AudioEncoderOutput 含 audio_codes
  4. NPU 运行时依赖链:torch_npu → ACL → GE → 需要 decorator、scipy、attrs 等 Python 包
  5. CNN 卷积算子在 NPU 上原生加速,RVQ 的 argmin 操作也在 NPU 上执行

7.3 关键代码

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 layer

8. 注意事项

  1. 采样率要求:该模型仅支持 24kHz 单声道。非 24kHz 音频需先重采样(使用 torchaudio.functional.resample())
  2. 输入格式:raw_audio 参数须为 (samples,) 一维数组。二维 (1, samples) 格式会报 Expected mono audio 错误
  3. NPU 运行时依赖:EnCodec 是较复杂的 CNN 模型,NPU 上需额外安装 decorator scipy attrs psutil。缺少这些包会导致 ACL_PRECISION_MODE 错误
  4. 可变码率:bandwidth 参数控制 RVQ 层数(1.5/3.0/6.0/12.0/24.0 kbps),带宽越高音质越好但编码量越大
  5. CNN 加速比:CNN 在 NPU 上的加速比(6.3×)低于 Transformer(20-60×),因为 Conv1d 在 x86 CPU 上已高度优化(MKL/OpenBLAS)