Android第三方服務(1):語音識別(1)

  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

 

    未完,待續。

相關文章
相關標籤/搜索