美文网首页音频
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 开发

    前言     前不久要集成语音发声,首先想到的就是科大讯飞 这个确实厉害导报 设置一气呵成,然后就开始美滋滋的发声...

  • 【Panda的Android开发之旅】

    个人开发经历 2010年,因为协助同事集成Android上TTS、魔音等软核产品,开始接触Android开发。 2...

  • Android TTS 语音合成播报

    Android TTS 语音合成播报Android系统原生自带了一个TTS引擎。可以自定义TTS引擎,系统默认TT...

  • android TTS TextToSpeech

    前言 最近公司产品提出需求:要在一个收音机广告app上新增一个小说文本朗读的功能。我第一反应是接入讯飞或者其他平台...

  • Android TTS 小试

    前言 让app具备tts能力,有两种方式,一种是直接集成第三方tts sdk,比如科大讯飞、百度等等,调用sdk的...

  • Android TTS系列二——如何开发一款系统级tts引擎?

    源码地址:https://github.com/yellowgreatsun/MXTtsEngine 上篇文章An...

  • Android 语音TTS简介

    TextToSpeech简称 TTS,是Android 1.6版本中比较重要的新功能。将所指定的文本转成不同语言音...

  • Android TTS(TextToSpeech) 使用

    TTS 是什么? TTS 是 Text To Speech 的缩写,即“从文本到语音”,是人机对话的一部分,让机器...

  • Android TTS API笔记

    写在前面 今日应内部团队需求,要实时朗读语音。在这个场景驱动,快速过了一遍官方文档。通过此笔记,摘录自己的思考和理...

  • Android 常见的问题整理 2022

    Android 语音TTS 识别全链路过程 本地录音 =》 ASR识别=》请求后台语义=》语义落域分发返回=》本...

网友评论

    本文标题:Android TTS 开发

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