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決定。靈活選擇,熱加載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章