文字轉語音 兩種方法:TextToSpeech、科大訊飛
阿新 • • 發佈:2019-01-02
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); }
程式碼較為簡單,有不足之處大家可以留言交流