本文為您介紹如何使用阿里云智能語音服務提供的HarmonyOS Next NUI SDK,包括SDK下載安裝、關鍵接口及代碼示例。
前提條件
下載安裝
下載V1.5.016.napi.001.003_5d87aea0fa4f42e1b5bb254573fbbcc6af546c6b.tar.gz。
以arkts HAR包的形式進行集成。解壓壓縮包,其中entry/libs/neonui.har 是SDK生成的HAR包文件,在用戶工程項目中導入調用即可。如果需要HarmonyOS Next CPP接入方式,可在壓縮包的native/libs和native/include中獲得動態庫和頭文件。
使用DevEco Studio打開工程,其中錄音文件識別的示例代碼為FileTranscriberPage.ets文件,替換UserKey.ets中 UserKey類的Appkey和Token后,即可直接運行。
SDK關鍵接口
initialize:初始化SDK。
/** * 初始化SDK,SDK為單例,請先釋放后再次進行初始化。請勿在UI線程調用,可能會引起阻塞 * @param callback: 事件監聽回調,參見下文回調說明 * @param parameters: 初始化參數,參見接口說明 * @param level: log打印級別,值越小打印越多 * @param save_log: 是否保存log信息,使用默認值false即可。 * @return: 參見錯誤碼 */ public initializeFileTrans(callback:INativeFileTransCallback , parameters:string , level:number , save_log:boolean=false):number
其中,INativeFileTransCallback類型需要實現的回調是onFileTransEventCallback。
onFileTransEventCallback:文件識別事件回調。
/** * SDK主要事件回調 * @param event: 回調事件,參見如下事件列表 * @param resultCode: 參見錯誤碼,在出現EVENT_ASR_ERROR事件時有效 * @param arg2: 保留參數 * @param asrResult: 語音識別結果 * @param taskId: 轉寫任務ID */ onFileTransEventCallback(event:Constants.NuiEvent, resultCode:number, arg2:number, asrResult:AsrResult, taskId:string):void
事件列表:
名稱
說明
EVENT_FILE_TRANS_CONNECTED
連接文件識別服務成功
EVENT_FILE_TRANS_UPLOADED
上傳文件成功
EVENT_FILE_TRANS_RESULT
識別最終結果
EVENT_ASR_ERROR
根據錯誤碼信息判斷出錯原因
setParams:以JSON格式設置SDK參數。
/** * 以JSON格式設置參數 * @param params: 參見接口說明 * @return: 參見錯誤碼 */ public setParams(params:string):number
startFileTranscriber:開始文件識別。
/** * 開始識別 * @param params: 識別參數,參見接口說明 * @param taskId: 開始轉寫的任務ID,SDK生成隨機字符串 * @return: 參見錯誤碼 */ public startFileTranscriber(params:string, task_id:ArrayBuffer):number
cancelFileTranscriber:結束識別。
/** * 結束識別 * @return: 參見錯誤碼 */ public cancelFileTranscriber(task_id:string):number
release:釋放SDK。
/** * 釋放SDK資源 * @return: 參見錯誤碼 */ public release():number
調用步驟
創建SDK類對象實例
初始化SDK。
根據業務需求設置參數。
調用startFileTranscriber開始識別。
在EVENT_FILE_TRANS_RESULT事件中獲取最終識別結果。
結束調用,使用release接口釋放SDK資源。
代碼示例
接口默認采用GetInstance獲得單例,您如果有多例需求,也可以直接new對象進行使用。
NUI SDK初始化
//初始化SDK,注意用戶需要在Auth.getAliYunTicket中填入相關ID信息才可以使用。
let ret:number = this.g_asrinstance.initializeFileTrans(this.cbhandle, this.genInitParams(asset_path,debug_path), Constants.LogLevel.LOG_LEVEL_VERBOSE, false);
console.info("result = " + ret);
if (ret == Constants.NuiResultCode.SUCCESS) {
} else {
//拋出錯誤異常信息。
}
//設置相關識別參數,具體參考API文檔
this.g_asrinstance.setParams(this.genParams());
其中,genInitParams生成為String JSON字符串,包含資源目錄和用戶信息。其中用戶信息包含如下字段。 genParams生成String JSON字符串格式的部分參數,在initializeFileTrans()之后, start之前進行設置。
genInitParams(workpath:string, debugpath:string):string {
let str:string = "";
//獲取token方式:
let object:Map<string, string|number|boolean|object> = new Map();
//賬號和項目創建
// ak_id ak_secret app_key如何獲得,請查看http://bestwisewords.com/document_detail/72138.html
object.set("app_key", UserKey.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.set("token", UserKey.token); // 必填
//方法2:
// STS獲取臨時憑證方法暫不支持
//方法3:(強烈不推薦,存在阿里云賬號泄露風險)
// 參考Auth類的實現在端上訪問阿里云Token服務獲取SDK進行獲取。請勿將ak/sk存在本地或端側環境。
// 此方法優點: 端側獲得Token, 無需搭建APP服務器。
// 此方法缺點: 端側獲得ak/sk賬號信息, 極易泄露。
// JSONObject object = Auth.getAliYunTicket();
object.set("device_id", "***"/*Utils.getDeviceId()*/); // 必填, 推薦填入具有唯一性的id, 方便定位問題
object.set("url", UserKey.url_file_trans); // 默認
object.set("workspace", workpath); // 必填, 且需要有讀寫權限
//當初始化SDK時的save_log參數取值為true時,該參數生效。表示是否保存音頻debug,該數據保存在debug目錄中,需要確保debug_path有效可寫。
// object.put("save_wav", "true");
//debug目錄,當初始化SDK時的save_log參數取值為true時,該目錄用于保存中間音頻文件。
object.set("debug_path", debugpath);
// FullMix = 0 // 選用此模式開啟本地功能并需要進行鑒權注冊
// FullCloud = 1
// FullLocal = 2 // 選用此模式開啟本地功能并需要進行鑒權注冊
// AsrMix = 3 // 選用此模式開啟本地功能并需要進行鑒權注冊
// AsrCloud = 4
// AsrLocal = 5 // 選用此模式開啟本地功能并需要進行鑒權注冊
object.set("service_mode", Constants.ModeFullCloud); // 必填
str = MapToJson(object)
console.info("configinfo genInitParams:" + str);
return str;
}
genParams():string {
let params:string = "";
let nls_config:Map<string, string|number|boolean|object> = new Map();
nls_config.set("enable_intermediate_result", true);
let parameters:Map<string, string|number|boolean|object> = new Map();
parameters.set("nls_config", Object( JSON.parse(MapToJson(nls_config)) ) );
params = MapToJson(parameters);//parameters.toString();
console.log("configinfo genParams" + params)
return params;
}
開始識別
調用startFileTranscriber方法開啟識別。
let task_id:ArrayBuffer = new ArrayBuffer(32);
let ret:number = this.g_asrinstance.startFileTranscriber(this.genDialogParams(), task_id);
genDialogParams():string {
let params:string = "";
let dialog_param:Map<string, string|number|boolean|object> = new Map();
//若想在運行時切換app_key
//dialog_param.put("app_key", "");
let debug_path:string = this.resourceDir
dialog_param.set("file_path", debug_path + "/2.wav"); //使用DevEcoStudio工程目錄resources/resfile/2.wav文件作為輸入文件進行轉寫
let nls_config:Map<string, string|number|boolean|object> = new Map();
nls_config.set("format", "wav"); //和 "file_path"字段的語音文件編碼格式匹配。
dialog_param.set("nls_config", Object( JSON.parse(MapToJson(nls_config)) ) );
params = MapToJson(dialog_param);
console.info("configinfo dialog params: " + params);
return params;
}
回調處理
onFileTransEventCallback:NUI SDK事件回調,請勿在事件回調中調用SDK的接口,可能引起死鎖。
class NativeNuiCallbackHandle implements INativeFileTransCallback{
asrmessage:string;
message:string;
task_result: Map<string, string> = new Map(); //緩存多個文件的識別結果
task_result_all:string=""; //所有文件的識別結果匯總字符串
constructor() {
this.asrmessage=""
this.message=""
}
onFileTransEventCallback(event:Constants.NuiEvent, resultCode:number, finish:number,
asrResult:AsrResult, taskId:string):void{
let asrinfo:string = ""
console.info("event=" + event + " task_id " + taskId);
if (event == Constants.NuiEvent.EVENT_FILE_TRANS_UPLOADED) {
this.message = "EVENT_FILE_TRANS_UPLOADED"
showToast("完成上傳,正在轉寫...");
} else if (event == Constants.NuiEvent.EVENT_FILE_TRANS_RESULT) {
this.message = "EVENT_FILE_TRANS_RESULT"
showToast("轉寫完成");
} else if (event == Constants.NuiEvent.EVENT_ASR_ERROR) {
this.message = "EVENT_ASR_ERROR"
console.info("error happened: " + resultCode);
showToast("error happened: " + resultCode);
}
if (asrResult) {
asrinfo = asrResult.asrResult
console.log(`asrinfo is ${asrinfo}`)
if (!asrinfo){
console.log(`asrinfo is null, with event ${event}`)
return
}
let asrresult_json:object|null = JSON.parse(asrResult.asrResult)
console.log(JSON.stringify(asrresult_json))
if (asrresult_json) {
let payload:object|null = asrresult_json["flash_result"];
if (payload) {
//console.log(JSON.stringify(payload))
let filetransresultarray:Array<object> = payload["sentences"]
let result_temp:string=""
for (let i=0;i<filetransresultarray.length;i++){
result_temp = result_temp +filetransresultarray[i]["text"]
}
this.asrmessage=result_temp
this.task_result.set(taskId, this.asrmessage)
}
}
}
this.task_result_all=""
let index:number = 0
this.task_result.forEach((value:string, key:string)=>{
this.task_result_all += `${index}==>${key}:${value};;\n`
index += 1
})
}
}
取消識別
常見問題
鴻蒙NEXT SDK錄音文件識別極速版,通過任務ID查詢任務狀態用哪個API?
不支持通過任務ID查詢任務狀態,任務中處理安卓端回調就是當前任務的狀態。
鴻蒙NEXT SDK是否可以上傳OPUS音頻數據,實現實時語音轉文字?
ASR中一句話識別和錄音文件極速版支持OPUS數據,實時語音轉文字僅支持PCM編碼、16 bit采樣位數、單聲道(mono)。具體詳情,請參見接口說明。