文档简介:
简介
DEMO在SDK的基础上,封装了调用逻辑,您可以直接使用SDK,或者使用DEMO封装好SDK接口的类。也可以对比参考DEMO中对SDK的调用封装。 使用SDK方式的话,比较底层,开发者需要自行实现一部分逻辑。
- SDK方式调用请参考MiniActivity
- DEMO方式调用请参考SynthActivity
本文仅描述SDK的调用方式。
初始化
获取 SpeechSynthesizer 实例
SpeechSynthesizer mSpeechSynthesizer = SpeechSynthesizer.getInstance();
SpeechSynthesizer.getInstance(); 建议每次只使用一个实例。release方法调用后,可以使用第二个,不支持多线程。
设置当前的Context
mSpeechSynthesizer.setContext(this); // this 是Context的之类,如Activity
注意 setContext只要在SpeechSynthesizer.getInstance();设置一次即可,不必切换Context时重复设置。
设置合成结果的回调
如合成成功后,SDK会调用用户设置的SpeechSynthesizerListener 里的回调方法
mSpeechSynthesizer.setSpeechSynthesizerListener(listener); //liste
ner是SpeechSynthesizerListener 的实现类,需要实现您自己的业务逻辑。
SDK合成后会对这个类的方法进行回调。
设置 App Id和 App Key 及 App Secret
在语音官网或者百度云网站上申请语音合成的应用后,会有appId、appKey、appSecret及android包名 4个鉴权信息
mSpeechSynthesizer.setAppId("8535996"/*这里只是为了让Demo运行使用的APPID,请替换成自己的id。*/);
mSpeechSynthesizer.setApiKey("MxPpf3nF5QX0pnd******cB", "7226e84664474aa09********b2aa434"/
*这里只是为了让Demo正常运行使用APIKey,请替换成自己的APIKey*/); // 包名填写在 app/build.gradle
如果需要使用离线合成功能的话,请在申请的语音合成的应用填写您自己的包名: demo的包名是“com.baidu.tts.sample", 定义在build.gradle中。
设置合成参数
具体参数请参见 “输入参数和输出回调”一节
可以在初始化设置,也可以在合成前设置。 示例:
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0"); // 设置发声的人声音,在线生效
初始化合成引擎
设置合成的参数后,需要调用此方法初始化
mSpeechSynthesizer.initTts(TtsMode.OFFLINE); // 初始化离线混合模式,如果需要在线合成功能,使用离在线混合模式TtsMode.MIX
控制接口
合成及播放接口
如果需要合成后立即播放的请调用speak方法,如果只需要合成请调用synthesize方法。
该接口线程安全,可以快速多次调用。内部采用排队策略,调用后将自动加入队列,SDK会按照队列的顺序进行合成及播放。 注意需要合成的每个文本text不超过120的GBK字节,即60个汉字或英文字母数字。超过请自行按照句号问号等标点切分,调用多次合成接口。
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
speak方法示例:
int speak(String text); int speak(String text, String utteranceId); // utterance
Id在SpeechSynthesizerListener 相关事件方法中回调 speechSynthesizer.speak("百度一下");
synthesize方法示例:
int synthesize(String text); int synthesize(String text, String utteranceId); // utter
anceId在SpeechSynthesizerListener 相关事件方法中回调 speechSynthesizer.synthesize("百度一下");
调用这两个方法后,SDK会回调SpeechSynthesizerListener中的onSynthesizeDataArrived方法。
音频数据在byte[] audioData参数中,采样率16K 16bits编码 单声道。连续将audioData写入一
个文件,即可作为一个可以播放的pcm文件(采样率16K 16bits编码 单声道)。
批量合成并播放接口
效果同连续调用speak 方法。推荐连续调用speak方法,sdk内部有队列缓冲。 该接口可以批量传入多个文本并进行排队合成并播放(如果没有设置utteranceId,则使用list的索引值作为utteranceId)。 注意需要合成的每个文本text不超过120的GBK字节,
即60个汉字或英文字母数字。超过请自行按照句号问号等标点切分,放入多个SpeechSynthesizeBag
int batchSpeak(java.util.List<SpeechSynthesizeBag> speechSynthesizeBags)
以下为批量调用示例
List<SpeechSynthesizeBag> bags = new ArrayList<SpeechSynthesizeBag>(); bags.add(getSpeec
hSynthesizeBag("123456", "0")); bags.add(getSpeechSynthesizeBag("你好", "1")); bags
.add(getSpeechSynthesizeBag("使用百度语音合成SDK", "2")); bags.add(getSpeechSynthesi
zeBag("hello", "3")); bags.add(getSpeechSynthesizeBag("这是一个demo工程", "4")); int
result = mSpeechSynthesizer.batchSpeak(bags); private SpeechSynthesizeBag getSpeechS
ynthesizeBag(String text, String utteranceId) { SpeechSynthesizeBag speechSynthesizeB
ag = new SpeechSynthesizeBag(); //需要合成的文本text的长度不能超过120个GBK字节。 speec
hSynthesizeBag.setText(text); speechSynthesizeBag.setUtteranceId(utteranceId); return
speechSynthesizeBag; }
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
播放过程中的暂停及继续
仅speak方法调用后有效。可以使用pause暂停当前的播放。pause暂停后,可使用resume进行播放。
int result = mSpeechSynthesizer.pause(); int result = mSpeechSynthesizer.resume();
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
停止合成并停止播放
取消当前的合成。并停止播放。
int result = mSpeechSynthesizer.stop();
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
其它接口
打开调试日志(重要)
LoggerProxy.printable(true); // 日志打印在logcat中
开启成功后会看见bdtts-开头的tag日志,建议上线后完全没问题再由服务端控制关闭。
判断模型文件是否有效(重要)
SynthesizerTool.verifyModelFile(“/path/to/bd_etts_eng_common_text_all_xxxx.dat”) ;//判断文本资源
SynthesizerTool.verifyModelFile(“/path/to/bd_etts_common_speech_xxxx.dat”) ;//判断音库资源
释放资源
不再使用后,请释放资源,并将mSpeechSynthesizer设为null。如果需要再次使用,
可以通过SpeechSynthesizer.getInstance() 获取,并重复上述流程。
int result = mSpeechSynthesizer.release();
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
切换离线发音
切换离线发音人接口。 SDK默认只有4种离线,用这个方法可以切换离线发音人。 离线合成时的参数,填入两个资源文件的路径。如果切换的话,也是使用这两个文件路径。
注意:必须在引擎空闲的时候调用这个方法,否则有不为0的错误码返回。空闲是指最后一个合成回调onSynthesizeFinish 之后。
int result = mSpeechSynthesizer.loadModel(speechModelPath, textModelPath);
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
设置音量
该接口用来设置播放器的音量,即使用speak 播放音量时生效。范围为[0.0f-1.0f]。
int result = mSpeechSynthesizer.setStereoVolume (leftVolume, rightVolume);
此接口与PARAM_VOLUME参数的设置不同,PARAM_VOLUME设置的是服务器合成音频时的音量,而该接口设置的是播放时Android系统的音量。 返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
音频流类型
public int setAudioAttributes(int usage, int contentType)
该接口用来设置播放器的音频流类型, 默认值为AudioAttributes.USAGE_MEDIA, AudioAttributes.CONTENT_TYPE_MUSIC,指的是用与音乐播放的音频流。 具体可以参考android官方文档 https://source.android.google.cn/devices/audio/attributes
授权检验接口(测试使用,上线可以忽略)
一般情况下,不需要使用该方法。
测试您的AppId,AppKey AppSecret填写正确,语音合成服务是否开通。
- 离在线混合模式下,自动下载正式授权文件。每次调用时,可能会更新正式授权文件。
离在线混合模式下 ,检验应用里包名是否填写正确,如果正确,自动下载正式授权文件。如果不正确,请在应用管理页面检查合成服务是否开通,包名是否填写正确。
mSpeechSynthesizer.auth(TtsMode.ONLINE); // 纯在线 //或 mSpeechSynthesizer.auth(TtsMode.MIX);
// 离在线混合 //或 mSpeechSynthesizer.auth(TtsMode.OFFLINE)// 纯离线
注意 demo的包名是com.baidu.tts.sample,定义在build.gradle文件中。
SpeechSynthesizerListener回调方法
// @param engineType 1: 音频数据由离线引擎合成; 0:音频数据由在线引擎(百度服务器)合成。
void onSynthesizeDataArrived(String utteranceId, byte[] bytes, int progress, int engineType);
其它回调方法请参见 “输入参数和输出回调”一节