欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解Android 语音播报实现方案(无SDK)

程序员文章站 2023-01-22 09:44:52
本文介绍了详解android 语音播报实现方案(无sdk),分享给大家,具体如下: 功能描述 类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会...

本文介绍了详解android 语音播报实现方案(无sdk),分享给大家,具体如下:

功能描述

类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到“支付宝到账12.55元”的语音播报。

要解决的问题

1.播放单个语音文件

2.播放完单个语音文件之后立即播放下一条,这样才能连续

3.当多个完整的语音序列都需要播报时的处理(比如支付宝短时间内收到多条收款推送)

实现思路

1、播放单个文件选择mediaplayer

首先创建一个mediaplayer实例

mediaplayer player = new mediaplayer();

然后设置数据源,这里数据源从assets中获取,当然也可以将语音文件放在raw文件夹里

 fd = fileutils.getassetfiledescription(path);
 player.setdatasource(fd.getfiledescriptor(), fd.getstartoffset(),
              fd.getlength());

然后调用prepareasync()方法,异步加载,并设置监听,加载完毕之后开始播放(与prepare方法区别开来)

player.prepareasync();
player.setonpreparedlistener(new mediaplayer.onpreparedlistener() {
            @override
            public void onprepared(mediaplayer mp) {
              mp.start();
            }
          });

2、由于播放的语音文件不止一个,因此需要监听播放完成的状态,在播放完成之后播放下一条语音

 player.setoncompletionlistener(new mediaplayer.oncompletionlistener() {
            @override
            public void oncompletion(mediaplayer mp) {
              mp.reset();
              counter[0]++;
              if (counter[0] < list.size()) {
                try {
                  assetfiledescriptor filedescriptor = fileutils.getassetfiledescription(string.format("sound/tts_%s.mp3", list.get(counter[0])));
                  mp.setdatasource(filedescriptor.getfiledescriptor(), filedescriptor.getstartoffset(), filedescriptor.getlength());
                  mp.prepare();
                } catch (ioexception e) {
                  e.printstacktrace();
                  latch.countdown();
                }
              } else {
                mp.release();
                latch.countdown();
              }
            }
          });

3、短时间多次播报请求,开采用同步方式进行,一条播完播放下一条,这里采用synchronized + notifyall() 实现,当然也可以用别的方法。

代码封装

功能代码分为两部分,一部分是语音序列组成的list,这里是voicetemplate;

一部分是播放的功能封装,接收list,然后播放语音,这里叫做voicespeaker;

详细代码见文末。

代码使用

比如要播放“支付宝到账十二点一三元”,代码如下

final list<string> list = new voicetemplate()
        .prefix("success")
        .numstring("12.13")
        .suffix("yuan")
        .gen();

voicespeaker.getinstance().speak(list);

源码

ktools

https://github.com/jiangkang/ktools/blob/master/app/src/main/java/com/jiangkang/ktools/audio/voicespeaker.java

https://github.com/jiangkang/ktools/blob/master/app/src/main/java/com/jiangkang/ktools/audio/voicetemplate.java

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。