FunASR 离线语音转写:一条命令部署加一条命令转写的本地完整实操指南
【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR
客服录音质检、会议纪要、庭审与访谈转写,这类音频往往不能离开内网:合规要求数据不出域,云端 API 按量计费且延迟不可控。FunASR 是达摩院开源的语音识别工具包,一条部署脚本即可把 ASR 识别、VAD 端点检测、标点补全装进一个本地 WebSocket 服务,音频进、文本出,全程不经过任何云端接口。
🧩 FunASR 能力模块与适用边界
| 模块 | 解决什么问题 | 本文路径 |
|---|---|---|
| ASR 识别(Paraformer-Large 中文) | 把音频转成文字,整段离线识别精度最高 | ✅ 核心路径 |
| VAD(FSMN-VAD,语音端点检测,判断哪段有人在说话) | 切掉长音频里的静音段,分段送识别 | ✅ 服务端内置,随流水线自动执行 |
| 标点补全(CT-Transformer) | 给识别文本加逗号、句号,输出可读段落 | ✅ 服务端内置 |
| 流式识别(online / 2pass 模式) | 边说边出字;2pass 先流式出草稿再离线修正 | ⭕ 客户端开关切换,本文只演示 offline |
| 说话人分离、训练自训模型、热词 NN 模型 | 多人会议分轨、领域微调、强召回 | ❌ 超出本文范围,见文末扩展材料 |
适用场景:内网闭环、数据合规敏感、文件级批量转写(会议纪要、客服录音、庭审录音)。 不适用:需要 GPU 高吞吐推理、需要实时直播级低延时、需要训练自有领域模型的读者,本文只覆盖 CPU 单机的最短落地路径。
🩺 部署前体检:依赖清单
- 操作系统:Linux(Ubuntu / CentOS / Debian,脚本读取
/etc/os-release自动适配);Windows 走 Docker Desktop 并开启 WSL2 后端 - Docker:缺失时一行安装(FunASR 官方脚本):
curl -O https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/shell/install_docker.sh && sudo bash install_docker.sh # 验证:docker info 能输出系统信息即安装成功- 磁盘:预留 ≥ 10GB(Docker 镜像 + ASR/VAD/标点三个模型 + 样例)
- 外网:脚本需拉取镜像(阿里云容器镜像仓库)并下载模型,机器必须可出网
- 端口:10095 空闲,用
ss -lntp | grep 10095确认无输出
🚀 一键部署离线转写服务
第 1 步:获取源码
git clone https://gitcode.com/GitHub_Trending/fun/FunASR cd FunASR/runtime/deploy_tools成功标志:当前目录能看到funasr-runtime-deploy-offline-cpu-zh.sh脚本文件。
第 2 步:安装并启动服务
sudo bash funasr-runtime-deploy-offline-cpu-zh.sh install脚本按 6 个阶段执行:拉取镜像列表 → 选择 ASR/VAD/标点模型 → 输入端口(默认 10095,直接回车)→ 展示参数确认(输入 Y)→ 自动安装 Docker 并拉镜像 → 启动容器并下载样例。
成功标志:终端输出The service has been started.,同时样例代码已解压到./funasr-runtime-resources/samples/。
服务自检:三条命令确认服务活着
# 1. 查看当前全部配置(端口、SSL、线程数) sudo bash funasr-runtime-deploy-offline-cpu-zh.sh show # 2. 确认容器处于 Up 状态 sudo docker ps | grep funasr_repo # 3. 探测 10095 端口(服务端默认开 SSL 自签证书,用 -k 跳过校验) curl -k -s -o /dev/null -w "%{http_code}\n" https://127.0.0.1:10095正常返回:docker ps中 STATUS 列为Up;curl 打印出任意 HTTP 状态码(如400或200)即表示有进程在监听。返回000或提示Connection refused说明服务未起。
🎙️ 最小闭环:完成一次真实转写
输入样例:部署脚本已下载一段示例音频asr_example.wav(中文 16k 录音),路径在仓库根目录下为:
runtime/deploy_tools/funasr-runtime-resources/samples/audio/asr_example.wav一条命令转写(在仓库根目录执行):
# 先装客户端依赖(仅需一次) pip install -r runtime/python/websocket/requirements_client.txt # 发起一次 offline 整段识别,结果写入 ./out python runtime/python/websocket/funasr_wss_client.py \ --host 127.0.0.1 --port 10095 \ --mode offline \ --audio_in runtime/deploy_tools/funasr-runtime-resources/samples/audio/asr_example.wav \ --output_dir ./out终端实时输出样例(识别文本随音频长度变化,此处为示意):
connect to wss://127.0.0.1:10095 pid0_0: asr_example.wav: 你好,这是一段用于测试离线语音识别的示例音频。 [MEETING 0_0] connection closed normally end看到pid0_0:开头的行即转写成功。
产物文件位置:
| 路径 | 内容 |
|---|---|
./out/text.0_0 | 每行一条结果:音频名 \t 文本 \t 时间戳(带时间戳的 tab 分隔文本) |
./asr_logs/ | events.jsonl(服务端每条消息)与meta.json(本次运行参数),便于复现与验收 |
不想敲命令的话,用浏览器打开runtime/html5/static/index.html,填入服务地址与端口 10095,直接上传音频或点麦克风转写。
🎛️ 常用开关速查
| 参数 / 开关 | 作用 | 何时用 |
|---|---|---|
--audio_in <wav.scp> | 批量:scp 文件每行标签 路径,逐条转写 | 一次转多个录音 |
--mode online/--mode 2pass | 流式边说边出 / 先流式草稿再离线修正 | 会议实时字幕、需要低延时出字 |
| 非 wav 输入(mp3、m4a) | 客户端需 FFmpeg 解码 | apt-get install -y ffmpeg(Windows 用winget install ffmpeg) |
--hotword <file.txt> | 热词文件,每行词 权重,如达摩院 20 | 专有名词、术语、产品名易错时提升召回 |
--use_itn 0 | 关闭数字归一化(ITN 会把"一百二十三"转成"123") | 希望保留原始读法时 |
--ssl 0 | 客户端走 ws:// 明文连接 | 服务端已执行update --ssl 0 |
--thread_num 4 | 客户端多线程并行发送多个文件 | 大批量时单线程吞吐不够 |
update --asr_model <模型ID或本地路径> | 服务端换 ASR 模型(改完自动重启) | 换行业领域模型 |
update --decode_thread_num 8/--io_thread_num 2 | 调服务端解码/IO 线程数 | 压测发现并发不足 |
update --host_port 10096 | 换监听端口(自动重启容器) | 10095 被占用 |
🧯 排坑清单
症状:curl 返回
000或Connection refused原因:容器未启动,或端口与--show显示的不一致解法:sudo bash funasr-runtime-deploy-offline-cpu-zh.sh start,再--show核对实际端口症状:
install卡在模型下载进度条不动原因:机器无法访问模型源或镜像仓库(网络策略拦截)解法:确认出网;模型落盘在funasr-runtime-resources/models/,可手动放好后重跑start症状:转写 mp3/m4a 报错、解码失败原因:客户端缺 FFmpeg,无法解压缩格式解法:
apt-get install -y ffmpeg(Windows 用winget install ffmpeg)后重跑症状:提示 10095 端口被占用,容器起不来原因:本机已有服务占用默认端口解法:
update --host_port 10096(脚本自动重启),客户端--port 10096同步改症状:客户端报 SSL 证书相关错误原因:服务端默认使用自签证书解法:示例客户端默认
--ssl 1且跳过证书校验;需明文时服务端update --ssl 0,客户端加--ssl 0
边界与延伸材料
本文覆盖的是 CPU 单机、文件级离线转写的最短路径:16k 中文录音、VAD 切分、离线识别、标点补全,适合对数据出网敏感的内网业务闭环。若需要实时听写、说话人分离、时间戳精细对齐或训练领域模型,请延伸阅读:
- 官方快速开始(Python 版 WebSocket 服务端/客户端更多示例):runtime/quick_start_zh.md
- 离线服务部署进阶指南(换模型、ITN、热词服务端配置):runtime/docs/SDK_advanced_guide_offline_zh.md
- 客户端完整参数与用法:runtime/python/websocket/README.md
【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考