在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用神經網絡進行語音降噪

電子發燒友論壇 ? 來源:電子發燒友論壇 ? 作者:電子發燒友論壇 ? 2022-04-11 10:38 ? 次閱讀

本文是基于NNoM神經網絡框架實現的。NNoM是一個為單片機定制的神經網絡框架,可以實現TensorFlow 模型的量化和部署到單片機上,可以在Cortex M4/7/33等ARM內核的單片機上實現加速(STM32LPC,Nordic nRF 等等)。

NNoM和本文代碼可以在后臺回復:“麥克風降噪”領取。

效果演示視頻

如何用神經網絡進行語音降噪

STM32實現單麥克風實時神經網絡(RNN)降噪演示

硬聲創作者:麻博士在科研

這個例子是根據著名的 RNNoise (https://jmvalin.ca/demo/rnnoise/) 的降噪方法進行設計的。整體進行了一些簡化和定點化的一些修改。

本例與RNNoise主要的區別如下:

此例子并非從RNNoise的模型直接轉換而來,而是從新基于Keras訓練一個新模型,并轉化成NNoM模型。

音頻信號處理去掉了Pitch Filtering的部分。

RNN 網絡定點化時,根據定點模型的一些特點進行了部分神經網絡結構修改。

訓練數據集選擇上使用了微軟的可定制語音數據庫而不是RNNoise收集的數據庫。

此例子用到的三方庫如下,大部分為寬松許可,但請大家在使用時遵循他們的開源協議。

RNNoise (https://jmvalin.ca/demo/rnnoise/)

Microsoft Scalable Noisy Speech Dataset (https://github.com/microsoft/MS-SNSD)

python speech features (https://github.com/jameslyons/python_speech_features)

arduino_fft (https://github.com/lloydroc/arduino_fft)

CMSIS (https://github.com/ARM-software/CMSIS_5)

NNoM本身許可為 Apache-2.0,詳細信息請看NNoM 開源主倉庫下的許可信息 (https://github.com/majianjia/nnom).

一些背景知識

如何用神經網絡進行語音降噪?

神經網絡降噪通常有兩種方式:

語音信號直入神經網絡模型,神經網絡全權進行識別處理并輸出降噪后的語音信號。

神經網絡識別語音和噪音的特征,動態輸出增益,使用傳統信號處理方法進行濾波。

RNNoise 使用的是第二種方法。

實際進行語音降噪(濾波)的部分,是一個均衡器,也就是大家播放器內調節低音高音的那個玩意兒。而均衡器(Equalizer)的本質是很多個平行的帶通濾波器(Bandpass Filter). 我們神經網絡的輸出,就是均衡器內各個filter band的增益。

那輸入是什么?跟之前的 KeyWord Spotting例子(https://github.com/majianjia/nnom/tree/master/examples/keyword_spotting) 一樣,我們這里使用了梅爾倒頻譜 (MFCC)。如果不熟悉的小伙伴,可以回去看看KWS的解釋或自行百度。

跟RNNoise有一些不一樣的是我們的例子使用MFCC和梅爾刻度 (Mel-scale) 而不是他們用的OPUS-Scale 或者響度刻度 (Bark-Scale)。單純從刻度的對比上,他們其實差別不是很大。感興趣的同學可以自己去查查他們的區別。

系統圖如下

如何用神經網絡進行語音降噪

運行步驟

如果想看詳細的解析,請跳到文章后半部分。這里介紹在RTT和STM32L476板子上把這套算法跑起來的步驟。

1.下載語音數據集

這里我們使用的數據集是微軟的可定制語音數據集Microsoft Scalable Noisy Speech Dataset (MS-SNSD: https://github.com/microsoft/MS-SNSD)。我們可以定制時長,噪音類型,噪音混合信噪比等。你需要把整個倉庫下載在 MS-SNSD/文件夾內。整個數據庫有2.x GB大佬們請自行進行github加速。

下載完后,你就可以用它生成我們需要的干凈的語音和帶噪音的語音。同時我們還控制了語音混合的程度,也就是信噪比(SNR).

在MS-SNSD/目錄下修改 noisyspeech_synthesizer.cfg 就可以配置需要生成的語音文件,推薦配置如下:

sampling_rate: 16000audioformat: *.wavaudio_length: 60silence_length: 0.0total_hours: 15snr_lower: 0snr_upper: 20total_snrlevels: 3

如果打算快速測試一下,可以把 total_hour 減少為1或者2小時。

修改完后,運行 noisyspeech_synthesizer.py 就可以生成我們需要的音頻WAV文件了。我們需要一對一的干凈的語音和帶噪音的語音,它們分別在MS-SNSD/CleanSpeech_training 和 MS-SNSD/NoisySpeech_training 內。

2. 生成訓練數據集

之前一步獲取到的是.wav文件,而我們訓練神經網絡使用的是 MFCC 和 gains。

現在我們可以運行例子提供的gen_dataset.py來計算MFCC和gains。它最終會生成一個dataset.npz文件。

在這個文件里面,你可以配置這些內容

需要MFCC的特征數(同時也會修改均衡器Equalizer的Banpass Filter的數量)。修改 num_filter = 20即可。通常數字在10到26。

這個腳本也會生成一個c工程使用的濾波器參數文件equalizer_coeff.h (generate_filter_header(...))。在C語音的均衡器中會使用這個頭文件。

另外,這個腳本還會生成兩個Demo音頻。一個叫_noisy_sample.wav 另一個叫 _filtered_sample.wav。前者為從訓練集里面選出的一個帶噪音的范例,后者為用gains和均衡器濾波后文件。基本上,這個文件代表了這個降噪方法的最好的水平。后文會有詳細的說明怎么生成這個gains。

3. 訓練模型

當dataset.npz生成后,我們就可以跑 main.py來訓練Keras模型了。訓練好的模型會保存在目錄下model.h5

因為我們的模型最終要放在單片機上跑,RNN 每次處理一個 timestamp,所以我們的模型設置為stateful=True 和 timestamps=1。這樣的設置對于訓練并不是很理想,因為反向傳播(BP)沒有辦法很好的在很小的batch上工作。我們的Batch盡量設置得很大。這里設置batchsize >= 1024。

同時,這一步會把我們之前的噪音范例_noisy_sample.wav ,使用RNN生成的gains來濾波filtered_sig = voice_denoise(...)(可以對比我們真實gains降噪的結果)。濾波后的文件保存為_nn_filtered_sample.wav。

在最后,調用NNoM的API generate_model(...) 生成NNoM模型文件 weights.h。

4. RNN 在 NNoM 上部署

本例提供了SConstruct, 所以你可以直接在目錄下運行 scons 來編譯。默認使用目錄下的main.c 編譯成PC可執行程序。支持32/64bit windows。理論上也支持linux

這個二進制文件可以直接對 .wav 文件降噪并生成一個新的 .wav文件,使用方法如下:

注意:僅僅支持16kHz 1CH的格式。(程序不解析WAV只復制文件頭)。

Win powershell: . nn-denoise [input_file] [output_file] 或者拖拽.wav 文件到編譯完成的*.exe上

Linux: 大家自己試試

比如,運行這個指令生成定點RNN濾波后的音頻:. nn-denoise _noisy_sample.wav _nn_fixedpoit_filtered_sample.wav

到此,目錄下一共有四個音頻,大家可以試聽一下。

_noisy_sample.wav --> 原始帶噪音文件_filtered_sample.wav --> 用真實gains降噪的文件(訓練的gains)_nn_filtered_sample.wav --> Keras浮點模型gains 降噪_nn_fixedpoit_filtered_sample.wav --> NNoM定點模型gains降噪

關于演示可以看文章頂部的視頻。

不過,大家可以先看個圖視覺上感受一下。Filtered by NNoM是我們單片機上的效果,對比Keras是模型原始輸出的效果。而Truth Gain是模型訓練輸入的參考,也就是最原始最好的效果。可以看到這個算法濾掉的不少的東西,具體是不是噪聲。。。再說。

如何用神經網絡進行語音降噪

以下是一大波細節講解

總的來說,我推薦大家看 gen_dataset.py 和 main.py里面的步驟,很多詳細的步驟都在注釋里面有相關的解釋。

關于訓練數據

x_train 里面包含了13或者20個(默認)MFCC,除此之外,還有前10個MFCC特征的第一和第二導數(derivative)。這些為常用的語音識別特征。所以一共有 33 到 40 個特征。

如何用神經網絡進行語音降噪

訓練數據的生成步驟

y_train 里面有兩組數據,一組是gains,另一個叫 VAD

Gains 與RNNoise方法相同,為 clean speech/noisy speech 在每一個band上的能量的開平方。是一組0-1的值,組大小為均衡器的帶通濾波器個數。

VAD 全稱叫 Voice Active Detection。為一個0-1的值,指示是否有語音。計算方法為檢測一個窗口內總能量的大小是否超過一個閾值。

如何用神經網絡進行語音降噪

語音能量和激活閾值

關于 Gains 和 VAD

在默認的模型里面,有兩個輸出,其中一個便是VAD。在main_arm.c (單片機版本的Demo)里面,這個VAD值控制了板子上的一個LED。如果VAD > 0.5 LED 會被點亮。

下圖為使用Keras的模型識別 VAD時刻 和 gains 的計算結果。

如何用神經網絡進行語音降噪

在語音中各個頻段的增益

關于均衡器

這里使用了20(默認)或者13個帶通濾波器(Filter Band)來抑制噪音所在的頻率。實際上你可以設置成任何值。不過我推薦 大于10且小于30。每一個獨立的帶通濾波器的-3dB點都與它附近的帶通濾波器的-3dB點相交。響頻曲線如下:

如何用神經網絡進行語音降噪

濾波器響應頻率范圍

音頻信號會平行地通過這些帶通濾波器,在最后把他們相加在一起。因為濾波器是交叉的,最終混合的信號幅度過大導致數值溢出,所以最終混合的信號會乘上一個0.6(并非數學上驗證的數值)再保存在int16 數組內。

關于RNN模型的結構

這里提供了兩個不同的RNN模型。一個是與RNNoise 類似的模型,各個RNN層之間包含很多的支線。這些支線會通過 concatenate 合并在一起。這個模型還會提供一個VAD輸出。整個模型一共約 120k的權重。比RNNoise稍高因為做了一些針對定點模型的改變。其實這個模型有點過于復雜了,我嘗試過減少模型參數,仍然可以很好的進行降噪。大佬們可以大膽地調整參數。如圖下圖所示。

如何用神經網絡進行語音降噪

另一個模型是一個簡單的多層GRU模型,這個模型不提供VAD輸出。非常震驚的是這個模型也能提供不錯的效果。

如果想嘗試這個簡單的模型,在main.py里面修改 history = train(...) 成 train_simple(...)。

Keras的RNN需要把 stateful=True 打開,這樣NNoM在每計算一個timestamps的時候才不會重置state。

MCU 例子

這里提供了一個 MCU 的文件main_arm.c。這個文件針對 STM32L476-Discovery 的麥克風做了移植,可以直接使用板載麥克風進行語音降噪。

例子通過一個綠色 LED(PE8)輸出VAD檢測的結果,有人說話時就會亮。

除了單片機相關的代碼,功能上MCU代碼main_arm.c與PC代碼main.c完全一致, 本例雖然做了音頻降噪,但是并沒有針對音頻輸出寫驅動,所以降噪輸出是被直接拋棄了。大家可以自己寫保存或者回放的代碼。

如果你使用的是 ARM-Cortex M系列的MCU,做以下設置可以提升性能 (參考下面性能測試章節)。

打開 NNoM 的 CMSIS-NN 后端,參考 Porting and Optimization Guide (https://github.com/majianjia/nnom/blob/master/docs/Porting_and_Optimisation_Guide.md)

在 mfcc.h里面,打開 PLATFORM_ARM 宏定義來使用ARM_FFT。

MCU 上的性能測試

傳統的 RNNoise 不止包含了浮點模型,還包括了其他計算(比如Pitch Filtering),導致總計算量在40MFLOPS左右。即是換成定點計算,一般的單片機也會很吃力。

本例中,浮點FFT,定點RNN模型,浮點均衡器(濾波器),并去掉了Pitch Filtering(額其實是因為我不知道怎么用)。我對這里使用的幾個運算量大的模塊進行了測試,分別是MFCC部分(包含FFT),神經網絡部分,還有均衡器。

測試環境為

Board: STM32L476-Discovery

MCU: STM32L476, 超頻到 140MHz Cortex-M4F

音頻輸入: 板載PDM麥克風

音頻輸出: 無

IDE: Keil MDK

測試條件:

神經網絡后端: CMSIS-NN 或 Local C (本地后端)

FFT 庫(512點): arm_rfft_fast_f32 或 純FFT arduino_fft

優化等級: -O0/-O1 或 -O2

均衡器濾波器數目: 13 band 或者 20 band

需要注意的是,這里使用的音頻格式為 16kHz 1CH,所以我們每次更新(FFT窗口:512,overlapping=50%)只有 256/16000 = 16ms 的時間來完成所有的計算。

13 Band Equalizer

如何用神經網絡進行語音降噪

可以看到,在完全優化的情況下,最短用時僅僅6.18ms 相當于38% 的CPU占用。在不適用ARM加速庫的情況下,也完全在16ms內。因為所有的計算量是固定的,測試下來同一項目內時間沒有太多的波動。

20 Band Equalizer

如何用神經網絡進行語音降噪

20個 band的情況下,在開啟優化后也可以實現實時的語音降噪。

模型編譯log

如何用神經網絡進行語音降噪

單片機內神經網絡模型載入的log

如何用神經網絡進行語音降噪

單片機內神經網絡模型性能

原文標題:【技術分享】STM32實現單麥克風實時神經網絡降噪

文章出處:【微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6060

    文章

    44833

    瀏覽量

    645153
  • 神經網絡
    +關注

    關注

    42

    文章

    4798

    瀏覽量

    102449
  • 降噪
    +關注

    關注

    4

    文章

    432

    瀏覽量

    31668

原文標題:【技術分享】STM32實現單麥克風實時神經網絡降噪

文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    助聽器降噪神經網絡模型

    抑制任務是語音增強領域的一個重要學科, 隨著深度神經網絡的興起,提出了幾種基于深度模型的音頻處理新方法[1,2,3,4]。然而,這些通常是為離線處理而開發的,不需要考慮實時性。當使用神經網絡
    發表于 05-11 17:15

    粒子群優化模糊神經網絡語音識別中的應用

    一定的早熟收斂問題,引入一種自適應動態改變慣性因子的PSO算法,使算法具有較強的全局搜索能力.將此算法訓練的模糊神經網絡應用于語音識別中,結果表明,與BP算法相比,粒子群優化的模糊神經網絡具有較高
    發表于 05-06 09:05

    用matlab編程進行BP神經網絡預測時如何確定最合適的,BP模型

    請問用matlab編程進行BP神經網絡預測時,訓練結果很多都是合適的,但如何確定最合適的?且如何用最合適的BP模型進行外推預測?
    發表于 02-08 14:19

    關于BP神經網絡預測模型的確定!!

    請問用matlab編程進行BP神經網絡預測時,訓練結果很多都是合適的,但如何確定最合適的?且如何用最合適的BP模型進行外推預測?
    發表于 02-08 14:23

    【PYNQ-Z2試用體驗】神經網絡基礎知識

    學習和認知科學領域,是一種模仿生物神經網絡(動物的中樞神經系統,特別是大腦)的結構和功能的數學模型或計算模型,用于對函數進行估計或近似。神經網絡由大量的人工
    發表于 03-03 22:10

    卷積神經網絡如何使用

    卷積神經網絡(CNN)究竟是什么,鑒于神經網絡在工程上經歷了曲折的歷史,您為什么還會在意它呢? 對于這些非常中肯的問題,我們似乎可以給出相對簡明的答案。
    發表于 07-17 07:21

    【案例分享】ART神經網絡與SOM神經網絡

    今天學習了兩個神經網絡,分別是自適應諧振(ART)神經網絡與自組織映射(SOM)神經網絡。整體感覺不是很難,只不過一些最基礎的概念容易理解不清。首先ART神經網絡是競爭學習的一個代表,
    發表于 07-21 04:30

    BP神經網絡的數據分類——語音特征信號分類有哪些

    第1章 BP神經網絡的數據分類——語音特征信號的分類
    發表于 04-28 08:05

    何用卷積神經網絡方法去解決機器監督學習下面的分類問題?

    人工智能下面有哪些機器學習分支?如何用卷積神經網絡(CNN)方法去解決機器學習監督學習下面的分類問題?
    發表于 06-16 08:09

    如何構建神經網絡

    原文鏈接:http://tecdat.cn/?p=5725 神經網絡是一種基于現有數據創建預測的計算系統。如何構建神經網絡神經網絡包括:輸入層:根據現有數據獲取輸入的層隱藏層:使用反向傳播優化輸入變量權重的層,以提高模型的預測
    發表于 07-12 08:02

    如何使用stm32cube.ai部署神經網絡

    何用stm32cube.ai簡化人工神經網絡映射?如何使用stm32cube.ai部署神經網絡
    發表于 10-11 08:05

    神經網絡移植到STM32的方法

    神經網絡移植到STM32最近在做的一個項目需要用到網絡進行擬合,并且將擬合得到的結果用作控制,就在想能不能直接在單片機上做神經網絡計算,這樣就可以實時計算,不依賴于上位機。所以要解決
    發表于 01-11 06:20

    卷積神經網絡的介紹 什么是卷積神經網絡算法

    卷積神經網絡的介紹 什么是卷積神經網絡算法 卷積神經網絡涉及的關鍵技術 卷積神經網絡(Convolutional Neural Network,CNN)是一種用于圖像分類、物體識別、
    的頭像 發表于 08-21 16:49 ?2192次閱讀

    如何使用神經網絡進行建模和預測

    輸入信號,對其進行加權求和,然后通過激活函數進行非線性轉換,生成輸出信號。通過這種方式,神經網絡可以學習輸入數據的復雜模式和關系。 神經網絡的類型
    的頭像 發表于 07-03 10:23 ?1093次閱讀

    遞歸神經網絡是循環神經網絡

    。 遞歸神經網絡的概念 遞歸神經網絡是一種具有短期記憶功能的神經網絡,它能夠處理序列數據,如時間序列、文本、語音等。與傳統的前饋神經網絡不同
    的頭像 發表于 07-04 14:54 ?1296次閱讀
    主站蜘蛛池模板: 高清国产美女在线观看 | 色多多免费在线观看 | 在线观看黄色的网站 | 中文字幕一区在线观看 | 国产亚洲欧洲人人网 | 国产精品天天干 | 四虎国产精品免费观看 | 国产免费爽爽视频免费可以看 | 女人张开腿给男人桶爽免费 | 天天摸夜夜操 | 天天干夜夜爽 | 国产呦在线观看视频 | 国模私拍在线观看 | 国产美女主播在线 | cao草棚视频网址成人 | a一级黄 | 100000免费啪啪18免进 | 日韩免费毛片全部不收费 | 午夜男人影院 | 精品黄色片 | 日本免费人成在线网站 | 六月激情网 | 老师叫我揉她内裤越快越好 | 91aaa免费观看在线观看资源 | 成人夜色视频网站在线观看 | 亚洲一区二区三区四区在线观看 | 国产h视频在线 | 黑人黑粗硬视频 | 天天操天天添 | 国产三级日本三级美三级 | 夜夜做日日做夜夜爽 | 老司机精品免费视频 | 羞羞影院男女午夜爽爽影视 | 亚洲国内精品久久 | 狠狠色噜噜狠狠狠狠888奇米 | 在线观看视频你懂得 | 老湿成人影院 | 亚洲网站色 | 免费观看在线视频 | 亚洲第一黄色网址 | 亚洲精品视频在线 |