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

所属分类: 软件编程 / Android 阅读数: 77
收藏 0 赞 0 分享

本文介绍了详解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

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

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多