溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android如何實(shí)現(xiàn)語(yǔ)音播報(bào)

發(fā)布時(shí)間:2021-08-06 10:57:42 來(lái)源:億速云 閱讀:336 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)Android如何實(shí)現(xiàn)語(yǔ)音播報(bào),小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

具體如下:

功能描述

類似支付寶收款時(shí)候的語(yǔ)音播報(bào)功能:當(dāng)別人掃描你的收款碼,你收到錢之后,就會(huì)聽(tīng)到“支付寶到賬12.55元”的語(yǔ)音播報(bào)。

要解決的問(wèn)題

1.播放單個(gè)語(yǔ)音文件

2.播放完單個(gè)語(yǔ)音文件之后立即播放下一條,這樣才能連續(xù)

3.當(dāng)多個(gè)完整的語(yǔ)音序列都需要播報(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)然也可以將語(yǔ)音文件放在raw文件夾里

 fd = FileUtils.getAssetFileDescription(path);
 player.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(),
              fd.getLength());

然后調(diào)用prepareAsync()方法,異步加載,并設(shè)置監(jiān)聽(tīng),加載完畢之后開(kāi)始播放(與prepare方法區(qū)別開(kāi)來(lái))

player.prepareAsync();
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
              mp.start();
            }
          });

2、由于播放的語(yǔ)音文件不止一個(gè),因此需要監(jiān)聽(tīng)播放完成的狀態(tài),在播放完成之后播放下一條語(yǔ)音

 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)求,開(kāi)采用同步方式進(jìn)行,一條播完播放下一條,這里采用synchronized + notifyAll() 實(shí)現(xiàn),當(dāng)然也可以用別的方法。

代碼封裝

功能代碼分為兩部分,一部分是語(yǔ)音序列組成的List,這里是VoiceTemplate;

一部分是播放的功能封裝,接收List,然后播放語(yǔ)音,這里叫做VoiceSpeaker;

詳細(xì)代碼見(jiàn)文末。

代碼使用

比如要播放“支付寶到賬十二點(diǎn)一三元”,代碼如下

final List<String> list = new VoiceTemplate()
        .prefix("success")
        .numString("12.13")
        .suffix("yuan")
        .gen();

VoiceSpeaker.getInstance().speak(list);

關(guān)于“Android如何實(shí)現(xiàn)語(yǔ)音播報(bào)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI