语音合成AndroidSDK使用示例 您所在的位置:网站首页 语音合成APP下载 语音合成AndroidSDK使用示例

语音合成AndroidSDK使用示例

2023-09-15 01:29| 来源: 网络整理| 查看: 265

前提条件

阅读接口说明,详情请参见接口说明。

已获取项目Appkey,详情请参见创建项目。

已获取Access Token,详情请参见获取Token概述。

下载安装

下载SDK和示例代码。

重要

下载后请在样例初始化代码中替换您的阿里云账号信息、Appkey和Token才可运行。

类别

兼容范围

系统

支持Android 4.0 以上版本,API LEVEL 14

架构

armeabi-v7a,arm64-v8a,x86,x86_64

此SDK还包含如下功能,若未支持您想要的功能,请前往对应文档获取SDK。

功能

是否支持

一句话识别

实时语音识别

语音合成

实时长文本语音合成

离线语音合成

录音文件识别极速版

唤醒及命令词

解压ZIP包,在app/libs目录下获取AAR格式的SDK包,将AAR包集成到您的工程项目中进行依赖。

使用Android Studio打开此工程查看参考代码实现,其中语音合成示例代码为TtsBasicActivity.java文件,替换appkey和token后可直接运行。

SDK关键接口

tts_initialize:初始化SDK。

/** * 初始化SDK,SDK为单例,请先释放后再次进行初始化。请勿在UI线程调用,可能会引起阻塞。 * @param callback:事件监听回调,参见下文具体回调。 * @param ticket:json string形式的初始化参数,参见下方说明或接口说明:https://help.aliyun.com/document_detail/173642.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:合成数据回调。

/** * 合成数据回调,开启enable_subtitle后,交替返回info和data * @param info:使用时间戳功能时,返回JSON格式的时间戳结果。 * @param info_len:info字段的数据长度,暂不使用。 * @param data:合成的音频数据,写入播放器。 */ void onTtsDataCallback(String info, int info_len, byte[] data);

其中,ticket内容参数说明,生成示例参见下方代码示例:

参数

类型

是否必选

说明

workspace

String

工作目录路径,SDK从该路径读取配置文件。需要有读写权限。

app_key

String

管控台创建项目的appkey。

token

String

请确保该Token可以使用并在有效期内。 Token可以在初始化时设置,也可通过参数设置进行更新。

device_id

String

用户层面的账户号,请保证唯一性。

setparamTts:设置tts参数。

/** * 以键值对形式设置参数, 参见接口说明:https://help.aliyun.com/document_detail/173642.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/173642.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进行播放。

在合成数据回调中,将数据写入播放器进行播放,建议使用流式播放。

收到语音合成结束的回调。

代码示例说明

您如果有多例需求,也可以直接new对象进行使用。也可采用GetInstance获得单例。

语音合成初始化//这里获得资源路径, 即工作路径 // 内部通过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.copyAssetsData(this); //SDK初始化 NativeNui nui_tts_instance = new NativeNui(Constants.ModeType.MODE_TTS); int ret = nui_tts_instance.tts_initialize(new INativeTtsCallback() {}, genTicket(workspace), Constants.LogLevel.LOG_LEVEL_VERBOSE, true);

其中,genTicket生成为String JSON字符串,包含资源目录和用户信息。其中用户信息包含如下字段,获取方式请参考接口说明文档。

/** * ticket生成示例,详见Demo工程中代码示例 */ private String genTicket(String workpath) { String str = ""; try { //获取token方式: JSONObject object = new JSONObject(); //账号和项目创建 // ak_id ak_secret app_key如何获得,请查看https://help.aliyun.com/document_detail/72138.html object.put("app_key", ""); // 必填 //方法1: // 首先ak_id ak_secret app_key如何获得,请查看https://help.aliyun.com/document_detail/72138.html // 然后请看 https://help.aliyun.com/document_detail/466615.html 使用其中方案一获取临时凭证 // 此方案简介: 远端服务器生成具有有效时限的临时凭证, 下发给移动端进行使用, 保证账号信息ak_id和ak_secret不被泄露 // 获得Token方法(运行在APP服务端): https://help.aliyun.com/document_detail/450255.html?spm=a2c4g.72153.0.0.79176297EyBj4k object.put("token", ""); // 必填 //方法2: // STS获取临时凭证方法暂不支持 object.put("device_id", Utils.getDeviceId()); // 必填, 可填入用户账户相关id object.put("url", "wss://nls-gateway.cn-shanghai.aliyuncs.com:443/ws/v1"); // 默认 object.put("workspace", workpath); // 必填, 且需要有读写权限 // 设置为在线合成 // Local = 0, // Cloud = 2, object.put("mode_type", "2"); // 必填, 0 离线模式请参见离线语音合成文档 str = object.toString(); } catch (JSONException e) { e.printStackTrace(); } return str; }根据需求设置参数//详细参数可见: https://help.aliyun.com/document_detail/173642.html // 在线语音合成发音人可以参考阿里云官网 // https://help.aliyun.com/document_detail/84435.html nui_tts_instance.setparamTts("font_name", "xiaoyun"); // 设置发音人对应的语音合成采样率, 设置后也请设置播放器的对应采样率, 否则无法播放出正常音频。 nui_tts_instance.setparamTts("sample_rate", "16000"); // 支持一次性合成300字符以内的文字,其中1个汉字、1个英文字母或1个标点均算作1个字符, // 超过300个字符的内容将会截断。所以请确保传入的text小于300字符(不包含ssml格式)。 // 长短文本语音合成收费不同,须另外开通长文本语音服务,请注意。 // 不需要长文本语音合成功能则无需考虑以下操作。 int charNum = nui_tts_instance.getUtf8CharsNum(ttsText); if (charNum > 300) { // 超过300字符设置成 长文本语音合成 模式 nui_tts_instance.setparamTts("tts_version", "1"); } else { // 未超过300字符设置成 短文本语音合成 模式, 此为默认设置 nui_tts_instance.setparamTts("tts_version", "0"); }启动语音合成// 每个instance一个task,若想同时处理多个task,请启动多instance nui_tts_instance.startTts("1", "", ttsText);回调处理

onTtsEventCallback:语音合成事件回调,根据语音合成状态控制播放器。

public void onTtsEventCallback(INativeTtsCallback.TtsEvent event, String task_id, int ret_code) { Log.i(TAG, "tts event:" + event + " task id " + task_id + " ret " + ret_code); if (event == INativeTtsCallback.TtsEvent.TTS_EVENT_START) { mAudioTrack.play(); Log.i(TAG, "start play"); } else if (event == INativeTtsCallback.TtsEvent.TTS_EVENT_END) { /* * 提示: TTS_EVENT_END事件表示TTS已经合成完并通过回调传回了所有音频数据, 而不是表示播放器已经播放完了所有音频数据。 */ Log.i(TAG, "play end"); // 表示推送完数据, 当播放器播放结束则会有playOver回调 mAudioTrack.isFinishSend(true); } 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) { // 表示推送完数据, 当播放器播放结束则会有playOver回调 mAudioTrack.isFinishSend(true); String error_msg = nui_tts_instance.getparamTts("error_msg"); Log.e(TAG, "TTS_EVENT_ERROR error_code:" + ret_code + " errmsg:" + error_msg); ToastText(Utils.getMsgWithErrorCode(ret_code, "error")); ToastText("错误码:" + ret_code + " 错误信息:" + error_msg); } }

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();常见问题使用语音合成Android SDK,在调用cancel时候出现一次anr,该如何处理?

SDK接口为同步调用,建议您不要在主线程调用SDK接口。

使用语音合成Android SDK TTS时,报错提示“tts event:TTS_EVENT_ERROR ret 140002”。

建议您检查下输入文本是否合规。

不能正常使用语音合成Android SDK。

您需要检查以下条件是否满足:

是否已经满足Android SDK语音合成的前提条件,详情请参见前提条件。

是否已开通商用。

调用Android SDK时,手机报错提示“audio recoder not init”。

您可以通过以下方式排查:

检查AudioRecord是否初始化正常。

检查语音播放器是否有问题。

编写AudioRecord录音代码,测试是否正常。

在模拟器上运行下载的Android程序,程序出现闪退现象,是什么原因?

模拟器可能会出现未知问题,建议您使用真机测试。

int ret = nui_instance.initialize(this, genInitParams(assets_path,debug_path), Constants.LogLevel.LOG_LEVEL_VERBOSE, true)。在该段代码中,录音权限是打开的,但代码仍然报错240021。

表示FILE_ACCESS_FAIL文件访问错误。你需要检查:

是否有文件读写权限。

是否完成SDK配置文件的拷贝,检查是否拷贝完成的代码示例如下:

if (CommonUtils.copyAssetsData(this)) { Log.i(TAG, "copy assets data done"); } else { Log.i(TAG, "copy assets failed"); return; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有