本文為您介紹如何使用阿里云智能語音服務提供的Android SDK,包括SDK下載安裝、關鍵接口及代碼示例。
前提條件
下載安裝
下載SDK。
對象
說明
SDK名稱
智能語音交互移動端SDK
開發者
阿里云計算有限公司
SDK版本
2.6.3-01B
SDK包名
com.alibaba.idst.nui
SDK更新時間
2024-12-19
SDK大小
MinSizeRel/nuisdk-release.aar
7.2MB
RelWithDebugInfo/nuisdk-release.aar
9.7MB
SDK MD5值
MinSizeRel/nuisdk-release.aar
c8e84d882a776797179b07cb55325a17
RelWithDebugInfo/nuisdk-release.aar
3bd1e2c2423c23e6522b7bc3ac072ec9
隱私政策
SDK整合包下載
解壓ZIP包,在
app/libs
目錄下獲取AAR格式的SDK包,將AAR包集成到您的工程項目中進行依賴。使用Android Studio打開此工程查看參考代碼實現,其中示例代碼為FileTranscriberActivity.java文件,替換Appkey和Token后可直接運行。
SDK關鍵接口
initialize:初始化SDK。
/** * 初始化SDK,SDK為單例,請先釋放后再次進行初始化。請勿在UI線程調用,可能會引起阻塞 * @param callback: 事件監聽回調,參見下文回調說明 * @param parameters: 初始化參數,參見接口說明 * @param level: log打印級別,值越小打印越多 * @return: 參見錯誤碼 */ public synchronized int initialize(final INativeFileTransCallback callback, String parameters, final Constants.LogLevel level)
其中,INativeFileTransCallback類型需要實現的回調是onFileTransEventCallback。
onFileTransEventCallback:文件識別事件回調。
/** * SDK主要事件回調 * @param event: 回調事件,參見如下事件列表 * @param resultCode: 參見錯誤碼,在出現EVENT_ASR_ERROR事件時有效 * @param arg2: 保留參數 * @param asrResult: 語音識別結果 * @param taskId: 轉寫任務ID */ void onFileTransEventCallback(NuiEvent event, final int resultCode, final int arg2, AsrResult asrResult, String taskId);
事件列表:
名稱
說明
EVENT_FILE_TRANS_CONNECTED
連接文件識別服務成功
EVENT_FILE_TRANS_UPLOADED
上傳文件成功
EVENT_FILE_TRANS_RESULT
識別最終結果
EVENT_ASR_ERROR
根據錯誤碼信息判斷出錯原因
setParams:以JSON格式設置SDK參數。
/** * 以JSON格式設置參數 * @param params: 參見接口說明 * @return: 參見錯誤碼 */ public synchronized int setParams(String params)
startFileTranscriber:開始文件識別。
/** * 開始識別 * @param params: 識別參數,參見接口說明 * @param taskId: 開始轉寫的任務ID,SDK生成隨機字符串 * @return: 參見錯誤碼 */ public synchronized int startFileTranscriber(String params, byte[] taskId)
stopFileTranscriber:結束識別。
/** * 結束識別 * @return: 參見錯誤碼 */ public synchronized int stopFileTranscriber(String taskId)
release:釋放SDK。
/** * 釋放SDK資源 * @return: 參見錯誤碼 */ public synchronized int release()
調用步驟
初始化SDK。
根據業務需求設置參數。
調用startFileTranscriber開始識別。
在EVENT_FILE_TRANS_RESULT事件中獲取最終識別結果。
結束調用,使用release接口釋放SDK資源。
Proguard配置
如果代碼使用了混淆,請在proguard-rules.pro中配置:
-keep class com.alibaba.idst.nui.*{*;}
代碼示例
接口默認采用GetInstance獲得單例,您如果有多例需求,也可以直接new對象進行使用。
NUI SDK初始化
//這里主動調用完成SDK配置文件的拷貝
CommonUtils.copyAssetsData(this);
//獲取工作路徑
String assets_path = CommonUtils.getModelPath(this);
Log.i(TAG, "use workspace " + assets_path);
int ret = nui_instance.initialize(this, genInitParams(assets_path, debug_path), Constants.LogLevel.LOG_LEVEL_VERBOSE);
其中,genInitParams生成為String JSON字符串,包含資源目錄和用戶信息。其中用戶信息包含如下字段。
private String genInitParams(String workpath, String debugpath) {
String str = "";
try{
//獲取token方式:
JSONObject object = new JSONObject();
//賬號和項目創建
// ak_id ak_secret app_key如何獲得,請查看http://bestwisewords.com/document_detail/72138.html
object.put("app_key", "<您申請創建的app_key>"); // 必填
//方法1:(強烈推薦)
// 首先ak_id ak_secret app_key如何獲得,請查看http://bestwisewords.com/document_detail/72138.html
// 然后請看 http://bestwisewords.com/document_detail/466615.html 使用其中方案一獲取臨時憑證
// 此方案簡介: 遠端服務器生成具有有效時限的臨時憑證, 下發給移動端進行使用, 保證賬號信息ak_id和ak_secret不被泄露
// 獲得Token方法(運行在APP服務端): http://bestwisewords.com/document_detail/450255.html?spm=a2c4g.72153.0.0.79176297EyBj4k
object.put("token", "<服務器生成的具有時效性的臨時憑證>"); // 必填
//方法2:
// STS獲取臨時憑證方法暫不支持
//方法3:(強烈不推薦,存在阿里云賬號泄露風險)
// 參考Auth類的實現在端上訪問阿里云Token服務獲取SDK進行獲取。請勿將ak/sk存在本地或端側環境。
// 此方法優點: 端側獲得Token, 無需搭建APP服務器。
// 此方法缺點: 端側獲得ak/sk賬號信息, 極易泄露。
// JSONObject object = Auth.getAliYunTicket();
object.put("url", "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/FlashRecognizer"); // 必填
object.put("device_id", Utils.getDeviceId()); // 必填, 推薦填入具有唯一性的id, 方便定位問題。也可用提供Utils.getDeviceId()
//工作目錄路徑,SDK從該路徑讀取配置文件
object.put("workspace", workpath); // 必填, 且需要有讀寫權限
//debug目錄。當初始化SDK時的save_log參數取值為true時,該目錄用于保存中間音頻文件
object.put("debug_path", debugpath);
// FullMix = 0 // 選用此模式開啟本地功能并需要進行鑒權注冊
// FullCloud = 1
// FullLocal = 2 // 選用此模式開啟本地功能并需要進行鑒權注冊
// AsrMix = 3 // 選用此模式開啟本地功能并需要進行鑒權注冊
// AsrCloud = 4
// AsrLocal = 5 // 選用此模式開啟本地功能并需要進行鑒權注冊
// 這里只能選擇FullMix和FullCloud
object.put("service_mode", Constants.ModeFullCloud); // 必填
str = object.toString();
} catch (JSONException e) {
e.printStackTrace();
}
return str;
}
開始識別
調用startFileTranscriber方法開啟識別。
byte[] task_id = new byte[32];
NativeNui.GetInstance().startFileTranscriber(genDialogParams(), taskId);
private String genDialogParams() {
String params = "";
try {
JSONObject dialog_param = new JSONObject();
//若想在運行時切換app_key
//dialog_param.put("app_key", "");
dialog_param.put("file_path", "/sdcard/test.wav");
JSONObject nls_config = new JSONObject();
nls_config.put("format", "wav");
dialog_param.put("nls_config", nls_config);
params = dialog_param.toString();
} catch (JSONException e) {
e.printStackTrace();
}
Log.i(TAG, "dialog params: " + params);
return params;
}
回調處理
onFileTransEventCallback:NUI SDK事件回調,請勿在事件回調中調用SDK的接口,可能引起死鎖。
public void onFileTransEventCallback(Constants.NuiEvent event, final int resultCode, final int arg2, AsrResult asrResult, String taskId) {
Log.i(TAG, "event=" + event);
if (event == Constants.NuiEvent.EVENT_FILE_TRANS_RESULT) {
showText(asrView, asrResult.asrResult);
} else if (event == Constants.NuiEvent.EVENT_ASR_ERROR) {
;
}
}
常見問題
Android SDK調用文件上傳轉寫極速版,調用int startFileTranscriber(String params, byte[] task_id)后無法收到回調,報錯提示“EventE/iDST::NativeNui: no java instance, maybe already released”。
您需要核實:
資源文件是否復制成功。
CommonUtils.copyAssetsData
函數是否已調用。
Android SDK錄音文件識別極速版,通過任務ID查詢任務狀態用哪個API?
不支持通過任務ID查詢任務狀態,任務中處理安卓端回調就是當前任務的狀態。
Android SDK是否可以上傳OPUS音頻數據,實現實時語音轉文字?
ASR中一句話識別和錄音文件極速版支持OPUS數據,實時語音轉文字僅支持PCM編碼、16 bit采樣位數、單聲道(mono)。具體詳情,請參見接口說明。
調用Android SDK時,手機報錯提示“audio recoder not init”如何解決?
您可以通過以下方式排查:
檢查AudioRecord是否初始化正常。
檢查語音播放器是否有問題。
系統的錄音模塊代碼如下,也可單獨編寫AudioRecord錄音代碼,測試是否正常。