方式一(TextToSpeech)
文字转语音方式
package com.gjc.ihelp.activity; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.widget.Button; import com.gjc.ihelp.R; import com.gjc.ihelp.Utils.ToastUtil; import java.util.Locale; public class VoiceAnnouncementsActivity extends AppCompatActivity { private Button btn; private TextToSpeech tts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_voice_announcements); btn = findViewById(R.id.btn); initTTS(); btn.setOnClickListener(v -> { startTTS("喝O泡果奶,把清凉抱抱,我要O泡,我要O泡,O泡果奶要要要"); }); } private void initTTS(){ tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status != TextToSpeech.SUCCESS){ ToastUtil.show(VoiceAnnouncementsActivity.this,"数据丢失或不支持"); } } }); } private void startTTS(String str) { // 设置音量(值越大声音越尖(女生),值越小则变成男声,1.0是常规) tts.setPitch(1.0f); // 设置语速 tts.setSpeechRate(1.0f); // 设置需要播报的语言 tts.setLanguage(Locale.CHINA); // 设置需要播报的语句(若设备不支持则不会读出来) /** * TextToSpeech.QUEUE_FLUSH:中断当时的播报,播报新的语音 * TextToSpeech.QUEUE_ADD:添加到当前任务之后 */ tts.speak(str, TextToSpeech.QUEUE_FLUSH, null); } @Override protected void onStop() { super.onStop(); tts.stop();//停止播报 tts.shutdown();//释放资源 } }
方式二(MediaPlayer)
获取assets目录下资源进行播报
package com.gjc.ihelp.activity; import androidx.appcompat.app.AppCompatActivity; import android.content.res.AssetFileDescriptor; import android.media.MediaPlayer; import android.os.Bundle; import android.text.TextUtils; import android.widget.Button; import com.gjc.ihelp.R; import java.io.IOException; public class VoiceAnnouncementsActivity extends AppCompatActivity { private Button btn; private MediaPlayer mediaPlayer;//多媒体组件 private AssetFileDescriptor assetFileDescriptor;//用来读取资源 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_voice_announcements); btn = findViewById(R.id.btn); btn.setOnClickListener(v -> { // path:assets目录下music文件夹中的 wake.mp3 文件 playBackgroundMusic("music/" + "wake.mp3"); }); } private void playBackgroundMusic(String path) { if (TextUtils.isEmpty(path)) { return; } try { mediaPlayer = new MediaPlayer(); assetFileDescriptor = this.getAssets().openFd(path); /** * getFileDescriptor():返回可用于读取文件中的数据的FileDescriptor对象 * getStartOffset():返回此资产条目数据开始处的字节偏移量 * getLength():返回此资产条目数据的总字节数 */ mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); mediaPlayer.setVolume(1.0f, 1.0f);//设置音量 mediaPlayer.prepare();//准备 mediaPlayer.seekTo(0);//指定播放的位置(以毫秒为单位的时间) mediaPlayer.start();//开始播放 // 结束监听 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { mediaPlayer.reset();//重置MediaPlayer对象 mediaPlayer.release();//释放MediaPlayer对象 } }); } catch (Exception e) { e.printStackTrace(); } finally { try { if (assetFileDescriptor != null){ assetFileDescriptor.close();//释放资源 } } catch (IOException e) { e.printStackTrace(); } } } }
创建assets方式
MediaPlayer常用方法
start(); //开始播放 stop(); //停止播放 seekTo(int msec); //指定播放的位置(以毫秒为单位的时间) setVolume(float leftVolume, float rightVolume); //设置音量 getDuration(); //得到文件的时间 getVideoHeight(); //得到视频高度 getVideoWidth(); //得到视频宽度 getCurrentPosition( ); //得到当前的播放位置 isLooping(); //是否循环播放 isPlaying(); //是否正在播放 setLooping(boolean looping); //设置是否循环播放 pause(); //暂停 prepare(); //准备(同步) prepareAsync(); //准备(异步) release(); //释放MediaPlayer对象 reset(); //重置MediaPlayer对象