国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解Android 語音播報實現方案(無SDK)

2019-12-12 01:36:01
字體:
來源:轉載
供稿:網友

本文介紹了詳解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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中山市| 四平市| 光泽县| 三台县| 锡林浩特市| 杭锦后旗| 咸宁市| 巨野县| 嘉鱼县| 封丘县| 广昌县| 历史| 东明县| 临沭县| 淮阳县| 潜江市| 新津县| 汝州市| 义马市| 靖西县| 盐源县| 宁武县| 大厂| 平远县| 茂名市| 西昌市| 尼玛县| 潮安县| 巴林左旗| 广宗县| 芜湖县| 布尔津县| 潼关县| 宁海县| 凌云县| 甘肃省| 甘泉县| 盈江县| 柘城县| 南京市| 巨鹿县|