panhg/FunASR-CTC-Nano-INT8-ONNX
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

FunASR-CTC-Nano-INT8-ONNX (Ascend NPU 适配版)

基于 Fun-ASR-Nano 的 ONNX INT8 量化语音识别模型,已适配华为昇腾(Ascend)NPU 硬件。

模型简介

FunASR-CTC-Nano 是一个高效率的语音识别模型,采用 CTC(Connectionist Temporal Classification)解码方案。本仓库提供:

  • ONNX INT8 量化模型:适用于 CPU / 边缘设备部署
  • Ascend NPU 适配:使用 torch_npu 在昇腾 910B 上运行 PyTorch 原生模型
  • 精度对齐验证:NPU (FP16) 与 ONNX (INT8) 输出精度对比

模型架构

组件规格
音频编码器SenseVoiceEncoderSmall (50层 SANM, 512维)
CTC 解码器Transformer (5层, 512维)
输出词汇60,515 (多语言)
参数量~800M

模型文件

文件大小说明
encoder.int8.onnx225 MBINT8 量化音频编码器
ctc.int8.onnx39 MBINT8 量化 CTC 解码器
tokens.txt918 KBToken 词汇表 (60,515 tokens)
inference.py-NPU/CPU 推理脚本 + 精度评测
configuration.json-模型配置文件

环境要求

硬件

  • Ascend 910B NPU (Atlas 800T A2 / A3)
  • CPU: aarch64 / x86_64

软件

组件版本
CANN8.5.1
torch_npu2.9.0.post1
PyTorch2.9.0
funasr1.3.1
onnxruntime1.26.0
# 安装依赖
pip install torch torch_npu onnx onnxruntime funasr modelscope soundfile librosa

快速开始

1. 克隆仓库并下载 ONNX 模型文件

注意: 由于 ONNX 模型文件体积较大(>100MB),未直接存储在 Git 仓库中。请通过 ModelScope 下载:

git clone https://ai.gitcode.com/panhg/FunASR-CTC-Nano-INT8-ONNX.git
cd FunASR-CTC-Nano-INT8-ONNX

pip install modelscope
modelscope download --model jiyilin123/FunASR-CTC-Nano-INT8-ONNX --local_dir .

2. NPU 推理

python inference.py --mode npu --audio <your_audio.wav>

3. CPU 推理 (ONNX Runtime 基线)

python inference.py --mode cpu --audio <your_audio.wav>

4. 精度对比评测

python inference.py --mode compare --audio <your_audio.wav>

5. 性能基准测试

python inference.py --mode benchmark

使用方法

import soundfile as sf
import numpy as np
import torch
import torch_npu
from funasr.models.sanm.encoder import SANMEncoder
from funasr.models.llm_asr.adaptor import Transformer as AdaptorTransformer

# 加载模型
torch.npu.set_device(0)

encoder = SANMEncoder(
    input_size=560, output_size=512, attention_heads=4,
    linear_units=2048, num_blocks=50, dropout_rate=0.1,
    positional_dropout_rate=0.1, attention_dropout_rate=0.1,
    input_layer="pe", normalize_before=True, kernel_size=11,
    sanm_shfit=0, selfattention_layer_type="sanm",
).eval().npu()

ctc_decoder = AdaptorTransformer(
    downsample_rate=1, encoder_dim=512, llm_dim=512,
    ffn_dim=2048, n_layer=5,
).eval().npu()

ctc_proj = torch.nn.Linear(512, 60515).eval().npu()

# 加载权重
checkpoint = torch.load("model.pt", map_location="cpu", weights_only=False)
encoder_state = {k[14:]: v for k, v in checkpoint.items() if k.startswith("audio_encoder.")}
ctc_state = {k[13:]: v for k, v in checkpoint.items() if k.startswith("ctc_decoder.")}
proj_state = {k[12:]: v for k, v in checkpoint.items() if k.startswith("ctc.ctc_lo.")}
encoder.load_state_dict(encoder_state, strict=False)
ctc_decoder.load_state_dict(ctc_state, strict=False)
ctc_proj.load_state_dict(proj_state)

# 推理
feats = torch.randn(1, 100, 560).npu()
feat_lens = torch.tensor([100], dtype=torch.long).npu()
with torch.no_grad():
    enc_out, _, _ = encoder(feats, feat_lens)
    dec_out, _ = ctc_decoder(enc_out, feat_lens)
    logits = ctc_proj(dec_out)
    log_probs = torch.nn.functional.log_softmax(logits, dim=-1)

精度评测

CPU (ONNX INT8) 与 NPU (PyTorch FP16) 精度对齐

指标数值阈值状态
Top-1 Token 匹配率96.00%>= 95%PASS
Top-5 Token 重叠率20.40%--
概率 MAE0.000548< 0.01PASS
概率 MSE2.59e-05--
概率最大偏差0.117--

注:ONNX INT8 量化模型与 PyTorch FP16 原生模型的 logit 绝对值存在差异(MAE=6.93),这是 INT8 量化引入的正常偏差。概率分布层面的 MAE 仅为 0.0005,表明输出分布高度一致。Top-1 匹配率 96% 表明两者的解码结果高度一致。

性能评测

NPU (Ascend 910B) 推理性能

帧数音频时长平均延迟RTFFPS
503.0s143.96 ms0.04806.9
1006.0s141.25 ms0.02357.1
20012.0s148.79 ms0.01246.7
50030.0s142.27 ms0.00477.0
100060.0s153.05 ms0.00266.5

CPU (ONNX INT8) 与 NPU (PyTorch FP16) 性能对比

平台推理时间加速比
CPU (ONNX INT8)0.1592 s1.00x
NPU (torch FP16)0.1456 s1.09x

注:对于短音频(50帧),NPU 与 CPU 速度接近。NPU 优势在长音频和批量推理场景中更明显:

  • NPU 处理 60 秒音频仅需 153ms (RTF=0.0026),远超实时
  • NPU 可以同时处理多个请求,批量推理吞吐量优势显著
  • 首次推理需要模型加载和预热,后续推理延迟更低

环境信息

项目详情
NPU 型号Ascend 910B (2x NPU)
CANN 版本8.5.1
torch_npu 版本2.9.0.post1
PyTorch 版本2.9.0
Python 版本3.11.14
操作系统Linux aarch64

推理流程

音频 (.wav)
    |
    v
[WavFrontend] 提取 FBank 特征 + LFR 降帧
    |  (1, T, 560)
    v
[SANMEncoder] 50层 SANM 音频编码器 (NPU)
    |  (1, T, 512)
    v
[Transformer CTC Decoder] 5层 CTC 解码 (NPU)
    |  (1, T, 512)
    v
[Linear Proj] 512 -> 60515 词汇映射 (NPU)
    |  (1, T, 60515)
    v
[LogSoftmax + CTC Greedy Decode] -> 文字输出

原始模型

  • 来源: FunAudioLLM/Fun-ASR-Nano-2512
  • 许可证: Apache 2.0
  • 参数量: 800M

NPU 适配说明

本模型在华为昇腾 NPU 上的适配方案:

  1. 模型加载: 从 Fun-ASR-Nano PyTorch 检查点提取音频编码器和 CTC 解码器权重
  2. NPU 部署: 使用 torch_npu 将模型迁移到 Ascend 设备
  3. 精度验证: 与 ONNX INT8 量化模型进行逐帧 Top-1 Token 匹配率对比
  4. 性能优化: 使用 torch.npu.synchronize 精确测量延迟,预热消除首次推理抖动

引用

@article{an2025fun,
  title={Fun-ASR Technical Report},
  author={An, Keyu and Chen, Yanni and Deng, Chong and others},
  journal={arXiv preprint arXiv:2509.12508},
  year={2025}
}

许可证

Apache 许可证 2.0