整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          前端音頻播放實戰(zhàn)

          前端音頻播放實戰(zhàn)

          . audio播放

          1.1 audio組件瀏覽器支持

          元素

          Chrome

          IE

          Firefox

          Safari

          Opera

          <audio>

          4.0

          9.0

          3.5

          4.0

          11.5

          1.2 音頻支持格式

          • mp3
          • wav
          • ogg

          音頻格式

          Chrome

          Firefox

          IE9

          Opera

          Safari

          OGG

          支持

          支持

          支持

          不支持

          不支持

          MP3

          支持

          不支持

          支持

          不支持

          支持

          WAV

          不支持

          支持

          不支持

          支持

          不支持

          1.3 示例代碼

          <audio controls="controls">
             <source src="song2.ogg" type="audio/ogg">
             <source src="song2.mp3" type="audio/mpeg">
          </audio>

          2. 播放組件-基于VUE前端框架(benz-amr-recorder)

          2.1 集成方式

          • npm包集成
          npm install benz-amr-recorder
          • 引入js文件集成
          <script type="text/javascript" src="./BenzAMRRecorder.min.js"></script>

          2.2 支持格式

          • amr

          2.3 特性

          • 方便的 API 實現(xiàn)解碼、播放、錄音、編碼 AMR 文件。
          • 支持 url 和 blob (即<input type="file">)方式獲取 AMR。
          • 支持將瀏覽器 <audio> 所支持的音頻格式(例如 MP3 或 OGG 音頻)轉(zhuǎn)換成 AMR 音頻。
          • 編碼后的 AMR 文件可下載,無須服務(wù)器。

          2.4 示例代碼

          2.4.1 代碼實現(xiàn)

          import BenzAMRRecorder from 'benz-amr-recorder'
          var amr = new BenzAMRRecorder();
          
          play(url) {
            amr.initWithUrl(url).then(function() {
              // amr.isPlaying() 返回音頻的播放狀態(tài) 是否正在播放 返回boolean類型
              if(amr.isPlaying()){
                amr.stop();
             } else {
                amr.play();
             }
           });
          }

          3. 音頻錄制組件-基于VUE前端框架js-audio-recorder

          3.1 依賴

          npm i js-audio-recorder

          3.2 代碼集成

          3.2.1 引用

          import Recorder from 'js-audio-recorder'
          this.recorder = new Recorder()

          3.2.2 前端代碼

          <!-- 錄音上傳 -->
             <Modal v-model="uploadRecordModal" :mask-closable="false" width="580">
               <p slot="header">
                 <span>錄音上傳</span>
               </p>
          
               <div style="font-size:14px">
                 <h3>錄音時長:{{recorder&&recorder.duration.toFixed(4)}}</h3>
                 <br />
                 <Button type="primary"@click="handleStart">開始錄音</Button>
                 <Button type="info" @click="handlePause">暫停錄音</Button>
                 <Button type="success"@click="handleResume">繼續(xù)錄音</Button>
                 <Button type="warning"@click="handleStop">停止錄音</Button>
                 <br />
                 <br />
                 <h3>播放時長:{{recorder&&(playTime>recorder.duration?recorder.duration.toFixed(4):playTime.toFixed(4))}}</h3>
                 <br />
                 <Button type="primary"@click="handlePlay">播放錄音</Button>
                 <Button type="info"@click="handlePausePlay">暫停播放</Button>
                 <Button type="success"@click="handleResumePlay">繼續(xù)播放</Button>
                 <Button type="warning"@click="handleStopPlay">停止播放</Button>
                 <Button type="error"@click="handleDestroy">銷毀錄音</Button>
               </div>
               <div slot="footer">
                 <Button style="margin-left:5px;"type="default"@click="uploadRecordModal=false">取消</Button>
                 <Button style="margin-left:5px;"type="primary" @click="uploadRecord">上傳</Button>
               </div>
             </Modal>

          3.2.3 后端代碼

          // 開始錄音
             handleStart () {
               this.recorder = new Recorder()
               Recorder.getPermission().then(() => {
                 console.log('開始錄音')
                 this.recorder.start() // 開始錄音
              }, (error) => {
                 this.$Message.info('請先允許該網(wǎng)頁使用麥克風(fēng)')
                 console.log(`${error.name} : ${error.message}`)
              })
            },
             handlePause () {
               console.log('暫停錄音')
               this.recorder.pause() // 暫停錄音
            },
             handleResume () {
               console.log('恢復(fù)錄音')
               this.recorder.resume() // 恢復(fù)錄音
            },
             handleStop () {
               console.log('停止錄音')
               this.recorder.stop() // 停止錄音
            },
             handlePlay () {
               console.log('播放錄音')
               this.recorder.play() // 播放錄音
          
               // 播放時長
               this.timer = setInterval(() => {
                 try {
                   this.playTime = this.recorder.getPlayTime()
                } catch (error) {
                   this.timer = null
                }
              }, 100)
            },
             handlePausePlay () {
               console.log('暫停播放')
               this.recorder.pausePlay() // 暫停播放
          
               // 播放時長
               this.playTime = this.recorder.getPlayTime()
               this.time = null
            },
             handleResumePlay () {
               console.log('恢復(fù)播放')
               this.recorder.resumePlay() // 恢復(fù)播放
          
               // 播放時長
               this.timer = setInterval(() => {
                 try {
                   this.playTime = this.recorder.getPlayTime()
                } catch (error) {
                   this.timer = null
                }
              }, 100)
            },
             handleStopPlay () {
               console.log('停止播放')
               this.recorder.stopPlay() // 停止播放
          
               // 播放時長
               this.playTime = this.recorder.getPlayTime()
               this.timer = null
            },
             handleDestroy () {
               console.log('銷毀實例')
               this.recorder.destroy() // 毀實例
               this.timer = null
            },
             uploadRecord () {
               if (this.recorder == null ||this.recorder.duration === 0) {
                 this.$Message.error('請先錄音')
                 return false
              }
               this.recorder.pause() // 暫停錄音
               this.timer = null
               console.log('上傳錄音')// 上傳錄音
               var formData = new FormData()
               var blob = this.recorder.getWAVBlob()//獲取wav格式音頻數(shù)據(jù)
            //此處獲取到blob對象后需要設(shè)置fileName滿足當(dāng)前項目上傳需求,其它項目可直接傳把blob作為file塞入formData
               var newbolb = new Blob([blob], { type: 'audio/wav' })
               var fileOfBlob = new File([newbolb], newDate().getTime() + '.wav')
               formData.append('file', fileOfBlob)
            //本地公共上傳接口獲取到服務(wù)器地址保存即可
               const axios = require('axios')
               axios.post(this.resource, formData).then(res=> {
                 console.log(res.data.data[0].url)
            //開始調(diào)用保存的方法
                 this.uploadRecordModal = false
              })
            },

          3.2.4 語音播放

          獲取音頻服務(wù)器地址后直接使用audio標簽播放

          <audio v-if="fileType==='WAV'||fileType==='MP3'":src="fileUrl" controls="controls"></audio>

          天的文章,我想幫大家解決「語音轉(zhuǎn)文字」的痛點。


          工作學(xué)習(xí)中,我們總會遇上語音轉(zhuǎn)文字的需求,例如工作會議布置大量任務(wù)、期末最后一節(jié)課劃重點,語速太快來不及記錄,只能錄音。


          但錄音一時爽,聽時「火葬場」。害怕錯過重要部分,半個多小時的錄音只能從頭聽到尾,實在是費時間!


          上次在讀者群,就有小伙伴提出了這個問題



          所以,今天我們就來盤一盤,現(xiàn)在市面上有哪些語音轉(zhuǎn)文字的好工具!


          文末我們也對這些工具做了性能對比,并且提供了音頻格式轉(zhuǎn)換軟件,所以一定要看到最后哦。


          或者你可以直接 私信@秋葉PPT軟件」兩個字拿到獲取方式。

          過語音和視頻與他人在線通訊,已經(jīng)逐漸成為了日常生活的一部分。為了實現(xiàn)這一需求,像 WebRTC 這樣的實時通信框架需要高效的壓縮技術(shù)和編解碼器來編碼(或解碼)傳輸或存儲的信號。過去幾十年來,編解碼器一直是媒體應(yīng)用程序的重要組成部分之一,它能讓消耗大量帶寬的應(yīng)用程序高效地傳輸數(shù)據(jù),并讓人們看到了隨時隨地進行高質(zhì)量通信的希望。


          也就是說,開發(fā)用于視頻和音頻的編解碼器時,所面臨的一項長期挑戰(zhàn)就提供更高的質(zhì)量、使用更少的數(shù)據(jù)并盡量降低實時通信的延遲。盡管視頻看起來比音頻要占用更多的帶寬,但是現(xiàn)代視頻編解碼器可以達到比當(dāng)今使用的某些高質(zhì)量語音編解碼器更低的比特率。若能結(jié)合使用低比特率的視頻和語音編解碼器,即使在低帶寬網(wǎng)絡(luò)中也可以提供高質(zhì)量的視頻通話體驗。然而在過去,音頻編解碼器的比特率越低,語音信號的清晰度就越差,電子味也會更濃。此外,盡管有些人可以用上始終如一的高質(zhì)量高速網(wǎng)絡(luò),但這種網(wǎng)絡(luò)水平并沒有普及。即使在網(wǎng)絡(luò)連接良好的地區(qū),有時也會遇到質(zhì)量差、帶寬低和網(wǎng)絡(luò)連接擁塞的情況。


          為了解決這一問題,我們創(chuàng)建了 Lyra(https://arxiv.org/abs/2102.09660),一種高質(zhì)量、低比特率的語音編解碼器,即使在最慢的網(wǎng)絡(luò)上也可以用它進行語音通信。為此,我們一方面應(yīng)用了傳統(tǒng)的編解碼技術(shù),同時利用機器學(xué)習(xí)(ML)的優(yōu)勢和使用數(shù)千小時數(shù)據(jù)訓(xùn)練的模型來創(chuàng)建一種壓縮和傳輸語音信號的新穎方法。

          Lyra 概述

          Lyra 編解碼器的基本架構(gòu)非常簡單。它以 40 毫秒的間隔從語音中提取特征或獨特的語音屬性,然后將其壓縮以進行傳輸。這些特征本身是對數(shù)梅爾聲譜圖,是一個代表不同頻段語音能量的數(shù)字列表。由于它們是根據(jù)人類聽覺響應(yīng)建模的,因此傳統(tǒng)上主要用在與感知相關(guān)的領(lǐng)域。另一方面,一個生成模型使用這些特征來重新創(chuàng)建語音信號。從這個意義上講,Lyra 與其他傳統(tǒng)的參數(shù)編解碼器(例如 MELP)非常相似。



          但是,傳統(tǒng)的參數(shù)編解碼器僅提取語音關(guān)鍵參數(shù)(這些參數(shù)可用于在接收端重新創(chuàng)建信號),結(jié)果比特率雖然很低,但通常聽起來電子味很重且不自然。這些缺陷推動了新一代高質(zhì)量音頻生成模型的開發(fā),這種模型不僅能夠區(qū)分信號,而且還能生成全新的信號,為這一領(lǐng)域帶來了革命性的變化。DeepMind 的 WaveNet 是這類生成模型中的排頭兵,為以后的許多應(yīng)用鋪平了道路。此外,目前在 Duo 中使用的 WaveNetEQ(基于生成模型的丟包隱匿系統(tǒng))已經(jīng)展示了這種技術(shù)在實際場景中使用的途徑。

          Lyra 使用的新壓縮方法

          我們以這些模型為基準開發(fā)了一種新的模型,能夠使用最少的數(shù)據(jù)來重建語音。與當(dāng)今大多數(shù)流媒體和通信平臺中使用的最先進波形編解碼器相比,Lyra 利用這些新的自然聲音生成模型的能力來保持參數(shù)編解碼器的低比特率優(yōu)勢,同時實現(xiàn)較高的質(zhì)量。波形編解碼器的缺點是,它們需要逐個壓縮并發(fā)送信號采樣才能實現(xiàn)高質(zhì)量的編碼,這需要更高的比特率,并且在大多數(shù)情況下獲得自然語音并不需要這么麻煩。


          生成模型的一個問題是它們的計算復(fù)雜性。Lyra 使用了一個開銷更低的循環(huán)生成模型(WaveRNN 的一個變體)來避免這一問題。該模型以較低的碼率工作,但會并行生成不同頻率范圍內(nèi)的多個信號,隨后將其組合為所需采樣率的單個輸出信號。這個技巧讓 Lyra 不僅可以運行在云服務(wù)器上,而且可以在中端手機上實時工作(處理延遲為 90ms,與其他傳統(tǒng)語音編解碼器相當(dāng))。然后,這個生成模型使用數(shù)千小時的語音數(shù)據(jù)來做訓(xùn)練和優(yōu)化(像 WaveNet 一樣),以準確地重新創(chuàng)建輸入音頻。

          與現(xiàn)有編解碼器的對比

          自 Lyra 誕生以來,我們的任務(wù)一直是使用比特率很小的數(shù)據(jù)來提供最優(yōu)質(zhì)的音頻。當(dāng)前,免授權(quán)的開源編解碼器 Opus 是基于 WebRTC 的 VOIP 應(yīng)用程序中使用最廣泛的編解碼器,并且音頻碼率為 32kbps 時通常就能獲得透明的語音質(zhì)量,也就是說與原始音頻沒有顯著區(qū)別。但是,雖然 Opus 可以在帶寬限制更小(最低 6kbps)的環(huán)境中使用,但此時它的音頻質(zhì)量就會下降了。其他編解碼器(Speex、MELP、AMR)能夠取得與 Lyra 相當(dāng)?shù)谋忍芈?,但它們的噪音很大,聲音也都是電子味?/p>


          Lyra 目前被設(shè)計為 3kbps 的碼率。收聽測試表明,Lyra 在這一比特率下的性能優(yōu)于其他所有編解碼器,并且在 8kbps 的碼率上性能優(yōu)于 Opus,從而將所需帶寬減少了 60%以上。Lyra 可以用在帶寬條件不足以提供更高比特率,且現(xiàn)有的低比特率編解碼器無法提供足夠質(zhì)量的場景中。


          確保公平

          與任何基于 ML 的系統(tǒng)一樣,我們必須對模型進行訓(xùn)練以確保其對每個人都一樣有效。我們已經(jīng)使用開源音頻庫為 Lyra 訓(xùn)練了數(shù)千小時的音頻(其中包含 70 多種語言),然后與專家和眾包聽眾一起驗證了音頻質(zhì)量。Lyra 的設(shè)計目標之一是確保高質(zhì)量音頻體驗?zāi)軌蚱栈荽蟊?。Lyra 會在廣泛的數(shù)據(jù)集上進行訓(xùn)練,數(shù)據(jù)集包括多種語言的語音,以確保編解碼器對可能遇到的任何情況都具有穩(wěn)健性。

          社會影響力和我們的計劃

          無論是短期還是長期范疇,Lyra 這類技術(shù)的影響都是非??捎^的。借助 Lyra,新興市場中的數(shù)十億用戶可以獲得高效的低比特率編解碼器,從而享受比以往質(zhì)量更高的音頻。此外,Lyra 可以在云環(huán)境中使用,使網(wǎng)絡(luò)條件和設(shè)備功能各異的用戶能夠無縫地聊天。將 Lyra 與新的視頻壓縮技術(shù)(例如 AV1)搭配后,即使通過 56kbps 撥號調(diào)制解調(diào)器連接到互聯(lián)網(wǎng)的用戶也可以進行視頻聊天了。


          Duo 已經(jīng)使用 ML 來減少音頻中斷,并且目前正在加入 Lyra 來提高超低帶寬連接上的音頻通話質(zhì)量和可靠性。我們將繼續(xù)研究 Lyra 的性能和質(zhì)量主題,以確保這一技術(shù)提供最大的可用性,還會通過 GPU 和 TPU 加速研究。我們也在研究如何使用這些技術(shù)開發(fā)低比特率的通用音頻編解碼器(即涵蓋音樂和其他非語音用例)。


          原文鏈接:https://ai.googleblog.com/2021/02/lyra-new-very-low-bitrate-codec-for.html


          主站蜘蛛池模板: 亚洲午夜精品一区二区| 3d动漫精品啪啪一区二区中文| 精品深夜AV无码一区二区老年| 亚洲欧美国产国产综合一区| 一区二区中文字幕在线观看| 亚洲国产成人久久综合一区| 亚洲一区二区三区免费| 日韩一区二区在线视频| 国产精品乱码一区二区三区| 黑巨人与欧美精品一区| 久久99热狠狠色精品一区| 精品免费AV一区二区三区| 亚洲一区二区三区在线观看蜜桃| 国产美女av在线一区| 国产在线第一区二区三区| 韩国福利影视一区二区三区| 清纯唯美经典一区二区| 国产中文字幕一区| 精品国产aⅴ无码一区二区| 中文字幕在线视频一区| 国产伦精品一区二区三区免费下载 | 久久99精品波多结衣一区| 国产一区二区三区在线观看免费 | 国产精品自拍一区| 国语精品一区二区三区| 一区二区不卡久久精品| 国产伦精品一区二区三区免费迷| 国产乱码精品一区二区三区中| 亚洲乱色熟女一区二区三区丝袜| 国产福利一区二区在线视频 | 伊人激情AV一区二区三区| 一区二区高清在线| 国产在线观看精品一区二区三区91| AA区一区二区三无码精片| 亚洲无删减国产精品一区| 亚洲av鲁丝一区二区三区| 伊人久久大香线蕉av一区| 精品国产免费一区二区三区香蕉| 国产福利电影一区二区三区,免费久久久久久久精 | 无码AV天堂一区二区三区| 国产午夜精品一区二区三区漫画|