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

 更新时间:2017年11月29日 09:20:59   作者:姜康  
本篇文章主要介绍了详解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

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

相关文章

  • Android剪贴板用法详解

    Android剪贴板用法详解

    这篇文章主要介绍了Android剪贴板用法详解,以实例的形式对Android中剪贴板的各类传值方法做了较为详细的讲述,需要的朋友可以参考下
    2014-10-10
  • Android图片无限轮播的实现代码

    Android图片无限轮播的实现代码

    这篇文章主要为大家详细介绍了Android图片无限轮播的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 详解Flutter Widget

    详解Flutter Widget

    本文主要讲解了Flutter Widget,它是是描述 Flutter UI 的基本单元,需要进一步了解的小伙伴可以参考一下这篇文章
    2021-08-08
  • android多行标签热点示例

    android多行标签热点示例

    这篇文章主要介绍了android多行标签热点示例,需要的朋友可以参考下
    2014-04-04
  • Android listview多视图嵌套多视图

    Android listview多视图嵌套多视图

    这篇文章主要介绍了Android listview多视图嵌套多视图 的相关资料,需要的朋友可以参考下
    2016-02-02
  • Android线程的优先级设置方法技巧

    Android线程的优先级设置方法技巧

    对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题,比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了MultiThread来解决慢速I/O但是合理分配优先级对于并发编程来说十分重要
    2016-02-02
  • Flutter给控件实现钻石般的微光特效

    Flutter给控件实现钻石般的微光特效

    这篇文章主要给大家介绍了关于Flutter给控件实现钻石般的微光特效的相关资料,实现的效果非常不错,非常适合大家做开发的时候参考,需要的朋友可以参考下
    2021-08-08
  • Android实现多级树形选择列表

    Android实现多级树形选择列表

    这篇文章主要为大家详细介绍了Android实现多级树形选择列表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Android ContentProvider获取手机联系人实例

    Android ContentProvider获取手机联系人实例

    这篇文章主要介绍了Android ContentProvider获取手机联系人实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android 启动另一个App/apk中的Activity实现代码

    Android 启动另一个App/apk中的Activity实现代码

    这篇文章主要介绍了Android 启动另一个App/apk中的Activity实现代码的相关资料,需要的朋友可以参考下
    2017-04-04

最新评论