服務機器人缺少了語音交互的話,就會讓人覺得不像個機器人。在當前非常多的服務機器人上,語音交互成為一個非常大的亮點。
當然如果我們從頭做起,這樣就太麻煩,還好當前有很多公司提供了解決方案。科大訊飛、百度語音等都提供了非常好的語音識別和語音合成工具。
1.1 簡介
這里我采用圖靈機器人作為語義理解的工具,搭建一個語音機器人。
具體可以參考圖靈機器人官網http://www.tuling123.com/help/h_cent_andriodsdk.jhtml?nav=doc
大致框架如下:
1.2 概念解釋
(1)語音識別:Automatic Speech Recognition(ASR),也稱自動語音識別,其目標是將人類的語音中的詞匯內容轉換相應的文本。
(2)自然語言理解:Natural Language Understanding(NLU),俗稱人機對話,是人工智能的分支學科。本學科通過電子計算機模擬人的語言交際過程,從而使計算機能理解和運用人類社會的自然語言,實現人機之間的自然語言通信,進而代替人的部分腦力勞動,包括查詢資料、解答問題、摘錄文獻、匯編資料以及一切有關自然語言信息的加工處理。
(3)TRClient:TRClient 是一個封裝了語音采集、處理、網絡收發、語義理解等功能的語音識別和語義解析整體解決方案。
(4)應用程序:在開發中使用了 TRClient,具有語音識別功能的產品線產品。
1.3功能介紹
(1)語音識別:將語音識別成相應的文本。
(2)語義理解:將文本識別成領域相關的語義結果。
(3)語音合成 : 將文本轉化成語音讀出
1.4 環境搭建
1.4.1 添加TRClient到工程
1. 添加libs到工程
開發者需要將Demo包中的libs目錄整體Copy到工程目錄,Libs目錄包括了語音識別合成所需的so庫以及jar包
對於android studio的操作環境,配置jar包和so文件,
Jar包拷貝入app->libs文件
在android studio中添加 file->project structure添加jar目錄
在app->src->main->jniLibs新建當前目錄,copy->armeabi的so文件
1.4.2 權限聲明
名稱 |
用途 |
android.permission.RECORD_AUDIO |
允許使用麥克風錄音 |
android.permission.INTERNET |
允許聯網,發送語音數據至服務器,獲得識別結果 |
android.permission.ACCESS_NETWORK_STATE |
允許獲取當前網絡狀態,優化錄音參數及網絡參數 |
android.permission.READ_PHONE_STATE |
允許獲取用戶手機的電話狀態信息 |
android.permission.MODIFY_AUDIO_SETTINGS |
允許藍牙錄音 |
android.permission.BROADCAST_STICKY |
某些手機啟動 SCO 音頻連接需要此權限 |
android.permission.BLUETOOTH |
允許藍牙錄音檢測耳機狀態 |
android.permission.WRITE_SETTINGS |
允許修改和讀取系統配置信息 |
android.permission.WRITE_EXTERNAL_STORAGE |
允許向存儲設備中寫入 |
需要在 AndroidManifest.xml 文件, 增加以上七個權限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
如果需要使用藍牙設備作為輸入源, 需要額外在AndroidManifest.xml 文件添加下列權限:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY "/>
<uses-permission android:name="android.permission.BLUETOOTH "/>
1.4.3 Progurad配置
如果應用配置了代碼混淆, 需要在 Proguard配置文件增加以下參數:
-keep class com.baidu.android.**{*;}
-keep class com.baidu.voicerecognition.android.**{*;}
-keep class com.turing.androidsdk.**{*;}
1.5語音識別
語音識別部分主要包括以下四個步驟
1.5.1 實例化VoiceRecognizerManager
實例化VoiceRecognizerManager,由於目前我們使用百度ASR方式,使用百度ASR,使用構造方法:
VoiceRecognizerManager(Context context,String bdAPI_KEY,String bdSECRET_KEY)
參數: bdAPI_KEY和bdSECRET_KEY
這里的bdAPI_KEY和bdSECRET_KEY,需要自己到百度官方去申請,位置如圖所示:
百度語音開放平台的網址為:http://yuyin.baidu.com/
1.5.2 設定ASR狀態監聽
設定ASR狀態監聽
示例:VoiceRecognizerManager.setVoiceRecognizeListener(listener);
這個listener就是需要實現接口VoiceRecognizeListener,在不同的識別狀態下回調其不同的方法。
1.5.3 調用語音識別方法
調用語音識別方法
VoiceRecognizerManager.startRecognize();
這個方法就是開始進行識別
1.5.4 獲取識別結果
獲取識別結果,在步驟2里listener的回調方法onRecognizeResult中獲取識別結果。
public void onRecognizeResult(String result)
{
handleRecognizeResult(result);
}
這里的result就是返回的結果
1.6 語義理解
語義理解部分主要包括以下四個步驟
1.6.1 SDKInit類
SDKInit類初始化
調用SDKInit.init
public static void init(SDKInitBuilder builder,InitListener initListener)
參數:(1)SDKInitBuilder是封裝了初始化的各種參數,這個類的變量說明
Contex為上下文
Secret為官網上機器人詳情頁中自動生成的一個secret(默認采用非加密模式,若采用加密模式時才開啟),如下圖
turingKey為該機器人帳號的apikey,可在“機器人詳情”頁獲取
uniqueId為自己添加的一個標示符,如郵箱、手機號等等
(2)參數InitListener是一個初始化后回調方法的接口
onComplete()是成功后,回調的方法
onFail(java.lang.String error)是失敗后,回調的方法
1.6.2 實例化TuringApiManager類
實例化TuringApiManager類
這里一定要在上一步SDKInit初始化成功后,再初始化TuringApiManager,否則很多功能將無法使用
推薦的代碼:
onComplete()
{
TuringApiManager m = new TuringApiManager (this);
}
1.6.3 設置監聽
添加監聽:
public void setHttpListener(HttpConnectionListener httpConnectionListener)
參數:httpConnectionListener用於監聽聯網請求結果的回調
代碼形式如下:
TuringApiManager m = new TuringApiManager (this);
m.setHttpListener(httpConnectionListener);
其中httpConnectionListener就是實現接口HttpConnectionListener
1.6.4 發出請求
發出請求
public void requestTuringAPI(String requestInfo)
參數:requestInfo為傳遞的文本
比如requestInfo = “你好”,那么在上一步的public void onSuccess(RequestResult result) 中result可以得到一串json字符串,其中json字符串根據不同的類型會有不同的格式
1.7 語音合成(TTS)
語音合成部分主要包括以下四個步驟
1.7.1 實例化TTSManager類
實例化TTSManager類
該類為語音合成的管理類,要使用語音合成功能,首先要創建TTSManager的對象實例
選用百度在線TTS,其構造函數如下:
public TTSManager(Context context, String bdAPI_KEY, String bdSECRET_KEY)
這里的bdAPI_KEY和bdSECRET_KEY
1.7.2 設置監聽
添加監聽:
TTSManager.setTTSListener(mTTSListener)
mTTSListener需要實現接口TTSListener ,可以在不同的語音合成狀態下回調其不同的方法
1.7.3 開始語音合成
調用TTSManager.startTTS(String ttsContent) 方法來進行語音合成
參數:ttsContent就是需要被合成的文本,比如 ttsContent=“你好”,那么就會讀出 你好。
1.7.4 處理合成完成
語音合成后,就會觸發onSpeechFinish(),這樣即可在其方法中添加相應的邏輯。