本地语音合成(Android旧)
一. 离线TTS概述
DUI Lite SDK 离线TTS可使在无网的情况下,提供将文字信息转化为声音信息的能力,方便您更流畅的体验合成音,给您的应用程序增加“嘴巴”功能,更趋近于人。您仅仅需要将下载的SDK嵌入到工程项目中,就可以流畅的获取从文字输入到语音输出的支持。另外,我们也提供了具有特色的发音人(若需要定制,可联系商务),给您带来更好的享受。如果希望语音输出内容更富有感情,可以在对话回复中为回复内容添加SSML标签。
二. SDK使用说明
使用当前功能时,请先授权,否则禁止使用。请参考授权说明
2.1 准备
jar:DUI-lite-SDK-for-Android-xxx.jar
so:libcntts.so,libduiutils.so
资源:
*****_aitts_sent_dict_local.db(字典数据库),
***_local_front.bin(前端资源,包含文本归一化,分词的,韵律等),
zhilingf_common_back_ce_local.***.bin(后端发音人资源,不同发音人资源不一样,demo中默认内置了性感女声的资源,如需其他,请联系商务) ,
*****_aitts_sent_dict_local.db.md5sum(该文件内容为*****_aitts_sent_dict_local.db文件的md5sum值,用于init时SDK检查是否需要重复拷贝到内部目录,文件可选, 文件名为 字典数据库名+.md5sum),
***_local_front.bin.md5sum(该文件内容为***_local_front.bin文件的md5sum值,用于init时SDK检查是否需要重复拷贝到内部目录,文件可选, 文件名为 字典数据库名+.md5sum),
zhilingf_common_back_ce_local.***.bin.md5sum(该文件内容为zhilingf_common_back_ce_local.***.bin文件的md5sum值,用于init时SDK检查是否需要重复拷贝到内部目录,文件可选,文件名为 资源名+.md5sum ),
资源可以放在assets目录中,也可以自己手动放在磁盘中,比如/sdcard/
三. 引擎运行流程图
四. 示例代码
涉及引擎 AILocalTTSEngine,详细使用示例请参考 demo
4.1 配置config信息
AILocalTTSConfig config = new AILocalTTSConfig();
// 设置assets目录下合成字典名和相应的Md5文件名
config.setDictResource(SampleConstants.TTS_DICT_RES, SampleConstants.TTS_DICT_MD5);
// 设置合成字典的外部路径,包含文件名(需要手动拷贝到指定目录)
// config.setDictResource("/sdcard/speech/tts/aitts_sent_dict_idx_middle_2.0.4_20180806.db");
// 设置assets目录下前端合成资源名和相应的Md5文件名
config.setFrontBinResource(SampleConstants.TTS_FRONT_RES, SampleConstants.TTS_FRONT_RES_MD5);
// 设置合成前端资源的外部路径,包含文件名(需要手动拷贝到指定目录)
// config.setFrontBinResource("/sdcard/speech/tts/local_front.bin");
// default is true
config.setUseCache(false);
//设置后端合成音色资源,如果只需设置一个,则array只需要传一个成员值就可以
config.addSpeakerResource(mBackResBinArray, mBackResBinMd5sumArray);
// 设置合成音色的外部路径,包含文件名(需要手动拷贝到指定目录)
// config.addSpeakerResource("/sdcard/speech/tts/zhilingf_common_back_ce_local.v2.1.0.bin");
部分api解释如下表
方法 | 方法说明 | 参数说明 | 默认值 | 备注 |
setUseCache(boolean useCache) | 设置是否使用缓存 | true/false | true | 缓存TTS缓存信息和音频文件,存放在应用外部缓存目录下的 ttsCache 文件夹下 |
setUseCache(boolean useCache, String cacheDirectory) | 设置是否使用缓存和缓存的文件夹 |
useCache 是否使用缓存 cacheDirectory 缓存目录 |
useCache true cacheDirectory null |
缓存目录,设置为 null,则为默认缓存目录:应用外部缓存目录下的 ttsCache 文件夹 |
addSpeakerResource(String[] speakerResource) | 设置 发音人资源,若只需要一个发音人,则设置一个即可。设置多个时第1个即为使用的发音人 |
1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin 2. 如在 assets 里设置为名称 |
NA |
NA |
addSpeakerResource(String speakerResource) | 设置 发音人资源 |
1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin 2. 如在 assets 里设置为名称 |
NA |
NA |
addSpeakerResource(String[] speakerResource, String[] speakerResourceMd5sum) | 设置assets目录下的后端发音人资源名和对应的md5文件 |
speakerResource assets 目录下发音人资源名 speakerResourceMd5sum 对应的md5文件 |
NA |
若只需要一个发音人,则设置一个即可,初始化时默认以第一个资源名加载进内核 |
clearSpeakerResourceAndMD5() | 清除发言人资源名和对应的md5文件 |
NA |
NA |
NA |
setEnableOptimization(boolean enableOptimization) | 设置是否开启cpu优化 |
true/false |
true |
若某些机器合成速度慢,可以关闭cpu优化功能,设置为false |
setDictResource(String dictResource) | 设置合成字典 |
1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.db 2. 如在 assets 里设置为名称 |
NA |
NA |
setDictResource(String dictResource, String dictResourceMd5sum) | 置assets目录下的合成字典资源名字和对应的md5文件 |
dictResource 合成字典文件名 dictResourceMd5sum 对应的md5文件 |
NA |
NA |
setUserDictResource(String userDictResource) | 用户自定义词典,用于修复离线合成问题,如多音字发音、停顿和数字字母符号读法错误等 |
自定义词典文件名或者文件路径 |
NA |
非必需,正常情況用不着,这个只有有发音问题需要紧急修复可以改这个资源。 |
setFrontBinResource(String frontBinResource) | 设置 FrontBinResource,包含文本归一化,分词的,韵律等 |
1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin 2. 如在 assets 里设置为名称 |
NA |
NA |
setFrontBinResource(String frontBinResource, String frontBinResourceMd5sum) | 设置assets目录下的合成前端资源的名字和对应的md5文件,包含文本归一化,分词的,韵律等 |
frontBinResource 资源文件名 frontBinResourceMd5sum 对应的md5文件 |
NA |
NA |
4.2 初始化引擎并初始化合成引擎
mEngine = AILocalTTSEngine.createInstance();//创建实例
mEngine.init(config, new AILocalTTSListenerImpl());//初始化合成引擎
4.3 实现引擎回调方法
private class AILocalTTSListenerImpl implements AILocalTTSListener {
@Override
public void onInit(int status) {
Log.i(Tag, "初始化完成,返回值:" + status);
Log.i(Tag, "onInit");
if (status == AIConstant.OPT_SUCCESS) {
tip.setText("初始化成功!");
btnStart.setEnabled(true);
} else {
tip.setText("初始化失败!code:" + status);
}
}
@Override
public void onError(String utteranceId, AIError error) {
tip.setText("检测到错误");
content.setText(content.getText() + "\nError:\n" + error.toString());
}
@Override
public void onSynthesizeStart(String utteranceId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tip.setText("合成开始");
Log.d(Tag, "合成开始");
}
});
}
@Override
public void onSynthesizeDataArrived(String utteranceId, byte[] audioData) {
//Log.d(Tag, "合成pcm音频数据:" + audioData.length);
//正常合成结束后会收到size大小为0的audioData,即audioData.length == 0。应用层可以根据该标志停止播放
//若合成过程中取消(stop或release),则不会收到该结束标志
}
@Override
public void onSynthesizeFinish(String utteranceId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tip.setText("合成结束");
Log.d(Tag, "合成结束");
}
});
}
@Override
public void onSpeechStart(String utteranceId) {
tip.setText("开始播放");
Log.i(Tag, "开始播放");
}
@Override
public void onSpeechProgress(int currentTime, int totalTime, boolean isRefTextTTSFinished) {
showTip("当前:" + currentTime + "ms, 总计:" + totalTime + "ms, 可信度:" + isRefTextTTSFinished);
}
@Override
public void onSpeechFinish(String utteranceId) {
tip.setText("播放完成");
Log.i(Tag, "播放完成");
}
}
4.4 配置intent
AILocalTTSIntent aILocalTTSIntent = new AILocalTTSIntent();
// 设置合成音语速,范围为0.5~2.0
aILocalTTSIntent.setSpeed(0.85f);
aILocalTTSIntent.setUseSSML(false); // 设置是否使用ssml合成语法,默认为false
aILocalTTSIntent.setVolume(100); // 设置合成音频的音量,范围为1~500
// 保存合成音频到指定路径,格式为wav
aILocalTTSIntent.setSaveAudioFilePath(Environment.getExternalStorageDirectory() + "/tts/"
+ System.currentTimeMillis() + ".wav");
更多的配置信息如下表
方法 | 方法说明 | 参数说明 | 默认值 | 备注 |
setSpeed(float speed) | 设置语音合成的速度 | 合成语速 范围为0.5~2.0 | 1.0f | NA |
setVolume(int volume) | 设置语音合成的音量 | 合成音量 范围为1~500 | 80 | NA |
setUseSSML(boolean useSSML) | 设置是否使用ssml | 是否配置ssml | false | NA |
setStreamType(int streamType) | 设置播放器的stream type | audioTrack播放stream type | AudioManager.STREAM_MUSIC | |
setAudioAttributes(int audioAttributesUsage, int audioAttributesContentType) | 设置音频属性 |
audioAttributesUsage 类似 AudioAttributes.USAGE_MEDIA 的设置 audioAttributesContentType 类似 AudioAttributes.CONTENT_TYPE_MUSIC 的设置 |
AudioAttributes.USAGE_UNKNOWN AudioAttributes.CONTENT_TYPE_UNKNOWN |
Android O 及以上系统使用,Android O 以前的系统请使用 setStreamType |
setSaveAudioFilePath(String saveAudioFilePath) | 设置合成的音频的全路径包含文件名 |
文件全路径 |
NA |
NA |
switchToSpeaker(String speakerResource) | 切换发音人 |
1. 如在 sd 里设置为绝对路径 如/sdcard/speech/***.bin 2. 如在 assets 里设置为名称 |
NA |
需要使用设置过的发音人 |
4.5 启动合成
// 合成并播放
mEngine.speak(aILocalTTSIntent, refText, "1024");
// 合成音频,不播放,同时输出实时pcm音频,音频回调在onSynthesizeDataArrived接口
// mEngine.synthesize(aILocalTTSIntent, refText, "1024");
4.6 引擎停止唤醒销毁
mEngine.pause();
mEngine.resume();
mEngine.stop();
mEngine.destroy();
请在合适的位置进行对应的方法调用
4.7 完整代码块参考
五. 错误码
六. 接口文档
更多的接口内容与描述请参阅 javadoc