Android-----巧用科大讯飞语句实现中文语音播报

概述

  • 如今,机器人崛起,而语音正是机器人的一个必要的技能,想想如果一个机器人听不懂人说的话,那它只能是机器,而不能冠以“人”之名
  • 科大讯飞,想必是现在最火的一家公司之一吧,其拥有好几年的技术经验的积累,观望以前,技术的不成熟:神经网络算法的不成熟,硬件上的瓶颈,等等,这些,都让从前的科大讯飞吃尽了苦头。但是,现在却不同了,随着硬件上关键的突破,软件上的突破,机器学习,语音分析的成熟,再加上这些年来的技术积累以及数据的沉淀,科大讯飞也就迎来了她的春天。

今天我要谈的就是语音分析。总所周知,android系统是外国佬谷歌开发的,因此android系统的默认语音TextToSpeech是不支持中文的,但是现在使用android的系统有很多,使用语音功能的应用更多,尤其在国内,但是由于谷歌的限制,TextToSpeech不支持中文,科大讯飞的语音包(sdk)场景是需要收费,难道就无计可施了,今天我就带大家巧妙的绕过这些限制,实现中文语音播报功能。(不过,国内部分高版本的手机由于已经集成了科大讯飞为默认语音引擎,那么恭喜你,你可以安心使用,本文只正对部分比较老的版本android手机)

准备工作

只需要去各大应用商店下载讯飞语句安装包,安装后,把讯飞语句设置为默认引擎即可。
安装完科大讯飞语句后,话不多说,直接上代码,快速实现语音播报功能

开始编码

  1. 首先,我们只需要实现TextToSpeech.OnInitListener接口,并在onStart生命周期实例化TextToSpeech
@Override
    protected void onStart() {
        super.onStart();
        if(mTextToSpeech == null){
            mTextToSpeech = new TextToSpeech(this, this);
            // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
            mTextToSpeech.setPitch(1.0f);
            //设定语速 ,默认1.0正常语速
            mTextToSpeech.setSpeechRate(1.5f);
        }

    }

2.既然有实例化,就有回收,回收再对应的 onStop生命周期实现回收:

   @Override
    protected void onStop() {
        super.onStop();
        try{
            if (mTextToSpeech != null) {
                mTextToSpeech.stop(); // 不管是否正在朗读TTS都被打断
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            mTextToSpeech.shutdown(); // 关闭,释放资源
            mTextToSpeech = null;
        }
    }
  1. 有了实例化,下面就应该要mTextToSpeech大声高歌了吧,此时你会发现主要监听onInit的status是否SUCCESS,你会发现onInit回调会给我们对应的初始化状态是否成功
@Override
    public void onInit(int status) {
        //如果初始化成功
        if (status == TextToSpeech.SUCCESS) {
            canSpeck=true;
            int result = mTextToSpeech.setLanguage(Locale.CHINA);
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED){
                Toast.makeText(this,"数据丢失或不支持",Toast.LENGTH_SHORT).show();
            }
        }
    }

我们可以在onInit方法里setLanguage为我们想要的语种,比如CHINA,本例设置的是中文。

  1. 正式调用speak方法,实现语音播报,这里我们就歌颂我们伟大祖国
      findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("TAG","this is can "+canSpeck);
                if (mTextToSpeech != null && !mTextToSpeech.isSpeaking()) {
                    mTextToSpeech.speak("我爱你我的祖国,中国", TextToSpeech.QUEUE_FLUSH, null);
                }
            }
        });

是不是感觉非常简单,自此,一个完整的语音播报功能就实现了,不管是中文还是都可以。下面给出完整的代码:
5. 完整语音播报code

public class TestSpeackActivity extends BaseActivity implements TextToSpeech.OnInitListener{
    //语音播放api
    private TextToSpeech mTextToSpeech;
  
    @Override
    public int getLayoutId() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,     WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
        return R.layout.activity_test_speack;
    }

    @Override
    public void initView() {
     findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("TAG","this is can "+canSpeck);
                if (mTextToSpeech != null && !mTextToSpeech.isSpeaking()) {
                    mTextToSpeech.speak("您好中国", TextToSpeech.QUEUE_FLUSH, null);
                }
            }
        });
    }

    @Override
    public void addListeners() {

    }

    @Override
    public void onInit(int status) {
        //如果初始化成功
        if (status == TextToSpeech.SUCCESS) {
            canSpeck=true;
            int result = mTextToSpeech.setLanguage(Locale.CHINA);
            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED){
                Toast.makeText(this,"数据丢失或不支持",Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        if(mTextToSpeech == null){
            mTextToSpeech = new TextToSpeech(this, this);
            // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
            mTextToSpeech.setPitch(1.0f);
            //设定语速 ,默认1.0正常语速
            mTextToSpeech.setSpeechRate(1.5f);
        }

    }

    @Override
    protected void onStop() {
        super.onStop();
        try{
            if (mTextToSpeech != null) {
                mTextToSpeech.stop(); // 不管是否正在朗读TTS都被打断
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            mTextToSpeech.shutdown(); // 关闭,释放资源
            mTextToSpeech = null;
        }
    }
}

注意

要想实现语音播报功能请注意一下几点

  1. 对于低版本的android手机,如果没有默认讯飞语音库,而是谷歌默认的TTS语音库,请先安装讯飞语句。
  2. 安装后讯飞语句后,请设置系统默认语音引擎为科大讯飞。
  3. 在调用speak方法前,一定要确认onInit方法被成功执行,否则调用speak方法还是默认调用TTS语音库, 将不会支持中文。
发布了49 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ljx1400052550/article/details/103730372
今日推荐