http://speech.baidu.com/docs/tts/157
此文档自2018年3月起不再更新,建议访问 http://ai.baidu.com/docs#/TTS-API/top 来查看相关内容
DEMO在SDK的基础上,封装了调用逻辑,您可以直接使用SDK,或者使用DEMO封装好SDK接口的类。也可以对比参考DEMO中对SDK的调用封装。
使用SDK方式的话,比较底层,开发者需要自行实现一部分逻辑。
本文仅描述SDK的调用方式。
SpeechSynthesizer mSpeechSynthesizer = SpeechSynthesizer.getInstance();
SpeechSynthesizer.getInstance(); 建议每次只使用一个实例。release方法调用后,可以使用第二个。
mSpeechSynthesizer.setContext(this); // this 是Context的之类,如Activity
注意 setContext只要在SpeechSynthesizer.getInstance();设置一次即可,不必切换Context时重复设置。
如合成成功后,SDK会调用用户设置的SpeechSynthesizerListener 里的回调方法
mSpeechSynthesizer.setSpeechSynthesizerListener(listener); //listener是SpeechSynthesizerListener 的实现类,需要实现您自己的业务逻辑。SDK合成后会对这个类的方法进行回调。
用户在语音官网或者百度云网站上申请语音合成的应用后,会有appId appKey及appSecret
如:
String AppId = "8535996";
String AppKey = "MxPpf3nF5QX0pnd******cB";
String AppSecret = "7226e84664474aa09********b2aa434"
mSpeechSynthesizer.setAppId("8535996"/*这里只是为了让Demo运行使用的APPID,请替换成自己的id。*/);
mSpeechSynthesizer.setApiKey("MxPpf3nF5QX0pnd******cB", "7226e84664474aa09********b2aa434"/*这里只是为了让Demo正常运行使用APIKey,请替换成自己的APIKey*/);
如果需要使用离线合成功能的话,请在申请的语音合成的应用填写您自己的包名: demo的包名是“com.baidu.tts.sample”, 定义在build.gradle中。
测试您的AppId,AppKey AppSecret填写正确,语音合成服务是否开通。
离在线混合模式下 ,检验应用里包名是否填写正确,如果正确,自动下载正式授权文件。如果不正确,请在应用管理页面检查合成服务是否开通,包名是否填写正确。
mSpeechSynthesizer.auth(TtsMode.ONLINE); // 纯在线
//或 mSpeechSynthesizer.auth(TtsMode.MIX); // 离在线混合
注意 demo的包名是com.baidu.tts.sample,定义在build.gradle文件中。
具体参数请参见 “输入参数和输出回调”一节
可以在初始化设置,也可以在合成前设置。
示例:
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0"); // 设置发声的人声音,在线生效
设置合成的参数后,需要调用此方法初始化
mSpeechSynthesizer.initTts(TtsMode.MIX); // 初始化离在线混合模式,如果只需要在线合成功能,使用 TtsMode.ONLINE
如果需要合成后立即播放的请调用speak方法,如果只需要合成请调用synthesize方法
该接口线程安全,可以重复调用。内部采用排队策略,调用后将自动加入队列,SDK会按照队列的顺序进行合成及播放。
注意需要合成的每个文本text不超过1024的GBK字节,即512个汉字或英文字母数字。超过请自行按照句号问号等标点切分,调用多次合成接口。
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
speak方法示例:
int speak(String text);
int speak(String text, String utteranceId); // utteranceId在SpeechSynthesizerListener 相关事件方法中回调
speechSynthesizer.speak("百度一下");
synthesize方法示例:
int synthesize(String text);
int synthesize(String text, String utteranceId); // utteranceId在SpeechSynthesizerListener 相关事件方法中回调
speechSynthesizer.synthesize("百度一下");
调用这两个方法后,SDK会回调SpeechSynthesizerListener中的onSynthesizeDataArrived方法。 音频数据在byte[] audioData参数中,采样率16K 16bits编码 单声道。连续将audioData写入一个文件,即可作为一个可以播放的pcm文件(采样率16K 16bits编码 单声道)。
效果同连续调用speak 方法。
该接口可以批量传入多个文本并进行排队合成并播放(如果没有设置utteranceId,则使用list的索引值作为utteranceId)。
注意需要合成的每个文本text不超过1024的GBK字节,即512个汉字或英文字母数字。超过请自行按照句号问号等标点切分,放入多个SpeechSynthesizeBag
int batchSpeak(java.util.List speechSynthesizeBags)
以下为批量调用示例
List bags = new ArrayList();
bags.add(getSpeechSynthesizeBag("123456", "0"));
bags.add(getSpeechSynthesizeBag("你好", "1"));
bags.add(getSpeechSynthesizeBag("使用百度语音合成SDK", "2"));
bags.add(getSpeechSynthesizeBag("hello", "3"));
bags.add(getSpeechSynthesizeBag("这是一个demo工程", "4"));
int result = mSpeechSynthesizer.batchSpeak(bags);
private SpeechSynthesizeBag getSpeechSynthesizeBag(String text, String utteranceId) {
SpeechSynthesizeBag speechSynthesizeBag = new SpeechSynthesizeBag();
//需要合成的文本text的长度不能超过1024个GBK字节。
speechSynthesizeBag.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,表示出错。错误码请参见“错误码及解决方法”一节
不再使用后,请释放资源,并将mSpeechSynthesizer设为null。如果需要再次使用,可以通过SpeechSynthesizer.getInstance() 获取,并重复上述流程。
int result = mSpeechSynthesizer.release();
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
切换离线发音人接口。 目前只有4种离线发声,用这个方法可以切换离线发音人。
离线合成时的参数,填入两个资源文件的路径。如果切换的话,也是使用这两个文件路径。
int result = mSpeechSynthesizer.loadModel(speechModelPath, textModelPath);
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
该接口用来设置播放器的音量,即使用speak 播放音量时生效。范围为[0.0f-1.0f]。
int result = mSpeechSynthesizer.setStereoVolume (leftVolume, rightVolume);
此接口与PARAM_VOLUME参数的设置不同,PARAM_VOLUME设置的是服务器合成音频时的音量,而该接口设置的是播放时Android系统的音量。
返回结果不为0,表示出错。错误码请参见“错误码及解决方法”一节
该接口用来设置播放器的音频流类型,默认值为AudioManager.STREAM_MUSIC, AudioManager.STREAM_MUSIC指的是用与音乐播放的音频流。
其它可选参数见Android 官方文档对AudioManager的描述
int setAudioStreamType(int streamType)
请参见 “输入参数和输出回调”一节