閱讀935 返回首頁    go windows


Android SDK__一句話識別_語音識別(ASR)_智能語音交互-阿裏雲

功能介紹

語音Android SDK提供一句話識別服務,提供將實時短語音轉成文字的功能,可直接用於語音搜索類應用。

阿裏雲語音服務SDK(NLSClinet),是運行於android平台的基礎語音識別、自然語言理解和語音合成的基礎服務,本服務通過Jar包和.so庫的形式導入,用戶通過本指南可以方便的接入。

SDK下載地址

一句話識別AndroidSDK

開發包目錄

文件夾 內容
libs/
libs/NlsClientSdk.jar NLSClinet的服務包
libs/armeabi
libs/armeabi/libjoysecurity.so
libs/armeabi/libzts2.so
libs/armeabi-v7a
libs/armeabi-v7a/libjoysecurity.so
libs/armeabi-v7a/libzts2.so
libs/x86
libs/x86/libjoysecurity.so
libs/x86/libzts2.so
  • 本服務使用了解析json的gson.jar,需要用戶自行導入。

集成指南

導入服務包

將下載的服務包解壓後,將NlsClientSdk.jar,以及對應架構的.so包導入你的項目中的libs/目錄下。

Android權限管理

在AndroidManifest.xml文件中添加以下權限申請:

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  4. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  7. <uses-permission android:name="android.permission.WRITE_SETTINGS" />

Proguard配置

如果代碼使用了混淆,請在proguard-rules.pro中配置:

  1. -keep class com.alibaba.idst.nls.** {*;}
  2. -keep class com.google.**{*;}

重要接口說明

com.alibaba.idst.nls.NlsClient


語音服務的核心服務類,客戶端程序通過調用該類的cancel()、start()、stop()等方法來打開、關閉或發送語音數據。

全局配置

public static void configure(Context appContext)

  • 說明 全局配置,在初始化NlsClient前需要被調用,建議放在Application的onCreate()裏
  • 參數
    • appContext 傳入ApplicationContext參數,用於識別引擎內部訪問和Android上下文相關的資源
  • 返回值 null

實例化NlsClient對象

public static NlsClient newInstance(Context context,NlsListener nlsListener,StageListener stageListener, NlsRequest nlsRequest)

  • 說明 獲得一個NlsClient, 通過該方法實例化NlsClient。
  • 參數
    • context 傳入Context參數,用於識別引擎內部訪問和Android上下文相關的資源
    • nlsListener 識別相關的回調接口,用於通知客戶端識別結果
    • stageListener 引擎狀態回調接口,用於通知客戶端當前的引擎狀態以及錄音音量等
  • 返回值 NlsClient

打開語音識別引擎

public boolean start()

  • 說明 打開語音識別引擎
  • 參數

  • 返回值 isOpen true:打印log false:關閉log

    true:開始錄音,並對錄音進行語音識別 false:打開語音識別引擎失敗,可能重複打開或者遠程服務處於不可用狀態。

關閉語音識別引擎

public void stop()

  • 說明 關閉語音識別引擎
  • 參數

  • 返回值

判斷是否正在進行語音識別

public boolean isStarted()

  • 說明 返回當前引擎是否已啟動
  • 參數

  • 返回值 true:引擎已啟動 false:引擎未啟動

取消此次語音識別

public void cancel()

  • 說明 取消此次語音識別,識別結果為ErrorCode.USER_CANCEL
  • 參數

  • 返回值 null

其它接口

Log開關

public static void openLog(boolean isOpen)

  • 說明 log開關,標識是否需要通過logcat打印識別引擎的相關log
  • 參數
    • isOpen true:打印log false:關閉log
  • 返回值 null

設置VAD是否打開

public NlsClient setRecordAutoStop(boolean isAutoStop)

  • 說明 VAD 是端點檢測功能,打開VAD可以自動檢測語音結束,並結束語音
  • 參數
    • isAutoStop true:打開VAD false:關閉VAD
  • 返回值 NlsClient

設置音量回調時長

public NlsClient setMinVoiceValueInterval(int interval)

  • 說明 設置獲取錄音音量的最短時間間隔,防止錄音音量回調過於頻繁影響客戶端對音量的展示邏輯
  • 參數
    • interval 更新間隔 單位ms
  • 返回值 NlsClient

設置最短錄音時長

public NlsClient setMinRecordTime(int minRecordTime)

  • 說明 用於設置最短錄音時間,引擎開始時,用戶在該時間內不說話,則會自動關閉引擎,識別結果為ErrorCode.NOTHING
  • 參數
    • minRecordTime 最短錄音時間 單位ms
  • 返回值 NlsClient

設置最大錄音時長

public NlsClient setMaxRecordTime(int maxRecordTime)

  • 說明 用於設置最大錄音時間
  • 參數
    • maxRecordTime 最大錄音時間 單位ms
  • 返回值 NlsClient

設置最大錄音中斷時間

public NlsClient setMaxStallTime(int milliSeconds)

  • 說明 打開VAD時, 設置錄音中句子之間的最長停頓時間 ,錄音過程中,如果用戶停頓超過該時間則認為用戶已經停止說話,停止錄音
  • 參數
    • milliSeconds 最大錄音時間 單位ms
  • 返回值 NlsClient

獲取完整錄音語音

public byte[] getObject()

  • 說明
    • 得到錄音樣本PCM,該方法可以在mStageListener.onStopRecognizing()方法中調用。
  • 參數
    • pcm bytes

com.alibaba.idst.nls.internal.protocol.NlsRequest


語音服務的請求封裝對象。調用程序需要至少在請求對象裏設定好調用者的appKey和語音數據的格式以便後台服務能正確識別並翻譯語音。

初始化Nls 請求:NlsRequest mNlsRequest = new NlsRequest(proto)或缺省proto:NlsRequest mNlsRequest = new NlsRequest()

public void setApp_key(String app_key)

  • 說明 設置應用的appkey,appkey請從 “快速開始” 幫助頁麵的appkey列表中獲取。
  • 參數
    • app_key
  • 返回值 null

public void setAsr_sc(String sc)

  • 說明 設置語音識別的語音格式,默認為opu。 該項在使用語音識別服務時必須設置,起到初始化作用。
  • 參數
    • sc 設置為opu。
  • 返回值 null

public void authorize(String id, String secret)

  • 說明 數加認證模塊,所有的請求都必須通過authorize方法認證通過,才可以使用。 id和secret需要申請獲取。
  • 參數
    • id id。
    • secret 對應密鑰。
  • 返回值 null

com.alibaba.idst.nls.internal.protocol.NlsRequestProto


NlsRequest對象初始化時需要注入的參數。

public void setApp_id(String app_id)

  • 設置application_id.

public void setApp_user_id(String app_user_id)

  • 設置app_user_id.

public void setReq_id(String req_id)

  • 設置req_id.

public void setQuery_type(String query_type)

  • 設置query_type.

com.alibaba.idst.nls.StageListener


語音服務引擎狀態變更回調接口,服務狀態的改變、音量大小的回調、語音文件的生成通過本接口獲取。

錄音開始的回調

public void onStartRecording(NlsClient recognizer)

  • 說明 錄音開始
  • 參數

  • 返回值 NlsClient

錄音結束的回調

public void onStopRecording(NlsClient recognizer)

  • 說明 錄音結束
  • 參數

  • 返回值 NlsClient

識別開始的回調

public void onStartRecognizing(NlsClient recognizer)

  • 說明 識別開始
  • 參數

  • 返回值 NlsClient

識別結束的回調

public void onStopRecognizing(NlsClient recognizer)

  • 說明 識別結束
  • 參數

  • 返回值 NlsClient

音量大小回調

public void onVoiceVolume(int volume)

  • 說明 獲取音量

  • 參數

    • volume 錄音音量,範圍0-100
  • 返回值 null

獲取流式返回錄音語音

public void onVoiceData(short[] data, int length)

  • 說明 當引擎獲取到每幀錄音時回調,用於客戶端應用獲取錄音數據,默認20ms每幀數據
  • 參數
    • data 錄音數據 原始未壓縮 未判斷VAD
    • length 該幀錄音長度

com.alibaba.idst.nls.NlsListener


語音服務結果的回調類,語音服務是一個相對較長過程,為了不影響客戶端的正常工作,語音sdk被設計成異步模式,調用程序將語音客戶端建立好並將語音數據交給sdk後就可以離開。在收到語音數據之後的處理需要通過實現該接口來完成。每一個識別過程創建的時候都需要注入偵聽者以響應語音服務的結果。

語音識別結果的回調接口

public void onRecognizingResult(int status, RecognizedResult result)

  • 說明 語音識別結果回調接口,識別結束時回調。(使用流式返回的key時,會多次回調本接口得到實時識別結果)
  • 參數
    • status 標識識別結果的狀態,詳情見下方。
    • result 返回識別結果的數據結構,詳情見下方。
  • 返回值 null
  • result中的字段值:
字段名 含義 類型
asr_out 語音識別結果json String
finish 流式返回時判斷返回是否結束的字段,finish=true表示返回結束 Boolean
bstream_attached 判斷後麵是否跟有語音流 Boolean
status_code 狀態碼 int

錯誤碼

  • 客戶端錯誤碼
字段名 錯誤碼 含義
SUCCESS 0 成功
RECOGNIZE_ERROR 1 識別失敗
USER_CANCEL 520 用戶取消
CONNECT_ERROR 530 網絡及通訊異常
NOTHING 540 語音服務異常
RECORDING_ERROR 550 錄音及語音識別異常
ERROR_CLICK_TOOMUCH 570 用戶點擊過快
  • 服務端返回結果錯誤碼
狀態 status_code CloseFrame狀態碼 HTTP語義
成功 200 1000 成功處理
請求格式有誤 400 4400 錯誤請求
需要鑒權信息 401 4401 請求要求身份驗證
鑒權失敗 403 4403 服務器拒絕請求
超出最大並發量 429 4429 太多請求
請求超時 408 4408 處理請求超時
處理出錯 500 4500 服務器內部錯誤
服務不可用 503 4503 服務不可用

完整示例

  1. package com.alibaba.idst.nlsdemo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.EditText;
  8. import android.widget.Toast;
  9. import com.alibaba.idst.R;
  10. import com.alibaba.idst.nls.NlsClient;
  11. import com.alibaba.idst.nls.NlsListener;
  12. import com.alibaba.idst.nls.StageListener;
  13. import com.alibaba.idst.nls.internal.protocol.NlsRequest;
  14. import com.alibaba.idst.nls.internal.protocol.NlsRequestProto;
  15. public class PublicAsrActivity extends Activity {
  16. private boolean isRecognizing = false;
  17. private EditText mFullEdit;
  18. private EditText mResultEdit;
  19. private Button mStartButton;
  20. private Button mStopButton;
  21. private NlsClient mNlsClient;
  22. private NlsRequest mNlsRequest = initNlsRequest();
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_public_asr);
  27. mFullEdit = (EditText) findViewById(R.id.editText2);
  28. mResultEdit = (EditText) findViewById(R.id.editText);
  29. mStartButton = (Button) findViewById(R.id.button);
  30. mStopButton = (Button) findViewById(R.id.button2);
  31. String appkey = ""; //請設置簡介頁麵的Appkey
  32. mNlsRequest.setApp_key(appkey); //appkey列表中獲取
  33. mNlsRequest.setAsr_sc("opu"); //設置語音格式
  34. NlsClient.openLog(true);
  35. NlsClient.configure(getApplicationContext()); //全局配置
  36. mNlsClient = NlsClient.newInstance(this, mRecognizeListener, mStageListener,mNlsRequest); //實例化NlsClient
  37. mNlsClient.setMaxRecordTime(60000); //設置最長語音
  38. mNlsClient.setMaxStallTime(1000); //設置最短語音
  39. mNlsClient.setMinRecordTime(500); //設置最大錄音中斷時間
  40. mNlsClient.setRecordAutoStop(false); //設置VAD
  41. mNlsClient.setMinVoiceValueInterval(200); //設置音量回調時長
  42. initStartRecognizing();
  43. initStopRecognizing();
  44. }
  45. private NlsRequest initNlsRequest(){
  46. NlsRequestProto proto = new NlsRequestProto();
  47. proto.setApp_user_id("xxx"); //設置在應用中的用戶名,可選
  48. return new NlsRequest(proto);
  49. }
  50. private void initStartRecognizing(){
  51. mStartButton.setOnClickListener(new View.OnClickListener() {
  52. @Override
  53. public void onClick(View view) {
  54. isRecognizing = true;
  55. mResultEdit.setText("正在錄音,請稍候!");
  56. mNlsRequest.authorize("", ""); //請替換為用戶申請到的Access Key ID和Access Key Secret
  57. mNlsClient.start();
  58. mStartButton.setText("錄音中。。。");
  59. }
  60. });
  61. }
  62. private void initStopRecognizing(){
  63. mStopButton.setOnClickListener(new View.OnClickListener() {
  64. @Override
  65. public void onClick(View view) {
  66. isRecognizing = false;
  67. mResultEdit.setText("");
  68. mNlsClient.stop();
  69. mStartButton.setText("開始 錄音");
  70. }
  71. });
  72. }
  73. private NlsListener mRecognizeListener = new NlsListener() {
  74. @Override
  75. public void onRecognizingResult(int status, RecognizedResult result) {
  76. switch (status) {
  77. case NlsClient.ErrorCode.SUCCESS:
  78. Log.i("asr", "[demo] callback onRecognizResult " + result.asr_out);
  79. mResultEdit.setText(result.asr_out);
  80. mFullEdit.setText(result.asr_out);
  81. break;
  82. case NlsClient.ErrorCode.RECOGNIZE_ERROR:
  83. Toast.makeText(PublicAsrActivity.this, "recognizer error", Toast.LENGTH_LONG).show();
  84. break;
  85. case NlsClient.ErrorCode.RECORDING_ERROR:
  86. Toast.makeText(PublicAsrActivity.this,"recording error",Toast.LENGTH_LONG).show();
  87. break;
  88. case NlsClient.ErrorCode.NOTHING:
  89. Toast.makeText(PublicAsrActivity.this,"nothing",Toast.LENGTH_LONG).show();
  90. break;
  91. }
  92. isRecognizing = false;
  93. }
  94. } ;
  95. private StageListener mStageListener = new StageListener() {
  96. @Override
  97. public void onStartRecognizing(NlsClient recognizer) {
  98. super.onStartRecognizing(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  99. }
  100. @Override
  101. public void onStopRecognizing(NlsClient recognizer) {
  102. super.onStopRecognizing(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  103. }
  104. @Override
  105. public void onStartRecording(NlsClient recognizer) {
  106. super.onStartRecording(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  107. }
  108. @Override
  109. public void onStopRecording(NlsClient recognizer) {
  110. super.onStopRecording(recognizer); //To change body of overridden methods use File | Settings | File Templates.
  111. }
  112. @Override
  113. public void onVoiceVolume(int volume) {
  114. super.onVoiceVolume(volume);
  115. }
  116. };
  117. }

最後更新:2016-12-08 11:44:40

  上一篇:go 賬號和服務申請__快速開始_智能語音交互-阿裏雲
  下一篇:go iOS SDK__一句話識別_語音識別(ASR)_智能語音交互-阿裏雲