基于昇腾 910B NPU 部署 SenseVoiceSmall 语音识别服务

本文记录在昇腾(Ascend)NPU 环境下,基于 Docker 部署 SenseVoiceSmall 语音识别模型的完整过程,包括 HTTP 接口服务启动、WebSocket 流式服务部署及测试。


一、模型准备

模型下载地址:

https://www.modelscope.cn/models/iic/SenseVoiceSmall

本地模型路径:

/data/nvme0/models/SenseVoiceSmall

二、启动 Docker 容器

export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0.post1-openeuler

docker run \
    --name SenseVoiceSmall \
    --shm-size=12g \
    --net host \
    --device /dev/davinci6 \
    --device /dev/davinci_manager \
    --device /dev/devmm_svm \
    --device /dev/hisi_hdc \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64 \
    -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
    -v /etc/ascend_install.info:/etc/ascend_install.info \
    -v /root/.cache:/root/.cache \
    -v /data:/data \
    -it -d $IMAGE bash

进入容器后安装依赖:

pip install -U funasr
yum install -y ffmpeg

三、启动 HTTP 识别服务

funasr-server --host 0.0.0.0 --port 8005 \
  --model-path /data/nvme0/models/SenseVoiceSmall \
  --device npu

服务启动后会在 8005 端口提供 OpenAI 兼容的音频转写接口。

接口测试

1. 下载测试音频:

curl -L https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/BAC009S0764W0121.wav -o sample.wav

2. 调用识别接口:

curl http://<服务器IP>:8005/v1/audio/transcriptions \
  -F "file=@sample.wav" \
  -F "model=sensevoice"

返回结果:

{"text":"甚至出现交易几乎停滞的情况"}

四、WebSocket 流式服务部署

1. 下载源码

wget https://codeload.github.com/modelscope/FunASR/zip/refs/tags/v1.4.16

上传服务器后解压,并安装依赖:

cd FunASR-1.4.16
cd runtime/python/websocket/
pip install -r requirements_server.txt

2. 启动 WebSocket 服务

__MODEL__

nohup python funasr_wss_server.py \
  --port 8006 \
  --device npu \
  --asr_model /data/nvme0/models/SenseVoiceSmall \
  > log.out 2>&1 &

服务启动后会自动加载以下 5 个模型:

序号模型作用
1speech_seaco_paraformer_largeSeACo-Paraformer,带热词功能的离线识别模型。2pass 模式下作为离线纠错模型,一句话结束后重新识别整句音频,利用热词增强输出更准确的最终文本(即日志中 offline final text 的来源)。
2speech_paraformer-large-onlineParaformer-Online,流式识别模型。在音频传输过程中逐块实时输出文字,实现"边说边出字"效果(online 开头的中间结果由此产生)。
3speech_fsmn_vadFSMN-VAD,语音端点检测模型。检测音频中有效语音的起止时间点,切分语音、过滤静音片段,只把有人声的部分送给识别模型,降低无效计算。
4punc_ct-transformerCT-Transformer,实时标点恢复模型。为识别出的文本添加标点,专为流式场景优化,在 VAD 检测到静音时被调用,为历史文本补充标点。
5speech_campplus_sv_zh-cn_16k-commonCAM++,说话人声纹识别模型。提取说话人特征向量(embedding),在会议等场景中用于说话人分离,不输出文字或姓名。

3. 客户端测试

python funasr_wss_client.py \
  --host 127.0.0.1 \
  --port 8006 \
  --mode 2pass \
  --chunk_size "8,8,4" \
  --audio_in ../../funasr_api/asr_example.wav

运行结果:

Namespace(host='127.0.0.1', port=8006, chunk_size=[8, 8, 4],
          encoder_chunk_look_back=4, decoder_chunk_look_back=0,
          chunk_interval=10, hotword='',
          audio_in='../../funasr_api/asr_example.wav', audio_fs=16000,
          send_without_sleep=False, thread_num=1, words_max_print=10000,
          output_dir=None, ssl=1, use_itn=1, mode='2pass',
          result_timeout=300.0, log_dir='./asr_logs', log_flush_every=1)
connect to wss://127.0.0.1:8006
hotword
[LATENCY] wav=demo, mode=2pass-online, from_last_chunk=4.8 ms, from_first_chunk=1551.4 ms
pid0_0: 欢
pid0_0: 欢迎大
pid0_0: 欢迎大家来体
pid0_0: 欢迎大家来体验达
pid0_0: 欢迎大家来体验达摩院
pid0_0: 欢迎大家来体验达摩院推出
pid0_0: 欢迎大家来体验达摩院推出的语
pid0_0: 欢迎大家来体验达摩院推出的语音识
pid0_0: 欢迎大家来体验达摩院推出的语音识别模
pid0_0: 欢迎大家来体验达摩院推出的语音识别模型 [spk=unknown score=0.000]

从日志中可以看到流式识别的全过程:随着音频逐块送入,模型实时返回中间结果,并在句末输出最终文本。


五、总结

  • HTTP 模式(funasr-server):适合一次性短音频的离线转写,接口简单易集成。
  • WebSocket 模式(funasr_wss_server.py):适合实时语音流场景,支持 2pass 模式(流式 + 离线纠错),可同时输出中间结果和最终结果。
  • 借助昇腾 NPU + vllm-ascend 镜像,整个推理过程均在 NPU 上完成,部署流程与 GPU 版本基本一致。

本文环境: vllm-ascend:v0.23.0.post1-openeuler 镜像 + 昇腾 NPU 卡(设备 单卡910B)。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐