(原創)用訊飛語音實現人機交互的功能


目前在做一款車載的項目,其中有一個需求是在開車的時候實現人與手機的對話,全過程不需要用手,只用語音操控。

這個就類似於人與機器人的對話,機器人在后台一直待命,用戶說話 機器人做出對應的反映。

但由於用戶手機電源的寶貴性,又不能讓用戶一直開着錄音監聽,這樣很耗費資源。因此使用了訊飛語音提供的喚醒功能。

具體怎么做呢?

看一張流程圖吧:這張流程圖使用了訊飛的大部分技術(語音喚醒、語音喚醒+命令詞識別、語義識別、語音合成),不廢話,看圖

流程圖已經寫的很清晰了,簡單介紹下

在程序啟動的時候先啟動喚醒,這個時候用戶說喚醒詞就會將機器喚醒,並 聆聽命令。但如果這個時候有播報信息的話會優先播報信息,播報的時候會將喚醒暫停,播報完成后再啟動喚醒。這么做有一個重要的原因是訊飛的喚醒是一直占用錄音資源的,而這個時候去播報語音會斷斷續續,聽說這個可以設置,但播報的時候用於一般也不會去說喚醒詞。

訊飛的喚醒有兩種模式:單純的喚醒和喚醒+命令詞識別

單純的喚醒會有一個喚醒成功的回調,比較簡單

而喚醒+命令詞識別不僅能夠喚醒,如果你在說喚醒詞的同時說了一個命令,那么他也會識別這個命令,你可以很干脆的收到這個命令去執行,而不需要在啟動什么語義識別后在執行命令了,這對用戶來說也是很爽的。

但是命令詞有一定的限制,就是命令詞使用之前必須先構建語法,而命令詞的內容必須得是提前知道的。但是如果用戶說了一個 石河子大學怎么走,這個命令在你的命令詞構建的語法文件里沒有!怎么辦?這時候你就得提示用戶讓用戶去語義輸入了。

所以我這里的構想是:用戶說命令詞,啟動喚醒,然后識別命令詞。識別命令詞成功執行命令,識別命令詞錯誤啟動語義識別。

這有個缺點就是用戶說了喚醒詞+語義識別的內容,語義識別的內容被命令詞消耗掉了,用戶只有再說一次語義識別的內容才可以識別語義。

為了避免這個問題,我們在喚醒詞識別后,如果命令詞不能識別的時候,用合成語音提示以下用戶“請問有什么可以幫您”,這個就代表機器沒有識別到用戶剛才的語義內容,需要 用戶重新說,我是不是很奸詐o(∩_∩)o 

接下來就是語義識別了,這個沒什么說的,主要的一點就是如果用戶不說話你要一直讓它保持錄音狀態嗎?當然不行啊,這多耗電啊!為了幫用戶省電,我還設計了一個用戶不說話20s自動進入等待喚醒的狀態的流程。20s怎么來?使用時間戳啊!就是每次用戶命令識別成功或者喚醒成功的時候記錄一個時間戳。然后下次再啟動語義識別前先判斷當前時間和時間戳時間是否相差大於20s,如果小於20s則繼續啟動語義識別,如果大於20s則啟動喚醒,准備讓用戶說命令詞來喚醒吧。

好了,差不多了。不要問我為什么不一直讓用戶說喚醒詞再執行對應的命令。如果你要干某一件事情之前總是還要說喚醒詞,我估計你會瘋掉的,即使你不瘋別人也會認為你是神經病的。沒有貶義,開玩笑,o(∩_∩)o 哈哈

 

 

我的github地址:https://github.com/dongweiq/study

歡迎關注,歡迎star o(∩_∩)o 。有什么問題請郵箱聯系 dongweiqmail@gmail.com qq714094450


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM