前言
前不久要集成语音发声,首先想到的就是科大讯飞 这个确实厉害导报 设置一气呵成,然后就开始美滋滋的发声,后来发现要联网才能播报,并且每天在线发声只有500次的使用次数。好用是好用限制太多挺无赖的,所以转战TTS(android 内置)。科大讯飞那边文档非常详细这里就不详细介绍。有一点要注意就是一点要在manifest中添加上网权限,因为不联网是不能发声的。
正文
下面介绍TTS的使用:
//实例并初始化TTS对象
String tts = “日志”;
textToSpeech =new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status==TextToSpeech.SUCCESS) {
//设置朗读语言
//这里要要注意一下初始化的步骤,这里是一个异步操作
int supported =textToSpeech.setLanguage(Locale.US);
if ((supported!=TextToSpeech.LANG_AVAILABLE)&&(supported!=TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
Toast.makeText(MainActivity.this, "不支持当前语言!", Toast.LENGTH_SHORT).show();
}
}
}
});
//直接这样写会因为初始化没初始好导致这个播报不出来,因为上面的是异步的操作
//可以在这个地方打印一个log然后在上面那边打印一个log看谁先执行就知道了。
textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);
使用:
- 简单播报:
textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);
第一个参数代表的是播报的内容,第二个第三个后面讲。
-
当我们想让他报个2-3遍或者循环播报的时候,我们来试一下
`for(int i= 0;i<3;i++){ textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null); }`
简单的不行,但是问题来了,一段长的文字他只播报前面几个字,然后又重新开始播报,这是因为textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);
这个方法会自动关闭掉上面一个播报的内容,从而进行新一轮的播报,那我要等上一条播报完整了再进行播报,那么可以TTS有 isSpeaking()
这个方法
if(!textToSpeech.isSpeaking){
textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);
}
这样就可以播全了嘛? 非也,for循环飞快的跑只要发现在speaking那么直接跳过开始走下一个i 有可能你循环的100次结果只报了50次,下面就是正确使用for()循环的使用了,
for(int i= 0;i<3;i++){
textToSpeech.speak(tts, TextToSpeech.QUEUE_ADD, null);
}
这样就相当于在一个消息队列然后进行循环的播报。那我们循环就可以了。
除此之外还有其他方法 比如退出循环播放或者说停止播报,那就调用textToSpeech.stop()
,注意一点在
textToSpeech.speak(tts,TextToSpeech.QUEUE_ADD, null);
后面假如调用了一次
textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);
那么不好意思,不管你队列里面多长我只播报我这个一次,而且播完就结束。
最后在关闭的时候把他销毁了
if (textToSpeech!=null) {
textToSpeech.shutdown();//关闭TTS
}
-
当然 我们看看tts 这个方法之后我们会发现还有其他的方法:
textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() { @Override public void onStart(String utteranceId) { //这个是开始的时候。是先发声之后才会走这里 //调用isSpeaking()方法在这为true } @Override public void onDone(String utteranceId) { //这个是播报完毕的时候 每一次播报完毕都会走 } @Override public void onError(String utteranceId) { //错误 } });
这样来实现循环也是非常舒服的。一顿操作之后发现没得用。这时候就要看到我们textToSpeech.speak(tts,TextToSpeech.QUEUE_ADD, null);
第三个参数了默认写的都是null
, 我们加上如下代码:
public static final String UTTERANCEID = "我们的key";
HashMap<String, String> params = new HashMap<String, String>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,UTTERANCEID);
这样就可以进入回调了,并且还可以给各种语言播报的时候带上不同的key在播报完毕之后进行不同的处理。
网友评论