這篇文章將為大家詳細(xì)講解有關(guān)Android如何實(shí)現(xiàn)語音播報(bào),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專注于鐵東企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),成都商城網(wǎng)站開發(fā)。鐵東網(wǎng)站建設(shè)公司,為鐵東等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)具體如下:
功能描述
類似支付寶收款時(shí)候的語音播報(bào)功能:當(dāng)別人掃描你的收款碼,你收到錢之后,就會(huì)聽到“支付寶到賬12.55元”的語音播報(bào)。
要解決的問題
1.播放單個(gè)語音文件
2.播放完單個(gè)語音文件之后立即播放下一條,這樣才能連續(xù)
3.當(dāng)多個(gè)完整的語音序列都需要播報(bào)時(shí)的處理(比如支付寶短時(shí)間內(nèi)收到多條收款推送)
實(shí)現(xiàn)思路
1、播放單個(gè)文件選擇MediaPlayer
首先創(chuàng)建一個(gè)MediaPlayer實(shí)例
MediaPlayer player = new MediaPlayer();
然后設(shè)置數(shù)據(jù)源,這里數(shù)據(jù)源從assets中獲取,當(dāng)然也可以將語音文件放在raw文件夾里
fd = FileUtils.getAssetFileDescription(path); player.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
然后調(diào)用prepareAsync()方法,異步加載,并設(shè)置監(jiān)聽,加載完畢之后開始播放(與prepare方法區(qū)別開來)
player.prepareAsync(); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } });
2、由于播放的語音文件不止一個(gè),因此需要監(jiān)聽播放完成的狀態(tài),在播放完成之后播放下一條語音
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、短時(shí)間多次播報(bào)請(qǐng)求,開采用同步方式進(jìn)行,一條播完播放下一條,這里采用synchronized + notifyAll() 實(shí)現(xiàn),當(dāng)然也可以用別的方法。
代碼封裝
功能代碼分為兩部分,一部分是語音序列組成的List,這里是VoiceTemplate;
一部分是播放的功能封裝,接收List,然后播放語音,這里叫做VoiceSpeaker;
詳細(xì)代碼見文末。
代碼使用
比如要播放“支付寶到賬十二點(diǎn)一三元”,代碼如下
final Listlist = new VoiceTemplate() .prefix("success") .numString("12.13") .suffix("yuan") .gen(); VoiceSpeaker.getInstance().speak(list);
關(guān)于“Android如何實(shí)現(xiàn)語音播報(bào)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。