百度語音識別開放平臺SDK用法

版權聲明:本文爲博主原創文章,未經博主贊成不得轉載。 https://blog.csdn.net/zpf8861/article/details/30229039

百度Android語音識別SDK分在線與離線兩種。這篇文章介紹在線SDK的用法。php

     在線SDK是以JAR包和動態連接庫形式公佈和使用。可以從百度開放雲平臺站點中下載SDK及使用說明文檔。css

http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voicehtml

     完畢語音SDK的集成分下面幾步。本文將一步步介紹SDK集成方法。java

      

 一、註冊開放開放平臺   android

 點擊管理控制檯。選擇移動應用管理git


 選擇建立應用,填寫應用名稱網絡

      


可以看到右上角有ID、API KEY、Secret KEY。點擊可以複製其內容,保存這些字符串,在使用語音SDK時會用到。ide


二、申請開啓語音識別服務 。選擇媒體雲---語音識別,點擊申請開啓服務,填寫理由。
post


等待對接成功this


三、使用語音識別SDK前的準備

以前準備了SDK開發包以及ID、API KEY、Secret KEY。

首先將開發包中的lib中的庫加入到project中


        聲明權限

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1.  <uses-permission android:name="android.permission.RECORD_AUDIO" />  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  4. <uses-permission android:name="android.permission.INTERNET" />  
  5. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  6. <uses-permission android:name="android.permission.WAKE_LOCK" />  
  7. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
  8. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  9. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /></span>  

    四、語音識別

SDK有兩種實現語音識別的方式,一種是直接使用SDK中的語音識別控件。一種是使用SDK中的語音識別服務。

語音識別控件方式

語音識別控件BaiduASRDigitalDialog。提供了整套語音交互、提示音、音量反饋、動效反饋。開發人員初始化一個BaiduASRDigitalDialog對象,並設置相關參數及結果回調,調用Show()方法就可以彈出對話框開始識別。識別結束後會在回調中獲得識別結果。

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. if (mDialog == null || mCurrentTheme != Config.DIALOG_THEME) {  
  2.                     mCurrentTheme = Config.DIALOG_THEME;  
  3.                     if (mDialog != null) {  
  4.                         mDialog.dismiss();  
  5.                     }  
  6.                     Bundle params = new Bundle();  
  7.                     params.putString(BaiduASRDigitalDialog.PARAM_API_KEY, Constants.API_KEY);  
  8.                     params.putString(BaiduASRDigitalDialog.PARAM_SECRET_KEY, Constants.SECRET_KEY);  
  9.                     params.putInt(BaiduASRDigitalDialog.PARAM_DIALOG_THEME, Config.DIALOG_THEME);  
  10.                     mDialog = new BaiduASRDigitalDialog(this, params);  
  11.                     mDialog.setDialogRecognitionListener(mRecognitionListener);  
  12.                 }  
  13.                 mDialog.getParams().putInt(BaiduASRDigitalDialog.PARAM_PROP, Config.CURRENT_PROP);  
  14.                 mDialog.getParams().putString(BaiduASRDigitalDialog.PARAM_LANGUAGE,  
  15.                         Config.getCurrentLanguage());  
  16.                 mDialog.show();  

 
  

識別對話框支持的參數定義在BaiduASRDigitalDialog中以PARAM_前綴的常量。列表例如如下:

PARAM_API_KEY

string

 

開放平臺認證API_key

PARAM_SECRET_KEY

string

 

開放平臺認證Secret_key

PARAM_LANGUAGE

string

LANGUAGE_CHINESE

語種,取值定義在VoiceRecognitionConfig類中前綴爲LANGUAGE_的常量

PARAM_PARTIAL_RESULTS

boolean

true

連續上屏

PARAM_NLU_ENABLE

boolean

false

是否語義解析。

Prop爲輸入時暫不支持語義,請顯示指定爲其餘領域。

PARAM_NLU_PARAMS

string

 

預留語義解析參數

PARAM_PROP

int

PROP_INPUT

領域參數。定義在VoiceRecognitionConfig類中前綴爲PROP_的常量

PARAM_PORMPT_TEXT

string

「請說話」

對話框提示語

PARAM_PROMPT_SOUND_ENABLE

boolean

true

提示音,需要集成SDK包Raw目錄的資源

PARAM_DIALOG_THEME

int

THEME_BLUE_LIGHTBG

樣式。

定義在前綴爲THEME_的常量中

PARAM_TIPS

String[]

 

引導語列表

PARAM_SHOW_TIPS_ON_START

boolean

false

對話框彈出時首先顯示引導語列表

PARAM_SHOW_TIP

boolean

false

識別啓動3秒未檢測到語音,隨機出現一條引導語

PARAM_SHOW_HELP_ON_SILENT

boolean

false

靜音超時後將「取消」button替換爲「幫助」

設置回調方法。處理返回的結果

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. mRecognitionListener = new DialogRecognitionListener() {  
  2.   
  3.            @Override  
  4.            public void onResults(Bundle results) {  
  5.                ArrayList<String> rs = results != null ? results  
  6.                        .getStringArrayList(RESULTS_RECOGNITION) : null;  
  7.                if (rs != null && rs.size() > 0) {  
  8.                    mResult.setText(rs.get(0));  
  9.                }  
  10.   
  11.            }  
  12.        };  


 
  
API方式
首先需要配置語音識別引擎ASREngine的參數VoiceRecognitionConfig
[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. VoiceRecognitionConfig config = new VoiceRecognitionConfig();  
  2.                 config.setProp(Config.CURRENT_PROP);  
  3.                 config.setLanguage(Config.getCurrentLanguage());  
  4.                 config.enableVoicePower(Config.SHOW_VOL); // 音量反饋。  
  5.                 if (Config.PLAY_START_SOUND) {  
  6.                     config.enableBeginSoundEffect(R.raw.bdspeech_recognition_start); // 設置識別開始提示音  
  7.                 }  
  8.                 if (Config.PLAY_END_SOUND) {  
  9.                     config.enableEndSoundEffect(R.raw.bdspeech_speech_end); // 設置識別結束提示音  
  10.                 }  
  11.                 config.setSampleRate(VoiceRecognitionConfig.SAMPLE_RATE_8K); // 設置採樣率,需要與外部音頻一致  

而後啓動識別
[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. int code = mASREngine.startVoiceRecognition(mListener, config);  

當中mListener是識別過程的回調,需要對當中的方法進行實現
[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. /** 
  2.     * 重寫用於處理語音識別回調的監聽器 
  3.     */  
  4.    class MyVoiceRecogListener implements VoiceClientStatusChangeListener {  
  5.   
  6.        @Override  
  7.        public void onClientStatusChange(int status, Object obj) {  
  8.            switch (status) {  
  9.            // 語音識別實際開始,這是真正開始識別的時間點。需在界面提示用戶說話。  
  10.                case VoiceRecognitionClient.CLIENT_STATUS_START_RECORDING:  
  11.                    isRecognition = true;  
  12.                    mHandler.removeCallbacks(mUpdateVolume);  
  13.                    mHandler.postDelayed(mUpdateVolume, POWER_UPDATE_INTERVAL);  
  14.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_RECORDING_START);  
  15.                    break;  
  16.                case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_START: // 檢測到語音起點  
  17.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_START);  
  18.                    break;  
  19.                // 已經檢測到語音終點,等待網絡返回  
  20.                case VoiceRecognitionClient.CLIENT_STATUS_SPEECH_END:  
  21.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_SPEECH_END);  
  22.                    break;  
  23.                // 語音識別完畢,顯示obj中的結果  
  24.                case VoiceRecognitionClient.CLIENT_STATUS_FINISH:  
  25.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);  
  26.                    isRecognition = false;  
  27.                    updateRecognitionResult(obj);  
  28.                    break;  
  29.                // 處理連續上屏  
  30.                case VoiceRecognitionClient.CLIENT_STATUS_UPDATE_RESULTS:  
  31.                    updateRecognitionResult(obj);  
  32.                    break;  
  33.                // 用戶取消  
  34.                case VoiceRecognitionClient.CLIENT_STATUS_USER_CANCELED:  
  35.                    mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);  
  36.                    isRecognition = false;  
  37.                    break;  
  38.                default:  
  39.                    break;  
  40.            }  
  41.   
  42.        }  
  43.   
  44.        @Override  
  45.        public void onError(int errorType, int errorCode) {  
  46.            isRecognition = false;  
  47.            mResult.setText(getString(R.string.error_occur, Integer.toHexString(errorCode)));  
  48.            mControlPanel.statusChange(ControlPanelFragment.STATUS_FINISH);  
  49.        }  
  50.   
  51.        @Override  
  52.        public void onNetworkStatusChange(int status, Object obj) {  
  53.            // 這裏不作不論什麼操做不影響簡單識別  
  54.        }  
  55.    }  

得到識別BDVRClient對象

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. mASREngine = VoiceRecognitionClient.getInstance(this);  
  2.         mASREngine.setTokenApis(Constants.API_KEY, Constants.SECRET_KEY);  

請求參數設置
每次識別需要經過經過VoiceRecognitionConfig設置參數,當中一些方法在API中有說明

方法

參數

描寫敘述

enableBeginSoundEffect

int soundResourceId 啓動提示音資源Id

設置開始提示音,soundResourceId爲放置在Raw目錄的資源Id。

 

enableEndSoundEffect

int soundResourceId 說話結束提示音資源Id

檢測到用戶說話結束播報的提示音,非識別結束

setSampleRate

int rate 採樣率

設置音頻採樣率,

一般建議開發人員不指定採樣頻率。由BDVRClient本身主動依據當前網絡環境選擇採樣頻率。WiFi環境下將使用16kHz採樣。移動網絡下將使用8kHz採樣,來節省流量。

參考常量定義

SAMPLE_RATE_8K 8K採樣率

SAMPLE_RATE_16K 16K採樣率

setProp

int prop

開發人員可以經過指定垂直分類來獲取更精準的語音識別結果。

注:垂直分類眼下支持地圖,音樂。視頻。APP。網址,開發人員需要注意設定採樣頻率時僅僅能在這五種垂直分類中選擇。

若指定其餘分類,可能會影響識別結果的精度。

參考PROP_前綴的常量定義。

setUseDefaultAudioSource

boolean useDefaultSource

設置是否使用缺省的錄音。 假設不使用,用戶需要調用VoiceRecognitionClient對象的feedAudioBuffer方法爲識別器提供語音數據

enableNLU

 

啓用語義解析,僅僅在搜索模式起做用

getSampleRate

 

獲取當前識別採樣率

setLanguage

String Language

設置語種。

眼下支持的語種有中文普通話(LANGUAGE_CHINESE)、中文粵語(LANGUAGE_CANTONSE)、英文(LANGUAGE_ENGLISH)。


開始語音識別,BDVRClient在開始識別後。會啓動錄音、預處理、上傳到server並獲取識別結果。

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. int code = mASREngine.startVoiceRecognition(mListener, config);  
  2.                if (code != VoiceRecognitionClient.START_WORK_RESULT_WORKING) {  
  3.                    mResult.setText(getString(R.string.error_start, code));  
  4.                }   

取消語音識別

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. mASREngine.stopVoiceRecognition();  

結束語音識別

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. mRecognitionClient.speakFinish();  
相關文章
相關標籤/搜索