標籤:
目前在做一款車載的項目,其中有一個需求是在開車的時候實現人與手機的對話,全過程不需要用手,只用語音操控。
這個就類似於人與機器人的對話,機器人在後台一直待命,使用者說話 機器人做出對應的反映。
但由於使用者手機電源的寶貴性,又不能讓使用者一直開著錄音監聽,這樣很耗費資源。因此使用了訊飛語音提供的喚醒功能。
具體怎麼做呢?
看一張流程圖吧:這張流程圖使用了訊飛的大部分技術(語音喚醒、語音喚醒+命令詞識別、語義識別、語音合成),不廢話,看圖
流程圖已經寫的很清晰了,簡單介紹下
在程式啟動的時候先啟動喚醒,這個時候使用者說喚醒詞就會將機器喚醒,並 聆聽命令。但如果這個時候有播報資訊的話會優先播報資訊,播報的時候會將喚醒暫停,播報完成後再啟動喚醒。這麼做有一個重要的原因是訊飛的喚醒是一直佔用錄音資源的,而這個時候去播報語音會斷斷續續,聽說這個可以設定,但播報的時候用於一般也不會去說喚醒詞。
訊飛的喚醒有兩種模式:單純的喚醒和喚醒+命令詞識別
單純的喚醒會有一個喚醒成功的回調,比較簡單
而喚醒+命令詞識別不僅能夠喚醒,如果你在說喚醒詞的同時說了一個命令,那麼他也會識別這個命令,你可以很乾脆的收到這個命令去執行,而不需要在啟動什麼語義識別後在執行命令了,這對使用者來說也是很爽的。
但是命令詞有一定的限制,就是命令詞使用之前必須先構建文法,而命令詞的內容必須得是提前知道的。但是如果使用者說了一個 石河子大學怎麼走,這個命令在你的命令詞構建的文法檔案裡沒有!怎麼辦?這時候你就得提示使用者讓使用者去語義輸入了。
所以我這裡的構想是:使用者說命令詞,啟動喚醒,然後識別命令詞。識別命令詞成功執行命令,識別命令詞錯誤啟動語義識別。
這有個缺點就是使用者說了喚醒詞+語義識別的內容,語義識別的內容被命令詞消耗掉了,使用者只有再說一次語義識別的內容才可以識別語義。
為了避免這個問題,我們在喚醒詞識別後,如果命令詞不能識別的時候,用合成語音提示以下使用者“請問有什麼可以幫您”,這個就代表機器沒有識別到使用者剛才的語義內容,需要 使用者重新說,我是不是很奸詐o(∩_∩)o
接下來就是語義識別了,這個沒什麼說的,主要的一點就是如果使用者不說話你要一直讓它保持錄音狀態嗎?當然不行啊,這多耗電啊!為了幫使用者省電,我還設計了一個使用者不說話20s自動進入等待喚醒的狀態的流程。20s怎麼來?使用時間戳啊!就是每次使用者命令識別成功或者喚醒成功的時候記錄一個時間戳記。然後下次再啟動語義識別前先判斷目前時間和時間戳記時間是否相差大於20s,如果小於20s則繼續啟動語義識別,如果大於20s則啟動喚醒,準備讓使用者說命令詞來喚醒吧。
好了,差不多了。不要問我為什麼不一直讓使用者說喚醒詞再執行對應的命令。如果你要幹某一件事情之前總是還要說喚醒詞,我估計你會瘋掉的,即使你不瘋別人也會認為你是神經病的。沒有貶義,開玩笑,o(∩_∩)o 哈哈
我的github地址:https://github.com/dongweiq/study
歡迎關注,歡迎star o(∩_∩)o 。有什麼問題請郵箱聯絡 [email protected] qq714094450
(原創)用訊飛語音實現人機互動的功能