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