随着离线合成的不断迭代,截止到 2023.04, 分化出来两类模型:V2 和 V4, V4 模型的音色显著优于 V2, 我们推荐所有新接入的业务方使用 V4 模型。但是 V4 的模型较大,不能再将所有音色打包进同一个文件中一次性下载。因此 V4 模型的下载逻辑与 V2 产生了一些差异。下面的接口说明仅用于V4模型下载, V2 模型下载请参考这里。
模型下发能力依赖语音SDK的网络功能, 在调用模型下发功能的初始化接口之前。必须先完成环境依赖的相关配置,详情可参考这里。
V4 模型的下载不再需要指定模型名,改为需指定语种、音色代号和引擎类型。
/** * 设置语音SDK的引擎名称 * 应该和 PARAMS_KEY_ENGINE_NAME_STRING 的配置值相同 * 须在 `initResourceManager(Context context, String speechModelDir)` 之前调用 * @param engineName 引擎名称 */ public void setEngineName(String engineName);
/** * 是否使用线上资源 * 须在 `initResourceManager(Context context, String speechModelDir)` 之前调用 * @param useOnlineModel 无特殊需求设置为 true */ public void setUseOnlineModel(boolean useOnlineModel);
除了上述与 TTS 相关的信息外,还需要传入一些基础字段,包括 appid, device_id 等。
/** * 设置从火山申请得到的 appid * 须在 `initResourceManager(Context context, String speechModelDir)` 之前调用 * @param appId */ public void setAppId(String appId);
建议传真实的设备 ID, 方便在具体用户遇到模型下载相关问题时回溯用户行为。如明确不需要,可设置为 "0".
/** * 设置可以唯一区别某台设备的 device id. * 须在 `initResourceManager(Context context, String speechModelDir)` 之前调用 * @param deviceId */ public void setDeviceId(String deviceId);
/** * 设置 APP 版本号,方便我们定位模型下载的问题 * 须在 `initResourceManager(Context context, String speechModelDir)` 之前调用 * @param appVersion 建议设置为真实可用的版本号 */ public void setAppVersion(String appVersion);
调用完上面的方法之后,最后调用初始化方法。
/** * 语音资源管理器初始化 * @param context 管理器配置依赖的上下文,传递ApplicationContext * @param speechModelDir 语音资源保存路径,必需;这个目录下最好不要存放其他文件,因为在模型升级时,有时会将这个目录清空。 */ public boolean initResourceManager(Context context, String speechModelDir);
当前支持的语种如下
语种 | 参数值 |
---|---|
中文 | zh-cn |
中文-粤语 | zh-yueyu |
英式英语 | en-uk |
美式英语 | en-us |
中文、英美式英语整合包 | zh-cn_en-us_en-uk |
/** * 设置想用使用的 TTS 语种 * 须在 `fetchResource`, `checkResourceDownload`, `checkResourceUpdate` 之前,`initResourceManager`之后调用 * @param languages 如 ["ZH_CN"] */ public void setTtsLanguage(final String[] languages);
/** * 设置想要使用的 TTS 音色 * 须在 `fetchResource`, `checkResourceDownload`, `checkResourceUpdate` 之前,`initResourceManager`之后调用 * @param voiceTypes 如 ["BV001_streaming", "BV002_streaming"] */ public void setTtsVoiceType(final String[] voiceTypes);
/** * 检查模型是否已经下载,具体用什么模型取决于 setEngineName, setTtsVoiceType, setTtsLanguage 方法传入的值 * @return 是否已经下载 */ public boolean checkResourceDownload();
云端更新模型需要冷启动才能生效。该接口为异步接口,需要传入监听器
interface CheckResouceUpdateListener { /** * 是否需要更新模型的回调接口 */ void onCheckResult(boolean needUpdate); }
/** * 检查模型是否有更新,具体资源取决于 setEngineName, setTtsVoiceType, setTtsLanguage 方法传入的值,冷启动生效 * @param listener 更新检查监听回调 */ public void checkResourceUpdate(CheckResouceUpdateListener listener);
该接口为异步接口,需要传入监听器
interface FetchResourceListener { /** * 模型下载成功回调. */ void onSuccess(); /** * 模型下载失败回调. * @param errorMsg 异常信息. */ void onFailed(String errorMsg); }
/** * 拉取模型,具体资源取决于 setEngineName, setTtsVoiceType, setTtsLanguage 方法传入的值 * @param listener 资源下载监听回调 */ public void fetchResource(FetchResourceListener listener);
正常情况下模型会自动解压到 speechModelDir 目录,无需集成方解压。但解压后的模型文件可能因为某些难以预知的原因而损坏(例如用户清除 APP 数据),这种情况下集成方可以主动调用解压接口来将已经下载到设备上的模型文件解压出来。
/** * 解压指定模型,解压操作在调用者线程中执行 * @param resourceName 资源名 * 通过 fetchResource 下载的资源,传音色或者语种的名称. * @return 解压是否成功 */ public boolean extractResource(String resourceName);
获取路径方法的返回字符串可直接作为 PARAMS_KEY_TTS_OFFLINE_RESOURCE_PATH_STRING的 value 字段传入 SDK 的 option 设置接口。
/** * 获取通过 fetchResource 方法下载到的模型的路径 * @return 资源路径,JSON 格式 */ public String getResourcePath();