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

首頁 > 系統 > Android > 正文

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

2019-10-22 18:21:59
字體:
來源:轉載
供稿:網友

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

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乳山市| 普宁市| 定远县| 沈阳市| 沅陵县| 伊金霍洛旗| 石泉县| 河西区| 通渭县| 邢台市| 墨脱县| 灌阳县| 宁都县| 嘉义县| 潮安县| 张家川| 崇仁县| 贵南县| 城市| 郎溪县| 龙里县| 津南区| 勃利县| 辰溪县| 大余县| 信阳市| 田林县| 唐河县| 博罗县| 平果县| 南通市| 庆安县| 陕西省| 山东省| 通榆县| 扶余县| 溧水县| 马公市| 阜新市| 寿光市| 芜湖县|