Android SDK
本文介绍了如何使用阿里云离线语音合成服务提供的Android NUI SDK,包括下载安装SDK和语音包、SDK关键接口及代码示例。
前提条件
下载安装
SDK关键接口
tts_initialize:初始化SDK。
/** * 初始化SDK,离线合成暂不支持多实例,请先释放后再次进行初始化。请勿在UI线程调用,可能会引起阻塞。 * 初始化是耗时操作,不需要合成一个任务就进行该操作;在启动和退出时进行一次即可。 * @param callback:事件监听回调,参见下文具体回调。 * @param ticket:json string形式的初始化参数,参见下方说明或接口说明:https://help.aliyun.com/document_detail/204185.html。 * @param level:log打印级别,值越小打印越多。 * @param save_log:是否保存log为文件,存储目录为ticket中的debug_path字段值。 * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。 */ public synchronized int tts_initialize(INativeTtsCallback callback, String ticket, final Constants.LogLevel level, boolean save_log);
INativeTtsCallback类型包含如下回调:
onTtsEventCallback:SDK事件回调。
/** * 事件回调 * @param event:回调事件,参见如下事件列表。 * @param task_id:请求的任务ID。 * @param ret_code:参见错误码,出现TTS_EVENT_ERROR事件时有效,可查阅https://help.aliyun.com/document_detail/459864.html。 */ void onTtsEventCallback(TtsEvent event, String task_id, int ret_code);
事件列表:
名称
说明
TTS_EVENT_START
语音合成开始,准备播放。
TTS_EVENT_END
语音合成结束,合成数据已全部抛出,但并不表示播放结束。
TTS_EVENT_CANCEL
取消语音合成。
TTS_EVENT_PAUSE
语音合成暂停。
TTS_EVENT_RESUME
语音合成恢复。
TTS_EVENT_ERROR
语音合成发生错误。可通过getparamTts("error_msg")获得详细错误消息。
onTtsDataCallback:合成数据回调。
/** * @param info:使用时间戳功能时,返回JSON格式的时间戳结果。 * @param info_len:info字段的数据长度,暂不使用。 * @param data:合成的音频数据,写入播放器。 */ void onTtsDataCallback(String info, int info_len, byte[] data);
setparamTts:设置参数。
/** * 以键值对形式设置参数, 参见接口说明:https://help.aliyun.com/document_detail/204185.html * @param param:参数名,参见接口说明。 * @param value:参数值,参见接口说明。 * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。 */ public synchronized int setparamTts(String param, String value);
getparamTts:获取参数。
/** * 获取参数值 * @param param:参数名,参考接口说明:https://help.aliyun.com/document_detail/204185.html。 * @return:参数值。 */ public String getparamTts(String param);
startTts:开始合成。
/** * 开始合成任务,该接口异步执行 * @param priority:任务优先级,请使用"1"。 * @param taskid:任务ID,可传入32个字节的uuid,或传入空内容由SDK自动生成。 * @param text:播放的文本内容。 * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。 */ public synchronized int startTts(String priority, String taskid, String text);
cancelTts:取消合成。
/** * 取消合成任务 * @param taskid:传入想要停止的任务ID,如果为空则取消所有任务。 * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。 */ public synchronized int cancelTts(String taskid);
pauseTts:暂停合成。
/** * 暂停合成任务 * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。 */ public synchronized int pauseTts();
resumeTts:恢复合成。
/** * 恢复暂停的任务 * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。 */ public synchronized int resumeTts();
tts_release:释放SDK资源。
/** * 释放SDK * @return:参见错误码:https://help.aliyun.com/document_detail/459864.html。 */ public synchronized int tts_release();
调用步骤
初始化SDK和播放组件。
根据业务需求设置参数。
调用startTts进行播放。
在合成数据回调中,将数据写入播放器进行播放,建议使用流式播放。
收到语音合成结束的回调。
代码示例
语音合成初始化。
//设置默认目的地路径最下级目录名字 // 比如设置当前 /data/user/0/mit.alibaba.nuidemo/files/asr_my // 未调用此接口, 则默认为 /data/user/0/mit.alibaba.nuidemo/files/asr_my CommonUtils.setTargetDataDir("asr_my"); //这里获得资源路径, 即工作路径 // 内部通过context.getApplicationContext().getFilesDir().toString() + "/asr_my" 创建工作路径, // 例如 /data/user/0/mit.alibaba.nuidemo/files/asr_my String workspace = CommonUtils.getModelPath(this); //从nuisdk.aar中assets资源拷贝到workspace中 CommonUtils.copyTtsAssetsData(this); //SDK初始化 int ret = NativeNui.GetInstance().tts_initialize(new INativeTtsCallback() {}, genInitParams(workspace), Constants.LogLevel.LOG_LEVEL_VERBOSE, true); if (Constants.NuiResultCode.SUCCESS == ret) { // 初始化成功 } else { // 初始化失败,通过“error_msg”查看详细错误信息,离线语音合成FAQ文档中已列出常见错误 String errmsg = nui_tts_instance.getparamTts("error_msg"); Log.e(TAG, "init failed.errmsg:" + errmsg); // 初始化失败时直接返回,不用再调用合成或者参数设置接口 return ret; }
其中,genInitParams生成为String JSON字符串,包含资源目录和用户信息。其中用户信息包含如下字段。
说明精品版sdk_code为software_nls_tts_offline
普通版sdk_code为software_nls_tts_offline_standard
private String genInitParams(String workpath) { File folder = new File(workpath); if (!folder.exists() && !folder.isDirectory()) { Log.e(TAG, "工作目录:" + workpath + " , 不存在, 会导致无法初始化"); return null; } String str = ""; try { // 需要特别注意:ak_id/ak_secret/app_key/sdk_code/device_id等参数必须传入SDK // 离线语音合成sdk_code取值:精品版为software_nls_tts_offline, 标准版为software_nls_tts_offline_standard // 鉴权信息获取参:https://help.aliyun.com/document_detail/69835.htm?spm=a2c4g.11186623.2.28.10b33069T2ydLk#topic-1917889 JSONObject initObject = Auth.getTicket(); // 必填, 按照getTicket()说明进行设置 initObject.put("workspace", workpath); // 必填 // 设置为离线合成 initObject.put("mode_type", "0"); // 必填 str = initObject.toString(); } catch (JSONException e) { e.printStackTrace(); } return str; }
根据需求设置参数。
//设置本地发音人,如下载的aicheng语音包放在目录/sdcard/idst/目录下,那么命令为”/sdcard/idst/aicheng“ // 语音包和SDK是隔离的,需要先设置语音包 // 如果切换发音人:SDK可使用语音包与鉴权账号相关,由购买时获得的语音包使用权限决定 // 如已经购买aijia,按下边方式调用后,发音人将切为aijia // 语音包下载地址:https://help.aliyun.com/document_detail/204185.html?spm=a2c4g.11186623.6.628.3cde73409gZCmA // 语音包试听:https://www.aliyun.com/activity/intelligent/offline_tts?spm=5176.12061040.J_5715429470.2.42c33871uFGa5s // 特别说明:离线语音合成的发音人, 并不一定也存在于在线语音合成;同理, 在线语音合成的发音人, 并不一定也存在于离线语音合成 //aar中的资源目录中自带了一个发音人aijia, /data/user/0/mit.alibaba.nuidemo/files/asr_my/tts/voices/aijia String fullName = workspace + "/tts/voices/" + mFontName; //切换发音人:一定要输入全路径名称 Log.i(TAG, "use extend_font_name:" + fullName); ret = nui_tts_instance.setparamTts("extend_font_name", fullName); if (ret != Constants.NuiResultCode.SUCCESS) { Log.e(TAG, "setparamTts extend_font_name " + fullName + " failed, ret:" + ret); String errmsg = nui_tts_instance.getparamTts("error_msg"); return ret; }
启动语音合成。
nui_tts_instance.startTts("1", "", ttsText);
回调处理。
onTtsEventCallback:语音合成事件回调,根据语音合成状态控制播放器。
public void onTtsEventCallback(INativeTtsCallback.TtsEvent event) { Log.i(TAG, "tts event:" + event); if (event == INativeTtsCallback.TtsEvent.TTS_EVENT_START) { mAudioTrack.play(); Log.i(TAG, "start play"); } else if (event == TtsEvent.TTS_EVENT_PAUSE) { mAudioTrack.pause(); Log.i(TAG, "play pause"); } else if (event == TtsEvent.TTS_EVENT_RESUME) { mAudioTrack.play(); } else if (event == TtsEvent.TTS_EVENT_ERROR) { String error_msg = nui_tts_instance.getparamTts("error_msg"); Log.e(TAG, "TTS_EVENT_ERROR error_code:" + ret_code + " errmsg:" + error_msg); } else if (event == INativeTtsCallback.TtsEvent.TTS_EVENT_END) { Log.i(TAG, "play end"); } }
onTtsDataCallback:语音合成数据回调,将回调中的合成数据写入播放器进行播放。
public void onTtsDataCallback(String info, int info_len, byte[] data) { if (info.length() > 0) { Log.i(TAG, "info: " + info); } if (data.length > 0) { mAudioTrack.setAudioData(data); Log.i(TAG, "write:" + data.length); } }
取消语音合成。
nui_tts_instance.cancelTts("");
退出语音合成。
nui_tts_instance.tts_release();