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語音庫, 將不會支持中文。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章