一、前言:ASR 真正难的地方,不是“把模型跑起来”
做过语音识别项目的人应该都有这种感觉:
模型下载下来,跑通 Demo,其实没那么难。
真正开始做项目以后,问题一个接一个。
比如:
一小时会议录音,为什么转写需要很长时间?
同一个模型,在测试机器上很快,放到生产服务器就变慢?
多个人同时说话时,文字为什么会互相串?
会议中有键盘声、空调声、敲桌子声,识别结果明显下降怎么办?
一段 2 小时录音,直接丢给 ASR 会不会导致内存持续上涨?
离线环境不能访问 Hugging Face,模型怎么部署?
GPU 只有一张,但同时来了十几个会议任务怎么办?
模型升级以后,怎么保证旧版本还能正常工作?
Java 后端已经有完整的微服务体系,ASR 模型难道也要全部改成 Python?
这些问题,才是企业级 ASR 部署真正需要考虑的事情。
在熙瑾会悟这类会议场景中,ASR 并不是一个单独的“语音转文字接口”,而是整个会议智能化链路中的基础能力。
从麦克风采集声音,到音频预处理,再到 VAD、ASR、标点恢复、时间戳、说话人识别,最后进入会议纪要和大模型分析,中间其实有一条比较长的处理链。
所以这篇文章不准备单纯介绍某一个 ASR 模型,而是结合实际工程场景,聊一聊 ASR 部署过程中比较容易踩坑的问题,以及我们最终采用什么方式解决。
二、熙瑾会悟 ASR 整体处理链路
先把整体架构摆出来。
如果采用离线部署方式,那么中间的模型推理部分通常全部放在企业自己的服务器上。

这里有一个比较重要的思路:
不要把 ASR 模型直接塞进业务服务。
业务系统负责的是任务、权限、文件、状态和结果。
模型服务负责的是推理。
两边最好解耦。
这对后面扩容、模型升级和故障排查都会方便很多。
三、ASR 部署过程中遇到的几个核心问题
1. 模型太大,服务器资源吃不消
这是最直接的问题。
Whisper、Paraformer、SenseVoice 等模型,在不同模型规格下,对 CPU、GPU、显存和内存的需求差异很大。
尤其是在企业内网环境中,服务器资源不像公有云那么容易扩容。
假设业务要求:
同时处理多个会议,并且希望接近实时转写。
这时候单纯追求“大模型”并没有意义。
模型越大,不代表最终业务效果一定越好。
我们更关注的是:
几个指标之间需要做平衡。
四、模型选型:Whisper、Paraformer、SenseVoice 怎么选?
实际部署时,可以重点关注下面几个方向。
|
模型 |
特点 |
适合场景 |
|
Whisper |
多语言能力较强,生态成熟 |
多语言、通用语音识别 |
|
Paraformer |
非自回归结构,推理速度较好 |
中文会议、实时转写 |
|
SenseVoice |
兼顾语音识别及语音相关任务 |
中文语音、复杂语音场景 |
|
FunASR系列 |
国内开源生态较完善 |
中文 ASR、企业私有化 |
|
Wav2Vec2 |
Transformer 语音识别路线 |
二次训练、研究和定制 |
如果项目主要面对中文企业会议,我个人比较倾向于优先评估:
Paraformer / SenseVoice + VAD + 后处理
而不是上来就直接使用一个非常大的模型。
原因很简单。
企业会议真正关心的不是模型参数有多少,而是:
“一个两小时会议,最终能不能稳定、快速、准确地生成可用文字?”
五、第一个关键问题:离线环境怎么部署 ASR?
这是企业项目中经常碰到的问题。
尤其是政企、制造业、科研院所等场景,服务器可能完全没有公网访问权限。
这时候不能指望:
pip install xxx
然后在线下载模型。
生产环境通常需要提前准备完整的软件包和模型文件。
例如:

部署之前,在有网络的环境完成:
- Python 依赖下载
- 模型下载
- CUDA / Runtime 准备
- Docker 镜像构建
- 模型文件完整性校验
- 离线安装包制作
然后把整个部署包带入内网。
六、第二个问题:模型能运行,但速度不够
这也是非常典型的问题。
第一次部署的时候,很多开发人员喜欢直接:
是能跑的。
但是生产环境一上来,问题就出现了。
比如一个 60 分钟的录音,处理速度只有 10~20 分钟音频/小时。
对于离线批处理还可以接受。
如果要求实时会议转写,就明显不够用了。
这时候需要考虑推理优化。
七、ONNX Runtime:第一个比较实用的优化方向
如果模型本身支持 ONNX,可以考虑将模型转换成 ONNX 格式。
整体链路变成:
相比直接使用原始 PyTorch 推理,ONNX Runtime 在很多部署场景中更加方便。
尤其适合:
服务化部署
CPU 推理
GPU 推理
多线程推理
Java / C++ 服务集成
当然,具体性能还是需要根据模型结构、硬件环境进行 benchmark。
不能简单理解为:
“换成 ONNX,速度一定提升十倍。”
实际项目中应该用真实会议音频测试。
八、GPU 环境下进一步考虑 TensorRT
如果企业服务器有 NVIDIA GPU,并且对实时性要求比较高,可以进一步考虑 TensorRT。
典型路线:
TensorRT 可以通过算子融合、精度优化、内存优化等方式降低推理成本。
例如:

对于 ASR 这种大量矩阵计算的模型来说,GPU 加速往往比较明显。
不过这里需要注意:
TensorRT 并不是“安装完成就结束”。
不同 CUDA、驱动、TensorRT 版本之间存在兼容关系。
生产环境一定要把版本固定下来。
比如:
其中任何一层发生变化,都可能导致模型无法正常加载。
所以建议生产环境使用 Docker 固化。
九、第三个问题:会议里面为什么总是识别错?
模型只是其中一个因素。
真实会议环境比测试数据复杂得多。
比如:
空调声音 键盘声音 翻页声音 手机震动 多人同时讲话 远距离拾音 麦克风回声 背景音乐 办公室环境噪声 如果原始音频质量不好,后面再好的模型也很难完全解决。
所以 ASR 前处理非常重要。
十、VAD:很多人低估了它的重要性
VAD,也就是:
Voice Activity Detection
语音活动检测。
简单理解就是:
先判断这一段音频有没有人在说话。
例如:
00:00 - 00:03 安静 00:03 - 00:08 讲话 00:08 - 00:12 安静 00:12 - 00:20 讲话 经过 VAD:
[03-08] [12-20] 真正送给 ASR 模型。
这样做有几个好处:
减少无效计算
降低模型负载
减少空白文本
改善长音频切分
提高实时识别稳定性
在会议场景里,这一步其实非常重要。
十一、音频切分也不能太随意
比如一段 2 小时的会议录音。
如果直接整个文件送进去:
显然不够合理。
我们通常会先切成多个 Segment:
Segment 01 00:00 - 00:18 Segment 02 00:18 - 00:42 Segment 03 00:42 - 01:05 ... 然后进行批量推理。
但是切分又不能太机械。
如果一句话被切成两半:
我们今天主要讨论 被切成:
我们今天主要 和:
讨论项目进度 后面就容易出现上下文丢失。
因此需要给切分增加:
VAD + 最大时长 + 最小语音长度 + 上下文窗口
这些约束。
十二、第四个问题:实时会议和离线转写不能用同一种策略
这个问题在项目初期特别容易被忽略。
实际上:
实时 ASR 和离线 ASR 是两套不同的优化思路。
离线转写
比如:
这种模式更加关注:
总处理时间
稳定性
准确率
GPU 利用率
实时转写
实时会议则不同。
链路通常是:

这时候最重要的是:
延迟。
用户说完一句话以后,不能过几秒钟才显示。
否则用户会明显感觉系统“卡”。
十三、流式 ASR 的核心:Chunk
比如每 200ms~1000ms 获取一个音频片段。
Chunk 01 Chunk 02 Chunk 03 Chunk 04 ... 然后持续送入模型。
但 Chunk 不能设置得太短。
太短:
计算次数增加 上下文不足 识别容易抖动 太长:
延迟增加 实时体验下降 因此这里通常需要结合具体模型和业务进行测试。
十四、第五个问题:多人会议中的“谁说的”怎么办?
ASR 只解决一个问题:
“说了什么?”
但是会议系统还需要知道:
“谁说的?”
这就涉及:
Speaker Diarization,说话人分离。
典型流程:
音频 ↓ VAD ↓ Speaker Embedding ↓ Speaker Diarization ↓ Speaker 01 Speaker 02 Speaker 03 ↓ ASR 最终输出:
[00:01:32] 张老师: 我们先看一下当前项目进度。 [00:01:46] 李工: 目前后端接口已经完成。 [00:02:03] 王经理: 那测试环境什么时候可以部署? 这时候会议纪要才真正有业务价值。
十五、声纹识别与 ASR 如何配合?
如果系统已经有人员声纹库,可以进一步做:
Speaker 01 ↓ 声纹特征 ↓ 向量检索 ↓ 人员库 ↓ 张三 但是这里不要把两个事情混在一起。
声纹识别负责“这个声音是谁”。
ASR 负责“他说了什么”。
两者是互补关系。
十六、第六个问题:ASR 输出文本不能直接拿去做会议纪要
这一点在实际开发中也非常明显。
ASR 输出通常是:
嗯那个我们今天主要是讨论一下项目目前这个进度然后呢 现在研发这边基本上已经完成了然后测试这块呢可能还需要 两三天左右大家看一下有没有什么问题 这不是会议纪要能直接使用的文本。
所以后面还需要做文本后处理。
例如:

如果再接大模型:

这才是完整的“会悟”链路。
十七、为什么 ASR 后面还需要一个文本纠错层?
因为企业会议里有大量专业词。
例如:
Transformer Kubernetes MyBatis Spring Cloud Paraformer TensorRT PostgreSQL 如果训练数据中没有这些词,ASR 很容易出现同音字或者近音词。
所以可以建立一个:
企业领域词典。
例如:
dictionary:
- 熙瑾会悟
- Paraformer
- SenseVoice
- TensorRT
- Kubernetes
- Spring Cloud
- MyBatis
然后在后处理阶段做术语纠正。
这对于企业内部系统特别实用。
十八、第七个问题:模型并发怎么解决?
单模型单任务:
没有什么问题。
但是生产环境:

如果全部同时进入模型,很容易出现:
GPU 显存不足
CPU 占满
请求超时
服务崩溃
推理延迟突然升高
所以建议增加任务队列。
例如:

ASR Worker 根据 GPU 数量进行扩展。
十九、为什么推荐 ASR 与 Java 微服务解耦?
如果业务系统本身是 Java 技术栈,例如:
Spring Boot Spring Cloud MyBatis MySQL Redis Kafka 而 ASR 模型主要使用:
Python PyTorch ONNX Runtime CUDA 没有必要强行把两套技术栈揉成一套。
可以采用:

其中:
- HTTP:适合普通文件任务
- WebSocket:适合实时音频流
- gRPC:适合内部高性能服务调用
这样后期替换 ASR 模型,也不会影响业务系统。
二十、一个比较完整的企业级 ASR 部署架构
结合前面的内容,可以整理成:

这个架构的好处是比较清晰。
以后模型发生变化:
或者:

业务层基本不用改。
二十一、模型版本管理,这个事情一定要做
AI 项目有一个很容易被忽略的问题:
模型也是生产依赖。
建议不要直接:
models/latest 而应该:
配置文件指定当前使用版本:
asr:
model: paraformer
version: v1.1
升级模型的时候:

不要直接覆盖生产模型。
否则出了问题很难回滚。
二十二、监控也是 ASR 部署的一部分
ASR 服务上线以后,不能只看:
服务是不是 UP 还应该关注:
GPU利用率 GPU显存 CPU利用率 内存 任务队列长度 平均推理时间 P95延迟 失败任务数 音频处理时长 实时率 RTF 例如可以使用:
Prometheus ↓ Grafana 进行监控。
日志则可以结合:
ELK 或者企业现有日志平台。
二十三、ASR 性能优化,我最终比较关注这几个指标
一个 ASR 服务到底快不快,不建议只看“多少毫秒”。
更适合关注:
1. RTF
RTF,也就是:
Real Time Factor
简单理解:
RTF = 处理耗时 / 音频时长 比如:
60分钟音频 处理用了6分钟 RTF = 0.1 RTF 越低,说明处理速度越快。
2. 并发量
比如:
单GPU 1路会议 2路会议 4路会议 8路会议 分别测试。
不能只测试单请求。
因为真正生产环境的瓶颈,很多时候是在并发以后才出现。
3. 显存
特别是 GPU 部署。
需要观察:
模型加载显存 + 推理显存 + Batch 显存 避免线上突然 OOM。
二十四、最终形成的一套部署思路
如果把整个项目重新归纳一下,我会更推荐下面这种路线:

这套方式比较适合企业级项目。
二十五、几个容易踩坑的地方
最后总结几个实际开发过程中比较容易忽略的问题。
1. 不要只看模型官网 Benchmark
官方 Benchmark 和自己的会议数据不是一回事。
最好准备一批真实业务录音。
2. 不要忽略音频质量
很多所谓“模型识别错误”,最后发现其实是:

模型背锅了。
3. 不要一开始就追求最大模型
先把:
准确率 实时性 资源占用 并发 几个指标跑出来。
再决定模型规格。
4. 不要把 ASR 和业务系统写死
模型一定会更新。
服务一定会扩容。
所以接口层最好保持稳定。
5. 不要忽略模型版本
生产环境建议:
一起进行版本管理。
做熙瑾会悟 ASR 部署这一块,给我最大的一个感受就是:
ASR 项目真正难的,从来不是“把模型启动起来”。
模型启动只是第一步。
真正到了生产环境,需要考虑的是一整套工程问题:
模型选型 音频预处理 VAD 流式识别 离线识别 GPU推理 ONNX Runtime TensorRT 并发控制 任务队列 声纹识别 说话人分离 文本纠错 模型版本 日志监控 离线部署 服务治理 尤其是企业内部部署,对稳定性和数据安全的要求往往比单纯的 Demo 效果更重要。
所以在实际项目里,我更倾向于把 ASR 看成一个独立的基础 AI 能力服务。
上层的会议、访谈、培训、录音整理等应用,只需要调用统一接口。
底层则可以根据实际情况替换:
Whisper Paraformer SenseVoice 甚至未来切换到企业自己训练的模型。
这样整个系统的生命周期会更长,维护起来也不会那么痛苦。
对于熙瑾会悟这样的企业级会议产品来说,最终真正有价值的也不是“用了哪个模型”,而是能不能把:

这一整条链路稳定跑起来。
模型只是其中的一环。
真正决定系统能不能落地的,还是工程能力。
如果你正在做企业级 ASR、离线语音识别、会议转写或者私有化 AI 部署,建议不要先从“选哪个模型”开始,而是先把业务场景、音频数据、实时性要求、服务器配置和并发目标确定下来。模型选型只是后面的结果,而不是项目的起点。

225

被折叠的 条评论
为什么被折叠?



