. audio播放
1.1 audio組件瀏覽器支持
元素 | Chrome | IE | Firefox | Safari | Opera |
---|---|---|---|---|---|
<audio> | 4.0 | 9.0 | 3.5 | 4.0 | 11.5 |
1.2 音頻支持格式
音頻格式 | 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 install benz-amr-recorder
<script type="text/javascript" src="./BenzAMRRecorder.min.js"></script>
2.2 支持格式
2.3 特性
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 編解碼器的基本架構(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ù)在實際場景中使用的途徑。
我們以這些模型為基準開發(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)建輸入音頻。
自 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
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。