Android实现语音播报的两种方式

简介: Android实现语音播报的两种方式

方式一(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对象
目录
相关文章
|
9月前
|
开发工具 Android开发
Android平台GB28181设备接入端语音广播技术探究和填坑指南
GB/T28181-2016官方规范和交互流程,我们不再赘述。
|
9月前
|
开发工具 Android开发
Android平台GB28181设备接入端语音广播支持PS格式
对接Android平台GB28181设备接入端语音广播的时候,我们有遇到过INVITE SDP需要PCMA格式的audio,对方同时回了PS和PCMA两种,然后,发数据的时候,直接发了PS的。
142 0
|
1月前
|
JSON 自然语言处理 Java
Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)
Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)
152 0
|
9月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入端如何支持跨网段语音对讲
如果你是音视频开发者亦或寻求这块技术方案的公司,在探讨这个问题之前,你可能网上看了太多关于语音广播和语音对讲相关的资料,大多文章认为语音对讲和语音广播无本质区别,实现思路也大同小异。
|
1月前
|
机器学习/深度学习 TensorFlow 语音技术
【Android +Tensroflow Lite】实现从基于机器学习语音中识别指令讲解及实战(超详细 附源码和演示视频)
【Android +Tensroflow Lite】实现从基于机器学习语音中识别指令讲解及实战(超详细 附源码和演示视频)
32 0
|
9月前
|
Android开发 开发者
Android平台GB28181设备接入端语音广播如何实现实时音量调节
Android平台GB28181设备接入,语音广播功能非常重要,本文要介绍的,不是语音广播的流程,语音广播流程,之前的blog也有非常详细的分享,感兴趣的可以参考官方规范书的交互流程:
|
9月前
|
开发工具 Android开发 开发者
Android平台GB28181接入端语音广播和语音对讲规范解读和技术实现
我在之前的blog,有提到过Android端GB28181接入端的语音广播和语音对讲,今天主要从GB/T28181-2016官方规范和交互流程,大概介绍下Android平GB28181接入端的语音广播和语音对讲。
170 0
|
9月前
|
Android开发 开发者
Android国标接入端如何播放GB28181平台端语音广播数据
GB28181语音广播这块,我们依据GB/T28181-2016针对流程和实例代码,做过详细的描述,本次主要是探讨下,广播数据过来后,如何处理。
|
9月前
|
Android开发 开发者
Android GB28181设备接入端语音广播和语音对讲技术实现探究
上篇文章提到Android端GB28181接入端的语音广播和语音对讲的实现,从spec角度大概介绍了下流程和简单的接口设计,好多开发者私信我,希望展开说一下。其实这块难度不大,只是广播和对讲涉及到双向实现,如果之前没有相关的积累,从头实现麻烦一些而已。
|
8天前
|
数据管理 API 数据库
探索Android Jetpack:现代安卓开发的利器
Android Jetpack是谷歌为简化和优化安卓应用开发而推出的一套高级组件库。本文深入探讨了Jetpack的主要构成及其在应用开发中的实际运用,展示了如何通过使用这些工具来提升开发效率和应用性能。