基于能量或过零率的实时语音分割--学习笔记
重要假設(shè)/基礎(chǔ):采集到的音頻在起始處有一小段靜音,長度為幾百毫秒,這是我們估計靜音閾值E0的基礎(chǔ),也是語音降噪的基礎(chǔ)。
1. 能量energy
選區(qū)一定數(shù)量的音頻幀,計算其平均能量值,然后加上一個經(jīng)驗值或乘以一個大于1的系數(shù),由此得到E0。
javascript在瀏覽器源碼頁面--console模塊下--輸出console.log();
取絕對值:Math.abs()
x的y次冪:Math.pow(x,y)
取對數(shù): Math.log(Math, data);
基于普天信息語音轉(zhuǎn)寫平臺,web錄音和實時語音分割
- question1: chrome瀏覽器html5網(wǎng)頁中的<script>標(biāo)簽代碼找不到j(luò)s文件及文件內(nèi)定義的函數(shù)function。
resolve: html-<script>? 和 js中定義的方法/添加的語句有錯誤;
- question2: chrome能找到j(luò)s文件,但html5無法調(diào)用js方法,報錯,而firefox瀏覽器可以。
resolve: 清空瀏覽器歷史緩存和清空js緩存(f12---network---disable cache)
- question3: html5<script>模塊程序觸發(fā)運行時間可能有差距。
window.clearInterval(clock_detection);
clock_detection = self.setInterval("audio_detection()", 100); //100ms觸發(fā)一次
window.clearInterval(clock); //每個4s調(diào)用setInterval中定義的函數(shù)showData
clock = self.setInterval("showData()",4000);
resolve: console.log()輸出觸發(fā)時間;輸出web stream input觸發(fā)時間
- question4: HZRecorder.js里buffer數(shù)據(jù)Float32Array每一位表示二進(jìn)制還是十進(jìn)制的語音采樣數(shù)據(jù)?
resolve: float32array里面是十進(jìn)制float小數(shù),可以轉(zhuǎn)化為2個Int16Array整數(shù)。
convert: do it directly from the arraybuffer.
(1) var data_int16array = new Int16Array(data.buffer); //buffer里面是float32array類型數(shù)據(jù)
或:(2) var float32 = new Float32Array(data);
var int16 = new Int16Array(float32.buffer);
float32: [0.12005, 0.25046, 0.101102, 0.030112] int16: [-13107, 15823, -42142, 15588]
javascript.Float32Array類型數(shù)組表示的是平臺字節(jié)順序為32為的浮點型數(shù)組,內(nèi)容初始化為0:
float32array.prototype.reduce()傳入一個函數(shù)作為累加器,從左到右遍歷,最終得到一個值
float32array.prototype.slice()提取數(shù)組的一部分并且返回一個新數(shù)組
float32array.prototype.some()如果數(shù)組中至少有一個元素滿足測試函數(shù)的要求,則返回true
float32array.prototype.subarray()從給定的起始位置返回一個新的float32array
float32array.get()獲取指定索引處的元素
- question5:單個buffer元素Float32Array長度為4096,跟錄音數(shù)據(jù)長度對不上。
web api包括:input sample_rate=44100; input sample_bit=16; output sample_rate=8000; output sample_bit=32
參見:https://developer.mozilla.org/zh-CN/docs/Web/API/AudioContext/createScriptProcessor
web api AudioContext.createScriptProcessor()創(chuàng)建一個ScriptProcessorNode用于通過javascript直接處理音頻
參數(shù):buffersize:緩存大小必須為其中一個--256, 512, 1024, 2048, 4096, 8192, 16384
- question6: 較差的錄音設(shè)備噪音較大,對錄音數(shù)據(jù)有較大影響,尤其是開頭靜音部分。(手機(jī)錄音效果不錯,有麥克風(fēng)陣列)
resolve: 更換設(shè)備;外接聲卡;麥克風(fēng)整列;取音頻數(shù)據(jù)最大值進(jìn)行比較(在較大噪音環(huán)境下,效果比能量均值要好)
- question7:一段靜音內(nèi)判斷出多個結(jié)束端點
resolve: 加入triggered_value,加入起始端點觸發(fā)機(jī)制
- question8: 出現(xiàn)40-60ms長音頻
resolve: 因為list[length] = null,導(dǎo)致buffer.slice(0)截取全部音頻
- question9: triggered激活后,更新audiobuffer.length,否則靜音段會被截取出來。
- question10: firefox火狐瀏覽器不能設(shè)置默認(rèn)麥克風(fēng), can't set default microphone.
resolve: 添加一個觸發(fā)函數(shù)。在recorder.start()開始之后,激活觸發(fā)函數(shù)。
2. 過零率zero
優(yōu)化:
(1)高通濾波器,它以高于某一截止頻率的頻率傳遞信號,并衰減低于截止頻率的信號。(我認(rèn)為不可行,因為web錄音實在html和js上,沒有現(xiàn)成的python包調(diào)用傅里葉變換fft去獲得語音頻率,如果自己在js中實現(xiàn),程序運行成本太高,而且也不能保證效果)
(2)設(shè)置一個門限T,將過零率的含義修改為跨過正負(fù)門限。(減去門限)
3. 高斯高階累積量
《現(xiàn)代語音信號處理》清音、噪音符合高斯分布,高斯四階及更高階的累積量會將噪音值清零,只留下有效語音數(shù)據(jù),我個人認(rèn)為其計算很麻煩,我能力不夠,沒法有效將其實現(xiàn)出來,用到j(luò)s中。
-----以后如果哪位大腿實現(xiàn)出來,讓我抱抱阿,比心
總結(jié)
以上是生活随笔為你收集整理的基于能量或过零率的实时语音分割--学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web浏览器录音:web audio a
- 下一篇: [转载] js 读取和输出txt文件