1. 项目概述
FunASR是阿里巴巴达摩院开源的一款高性能语音识别工具包,特别适合需要实时语音转写的应用场景。作为一名长期从事语音技术开发的工程师,我在多个企业级项目中都采用过这套方案。相比商业API,FunASR最大的优势在于可以私有化部署,既能保证数据安全,又能根据业务需求灵活调整模型。
这个项目最吸引我的三个特点:
- 端到端的流式识别能力,延迟可控制在毫秒级
- 内置说话人分离(Speaker Diarization)功能
- 支持热词定制和领域自适应训练
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备
2.1 服务器选型建议
根据我的部署经验,推荐以下配置:
- CPU:至少4核(推荐8核以上)
- 内存:16GB起步(流式识别需保持常驻内存)
- 磁盘:50GB可用空间(主要存放模型文件)
- 系统:Ubuntu 20.04 LTS(兼容性最佳)
注意:虽然官方说支持国产Linux系统,但在实际测试中,麒麟OS等发行版需要额外安装glibc兼容库
2.2 基础环境配置
先更新系统并安装必要工具:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose
配置docker用户组(避免每次sudo):
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效
3. 部署流程
3.1 镜像获取与加载
官方提供了两种获取镜像的方式:
- 直接拉取(需网络通畅):
bash复制docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.1.5
- 离线加载(适合内网环境):
bash复制tar -zxvf asr_docker.tar.gz
docker load -i asr_docker.tar
验证镜像:
bash复制docker images | grep funasr
应该能看到类似sichuan_asr:v2的镜像名称
3.2 容器启动参数详解
推荐使用这个优化过的启动命令:
bash复制docker run -itd \
--name funasr_service \
-p 10095:10095 \
-p 9090:9090 \
-v /path/to/local/models:/workspace/models \
--restart=unless-stopped \
--cpus=6 \
--memory=12g \
sichuan_asr:v2
参数说明:
-v挂载点:建议将模型文件放在宿主机,方便更新维护--cpus:限制CPU核心数,避免资源争抢--memory:限制内存用量,防止OOM
3.3 服务启动与验证
进入容器:
bash复制docker exec -it funasr_service bash
启动双通道识别服务:
bash复制cd FunASR/runtime
bash run_server_2pass.sh
这个脚本会同时启动:
- 实时流式识别(WebSocket端口10095)
- 离线文件转写(HTTP端口9000)
测试服务是否正常:
bash复制curl http://localhost:9000
应该返回FunASR server is running
4. 进阶配置
4.1 模型管理
模型目录结构说明:
code复制/workspace/models/
├── damo
│ ├── asr_paraformer-large-vad-punc_spk_16k-common
│ └── ...其他模型
└── ...自定义模型
更新模型的方法:
- 下载新版模型到宿主机挂载目录
- 修改
run_server_2pass.sh中的模型路径 - 重启容器
4.2 性能调优
在run_server_2pass.sh中可调整的关键参数:
bash复制# 线程数建议设为CPU核心数的1.5倍
THREAD_NUM=6
# 流式识别缓存大小(单位:毫秒)
CHUNK_SIZE=200
# 是否启用GPU加速(需NVIDIA容器运行时)
USE_GPU=false
5. 接口调用示例
5.1 WebSocket实时识别
Python客户端示例:
python复制import websockets
import asyncio
async def send_audio():
async with websockets.connect("ws://your_server_ip:10095") as ws:
# 发送音频配置
await ws.send('{"mode":"2pass","wav_name":"test.wav"}')
# 流式发送音频数据
with open("test.wav", "rb") as f:
while chunk := f.read(8000):
await ws.send(chunk)
# 获取识别结果
result = await ws.recv()
print(result)
asyncio.get_event_loop().run_until_complete(send_audio())
5.2 HTTP文件转写
使用curl测试:
bash复制curl -X POST "http://localhost:9000" \
-H "accept: application/json" \
-F "file=@test.wav" \
-F "model=paraformer-large"
6. 常见问题排查
6.1 端口冲突问题
如果遇到端口占用错误:
bash复制lsof -i :10095 # 查看占用进程
kill -9 <PID> # 结束冲突进程
6.2 内存不足处理
当出现OOM错误时:
- 减少
run_server_2pass.sh中的THREAD_NUM - 增加docker内存限制
--memory=16g - 使用更小的模型版本
6.3 音频格式要求
支持的格式:
- 采样率:16kHz(推荐)
- 位深:16bit
- 声道:单声道
转换命令示例:
bash复制ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav
7. 生产环境建议
- 使用Nginx反向代理:
nginx复制location /asr {
proxy_pass http://localhost:10095;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
-
启用HTTPS加密传输
-
建议配合Kubernetes实现:
- 自动扩缩容
- 健康检查
- 滚动更新
我在实际部署中发现,当并发量超过50路时,建议采用分布式部署方案,将识别服务和前端Web服务分开部署。同时要注意模型加载时间,冷启动可能需要30-60秒,可以通过预热脚本来解决。
