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对象
相关文章
Android平台GB28181设备接入端语音广播支持PS格式
对接Android平台GB28181设备接入端语音广播的时候,我们有遇到过INVITE SDP需要PCMA格式的audio,对方同时回了PS和PCMA两种,然后,发数据的时候,直接发了PS的。
195 0
Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)
Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)
605 0
Android平台GB28181设备接入端如何支持跨网段语音对讲
如果你是音视频开发者亦或寻求这块技术方案的公司,在探讨这个问题之前,你可能网上看了太多关于语音广播和语音对讲相关的资料,大多文章认为语音对讲和语音广播无本质区别,实现思路也大同小异。
153 0
【Android +Tensroflow Lite】实现从基于机器学习语音中识别指令讲解及实战(超详细 附源码和演示视频)
【Android +Tensroflow Lite】实现从基于机器学习语音中识别指令讲解及实战(超详细 附源码和演示视频)
113 0
Android平台GB28181设备接入端语音广播如何实现实时音量调节
Android平台GB28181设备接入,语音广播功能非常重要,本文要介绍的,不是语音广播的流程,语音广播流程,之前的blog也有非常详细的分享,感兴趣的可以参考官方规范书的交互流程:
102 0
Android平台GB28181接入端语音广播和语音对讲规范解读和技术实现
我在之前的blog,有提到过Android端GB28181接入端的语音广播和语音对讲,今天主要从GB/T28181-2016官方规范和交互流程,大概介绍下Android平GB28181接入端的语音广播和语音对讲。
270 0
Android国标接入端如何播放GB28181平台端语音广播数据
GB28181语音广播这块,我们依据GB/T28181-2016针对流程和实例代码,做过详细的描述,本次主要是探讨下,广播数据过来后,如何处理。
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
42 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
    16
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    20
  • 3
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    15
  • 4
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    4
  • 5
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    2
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    7
  • 7
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    4
  • 8
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    2
  • 9
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    12
  • 10
    Android实战经验之Kotlin中快速实现MVI架构
    14
  • 1
    android FragmentManager 删除所有Fragment 重建
    18
  • 2
    Android实战经验之Kotlin中快速实现MVI架构
    36
  • 3
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    36
  • 4
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    149
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    47
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    59
  • 8
    Android历史版本与APK文件结构
    165
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    48
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    42
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等