App開發中爲了讓軟件功能更增強大,常常會引用許多的第三方框架或服務,其中可能會碰到這樣一種場景,讓用戶語音輸入,App接受用戶的輸入信息,作出相應的相應,這就是所謂的語音識別,固然這也是最基礎最簡單的語音識別,還有什麼語音聽寫、在線語音合成、開發語義、人臉識別、聲紋識別、語音喚醒等等。android
關於Android的語音識別,首先是大多模擬器無法模擬,須要用真機來測試。git
Android原生系統自帶有語音識別模塊,不過因爲後臺是訪問Google雲服務器數據,基於中國的國情,是無法真正的使用的。所以尋找一種替代是天然而然的事情,如今提供語音識別的平臺有不少,在此提供兩種解決方案,百度語音識別(百度語音官網:http://yuyin.baidu.com/)和訊飛語音識別(訊飛開發平臺官網:http://www.xfyun.cn/),如下簡單介紹基於它們平臺的語音識別開發。json
1、基於百度語音SDK的語音識別功能開發數組
第一步:在官網http://yuyin.baidu.com/註冊賬號(必須),成爲開發者。服務器
第二步: 在官網建立一個應用(獲取相應的APP key,Secret Key),開通服務(語音識別必須開通). app
第三步:下載SDK,解壓。框架
上圖爲SDK解壓後獲得的文件,其中docs文件夾爲可參考的文檔,libs是本身建立語音識別工程必須導入的包,ide
res是可能在語音識別須要的一些語音文件,最下面是一個Demo。其實以上三步算起來是一步,不過是爲了獲取SDK和相應測試
的key.gradle
第四步:本地建立Android標準工程,導入SDK中的libs文件夾下全部的文件。
第五步:工程配置和功能代碼實現。
權限:
1 <!-- 語音識別--> 2 <uses-permission android:name="android.permission.INTERNET" /> 3 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 4 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 5 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 6 7 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 8 <uses-permission android:name="android.permission.BROADCAST_STICKY"/> 9 <uses-permission android:name="android.permission.BLUETOOTH"/>
核心代碼:
1 public void btnVoice(View view) { 2 Bundle params = new Bundle(); 3 4 //設置開放平臺 API Key 5 params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, "3xMq8l8AtQw8WeZjqMaLyd4f"); 6 //設置開放平臺 Secret Key 7 params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, "48b2df134266594bd39b375b40d04e1f"); 8 //設置識別領域:搜索、輸入、地圖、音樂……,可選。默認爲輸入。 9 params.putInt(BaiduASRDigitalDialog.PARAM_PROP, VoiceRecognitionConfig.PROP_INPUT); 10 //設置語種類型:中文普通話,中文粵語,英文,可選。默認爲中文普通話 11 params.putString(BaiduASRDigitalDialog.PARAM_LANGUAGE, VoiceRecognitionConfig.LANGUAGE_CHINESE); 12 //若是須要語義解析,設置下方參數。領域爲輸入不支持 13 params.putBoolean(BaiduASRDigitalDialog.PARAM_NLU_ENABLE, true); 14 // 設置對話框主題,可選。BaiduASRDigitalDialog 提供了藍、暗、紅、綠、橙四中顏色,每種顏色又分亮、暗兩種色調。 15 // 共 8 種主題,開發者能夠按需選擇,取值參考 BaiduASRDigitalDialog 中前綴爲 THEME_的常量。默認爲亮藍色 16 params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, BaiduASRDigitalDialog.THEME_RED_DEEPBG); 17 18 voiceDialog = new BaiduASRDigitalDialog(this, params); 19 voiceDialog.setDialogRecognitionListener(new DialogRecognitionListener() { 20 @Override 21 public void onResults(Bundle results) { 22 // 在Results中獲取Key 爲DialogRecognitionListener .RESULTS_RECOGNITION的StringArrayList, 23 // 可能爲空。獲取到識別結果後執行相應的業務邏輯便可,此回調會在主線程調用。 24 ArrayList<String> rs = results != null ? results 25 .getStringArrayList(RESULTS_RECOGNITION) : null; 26 if (rs != null) { 27 //此到處理識別結果,識別結果可能有多個,按置信度從高到低排列,第一個元素是置信度最高的結果。 28 29 Toast.makeText(MainActivity.this,rs.get(0),Toast.LENGTH_LONG).show(); 30 } 31 } 32 }); 33 34 voiceDialog.show(); 35 }
這裏是當點擊按鈕時,開啓語音識別功能。
第5行和第7行分別要傳入兩個參數APP key/Secret key,其中須要注意的是這兩個key要和你下載的SDK是一一對應的,也就是說不一樣的SDK對於的key是不相同的,不然可能無法實現
語音識別。
----------------------------------------------------必須加以說明的分割線----------------------------------------------------
完成以上全部的工做可能任然無法實現語音功能(我的使用的是IDEA的Gradle標準Android工程),出現下面的一種情景:
那麼該工程對應的libs可能應該這樣,so文件對應的多個文件夾
若是任然不能解決問題,提示是這樣的,
那麼你能夠在build.gradle中的android下加上這個
1 sourceSets { 2 main { 3 jniLibs.srcDirs = ['libs'] 4 } 5 }
效果圖:
能夠看到百度的語音識別帶有百度的樣式,不太美觀,你能夠試着修改它的樣式,固然還有一種方式是使用下面的基於訊飛語音SDK的語音識別功能開發,實際使用可能更方便一些。
2、基於訊飛語音SDK的語音識別功能開發
訊飛開發平臺:http://www.xfyun.cn/
對於訊飛語音識別,能夠說是專家級的,在其官網能夠看見有不少強大的功能,而百度語音僅僅提供的是語音識別和語音合成,所以推薦使用訊飛的,更加專業。
第一步:在官網註冊賬號,建立新應用,開通語音聽寫服務(基礎的,這裏要用到),下載該應用對應的SDK,解壓,拷相應的文件到本地建立的安卓工程。
第二步:
初始化代碼,後面參數爲建立應用的APPID,須要注意的是這個APPid要和你下載的SDK是一一對應的,也就是說不一樣的SDK對於的key是不相同的,不然可能無法實現
1 SpeechUtility.createUtility(this, SpeechConstant.APPID+"=563aff8a");
核心代碼:
1 public void btnVoice(View view) { 2 3 RecognizerDialog dialog = new RecognizerDialog(this,null); 4 dialog.setParameter(SpeechConstant.LANGUAGE,"zh_cn"); 5 dialog.setParameter(SpeechConstant.ACCENT,"mandarin"); 6 7 dialog.setListener(new RecognizerDialogListener() { 8 @Override 9 public void onResult(RecognizerResult recognizerResult, boolean b) { 10 printResult(recognizerResult); 11 } 12 13 @Override 14 public void onError(SpeechError speechError) { 15 16 } 17 }); 18 19 dialog.show(); 20 Toast.makeText(this,"請開始說話",Toast.LENGTH_SHORT).show(); 21 22 } 23 24 private void printResult(RecognizerResult results) { 25 String text = JsonParser.parseIatResult(results.getResultString()); 26 27 TextView textView = (TextView) findViewById(R.id.textView); 28 textView.append(text); 29 }
因爲語音識別返回的是形以下列的Json字符串,當語音輸入"安卓"
1 {"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":-108.95,"w":"安卓"}]}]}
所以建立其解析類
1 public class JsonParser { 2 3 public static String parseIatResult(String json) { 4 StringBuffer ret = new StringBuffer(); 5 try { 6 JSONTokener tokener = new JSONTokener(json); 7 JSONObject joResult = new JSONObject(tokener); 8 9 JSONArray words = joResult.getJSONArray("ws"); 10 for (int i = 0; i < words.length(); i++) { 11 // 轉寫結果詞,默認使用第一個結果 12 JSONArray items = words.getJSONObject(i).getJSONArray("cw"); 13 JSONObject obj = items.getJSONObject(0); 14 ret.append(obj.getString("w")); 15 // 若是須要多候選結果,解析數組其餘字段 16 // for(int j = 0; j < items.length(); j++) 17 // { 18 // JSONObject obj = items.getJSONObject(j); 19 // ret.append(obj.getString("w")); 20 // } 21 } 22 } catch (Exception e) { 23 e.printStackTrace(); 24 } 25 return ret.toString(); 26 } 27 28 }
若是出現以下提示,
那麼你能夠在build.gradle中的android下加上這個
1 sourceSets {
2 main { 3 jniLibs.srcDirs = ['libs'] 4 } 5 }
效果圖:
源碼下載:連接: http://pan.baidu.com/s/1bpozc 密碼: 67bz
未完,待續。