本文主要是介绍FreeSWITCH源码分析和分享之ASR解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
asr_interface的工作流程
调用detect_speech这个APP,FreeSWITCH的核心代码中会注册ASR的监听(bugging)处理,并注册监听回调函数。
一、监听回调函数初始化时启动
创建一个线程A。A线程主要是处理识别结果。
在线程中可以看到,只要channel没有销毁,呼叫状态没有进入CS_HANGUP状态,就会执行一个死循环,等待条件变量被唤醒。
当条件变量被唤醒后,动作就是检查当前session的内存池中是否有识别结果数据。
这个检查动作比较迷惑人,即便没有识别结果,但只要vad检测到状态是activity的,检查结果也是成功的。
检查结果成功的话。创建freeswitch的事件,并发送事件。
有识别结果时,事件的"Speech-Type"为"detected-speech"类型,如果无识别结果,事件的"Speech-Type"为"begin-speaking"类型
二、监听回调函数在读取音频流时被调用
将读取的音频流数据发给语音识别的回调函数。
然后执行检查识别结果,如果检查识别结果成功,发送一个信号给处于阻塞等待状态的A线程。
三、语音识别处理(我开发的模块,或者使用MRCP建立通道转发语音获取结果)
VAD识别函数,我采用的处理也是注册回调函数,将每一帧数据挂载在一个链表中,达到一个可识别的阀值大小时,送给VAD接口去检测。
VAD回调使用的类型由profile决定,ASR引擎类型同样由profile决定。灵活选择,热加载。
这篇关于FreeSWITCH源码分析和分享之ASR解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!