接口及调用过程

简介

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); //listener是SpeechSynthesizerListener 的实现类,需要实现您自己的业务逻辑。SDK合成后会对这个类的方法进行回调。

设置 App Id和 App Key 及 App Secret

用户在语音官网或者百度智能云网站上申请语音合成的应用后,会有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填写正确,语音合成服务是否开通。

  • 离在线混合模式下,自动下载正式授权文件。每次调用时,可能会更新正式授权文件。
  • 在线合成模式下,验证权限。首次验证时比较耗时,第一次调用成功,之后可以不必调用。

离在线混合模式下 ,检验应用里包名是否填写正确,如果正确,自动下载正式授权文件。如果不正确,请在应用管理页面检查合成服务是否开通,包名是否填写正确。

建议在app安装后,检查首次联网状态时调用该方法,成功之后就不必调用。
该方法也可以忽略,第一次在线合成时会自动调用。

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<SpeechSynthesizeBag> speechSynthesizeBags)

以下为批量调用示例

List<SpeechSynthesizeBag> bags = new ArrayList<SpeechSynthesizeBag>();
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种离线发声,用这个方法可以切换离线发音人。
离线合成时的参数,填入两个资源文件的路径。如果切换的话,也是使用这两个文件路径。

注意:必须在引擎空闲的时候调用这个方法,否则有不为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,表示出错。错误码请参见“错误码及解决方法”一节

音频流类型

该接口用来设置播放器的音频流类型,默认值为AudioManager.STREAM_MUSIC, AudioManager.STREAM_MUSIC指的是用与音乐播放的音频流。
其它可选参数见Android 官方文档对AudioManager的描述

int setAudioStreamType(int streamType)

打开调试日志

LoggerProxy.printable(true); // 日志打印在logcat中

SpeechSynthesizerListener回调方法

请参见 “输入参数和输出回调”一节