1. 程式人生 > >文字轉語音 兩種方法:TextToSpeech、科大訊飛

文字轉語音 兩種方法:TextToSpeech、科大訊飛

TextToSpeech核心程式碼:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mBinding.setOnClick(this);
        mTextToSpeech = new TextToSpeech(this,this);
    }

 

    private void speakOut() {
        if (mTextToSpeech!= null && !mTextToSpeech.isSpeaking()){
//            Bundle bundle = new Bundle();
//            bundle.putFloat(TextToSpeech.Engine.KEY_PARAM_VOLUME,1.0f);
            //朗讀,注意這裡三個引數的added in API level 4   四個引數的added in API level 21
//            mTextToSpeech.speak(mBinding.editText.getText().toString(),TextToSpeech.QUEUE_FLUSH,null);
            mTextToSpeech.speak(mBinding.editText.getText().toString(),TextToSpeech.QUEUE_FLUSH,null,"");
        }
    }

    /**
     * 初始化語音播放
     * @param status
     */
    @Override
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS){
            // 設定音調,1.0是常規
            mTextToSpeech.setPitch(1.0f);
            //設定語速 ,預設1.0正常語速
            mTextToSpeech.setSpeechRate(1.0f);
            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 onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_xun_fei);
        mBinding.setOnClick(this);
        //初始化科大訊飛
        SpeechUtility.createUtility(getApplicationContext(), SpeechConstant.APPID + "=5b558975");
        mSynthesizer = SpeechSynthesizer.createSynthesizer(this, this);
    }

    private void speak() {
        mSynthesizer.startSpeaking(mBinding.editTextXf.getText().toString(),mSynthesizerListener);
    }

    /*
        合成回撥
     */
   private SynthesizerListener mSynthesizerListener = new SynthesizerListener() {
       @Override
       public void onSpeakBegin() {
           //開始播放
       }

       @Override
       public void onBufferProgress(int i, int i1, int i2, String s) {
            //合成進度
       }

       @Override
       public void onSpeakPaused() {
           //暫停播放

       }

       @Override
       public void onSpeakResumed() {
            //繼續播放
       }

       @Override
       public void onSpeakProgress(int i, int i1, int i2) {
            //播放進度
       }

       @Override
       public void onCompleted(SpeechError speechError) {
            if (speechError == null){//播放完成

            }else {

            }
       }

       @Override
       public void onEvent(int i, int i1, int i2, Bundle bundle) {
           // 以下程式碼用於獲取與雲端的會話id,當業務出錯時將會話id提供給技術支援人員,可用於查詢會話日誌,定位出錯原因
           // 若使用本地能力,會話id為null
       }
   };


    @Override
    public void onInit(int i) {
        if (i != ErrorCode.SUCCESS){
            return;//初始化失敗
        }
        mSynthesizer.setParameter(SpeechConstant.ENGINE_MODE, SpeechConstant.MODE_MSC);
        mSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
        mSynthesizer.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
        mSynthesizer.setParameter(SpeechConstant.VOICE_NAME, voicerLocal);
    }

程式碼較為簡單,有不足之處大家可以留言交流