音频

Android TTS 开发

2019-01-23  本文已影响0人  就爱烫卷发

前言

    前不久要集成语音发声,首先想到的就是科大讯飞 这个确实厉害导报 设置一气呵成,然后就开始美滋滋的发声,后来发现要联网才能播报,并且每天在线发声只有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);这个方法会自动关闭掉上面一个播报的内容,从而进行新一轮的播报,那我要等上一条播报完整了再进行播报,那么可以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
  }  

这样来实现循环也是非常舒服的。一顿操作之后发现没得用。这时候就要看到我们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在播报完毕之后进行不同的处理。

上一篇下一篇

猜你喜欢

热点阅读