Android SDK
本文介紹了如何使用阿里云智能語(yǔ)音服務(wù)提供的Android NUI SDK,包括SDK下載安裝、關(guān)鍵接口及代碼示例。
前提條件
閱讀接口說(shuō)明,詳情請(qǐng)參見(jiàn)接口說(shuō)明。
已獲取項(xiàng)目Appkey,詳情請(qǐng)參見(jiàn)創(chuàng)建項(xiàng)目。
已獲取Access Token,詳情請(qǐng)參見(jiàn)獲取Token概述。
下載安裝
下載SDK
重要下載后請(qǐng)?jiān)跇永跏蓟a中替換您的阿里云賬號(hào)信息、
Appkey
和Token
才可運(yùn)行。對(duì)象
說(shuō)明
SDK名稱(chēng)
智能語(yǔ)音交互移動(dòng)端SDK
開(kāi)發(fā)者
阿里云計(jì)算有限公司
SDK版本
2.6.3-01B
SDK包名
com.alibaba.idst.nui
SDK更新時(shí)間
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整合包下載
類(lèi)別
兼容范圍
系統(tǒng)
支持Android 4.0 以上版本,API LEVEL 14
架構(gòu)
armeabi-v7a,arm64-v8a,x86,x86_64
此SDK還包含如下功能,若未支持您想要的功能,請(qǐng)去對(duì)應(yīng)文檔獲取SDK。
功能
是否支持
一句話(huà)識(shí)別
是
實(shí)時(shí)語(yǔ)音識(shí)別
是
語(yǔ)音合成
是
實(shí)時(shí)長(zhǎng)文本語(yǔ)音合成
是
流式文本語(yǔ)音合成
是
離線(xiàn)語(yǔ)音合成
否
錄音文件識(shí)別極速版
是
喚醒及命令詞
否
聽(tīng)悟?qū)崟r(shí)推流
是
解壓ZIP包,在app/libs目錄下獲取AAR格式的SDK包,將AAR包集成到您的工程項(xiàng)目中進(jìn)行依賴(lài)。若需要Android CPP接入方式,則可在ZIP包的android_libs和android_include中獲得動(dòng)態(tài)庫(kù)和頭文件。
使用Android Studio打開(kāi)此工程查看參考代碼實(shí)現(xiàn),其中語(yǔ)音合成示例代碼為
StreamInputTtsBasicActivity.java
文件,替換appkey
和token
后可直接運(yùn)行。
關(guān)鍵接口
startStreamInputTts:開(kāi)始運(yùn)行流式TTS。
/** * 開(kāi)始運(yùn)行流式TTS。請(qǐng)勿在UI線(xiàn)程調(diào)用,可能會(huì)引起阻塞。 * @param callback:事件監(jiān)聽(tīng)回調(diào),參見(jiàn)下文具體回調(diào)。 * @param ticket:json string形式的初始化參數(shù),參見(jiàn)下方說(shuō)明。 * @param parameters:json string形式的初始化參數(shù),參見(jiàn)下方說(shuō)明。 * @param session_id:當(dāng)前會(huì)話(huà)的id,若客戶(hù)端請(qǐng)求時(shí)傳入則原樣返回,否則由服務(wù)端自動(dòng)生成32位唯一ID。 * @param level:log打印級(jí)別,值越小打印越多。 * @param save_log:是否保存log為文件,存儲(chǔ)目錄為ticket中的debug_path字段值。注意,log文件無(wú)上限,請(qǐng)注意持續(xù)存儲(chǔ)導(dǎo)致磁盤(pán)存滿(mǎn)。 * @return:參見(jiàn)錯(cuò)誤碼:http://bestwisewords.com/document_detail/459864.html。 */ public synchronized int startStreamInputTts(INativeStreamInputTtsCallback callback, String ticket, String parameters, String session_id, int log_level, boolean save_log);
其中,INativeStreamInputTtsCallback類(lèi)型包含如下回調(diào)。
onStreamInputTtsEventCallback:SDK事件回調(diào)。
/** * 事件回調(diào) * @param event:回調(diào)事件,參見(jiàn)如下事件列表。 * @param task_id:整個(gè)實(shí)時(shí)語(yǔ)音合成會(huì)話(huà)的任務(wù)ID,整個(gè)請(qǐng)求中需要保持一致,32位唯一ID。 * @param session_id:當(dāng)前會(huì)話(huà)的id,若客戶(hù)端請(qǐng)求時(shí)傳入則原樣返回,否則由服務(wù)端自動(dòng)生成32位唯一ID。 * @param ret_code:參見(jiàn)錯(cuò)誤碼,出現(xiàn)STREAM_INPUT_TTS_EVENT_TASK_FAILED事件時(shí)有效,可查閱http://bestwisewords.com/document_detail/459864.html。 * @param error_msg:詳細(xì)錯(cuò)誤信息,出現(xiàn)STREAM_INPUT_TTS_EVENT_TASK_FAILED事件時(shí)有效。 * @param timestamp:合成結(jié)果中時(shí)間戳相關(guān)信息。 * @param all_response:完整的json string格式返回消息,可從中解析需要的信息。 */ void onStreamInputTtsEventCallback(StreamInputTtsEvent event, String task_id, String session_id, int ret_code, String error_msg, String timestamp, String all_response);
事件列表:
名稱(chēng)
說(shuō)明
STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED
語(yǔ)音合成開(kāi)始,準(zhǔn)備播放。
STREAM_INPUT_TTS_EVENT_SENTENCE_BEGIN
服務(wù)端檢測(cè)到了一句話(huà)的開(kāi)始。
STREAM_INPUT_TTS_EVENT_SENTENCE_SYNTHESIS
增量返回語(yǔ)音合成的結(jié)果,包含最新的音頻和時(shí)間戳,句內(nèi)全量,句間增量。
STREAM_INPUT_TTS_EVENT_SENTENCE_END
服務(wù)端檢測(cè)到了一句話(huà)的結(jié)束,返回該句的全量時(shí)間戳。
STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE
服務(wù)端檢測(cè)到了一句話(huà)的結(jié)束,返回該句的全量時(shí)間戳。
STREAM_INPUT_TTS_EVENT_TASK_FAILED
語(yǔ)音合成發(fā)生錯(cuò)誤,詳見(jiàn)ret_code和error_msg。
onStreamInputTtsDataCallback:合成數(shù)據(jù)回調(diào)。
/** * 合成數(shù)據(jù)回調(diào)。 * @param data:合成的音頻數(shù)據(jù),寫(xiě)入播放器。 */ void onStreamInputTtsDataCallback(byte[] data);
其中,ticket初始化相關(guān)參數(shù)說(shuō)明,生成示例參見(jiàn)下方代碼示例:
參數(shù)
類(lèi)型
是否必選
說(shuō)明
url
String
否
服務(wù)地址,默認(rèn)使用北京服務(wù)。
app_key
String
是
管控臺(tái)創(chuàng)建項(xiàng)目的appkey。
token
String
是
請(qǐng)確保該Token可以使用并在有效期內(nèi)。
debug_path
String
否
當(dāng)save_log為true時(shí),將會(huì)把運(yùn)行日志存儲(chǔ)在此路徑下。
complete_waiting_ms
Integer
否
調(diào)用stop后等待STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE的超時(shí)時(shí)間,單位ms,默認(rèn)10s。
parameters任務(wù)相關(guān)參數(shù)說(shuō)明,生成示例參見(jiàn)下方代碼示例:
參數(shù)
類(lèi)型
是否必選
說(shuō)明
voice
String
是
說(shuō)話(huà)人音色。
format
String
否
音頻編碼格式,如“pcm”“wav”“mp3”。
sample_rate
Integer
否
音頻采樣率,24000,可選擇8000、16000、24000、48000。
volume
Integer
否
朗讀音量,范圍是0~100,默認(rèn)50。
speech_rate
Integer
否
朗讀語(yǔ)速,范圍是-500~500,默認(rèn)是0。
pitch_rate
Integer
否
朗讀語(yǔ)調(diào),范圍是-500~500,默認(rèn)是0。
enable_subtitle
Boolean
否
開(kāi)啟字級(jí)別時(shí)間戳。更多使用方法,請(qǐng)參見(jiàn)時(shí)間戳功能介紹。
stopStreamInputTts: 停止語(yǔ)音合成
/** * 停止語(yǔ)音合成,等待接收完所有合成數(shù)據(jù)直到STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE。 * @return:參見(jiàn)錯(cuò)誤碼:http://bestwisewords.com/document_detail/459864.html。 */ public synchronized int stopStreamInputTts();
sendStreamInputTts:發(fā)送待合成文本
/** * 發(fā)送待合成文本 * @param text:待合成文本,僅支持采用UTF-8編碼的文本輸入。單次合成推薦少于5000字,總計(jì)不超過(guò)10萬(wàn)字,其中1個(gè)漢字、1個(gè)英文字母、1個(gè)標(biāo)點(diǎn)或1個(gè)句子中間空格均算作1個(gè)字符。 * @return:參見(jiàn)錯(cuò)誤碼:http://bestwisewords.com/document_detail/459864.html。 */ public synchronized int sendStreamInputTts(String text);
調(diào)用步驟
初始化SDK和播放組件。
根據(jù)業(yè)務(wù)需求設(shè)置參數(shù)。
調(diào)用startStreamInputTts開(kāi)始進(jìn)行流式文本語(yǔ)音合成。
調(diào)用sendStreamInputTts持續(xù)發(fā)送待合成文本。在合成數(shù)據(jù)回調(diào)中,將數(shù)據(jù)寫(xiě)入播放器進(jìn)行播放,建議使用流式播放。
調(diào)用stopStreamInputTts表示文本發(fā)送完成,等待合成完畢。
收到語(yǔ)音合成結(jié)束的回調(diào)。
代碼示例
開(kāi)始語(yǔ)音合成
//SDK初始化
NativeNui stream_input_tts_instance = new NativeNui(Constants.ModeType.MODE_STREAM_INPUT_TTS);
int ret = stream_input_tts_instance.startStreamInputTts(
new INativeStreamInputTtsCallback() {},
genTicket(), genParameters(), "",
Constants.LogLevel.toInt(Constants.LogLevel.LOG_LEVEL_VERBOSE), false);
其中g(shù)enTicket生成為String JSON串,包含用戶(hù)信息。其中用戶(hù)信息包含如下字段,獲取方式請(qǐng)參考接口說(shuō)明文檔。
/**
* ticket生成示例,詳見(jiàn)Demo工程中代碼示例
*/
private String genTicket() {
String str = "";
try {
//鄭重提示:
// 語(yǔ)音交互服務(wù)需要先準(zhǔn)備好賬號(hào),并開(kāi)通相關(guān)服務(wù)。具體步驟請(qǐng)查看:
// http://bestwisewords.com/zh/isi/getting-started/start-here
//
//原始賬號(hào):
// 賬號(hào)(子賬號(hào))信息主要包括AccessKey ID(后續(xù)簡(jiǎn)稱(chēng)為ak_id)和AccessKey Secret(后續(xù)簡(jiǎn)稱(chēng)為ak_secret)。
// 此賬號(hào)信息一定不可存儲(chǔ)在app代碼中或移動(dòng)端側(cè),以防賬號(hào)信息泄露造成資費(fèi)損失。
//
//STS臨時(shí)憑證:
// 由于賬號(hào)信息下發(fā)給客戶(hù)端存在泄露的可能,阿里云提供的一種臨時(shí)訪(fǎng)問(wèn)權(quán)限管理服務(wù)STS(Security Token Service)。
// STS是由賬號(hào)信息ak_id和ak_secret,通過(guò)請(qǐng)求生成臨時(shí)的sts_ak_id/sts_ak_secret/sts_token
// (為了區(qū)別原始賬號(hào)信息和STS臨時(shí)憑證, 命名前綴sts_表示STS生成的臨時(shí)憑證信息)
//什么是STS:http://bestwisewords.com/zh/ram/product-overview/what-is-sts
//STS SDK概覽:http://bestwisewords.com/zh/ram/developer-reference/sts-sdk-overview
//STS Python SDK調(diào)用示例:http://bestwisewords.com/zh/ram/developer-reference/use-the-sts-openapi-example
//
//賬號(hào)需求說(shuō)明:
// 若使用離線(xiàn)功能(離線(xiàn)語(yǔ)音合成、喚醒), 則必須app_key、ak_id和ak_secret,或app_key、sts_ak_id、sts_ak_secret和sts_token
// 若使用在線(xiàn)功能(語(yǔ)音合成、實(shí)時(shí)轉(zhuǎn)寫(xiě)、一句話(huà)識(shí)別、錄音文件轉(zhuǎn)寫(xiě)等), 則只需app_key和token
JSONObject object = Auth.getTicket(Auth.GetTicketMethod.GET_TOKEN_FROM_SERVER_FOR_ONLINE_FEATURES);
if (!object.containsKey("token")) {
Log.e(TAG, "Cannot get token!!!");
}
object.put("url", "wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1"); // 默認(rèn),必填
str = object.toString();
} catch (JSONException e) {
e.printStackTrace();
}
Log.i(TAG, "UserContext:" + str);
return str;
}
genParameters生成為String JSON串,包含參數(shù)信息,請(qǐng)參考接口說(shuō)明文檔。
/**
* parameters生成示例,詳見(jiàn)Demo工程中代碼示例
*/
private String genParameters() {
String str = "";
try {
JSONObject object = new JSONObject();
object.put("enable_subtitle", true);
object.put("voice", "zhixiaoxia");
object.put("format", "pcm");
object.put("sample_rate", 16000);
object.put("volume", 50);
object.put("speech_rate", 0);
object.put("pitch_rate", 0);
str = object.toString();
} catch (JSONException e) {
e.printStackTrace();
}
Log.i(TAG, "user parameters:" + str);
return str;
}
流式發(fā)送合成文本
String sentence = "番茄炒蛋怎么做?";
stream_input_tts_instance.sendStreamInputTts(sentence);
結(jié)束語(yǔ)音合成
stream_input_tts_instance.stopStreamInputTts();
回調(diào)處理
onStreamInputTtsEventCallback:流式文本語(yǔ)音合成事件回調(diào),根據(jù)語(yǔ)音合成狀態(tài)控制播放器。
public void onStreamInputTtsEventCallback( INativeStreamInputTtsCallback.StreamInputTtsEvent event, String task_id, String session_id, int ret_code, String error_msg, String timestamp, String all_response) { Log.i(TAG, "stream input tts event:" + event + " session id " + session_id + " session id " + task_id + " ret " + ret_code); if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED) { Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED"); mAudioTrack.play(); Log.i(TAG, "start play"); } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SENTENCE_SYNTHESIS) { Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SENTENCE_SYNTHESIS:" + timestamp); } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE || event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_TASK_FAILED) { /* * 提示: STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE事件表示TTS已經(jīng)合成完并通過(guò)回調(diào)傳回了所有音頻數(shù)據(jù), 而不是表示播放器已經(jīng)播放完了所有音頻數(shù)據(jù)。 */ Log.i(TAG, "play end"); // 表示推送完數(shù)據(jù), 當(dāng)播放器播放結(jié)束則會(huì)有playOver回調(diào) mAudioTrack.isFinishSend(true); if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_TASK_FAILED) { Log.e(TAG, "STREAM_INPUT_TTS_EVENT_TASK_FAILED error_code:" + ret_code + " errmsg:" + error_msg); } } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SENTENCE_BEGIN) { Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SENTENCE_BEGIN:" + all_response); } else if (event == StreamInputTtsEvent.STREAM_INPUT_TTS_EVENT_SENTENCE_END) { Log.i(TAG, "STREAM_INPUT_TTS_EVENT_SENTENCE_END:" + all_response); } }
onStreamInputTtsDataCallback:語(yǔ)音合成數(shù)據(jù)回調(diào),將回調(diào)中的合成數(shù)據(jù)寫(xiě)入播放器進(jìn)行播放。
public void onStreamInputTtsDataCallback(byte[] data) { if (data.length > 0) { if (mEncodeType.equals("pcm")) { mAudioTrack.setAudioData(data); } } }