基于 Fun-ASR-Nano 的 ONNX INT8 量化语音识别模型,已适配华为昇腾(Ascend)NPU 硬件。
FunASR-CTC-Nano 是一个高效率的语音识别模型,采用 CTC(Connectionist Temporal Classification)解码方案。本仓库提供:
| 组件 | 规格 |
|---|---|
| 音频编码器 | SenseVoiceEncoderSmall (50层 SANM, 512维) |
| CTC 解码器 | Transformer (5层, 512维) |
| 输出词汇 | 60,515 (多语言) |
| 参数量 | ~800M |
| 文件 | 大小 | 说明 |
|---|---|---|
encoder.int8.onnx | 225 MB | INT8 量化音频编码器 |
ctc.int8.onnx | 39 MB | INT8 量化 CTC 解码器 |
tokens.txt | 918 KB | Token 词汇表 (60,515 tokens) |
inference.py | - | NPU/CPU 推理脚本 + 精度评测 |
configuration.json | - | 模型配置文件 |
| 组件 | 版本 |
|---|---|
| CANN | 8.5.1 |
| torch_npu | 2.9.0.post1 |
| PyTorch | 2.9.0 |
| funasr | 1.3.1 |
| onnxruntime | 1.26.0 |
# 安装依赖
pip install torch torch_npu onnx onnxruntime funasr modelscope soundfile librosa注意: 由于 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 .python inference.py --mode npu --audio <your_audio.wav>python inference.py --mode cpu --audio <your_audio.wav>python inference.py --mode compare --audio <your_audio.wav>python inference.py --mode benchmarkimport 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)| 指标 | 数值 | 阈值 | 状态 |
|---|---|---|---|
| Top-1 Token 匹配率 | 96.00% | >= 95% | PASS |
| Top-5 Token 重叠率 | 20.40% | - | - |
| 概率 MAE | 0.000548 | < 0.01 | PASS |
| 概率 MSE | 2.59e-05 | - | - |
| 概率最大偏差 | 0.117 | - | - |
注:ONNX INT8 量化模型与 PyTorch FP16 原生模型的 logit 绝对值存在差异(MAE=6.93),这是 INT8 量化引入的正常偏差。概率分布层面的 MAE 仅为 0.0005,表明输出分布高度一致。Top-1 匹配率 96% 表明两者的解码结果高度一致。
| 帧数 | 音频时长 | 平均延迟 | RTF | FPS |
|---|---|---|---|---|
| 50 | 3.0s | 143.96 ms | 0.0480 | 6.9 |
| 100 | 6.0s | 141.25 ms | 0.0235 | 7.1 |
| 200 | 12.0s | 148.79 ms | 0.0124 | 6.7 |
| 500 | 30.0s | 142.27 ms | 0.0047 | 7.0 |
| 1000 | 60.0s | 153.05 ms | 0.0026 | 6.5 |
| 平台 | 推理时间 | 加速比 |
|---|---|---|
| CPU (ONNX INT8) | 0.1592 s | 1.00x |
| NPU (torch FP16) | 0.1456 s | 1.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] -> 文字输出本模型在华为昇腾 NPU 上的适配方案:
torch_npu 将模型迁移到 Ascend 设备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