58同城流式语音识别引擎实践
如果无法正常显示,请先停止浏览器的去广告插件。
1.
2. 58同城流式语音识别引擎实践
王焱
58同城
欢迎关注58技术公众号
欢迎关注 58AILab 公众号
3. 目录
• 背景
• 流式识别引擎的总体架构
• 流式识别服务
• 优化实践
4. 58同城生活服务平台
浏览帖子
C端用户
58平
台
发布帖子
(房源、职位…)
人工销售、客服
B端商家
机器人销售、客服
客户
房产中介
企业
二手车商
搬家公司
…
5. 流式语音识别引擎背景
6. 应用场景举例
招聘机器人
用户
你好,请问你叫什么名字 你好,我叫张三
有没有做过xxx的职位? 之前做过
请问做了多久呢?
外呼机器人
用户
你好,能为您做个问卷回访吗? 可以
您对我们提供的xxx服务满意吗? 还可以
您认为我们有什么需要改进的? 已经很好了
感谢您的回答,祝您生活愉快 再见
有2年的经验
流式语音识别
7. 语音识别技术概览
• 声音的处理流程
发声
声音采集
模拟信号
数字信号
100101
音频文件
8. 语音识别技术概览
• 语音识别的总体流程
9. 语音识别技术概览
• 训练过程
字:
发音词典
你
好 哪
位
语言模型: f(音素) = 字
音素:
ei4
声学特征
(按帧):
音频:
n i3 h ao2 n a3 w
声学模型: f(帧特征) = 音素状态
10. 语音识别技术概览
l
预测(识别)过程
识别结果: 你
好 哪
语音解码器
语言模型: f(音素) = 字
声学模型:
声学特征
(按帧):
音频:
f(帧特征) = 音素状态
位
发音词典
11. 流式语音识别引擎整体架构
IOS/Android/Java SDK
接入层
实时语音服务
逻辑层
语
音
标
注
系
统
语音接入服务
ABTest
服务
静音检测服务
实时语音解码服务
WPAI
人工
智能
平台
Kaldi
数据层
Hive
Mysql
WTable
WOS
Redis
12. 流式语音识别整体流程
• 实时语音识别
鉴权
语音数据流
实时语音解码
限流
解码器
VAD
人声检测
你好
你好请问
中间
结果
你好请问房子租出去了吗
后处理
你好,请问房子租出去了吗?
你好请问房子
最终
结果
你好请问房子租出去了吗
13. 流式语音识别请求过程
0
SDK
1
…
语音接入服务
语音接入服务
5
ABTest
2 3
… ABTest 静音
检测
4
…
静音
检测
实时
解码
…
实时
解码
后处理
服务
…
后处理
服务
14. 流式语音识别sdk和服务的交互
Client
Server
握手鉴权
鉴权请求
鉴权成功
握手
连接建立
识别开始
识别开始
OnStarted
识别中
音频流
OnChanged
音频流
OnChanged
识别结束
音频发送结束
OnComplete
d
连接关闭
你好,请问房子租出去了吗?
识别结束
最终
结果
15. 客户端SDK
• websocket连接
• 处理事件、回调
connect
NioSocketChannel
connect
reactor
connect
rea
d
rea
d
rea
d
事件 状态
识别开始 (OnStarted) 0
识别中间结果 (OnChaned) 1
识别结束 (OnCompleted) 2
识别失败 (OnFailed) -1
回调函数
write
write
write
数据发送
16. 语音接入服务
• 鉴权
• 限流
client
• 事件生成
Sub
Reactor
Main
Reactor
client
• 数据流交互
client
Acceptor
rea
d
rea
d
rea
d
write
write
write
事件 状态
识别开始 (OnStarted) 0
识别中间结果 (OnChaned) 1
识别结束 (OnCompleted) 2
识别失败 (OnFailed) -1
负载
均衡
转写回送
音频流解码
实时解码服务
服务地
址池
17. 实时解码器
• 处理音频(流)块数据
• 获取部分转写结果
模型初始化
声学模型
解码器
HCLG解码图
chunk1
实时解码
二进制转换音频特征
chunk2
输入到网络
Decoder
搜索当前最佳路径
转为文字输出
chunk1 ->
text1
text1
chunk2 ->
text2
text2
18. 实时语音解码服务的设计
实时语音解码服务
加载模型
加载配置
音频流
语
言
模
型
声
学
模
型
模
型
配
置
服
务
配
置
加载解码器
decoder
解码
器同
步队
列
音频
特征
转换
实
时
解
码
转写
结果
线上
Kaldi格式
数据处理
标注
数据
Kaldi
C++库
扩展库
训练
数据
模型训练
声学模型 模型文件
语言模型 配置文件
离线
环境
HMM
OpenFST
GMM
Decoder
BLAS
Matrix
Utils
CUDA
19. 系统的高可用
0
SDK
1
…
语音接入服务
语音接入服务
1.
2.
3.
4.
5.
6.
水平层次上无状态、水平扩容
服务限流
业务隔离、资源隔离
故障检测、流量切换
超时降级、失败重试
多方位监控和告警
5
ABTest
2 3
… ABTest 静音
检测
4
…
静音
检测
实时
解码
…
实时
解码
后处理
服务
…
后处理
服务
20. 解码并发数与耗时优化
问题:解码并发数增加,耗时线性增加
解决方案:
优化beam参数
优化内存
并发数与耗时的关系
效果:
解码并发数和耗时解耦
并发数与耗时的关系
21. 解码中间转写结果耗时优化
问题:开启获取中间结果开关后,导致下一帧解码耗时累积增加
解决方案:
优化从Lattice选取路径的逻辑
效果:
一次发送时长与耗时的关系
• 打开获取中间结果的开关,不影响下一帧的解码耗时
• 每次发送100ms音频,平均耗时104ms->18ms
一次发送时长与耗时的关系
22. 服务和客户端优化
• 优化客户端sdk耗时
l
优化服务端GC,降低耗时
问题:客户端平均耗时比服务端耗时高300ms+ 问题:服务端TP99耗时较高
解决方案: 解决方案:
l
线程阻塞,去除SDK中的不必要的日志打印
效果:
l
l
优雅的关闭连接,消除异常
FIN
FIN_WAIT1 ACK
效果:
正常四次挥手结束
解决服务丢包、延迟包问题
ESTABLISHED
解决方案:
l
nginx收发包问题,临时使用VIP直连后端集群方案
FIN
ACK
TIME_WAIT
(2MSL)
CLOSED
GC优化前后耗时对比
问题:服务端收不到、延迟收到调用方发送的数据帧
ESTABLISHED
FIN_WAIT2
服务端TP99耗时降低300ms+
被动
CLOSE_WAIT
l
调整jvm参数
l
主动
发送FIN帧关闭连接
l
l
问题:客户端close后,服务端出现异常
l
优化数据库取数逻辑,降低引用的回收数目
效果:
客户端平均耗时接近服务端平均耗时
解决方案:
l
LAST_ACK
CLOSED
效果:
l
问题解决,无异常
23. 欢迎关注58AILab
开源项目:
Ø 《开源 | qa_match:一款基于深度学习的问答匹配工具》
https://github.com/wuba/qa_match
Ø 《开源|dl_inference:通用深度学习推理服务》
https://github.com/wuba/dl_inference
相关文章:
58AILab 公众号
Ø
Ø
Ø
Ø
Ø
《58同城语音识别技术探索和实践》
《深度学习在单声道录音中的说话人角色识别优化实践》
《人机语音对话技术在58同城的应用实践》
《语音识别中Chain Model的原理和实践》
《智能语音机器人中VAD语音端点检测算法优化实践》
招聘后端、算法人才
欢迎投递:zhankunlin@58.com
微信号:WubaAILab
58技术公众号
24.