本地语音合成(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 完整代码块参考

AILocalTTSEngine
AILocalTTSEngine mEngine;
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");

mEngine = AILocalTTSEngine.createInstance();//创建实例
mEngine.init(config, new AILocalTTSListenerImpl());//初始化合成引擎




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");


// 合成并播放
mEngine.speak(aILocalTTSIntent, refText, "1024");
// 合成音频,不播放,同时输出实时pcm音频,音频回调在onSynthesizeDataArrived接口
// mEngine.synthesize(aILocalTTSIntent, refText, "1024");


mEngine.pause();
mEngine.resume();
mEngine.stop();
mEngine.destroy();


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, "播放完成");
    }

}

五. 错误码

DUI Lite 2.0 - 错误码

 

六. 接口文档

 

更多的接口内容与描述请参阅 javadoc