Two ways for Android to implement voice broadcast

Method 1 (TextToSpeech)

text-to-speech

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();//释放资源
    }

}

Method 2 (MediaPlayer)

Obtain resources under the assets directory for broadcasting

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();
            }
        }
    }

}

How to create assets

insert image description here

Common methods of 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对象

Guess you like

Origin blog.csdn.net/Mr_Gaojinchao/article/details/130626113