美文网首页音频
Android TTS 开发

Android TTS 开发

作者: 就爱烫卷发 | 来源:发表于2019-01-23 11:05 被阅读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);第一个参数代表的是播报的内容,第二个第三个后面讲。
    • 当我们想让他报个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在播报完毕之后进行不同的处理。

    相关文章

      网友评论

        本文标题:Android TTS 开发

        本文链接:https://www.haomeiwen.com/subject/bsomdqtx.html