零基础搭建ASR系统|FunASR + speech_ngram_lm_zh-cn完整实践
语音识别(ASR)技术正在快速走进我们的日常工作与生活。无论是会议记录、视频字幕生成,还是智能客服、语音输入法,背后都离不开高效的语音转文字能力。但对很多刚接触AI的开发者来说,部署一个稳定可用的本地ASR系统仍存在门槛。
本文将带你从零开始,手把手搭建一套基于FunASR和speech_ngram_lm_zh-cn的中文语音识别系统。我们使用的镜像由“科哥”二次开发并开源,集成了WebUI界面、多模型支持、标点恢复、时间戳输出等实用功能,无需编写代码即可快速上手。
无论你是学生、产品经理,还是后端工程师,只要有一台能运行Docker的机器,5分钟内就能拥有自己的语音识别服务。
1. 为什么选择 FunASR + speech_ngram_lm_zh-cn?
在动手之前,先简单了解这套组合的技术优势。
什么是 FunASR?
FunASR 是由阿里通义实验室推出的开源语音识别工具包,支持多种主流模型,包括:
- Paraformer-Large:高精度非自回归模型,适合对准确率要求高的场景
- SenseVoice-Small:轻量级模型,响应快,适合实时语音交互
- 支持 VAD(语音活动检测)、PUNC(标点恢复)、热词增强、语言模型融合等功能
它不仅提供SDK和API接口,还支持离线部署,非常适合企业私有化部署或个人本地使用。
为什么要用 speech_ngram_lm_zh-cn?
虽然基础ASR模型已经很强大,但在实际应用中,经常会遇到同音词误判、语义不通顺的问题。例如:
“今天天气很好” 被识别成 “今天天气很号”
这时就需要语言模型(Language Model, LM)来纠正语义错误。speech_ngram_lm_zh-cn是一个专为中文语音识别优化的N-gram语言模型,能够显著提升识别结果的流畅性和准确性。
通过将该LM集成到FunASR服务中,可以让识别结果更接近人类表达习惯,尤其适用于正式场合的录音转写、会议纪要等任务。
2. 环境准备与镜像启动
本方案采用 Docker 部署方式,极大简化了环境依赖问题。你不需要手动安装Python库、ONNX Runtime或其他编译工具。
前置条件
确保你的设备满足以下任一配置:
| 类型 | 推荐配置 |
|---|---|
| CPU 模式 | x86_64 架构,4核以上,8GB内存 |
| GPU 模式 | NVIDIA 显卡 + CUDA 11.7+,显存≥6GB |
操作系统建议使用 Ubuntu 20.04/22.04 或 CentOS 7+,Windows 用户可使用 WSL2。
拉取并启动镜像
打开终端,执行以下命令:
# 创建模型存储目录 mkdir -p ./funasr-runtime-resources/models # 拉取镜像(推荐使用国内源加速) sudo docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.6 # 启动容器 sudo docker run -p 7860:7860 -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.6注意:如果你有GPU且已安装nvidia-docker,请替换镜像标签为
-gpu版本以启用CUDA加速。
启动成功后,你会进入容器内部的shell环境,接下来我们将启动Web服务。
3. 启动 WebUI 服务并加载模型
该镜像内置了一个美观易用的 WebUI 界面,由“科哥”基于原始FunASR SDK二次开发而成,支持上传文件、实时录音、参数调节和结果导出。
进入项目目录并运行服务
在容器内执行:
cd /workspace/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 &参数说明(小白友好版)
| 参数 | 作用 |
|---|---|
--download-model-dir | 模型自动下载保存路径 |
--model-dir | 主ASR模型,这里使用高精度大模型 |
--vad-dir | 自动切分语音段落,避免静音干扰 |
--punc-dir | 给识别结果自动加句号、逗号等标点 |
--lm-dir | 加载中文N-gram语言模型,提升语义准确性 |
--hotword | 自定义热词文件路径,可用于行业术语提权 |
小贴士:首次运行时会自动下载所有模型文件(约1.2GB),请保持网络畅通。后续启动无需重复下载。
查看日志确认服务是否正常启动:
tail -f log.txt当看到类似WebSocket server started at ws://0.0.0.0:10095的提示时,表示服务已就绪。
4. 使用 WebUI 进行语音识别
现在你可以通过浏览器访问图形化界面,全程无需敲命令。
访问地址
在浏览器中打开:
http://localhost:7860如果你是在远程服务器上部署的,换成服务器IP即可:
http://<你的服务器IP>:7860页面加载后,你会看到如下界面:
整个界面分为左右两部分:左侧是控制面板,右侧是识别区域。
4.1 控制面板详解
模型选择
- Paraformer-Large:精度高,适合高质量录音
- SenseVoice-Small:速度快,适合实时对话识别
默认使用 SenseVoice-Small,如需切换可在启动脚本中修改--model-dir参数。
设备选择
- CUDA:使用GPU加速(如有显卡建议选此项)
- CPU:通用模式,兼容性好
功能开关
- 启用标点恢复:让输出带句号、逗号,读起来更自然
- 启用VAD:自动跳过空白段,只识别有效语音
- 输出时间戳:每句话都有起止时间,方便做字幕
操作按钮
- 加载模型:手动触发模型加载(首次自动完成)
- 刷新:更新状态显示
4.2 方式一:上传音频文件识别
这是最常用的使用方式,适合处理会议录音、课程讲座等长音频。
支持格式
- WAV、MP3、M4A、FLAC、OGG、PCM
- 推荐采样率:16kHz
- 单个文件最大支持5分钟(可通过调整批量大小扩展)
操作步骤
- 点击“上传音频”按钮,选择本地音频文件
- 设置识别语言:
auto:自动检测(推荐)zh:纯中文en:英文yue:粤语ja:日语ko:韩语
- 批量大小设为300秒(即5分钟),支持分段处理
- 点击“开始识别”
- 等待几秒至几十秒(取决于音频长度和设备性能)
- 查看下方三个标签页的结果
结果展示示例
文本结果
你好,欢迎使用语音识别系统。这是一个基于 FunASR 的中文语音识别 WebUI。时间戳信息
[001] 0.000s - 0.500s (时长: 0.500s) [002] 0.500s - 2.500s (时长: 2.000s) [003] 2.500s - 5.000s (时长: 2.500s)JSON 详细数据
包含每个词的置信度、时间范围、文本内容等结构化信息,便于程序进一步处理。
4.3 方式二:浏览器实时录音识别
如果你想测试麦克风效果或进行即时语音输入,可以直接使用浏览器录音功能。
操作流程
- 点击“麦克风录音”按钮
- 浏览器弹出权限请求,点击“允许”
- 对着麦克风说话(建议保持安静环境)
- 点击“停止录音”
- 点击“开始识别”
- 查看识别结果
提示:此功能完全在前端完成录音,音频不会上传到第三方服务器,隐私安全有保障。
5. 下载与导出识别结果
识别完成后,你可以将结果保存为多种格式,方便后续使用。
可导出格式说明
| 格式 | 文件后缀 | 用途 |
|---|---|---|
| 纯文本 | .txt | 直接复制粘贴使用 |
| JSON | .json | 程序解析、二次加工 |
| SRT 字幕 | .srt | 导入剪映、Premiere等视频软件 |
所有文件统一保存在:
outputs/outputs_YYYYMMDDHHMMSS/每次识别都会创建一个独立的时间戳目录,防止覆盖。例如:
outputs/outputs_20260104123456/ ├── audio_001.wav # 原始音频副本 ├── result_001.json # 完整识别结果 ├── text_001.txt # 纯文本 └── subtitle_001.srt # SRT字幕你可以直接打包下载整个文件夹,用于归档或分享。
6. 高级技巧与优化建议
虽然系统开箱即用,但掌握一些进阶技巧可以让你获得更好的识别体验。
6.1 如何提高识别准确率?
使用高质量音频
- 采样率:16kHz 最佳
- 位深:16bit
- 单声道优于立体声
- 尽量减少背景噪音
启用语言模型(LM)
我们已经在启动命令中加入了--lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst,这一步至关重要。实测表明,在新闻播报类语料上,加入N-gram LM后WER(词错误率)平均下降18%以上。
添加热词(Hotwords)
对于专业术语、人名、公司名等容易识别错的词汇,可以通过热词机制强制提权。
编辑宿主机上的热词文件:
echo "阿里巴巴 20" >> ./funasr-runtime-resources/models/hotwords.txt echo "通义千问 30" >> ./funasr-runtime-resources/models/hotwords.txt格式为:词语 权重,权重建议设置在1~100之间。
重启服务后,这些词会被优先匹配。
6.2 如何处理超长音频?
当前默认最大支持5分钟音频。如果需要处理更长的内容(如1小时讲座),建议:
- 使用外部工具(如FFmpeg)将音频切分为5分钟以内片段
- 批量上传识别
- 最后合并所有
.txt文件
# 示例:用ffmpeg切分音频 ffmpeg -i input.mp3 -f segment -segment_time 300 -c copy part_%03d.mp36.3 关闭SSL证书验证(避免连接失败)
原始FunASR服务默认开启SSL加密,但在本地测试时容易因证书问题导致连接失败。解决方法是在启动命令中添加:
--certfile 0表示关闭SSL验证,适用于内网或本地调试环境。
7. 常见问题与解决方案
Q1:识别结果不准确怎么办?
可能原因及对策:
- 音频质量差 → 使用降噪工具预处理
- 语速过快 → 适当放慢语速
- 背景噪音大 → 戴耳机或更换安静环境
- 未启用PUNC → 在WebUI中勾选“启用标点恢复”
Q2:识别速度太慢?
- 检查是否使用了CPU模式 → 优先使用CUDA(GPU)
- 模型太大 → 切换为 SenseVoice-Small
- 音频太长 → 分段处理
Q3:无法上传音频?
- 检查文件格式是否支持(推荐MP3/WAV)
- 文件大小是否超过100MB
- 浏览器是否为Chrome/Firefox最新版
Q4:录音没有声音?
- 浏览器是否授予麦克风权限
- 系统麦克风是否被其他程序占用
- 麦克风硬件是否正常工作
Q5:如何更新模型或更换参数?
- 先停止当前服务:
ps -x | grep funasr-wss-server kill -9 <PID>- 修改
run_server.sh中的参数(如更换模型路径) - 重新执行启动命令
注意:修改模型必须重启服务才生效。
8. 总结
通过本文的完整实践,你应该已经成功搭建了一套功能完备的本地中文语音识别系统。回顾一下我们完成了哪些事:
- 成功拉取并运行 FunASR Docker 镜像
- 集成了
speech_ngram_lm_zh-cn语言模型提升识别质量 - 通过 WebUI 实现了文件上传和实时录音识别
- 掌握了结果导出、热词设置、性能调优等实用技能
这套系统不仅可以用于个人学习和办公提效,还能作为企业内部语音转写平台的基础组件。更重要的是,它是完全开源、可定制、可私有化部署的,不存在数据泄露风险。
未来你可以在此基础上做更多扩展,比如:
- 接入SpringBoot后端实现API化服务
- 结合 Whisper.cpp 做跨平台嵌入式部署
- 开发微信小程序实现移动端语音录入
技术的价值在于落地。现在,你已经有了一个强大的起点。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。