源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-09-04 08:59 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:详解Android 语音播报实现方案(无SDK)
本文介绍了详解Android 语音播报实现方案(无SDK),分享给大家,具体如下: [b]功能描述[/b] 类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到“支付宝到账12.55元”的语音播报。 [b]要解决的问题[/b] 1.播放单个语音文件 2.播放完单个语音文件之后立即播放下一条,这样才能连续 3.当多个完整的语音序列都需要播报时的处理(比如支付宝短时间内收到多条收款推送) [b]实现思路[/b] 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() 实现,当然也可以用别的方法。 [b]代码封装[/b] 功能代码分为两部分,一部分是语音序列组成的List,这里是VoiceTemplate; 一部分是播放的功能封装,接收List,然后播放语音,这里叫做VoiceSpeaker; 详细代码见文末。 [b]代码使用[/b] 比如要播放“支付宝到账十二点一三元”,代码如下
final List<String> list = new VoiceTemplate()
        .prefix("success")
        .numString("12.13")
        .suffix("yuan")
        .gen();

VoiceSpeaker.getInstance().speak(list);
[b]源码[/b] [url=https://github.com/jiangkang/KTools]KTools[/url] [url=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/VoiceSpeaker.java[/url] [url=https://github.com/jiangkang/KTools/blob/master/app/src/main/java/com/jiangkang/ktools/audio/VoiceTemplate.java]https://github.com/jiangkang/KTools/blob/master/app/src/main/java/com/jiangkang/ktools/audio/VoiceTemplate.java[/url] 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部