不要用speex做靜音檢測vad

2021-07-09 13:07:03 字數 1210 閱讀 3250

speex從1.2版本開始支援靜音檢測vad(還有降噪、回聲消除、自動增益控制agc、抖動buffer、重取樣等一堆功能)等針對語音的預處理功能,實現在libspeexdsp庫中。

真正用起來後,發現各種坑!

因為speex初始化時frame size填的20ms幀長,所以各位從上圖可以看到,每隔20ms,波形會出現乙個突變,突變從20ms對齊處開始,持續1.5ms左右

將降噪和agc關閉後,現象不變,還跟上圖一樣

察看speexdsp原始碼中的preprocess.c檔案,發現speex_preprocess_state_init函式預設開啟降噪,不過我用speex_preprocess_ctl函式顯式關閉後,結果還是如上圖。而speex_preprocess_run函式裡面有段注釋嚇到我了

speexdsp的降噪也是擺設,開啟降噪功能後,背景雜訊根本沒有任何減少(還增加了它自己引入的電流突突聲)

speexdsp還有個問題:即使是單純的背景雜訊,它也可能將其檢測為語音,感覺它是單純基於頻域,即只要屬於高頻成分,一律認為是人聲

以上兩點導致vad功能完全不可用

最後附上**,好奇的同學可以自行嘗試

#include #include #include #include #include #include #define sample_rate (16000)

#define frame_size (20) //ms

#define samples_per_frame (sample_rate/1000 * frame_size)//每毫秒16個樣點

#define frame_bytes (samples_per_frame * 2)//每個樣點2位元組(單通道)

int main()

free(buf);

fclose(infile);

fclose(outfile);

speex_preprocess_state_destroy(state);

return 0;

}

編譯執行:

gcc squelch.c -lspeexdsp

./a.out

還好我最終用自己想出來的方法實現了靜音檢測,雖然應用範圍較窄,但符合我們的使用場景

千萬不要用這些工具

本文與12.26 12.27日有更新,主要是把maxthon換成了firefox。因為現在,我實在太喜歡firefox了,由此而導致的 maxthon 被拋棄的事,本人概不負責。1.blog 網路日誌 web 2.0 時代的代表產品,也是網際網路從以資料中心轉向以人為中心的最顯著標誌。你可以沒有個人...

為什麼不要用 StringBuffer

很多人在回答新手提問的時候會說,stringbuilder 是非同步的,所以快一些,stringbuffer是同步 執行緒an全 的,所以慢一些。從技術上說這句話是沒有錯的,但是為什麼又不要用 stringbuffer 呢?這就是為什麼 stringbuffer 這個類天生缺陷。在api設計中有一條...

不要用手機挖礦

成功的挖礦協議不會使用日常生活進行時的裝置挖礦。挖礦的意義 挖礦的意義是縮短將願意努力創新努力追求更高 更快 更強的人的努力轉化為回報的週期。挖礦是人類文明由0.7踏過1.0的必經之路。挖礦去掉中間環節,直接將造幣權賦予努力行動的人。協議保證造幣生產力不脫離人類活動空間,且保證有利可圖的造幣活動空間...