跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI大前端算法

FunASR 离线文件转写服务开发指南(实践篇)

FunASR 离线文件转写服务开发指南(实践篇) 是什么 快速上手 2.1 Docker 安装 2.2 镜像启动 2.3 服务端启动 2.4 客户端测试与使用 客户端用法详解 3.1 Python Client 3.2 C++ Client 3.3 HTML 网页版 3.4 Java Client 3.4.1 Building for Linux/Unix 服务端用法详解 4.1 启动 FunAS…

锁机制发布于 2026/4/6更新于 2026/7/2135K 浏览
FunASR 离线文件转写服务开发指南(实践篇)
  • 1. 是什么
  • 2. 快速上手
    • 2.1 Docker 安装
    • 2.2 镜像启动
    • 2.3 服务端启动
    • 2.4 客户端测试与使用
  • 3. 客户端用法详解
    • 3.1 Python Client
    • 3.2 C++ Client
    • 3.3 HTML 网页版
    • 3.4 Java Client
      • 3.4.1 Building for Linux/Unix
  • 4. 服务端用法详解
    • 4.1 启动 FunASR 服务
    • 4.2 关闭 FunASR 服务
    • 4.3 修改模型及其他参数
  • 5. 如何定制服务部署

本文基于 FunASR 官网文档整理,补充了实践步骤与问题记录,部署环境如下:

# 系统信息
NAME="openEuler"
VERSION="22.03 (LTS-SP3)"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 (LTS-SP3)"
ANSI_COLOR="0;31"
# Docker 版本
Docker version 27.4.0, build bde2b89

1. 是什么

FunASR (Automatic Speech Recognition,自动语音识别) 离线文件转写软件包,提供了一款功能强大的语音离线文件转写服务。拥有完整的语音识别链路,结合了语音端点检测、语音识别、标点等模型,可以将几十个小时的长音频与视频识别成带标点的文字,而且支持上百路请求同时进行转写。输出为带标点的文字,含有字级别时间戳,支持 ITN 与用户自定义热词等。服务端集成有 ffmpeg,支持各种音视频格式输入。软件包提供有 html、python、c++、java 与 c# 等多种编程语言客户端,用户可以直接使用与进一步开发。

文章配图

推荐配置为:

  • 配置 1: (X86,计算型),4 核 vCPU,内存 8G,单机可以支持大约 32 路的请求
  • 配置 2: (X86,计算型),16 核 vCPU,内存 32G,单机可以支持大约 64 路的请求
  • 配置 3: (X86,计算型),64 核 vCPU,内存 128G,单机可以支持大约 200 路的请求

2. 快速上手

2.1 Docker 安装

官网推荐的安装方式:

# 下载安装脚本
curl -O https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/shell/install_docker.sh
# 执行安装命令
sudo bash install_docker.sh

2.2 镜像启动

通过下述命令拉取并启动 FunASR 软件包的 docker 镜像:

# 拉取镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.7
# 创建资源文件夹
mkdir -p ./funasr-runtime-resources/models
# 交互式启动容器
sudo docker run -p 10095:10095 -it --privileged=true \
-v $PWD/funasr-runtime-resources/models:/workspace/models \
registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.7

2.3 服务端启动

docker 启动之后,进入到 docker 里边启动 funasr-wss-server 服务程序:

# 容器内的操作
cd FunASR/runtime
nohup bash run_server.sh \
--download-model-dir /workspace/models \
--vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
--model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx \
--punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \
--itn-dir thuduj12/fst_itn_zh \
--hotword /workspace/models/hotwords.txt > log.txt 2>&1 &

# 如果您想关闭 ssl,增加参数:--certfile 0
# 如果您想使用 SenseVoiceSmall 模型、时间戳、nn 热词模型进行部署,请设置--model-dir 为对应模型:
# iic/SenseVoiceSmall-onnx
# damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx(时间戳)
# damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404-onnx(nn 热词)
# 如果您想在服务端加载热词,请在宿主机文件./funasr-runtime-resources/models/hotwords.txt 配置热词(docker 映射地址为/workspace/models/hotwords.txt):
# 每行一个热词,格式 (热词 权重):阿里巴巴 20(注:热词理论上无限制,但为了兼顾性能和效果,建议热词长度不超过 10,个数不超过 1k,权重 1~100)
# SenseVoiceSmall-onnx 识别结果中'<|zh|><|NEUTRAL|><|Speech|> '分别为对应的语种、情感、事件信息
# 服务启动时容器内的日志信息
root@485ac2db1a1a:/workspace/FunASR/runtime# tail -f log.txt
warn(RuntimeWarning(msg))
2026-03-03 10:45:35,638 - modelscope - INFO - Use user-specified model revision: v2.0.5
Notice: ffmpeg is not installed. torchaudio is used to load audio
If you want to use ffmpeg backend to load audio, please install it by: sudo apt install ffmpeg # ubuntu
# brew install ffmpeg # mac
Downloading [am.mvn]: 100%|██████████|10.9k/10.9k [00:00<00:00, 50.2kB/s]
Downloading [config.yaml]: 100%|██████████|2.83k/2.83k [00:00<00:00, 13.5kB/s]
Downloading [configuration.json]: 100%|██████████|790/790 [00:00<00:00, 3.69kB/s]...
Downloading [model_quant.onnx]: 100%|██████████| 965M/965M [06:08<00:00, 2.74MB/s]
Downloading [README.md]: 100%|██████████|5.11k/5.11k [00:00<00:00, 23.4kB/s]
Downloading [tokens.json]: 100%|██████████|7.90M/7.90M [00:03<00:00, 2.15MB/s]
I20260303 11:01:36.809777 56 funasr-wss-server.cpp:437] Set punc-dir : /workspace/models/damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx
I20260303 11:01:36.809870 56 funasr-wss-server.cpp:466] hotword path: /workspace/models/hotwords.txt
E20260303 11:01:36.810029 56 util.cpp:1009] Unable to open hotwords file: /workspace/models/hotwords.txt. If you have not set hotwords, please ignore this message.
I20260303 11:01:36.813566 56 funasr-wss-server.cpp:488] SSL is opened! certfile path is /workspace/FunASR/runtime/ssl_key/server.crt
I20260303 11:01:36.813755 56 websocket-server.cpp:29] on_tls_init called with hdl: 0x558f9003f1d0
I20260303 11:01:36.813779 56 websocket-server.cpp:30] using TLS mode: Mozilla Intermediate
I20260303 11:01:36.864419 56 fsmn-vad.cpp:58] Successfully load model from /workspace/models/damo/speech_fsmn_vad_zh-cn-16k-common-onnx/model_quant.onnx
I20260303 11:01:40.236037 56 paraformer.cpp:42] Successfully load model from /workspace/models/damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx/model_quant.onnx
I20260303 11:01:48.425398 56 paraformer.cpp:197] Successfully load lm file /workspace/models/damo/speech_ngram_lm_zh-cn-ai-wesp-fst/TLG.fst
I20260303 11:01:50.282640 56 ct-transformer.cpp:21] Successfully load model from /workspace/models/damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx/model_quant.onnx
I20260303 11:01:52.288884 56 tokenizer.cpp:40] Successfully load file from /workspace/models/damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx/jieba.c.dict, /workspace/models/damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx/jieba_usr_dict
I20260303 11:01:52.305197 56 tokenizer.cpp:48] Successfully load model from /workspace/models/damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx/jieba.hmm
I20260303 11:01:52.309901 56 itn-processor.cpp:33] Successfully load model from /workspace/models/thuduj12/fst_itn_zh/zh_itn_tagger.fst
I20260303 11:01:52.311070 56 itn-processor.cpp:35] Successfully load model from /workspace/models/thuduj12/fst_itn_zh/zh_itn_verbalizer.fst
I20260303 11:01:52.311086 56 websocket-server.cpp:423] model successfully inited
I20260303 11:01:52.311093 56 websocket-server.cpp:425] initAsr run check_and_clean_connection
I20260303 11:01:52.311194 56 websocket-server.cpp:428] initAsr run check_and_clean_connection finished
I20260303 11:01:52.311209 56 funasr-wss-server.cpp:513] decoder-thread-num: 40
I20260303 11:01:52.311215 56 funasr-wss-server.cpp:514] io-thread-num: 3
I20260303 11:01:52.311220 56 funasr-wss-server.cpp:515] model-thread-num: 1
I20260303 11:01:52.311225 56 funasr-wss-server.cpp:516] asr model init finished. listen on port:10095

如果您想定制 ngram,参考文档 (如何训练 LM),如果您想部署 8k 的模型,请使用如下命令启动服务:

cd FunASR/runtime
nohup bash run_server.sh \
--download-model-dir /workspace/models \
--vad-dir damo/speech_fsmn_vad_zh-cn-8k-common-onnx \
--model-dir damo/speech_paraformer_asr_nat-zh-cn-8k-common-vocab8358-tensorflow1-onnx \
--punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst-token8358 \
--itn-dir thuduj12/fst_itn_zh \
--hotword /workspace/models/hotwords.txt > log.txt 2>&1 &
  • 服务端详细参数介绍可参考 服务端用法详解。

2.4 客户端测试与使用

下载客户端测试工具目录 samples

wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/sample/funasr_samples.tar.gz

我们以 Python 语言客户端为例,进行说明,支持多种音频格式输入(.wav, .pcm, .mp3 等),也支持视频输入 (.mp4 等),以及多文件列表 wav.scp 输入,其他版本客户端请参考文档(点击此处),定制服务部署请参考 如何定制服务部署

python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline --audio_in "../audio/asr_example.wav"

运行结果:

[root@localhost python]# python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline --audio_in "../audio/asr_example.wav"
Namespace(host='127.0.0.1', port=10095, chunk_size=[5, 10, 5], chunk_interval=10, hotword='', audio_in='../audio/asr_example.wav', audio_fs=16000, send_without_sleep=True, thread_num=1, words_max_print=10000, output_dir=None, ssl=1, use_itn=1, mode='offline')
connect to wss://127.0.0.1:10095
pid0_0: demo: 欢迎大家来体验达摩院推出的语音识别模型。
 timestamp: [[880,1120],[1120,1380],[1380,1540],[1540,1780],[1780,2020],[2020,2180],[2180,2480],[2480,2600],[2600,2780],[2780,3040],[3040,3240],[3240,3480],[3480,3699],[3699,3900],[3900,4180],[4180,4420],[4420,4620],[4620,4780],[4780,5195]]
Exception: sent 1000(OK);then received 1000(OK) end

异常问题处理:

# 启动时的报错信息
Traceback (most recent call last):
  File "/home/jsgx/funasr/samples/python/funasr_wss_client.py", line 4, in <module>
    import websockets, ssl
ModuleNotFoundError: No module named 'websockets'
# 1. 安装 websockets
pip install websockets
# 2. 安装兼容性较好的指定版本
pip install websockets==13.1

3. 客户端用法详解

在服务器上完成 FunASR 服务部署以后,可以通过如下的步骤来测试和使用离线文件转写服务。目前分别支持以下几种编程语言客户端:

  • Python
  • CPP
  • html 网页版本
  • Java

3.1 python-client

若想直接运行 client 进行测试,可参考如下简易说明,以 python 版本为例:

python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline \
--audio_in "../audio/asr_example.wav" --output_dir "./results"

命令参数说明:

--host 为 FunASR runtime-SDK 服务部署机器 ip,默认为本机 ip(127.0.0.1),如果 client 与服务不在同一台服务器,需要改为部署机器 ip
--port 10095 部署端口号
--mode offline 表示离线文件转写
--audio_in 需要进行转写的音频文件,支持文件路径,文件列表 wav.scp
--thread_num 设置并发发送线程数,默认为 1
--ssl 设置是否开启 ssl 证书校验,默认 1 开启,设置为 0 关闭
--hotword 热词文件,每行一个热词,格式 (热词 权重):阿里巴巴 20
--use_itn 设置是否使用 itn,默认 1 开启,设置为 0 关闭

文件是测试 Windows 环境部署的 whisper 时用到的,顺便也对比一下:

# 上点儿强度也测试一下 mp3 格式
python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline \
--audio_in "./whisperTest.mp3" --output_dir "./results"
# 输出结果
Namespace(host='127.0.0.1', port=10095, chunk_size=[5, 10, 5], chunk_interval=10, hotword='', audio_in='./whisperTest.mp3', audio_fs=16000, send_without_sleep=True, thread_num=1, words_max_print=10000, output_dir='./results', ssl=1, use_itn=1, mode='offline')
connect to wss://127.0.0.1:10095
pid0_0: demo: 我呢今年 40 岁,85 年的出生在天津市。父母呢就是普通的工人,没有什么这个过多资源吧,基本上就是家里条件你说多好,也没有说多差,也不至于都是普通家庭吧。大学的时候呢,学文物专业的毕业之后就进了拍卖行工作,就毕业京一直北漂到到今天,我的妻子呢就是我的这个大学同学,然后我们结婚呢也比较晚生,孩子也比较晚,现在孩子也一岁半。
 timestamp: [[930,1070],[1070,1390],[1390,1470],[1470,2070],[2150,2290],[2290,2430],[2430,2730],[2730,2880],[2880,3030],[3030,3210],[3210,3630],[3630,4050],[4050,4350],[4350,4569],[4569,4710],[4710,4830],[4830,5130],[5130,5290],[5290,5470],[5470,5590],[5590,5670],[5670,5770],[5770,5850],[5850,5950],[5950,6090],[6090,6189],[6189,6569],[6569,6730],[6730,6850],[6850,6970],[6970,7230],[7230,7390],[7390,7890],[7890,8029],[8029,8189],[8189,8330],[8330,8510],[8510,8910],[8910,9050],[9050,9170],[9170,9290],[9290,9470],[9470,9670],[9670,9830],[9830,10010],[10010,10130],[10130,10570],[10570,10650],[10650,10910],[10910,11010],[11010,11310],[11310,11450],[11450,11550],[11550,11810],[11810,12010],[12010,12150],[12150,12430],[12430,12570],[12570,12690],[12690,12830],[12830,12930],[12930,13190],[13190,13350],[13350,13610],[13610,13710],[13710,13850],[13850,14010],[14010,14110],[14110,14550],[14550,14710],[14710,14890],[14890,15010],[15010,15090],[15090,15190],[15190,15269],[15269,15450],[15450,15550],[15550,15690],[15690,15850],[15850,16209],[16209,16309],[16309,16449],[16449,16550],[16550,16730],[16730,17089],[17089,17289],[17289,17390],[17390,17509],[17509,17589],[17589,17689],[17689,17890],[17890,18029],[18029,18289],[18289,18449],[18449,18570],[18570,18689],[18689,19009],[19009,19169],[19169,19310],[19310,19470],[19470,19650],[19650,19890],[19890,20009],[20009,20329],[20329,20490],[20490,20664],[20840,21000],[21000,21180],[21180,21439],[21439,21539],[21539,21740],[21740,21900],[21900,22039],[22039,22199],[22199,22660],[22660,22800],[22800,22920],[22920,23020],[23020,23520],[23520,23619],[23619,23740],[23740,23860],[23860,23960],[23960,24099],[24099,24340],[24340,24500],[24500,24640],[24640,24800],[24800,24920],[24920,25260],[25260,25420],[25420,25580],[25580,25660],[25660,25760],[25760,25880],[25880,25960],[25960,26119],[26119,26220],[26220,26340],[26340,26460],[26460,26640],[26640,26779],[26779,26880],[26880,27060],[27060,27355]]
Exception: sent 1000(OK);then received 1000(OK) end

这是我人耳转录的,有些地方听了好几遍才听清楚:

我呢今年 40 岁,85 年的,出生在天津市,父母就是普通工人,没有什么这个过多资源吧,基本上就是家里条件,你说多好也没有,说多差也不至于,都是普通家庭吧,大学的时候学文物专业的,毕业之后呢就进了拍卖行工作,就在北京,一直北漂到今天,我的妻子呢就是我的这个大同学,然后我们结婚也比较晚,生孩子也比较晚,现在孩子也一岁半。

对比结果(左侧 funasr 右侧人耳转录):

文章配图

之前 whisper 的对比:

文章配图

重新比对了一下 whisper 的结果:

文章配图

之所以又重新比对了一次 whisper 的转录结果,原因是 funasr 的转录结果帮我修正了自己耳朵输出的信息,下一个结论:就测试的版本而言,正确率都是挺高的,whisper 存在一定的水土不服,funasr 也有些许的问题。

3.2 cpp-client

进入 samples/cpp 目录后,可以用 cpp 进行测试,指令如下:

./funasr-wss-client --server-ip 127.0.0.1 --port 10095 --wav-path ../audio/asr_example.wav

命令参数说明:

--server-ip 为 FunASR runtime-SDK 服务部署机器 ip,默认为本机 ip(127.0.0.1),如果 client 与服务不在同一台服务器,需要改为部署机器 ip
--port 10095 部署端口号
--wav-path 需要进行转写的音频文件,支持文件路径
--hotword 热词文件,每行一个热词,格式 (热词 权重):阿里巴巴 20
--thread-num 设置客户端线程数
--use-itn 设置是否使用 itn,默认 1 开启,设置为 0 关闭

执行结果:

sended data len=177572
Thread: 139725240264256, total_recv=1, on_message ={"is_final":false,"mode":"offline","stamp_sents":[{"end":5195,"punc":"。","start":880,"text_seg":"欢 迎 大 家 来 体 验 达 摩 院 推 出 的 语 音 识 别 模 型","ts_list":[[880,1120],[1120,1380],[1380,1540],[1540,1780],[1780,2020],[2020,2180],[2180,2480],[2480,2600],[2600,2780],[2780,3040],[3040,3240],[3240,3480],[3480,3699],[3699,3900],[3900,4180],[4180,4420],[4420,4620],[4620,4780],[4780,5195]]}],"text":"欢迎大家来体验达摩院推出的语音识别模型。","timestamp":"[[880,1120],[1120,1380],[1380,1540],[1540,1780],[1780,2020],[2020,2180],[2180,2480],[2480,2600],[2600,2780],[2780,3040],[3040,3240],[3240,3480],[3480,3699],[3699,3900],[3900,4180],[4180,4420],[4420,4620],[4620,4780],[4780,5195]]","wav_name":"wav_default_id"}
Thread: 139725240264256, close client
{"is_final":false,"mode":"offline","stamp_sents":[{"end":5195,"punc":"。","start":880,"text_seg":"欢 迎 大 家 来 体 验 达 摩 院 推 出 的 语 音 识 别 模 型","ts_list":[[880,1120],[1120,1380],[1380,1540],[1540,1780],[1780,2020],[2020,2180],[2180,2480],[2480,2600],[2600,2780],[2780,3040],[3040,3240],[3240,3480],[3480,3699],[3699,3900],[3900,4180],[4180,4420],[4420,4620],[4620,4780],[4780,5195]]}],"text":"欢迎大家来体验达摩院推出的语音识别模型。","timestamp":"[[880,1120],[1120,1380],[1380,1540],[1540,1780],[1780,2020],[2020,2180],[2180,2480],[2480,2600],[2600,2780],[2780,3040],[3040,3240],[3240,3480],[3480,3699],[3699,3900],[3900,4180],[4180,4420],[4420,4620],[4620,4780],[4780,5195]]","wav_name":"wav_default_id"}

3.3 Html 网页版

在浏览器中打开 html/static/index.html,即可出现如下页面,支持麦克风输入与文件上传,直接进行体验,需要输入 asr 服务地址 wss://IP:10095/:

文章配图

报错信息:

I20260303 14:01:36.164183 530 websocket-server.cpp:29] on_tls_init called with hdl: 0x7fb98c010ac0
I20260303 14:01:36.164292 530 websocket-server.cpp:30] using TLS mode: Mozilla Intermediate
[2026-03-03 14:01:36][error] handle_transport_init received error: TLS handshake failed
[2026-03-03 14:01:36][info] asio async_shutdown error: asio.ssl:336462231 (shutdown while in init (SSL routines, SSL_shutdown))

关掉 SSL 重新启动 funasr 服务:

# 如果您想关闭 ssl,增加参数:--certfile 0
cd FunASR/runtime
nohup bash run_server.sh \
--download-model-dir /workspace/models \
--vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
--model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx \
--punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \
--itn-dir thuduj12/fst_itn_zh \
--certfile 0 \
--hotword /workspace/models/hotwords.txt > log.txt 2>&1 &

asr 地址也需要改为 ws://IP:10095/:

文章配图

3.4 Java-client

FunasrWsClient --host localhost --port 10095 --audio_in ./asr_example.wav --mode offline

详细可以参考文档(点击此处)

3.4.1 Building for Linux/Unix
  1. install java environment
# in ubuntu
apt-get install openjdk-11-jdk
  1. Build and run by make
cd funasr/runtime/java
# download java lib
make downjar
# compile
make buildwebsocket
# run client
make runclient
  1. Run java websocket client by shell
# full command refer to Makefile runclient usage: FunasrWsClient [-h][--port PORT][--host HOST][--audio_in AUDIO_IN][--num_threads NUM_THREADS][--chunk_size CHUNK_SIZE][--chunk_interval CHUNK_INTERVAL][--mode MODE]
# Where:
# --host<string>(required) server-ip
# --port<int>(required) port
# --audio_in<string>(required) the wav or pcm file path
# --num_threads<int> thread number for test
# --mode asr mode, support "offline" "online" "2pass"
# example: FunasrWsClient --host localhost --port 8889 --audio_in ./asr_example.wav --num_threads 1 --mode 2pass
# result json, example like: {"mode":"offline","text":"欢迎大家来体验达摩院推出的语音识别模型","wav_name":"javatest"}

4. 服务端用法详解

4.1 启动 FunASR 服务

cd /workspace/FunASR/runtime
nohup bash run_server.sh \
--download-model-dir /workspace/models \
--model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx \
--vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
--punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \
--itn-dir thuduj12/fst_itn_zh \
--certfile ../../../ssl_key/server.crt \
--keyfile ../../../ssl_key/server.key \
--hotword ../../hotwords.txt > log.txt 2>&1 &

run_server.sh 命令参数介绍

--download-model-dir 模型下载地址,通过设置 model ID 从 Modelscope 下载模型
--model-dir modelscope model ID 或者 本地模型路径
--vad-dir modelscope model ID 或者 本地模型路径
--punc-dir modelscope model ID 或者 本地模型路径
--lm-dir modelscope model ID 或者 本地模型路径
--itn-dir modelscope model ID 或者 本地模型路径
--port 服务端监听的端口号,默认为 10095
--decoder-thread-num 服务端线程池个数 (支持的最大并发路数),脚本会根据服务器线程数自动配置 decoder-thread-num、io-thread-num
--io-thread-num 服务端启动的 IO 线程数
--model-thread-num 每路识别的内部线程数 (控制 ONNX 模型的并行),默认为 1,其中建议 decoder-thread-num*model-thread-num 等于总线程数
--certfile ssl 的证书文件,默认为:../../../ssl_key/server.crt,如果需要关闭 ssl,参数设置为 0
--keyfile ssl 的密钥文件,默认为:../../../ssl_key/server.key
--hotword 热词文件路径,每行一个热词,格式:热词 权重 (例如:阿里巴巴 20),如果客户端提供热词,则与客户端提供的热词合并一起使用,服务端热词全局生效,客户端热词只针对对应客户端生效。

4.2 关闭 FunASR 服务

# 查看 funasr-wss-server 对应的 PID
ps -x | grep funasr-wss-server
kill -9 PID

4.3 修改模型及其他参数

替换正在使用的模型或者其他参数,需先关闭 FunASR 服务,修改需要替换的参数,并重新启动 FunASR 服务。其中模型需为 ModelScope 中的 ASR/VAD/PUNC 模型,或者从 ModelScope 中模型 finetune 后的模型。

# 例如替换 ASR 模型为 damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx,则如下设置参数
--model-dir --model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx
# 设置端口号
--port --port <port number>
# 设置服务端启动的推理线程数
--decoder-thread-num --decoder-thread-num <decoder thread num>
# 设置服务端启动的 IO 线程数
--io-thread-num --io-thread-num <io thread num>
# 关闭 SSL 证书
--certfile 0

执行上述指令后,启动离线文件转写服务。如果模型指定为 ModelScope 中 model id,会自动从 ModelScope 中下载如下模型:FSMN-VAD 模型, Paraformer-lagre 模型, CT-Transformer 标点预测模型, 基于 FST 的中文 ITN, Ngram 中文语言模型

如果,您希望部署您 finetune 后的模型(例如 10epoch.pb),需要手动将模型重命名为 model.pb,并将原 modelscope 中模型 model.pb 替换掉,将路径指定为 model_dir 即可。

5. 如何定制服务部署

FunASR-runtime 的代码已开源,如果服务端和客户端不能很好的满足您的需求,您可以根据自己的需求进行进一步的开发:

  • c++ 客户端:https://github.com/alibaba-damo-academy/FunASR/tree/main/runtime/websocket
  • python 客户端:https://github.com/alibaba-damo-academy/FunASR/tree/main/runtime/python/websocket
  • 自定义客户端:如果您想定义自己的 client,参考 websocket 通信协议

c++ 服务端:

VAD

// VAD 模型的使用分为 FsmnVadInit 和 FsmnVadInfer 两个步骤:
FUNASR_HANDLE vad_hanlde = FsmnVadInit(model_path, thread_num); // 其中:model_path 包含"model-dir"、"quantize",thread_num 为 onnx 线程数;
FUNASR_RESULT result = FsmnVadInfer(vad_hanlde, wav_file.c_str(), NULL, 16000); // 其中:vad_hanlde 为 FunOfflineInit 返回值,wav_file 为音频路径,sampling_rate 为采样率 (默认 16k)

使用示例详见:https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/onnxruntime/bin/funasr-onnx-offline-vad.cpp

ASR

// ASR 模型的使用分为 FunOfflineInit 和 FunOfflineInfer 两个步骤:
FUNASR_HANDLE asr_hanlde = FunOfflineInit(model_path, thread_num); // 其中:model_path 包含"model-dir"、"quantize",thread_num 为 onnx 线程数;
FUNASR_RESULT result = FunOfflineInfer(asr_hanlde, wav_file.c_str(), RASR_NONE, NULL, 16000); // 其中:asr_hanlde 为 FunOfflineInit 返回值,wav_file 为音频路径,sampling_rate 为采样率 (默认 16k)

使用示例详见:https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/onnxruntime/bin/funasr-onnx-offline.cpp

PUNC

// PUNC 模型的使用分为 CTTransformerInit 和 CTTransformerInfer 两个步骤:
FUNASR_HANDLE punc_hanlde = CTTransformerInit(model_path, thread_num); // 其中:model_path 包含"model-dir"、"quantize",thread_num 为 onnx 线程数;
FUNASR_RESULT result = CTTransformerInfer(punc_hanlde, txt_str.c_str(), RASR_NONE, NULL); // 其中:punc_hanlde 为 CTTransformerInit 返回值,txt_str 为文本

使用示例详见:https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/onnxruntime/bin/funasr-onnx-offline-punc.cpp

目录

  1. FunASR 离线文件转写服务开发指南(实践篇)
  2. 系统信息
  3. Docker 版本
  4. 1. 是什么
  5. 2. 快速上手
  6. 2.1 Docker 安装
  7. 下载安装脚本
  8. 执行安装命令
  9. 2.2 镜像启动
  10. 拉取镜像
  11. 创建资源文件夹
  12. 交互式启动容器
  13. 2.3 服务端启动
  14. 容器内的操作
  15. 如果您想关闭 ssl,增加参数:--certfile 0
  16. 如果您想使用 SenseVoiceSmall 模型、时间戳、nn 热词模型进行部署,请设置--model-dir 为对应模型:
  17. iic/SenseVoiceSmall-onnx
  18. damo/speechparaformer-large-vad-puncasr_nat-zh-cn-16k-common-vocab8404-onnx(时间戳)
  19. damo/speechparaformer-large-contextualasr_nat-zh-cn-16k-common-vocab8404-onnx(nn 热词)
  20. 如果您想在服务端加载热词,请在宿主机文件./funasr-runtime-resources/models/hotwords.txt 配置热词(docker 映射地址为/workspace/models/hotwords.txt):
  21. 每行一个热词,格式 (热词 权重):阿里巴巴 20(注:热词理论上无限制,但为了兼顾性能和效果,建议热词长度不超过 10,个数不超过 1k,权重 1~100)
  22. SenseVoiceSmall-onnx 识别结果中“<|zh|><|NEUTRAL|><|Speech|> ”分别为对应的语种、情感、事件信息
  23. 服务启动时容器内的日志信息
  24. brew install ffmpeg # mac
  25. 2.4 客户端测试与使用
  26. 启动时的报错信息
  27. 1. 安装 websockets
  28. 2. 安装兼容性较好的指定版本
  29. 3. 客户端用法详解
  30. 3.1 python-client
  31. 上点儿强度也测试一下 mp3 格式
  32. 输出结果
  33. 3.2 cpp-client
  34. 3.3 Html 网页版
  35. 如果您想关闭 ssl,增加参数:--certfile 0
  36. 3.4 Java-client
  37. 3.4.1 Building for Linux/Unix
  38. in ubuntu
  39. download java lib
  40. compile
  41. run client
  42. full command refer to Makefile runclient usage: FunasrWsClient [-h][--port PORT][--host HOST][--audioin AUDIOIN][--numthreads NUMTHREADS][--chunksize CHUNKSIZE][--chunkinterval CHUNKINTERVAL][--mode MODE]
  43. Where:
  44. --host<string>(required) server-ip
  45. --port<int>(required) port
  46. --audio_in<string>(required) the wav or pcm file path
  47. --num_threads<int> thread number for test
  48. --mode asr mode, support "offline" "online" "2pass"
  49. example: FunasrWsClient --host localhost --port 8889 --audioin ./asrexample.wav --num_threads 1 --mode 2pass
  50. result json, example like: {"mode":"offline","text":"欢迎大家来体验达摩院推出的语音识别模型","wav_name":"javatest"}
  51. 4. 服务端用法详解
  52. 4.1 启动 FunASR 服务
  53. 4.2 关闭 FunASR 服务
  54. 查看 funasr-wss-server 对应的 PID
  55. 4.3 修改模型及其他参数
  56. 例如替换 ASR 模型为 damo/speechparaformer-largeasr_nat-zh-cn-16k-common-vocab8404-onnx,则如下设置参数
  57. 设置端口号
  58. 设置服务端启动的推理线程数
  59. 设置服务端启动的 IO 线程数
  60. 关闭 SSL 证书
  61. 5. 如何定制服务部署
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • NVIDIA RTX PC 开源 AI 工具升级:LLM 与扩散模型性能优化
  • HTML5+CSS3+JavaScript 实现高木同学圣诞树 GalGame 开发
  • Node-RED 智能家居自动化配置指南
  • Redis 字符串类型核心命令详解
  • 基于 NVIDIA DGX Spark 部署 Stable Diffusion 3.5 与 ComfyUI
  • Node.js 调试核心要点全解析
  • Java 常见代码示例大全:基础语法到并发编程
  • Vue3 实战:利用 html2canvas 与 jsPDF 完美解决 A4 PDF 分页截断问题
  • AI 代码生成 Prompt 实战:从需求描述到完整函数
  • GitHub Copilot 学生认证零基础入门指南
  • Python 入门学习路线与核心技能解析
  • CATE 条件平均处理效应估计:五大方法原理详解与实战
  • C++ 红黑树详解:原理、实现与性能对比
  • 基于 RAG 的生成式 AI:使用 LlamaIndex、Deep Lake 和 Pinecone 构建检索增强生成管道
  • Web 自动化测试入门:从概念到百度搜索实战
  • 数据结构与算法:链表分类详解与双向链表初始化实现
  • 基于 Spring Boot 的家庭财务管理系统设计与实现
  • GitHub 开源免费 PDF 编辑器推荐:告别破解,高效编辑
  • 双指针算法实战:移动零、快乐数与盛水容器解析
  • JSP 基础 1:客户端请求与前后端交互

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online