最近写android的时候碰到一个需求,就是当我们想要自己合成语音的时候,需要在播报一句话的某些位置进行几秒钟的停顿,比如想要合成这样的语音:"大家好,【停顿一秒】欢迎【停顿两秒】来到我的博客,如果有用【停顿一秒】,顶一下呗"。在讯飞的文档中,我没看到有实现这样功能的方法(看的并不仔细,android也才看了一个月)
我的实现方法是把这段文字先拆分,用split(String regex)把文字拆成字符串数组,参数当然是“【停顿一秒】”,这个停顿两秒怎么处理?当然是用两个【停顿一秒】代替,
这样就把原字符串切割成了多个字符串,再遍历数组播报出来就行了(每播报完一个停顿一秒)。这里【停顿两秒】会生成一个空字符串存进数组,当然也是有用的。空字符串不会发出声音,但是会形成停顿效果。其实还是很简单的。不多说,上代码:
//搞个工具类,//private SpeechSynthesizer mTts;//private int flag = 0;
public void startSpeaking(String playText) { final String[] texts = playText.split("【停顿一秒】"); // 进行语音合成. if (mTts != null){
//为了不影响主线程,重新开个异步线程 new AsyncTask(){ @Override protected Object doInBackground(Object[] params) { for (int i = 0; i < texts.length; i++) {
//这是咱们讯飞文档中SpeechSynthesizer提供的播报语音方法 mTts.startSpeaking(texts[i],new SynthesizerListener(){
//这里实现SynthesizerListener中该实现的方法即可,在这些方法中,我们主要用到onCompleted()这个方法,在这个方法中做以下控制
//播放完语音会自动调用这个方法
@Override public void onCompleted(SpeechError speechError) { flag = 100; try {//休眠1秒 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
});
//这里要让一定要卡住,我是用了死循环卡在这里,不让其自动往下走,否则会发现基本上只播报了数组中最后一段语音,因为代码执行的速度很快,
//第一句话还没说完,可能刚发出第一个字的第一个音就会再次执行mTts.startSpeaking(texts[i+1],...)了 while (true){
//搞个标示在这,只要当前语音播放完,就修改标识的值,让其跳出这个死循环,让他继续播放下一段语音,当然跳出之后需要再次赋值成0,否则下一次进来这里的时候,
//就卡不住了 if (flag != 0){ break; } } flag = 0; } return null; } }.execute(); } }
OK,现在调用这个方法,把我们需要播放的字符串传进去,就这么简单。
另一种方法,中文顿号"、"即可停顿,想停长时间,可多加几个。在来自http://blog.youkuaiyun.com/eastlhu/article/details/25436973看到的。