Arm 公司的首席軟件工程師 Sandeep Mistry 為我們展示了一種全新的巧妙方法:在 Raspberry Pi Pico 2 上如何將音頻噪音抑制應(yīng)用于麥克風(fēng)輸入。機器學(xué)習(xí)(ML)技術(shù)徹底改變了許多軟件應(yīng)用程序的開發(fā)方式。應(yīng)用程序開發(fā)人員現(xiàn)在可以為所需系統(tǒng)整理包含大量輸入和輸出示例的數(shù)據(jù)集,然后使用這些數(shù)據(jù)集來訓(xùn)練 ML 模型。在訓(xùn)練過程中,ML 模型從輸入和輸出中學(xué)習(xí)模式。訓(xùn)練好的模型會被部署到設(shè)備上,這些設(shè)備會對來自真實世界的輸入進行推理,并使用 ML 模型的預(yù)測輸出來執(zhí)行一個或多個操作。可以部署到基于微控制器的設(shè)備(如新 Pico 2 板上使用的 Arm Cortex-M33 微控制器 RP2350)上的小型 ML 模型只需要幾千字節(jié)的內(nèi)存。將 ML 模型部署到微控制器上可以降低系統(tǒng)的延遲,因為數(shù)據(jù)是在靠近輸入數(shù)據(jù)源的設(shè)備上處理的。這篇博客將深入探討如何將基于現(xiàn)有 ML 的音頻噪音抑制算法部署到新 Pico 2 板上使用的 RP2350 微控制器。RP2350 的雙核 Arm Cortex-M33 CPU 使應(yīng)用程序開發(fā)人員能夠部署更多計算密集型應(yīng)用程序,這些應(yīng)用的性能超過了原始 Raspberry Pi Pico 板中使用的 RP2040 微控制器。然后,該算法將被集成到我為原始 Pico 板開發(fā)的 USB 麥克風(fēng)應(yīng)用程序中。最初的應(yīng)用程序從數(shù)字脈沖密度調(diào)制(PDM)麥克風(fēng)捕獲數(shù)據(jù),并將其處理成與 USB 音頻標(biāo)準(zhǔn)兼容的格式,通過 USB 傳輸。

Hackster.io上使用Raspberry Pi Pico指南創(chuàng)建USB麥克風(fēng)的屏幕截圖
該算法背景介紹
2018年,Jean-Marc Valin 發(fā)表了一篇關(guān)于實時全帶語音增強的混合DSP/深度學(xué)習(xí)方法的論文。本文介紹了如何使用基于遞歸神經(jīng)網(wǎng)絡(luò)(RNN)的ML模型來抑制音頻源中的噪聲。如果您有興趣了解有關(guān)該算法的更多信息,請閱讀Jean-Marc的RNNoise:學(xué)習(xí)噪聲抑制頁面。該頁面涵蓋了算法的詳細信息,并包括交互式示例。該項目的源代碼可在RNNoise Git存儲庫中找到。

RNNoise的屏幕截圖:學(xué)習(xí)噪聲抑制頁面在高層次上,該算法通過將信號分成 22 個頻段,從 10 毫秒的 48 kHz 音頻源中提取出 42 個特征。

屏幕截圖:RNNoise的“定義問題”部分:學(xué)習(xí)噪音抑制頁面然后,42 個特征被用作神經(jīng)網(wǎng)絡(luò)的輸入,神經(jīng)網(wǎng)絡(luò)會計算出 22 個頻段的增益。計算出的增益可應(yīng)用于原始音頻信號,生成去噪版本。神經(jīng)網(wǎng)絡(luò)還會輸出 "語音活動檢測 "輸出,該輸出顯示輸入信號中存在語音的預(yù)測置信度,其值介于 0 和 1 之間。

屏幕截圖:RNNoise的“深度架構(gòu)”部分:學(xué)習(xí)噪聲抑制頁面
移植和基準(zhǔn)測試算法
RNNoise 項目的原始 C 代碼可以集成到使用 Raspberry Pi Pico SDK 的 CMake 項目中。移植的所有源代碼都可以在 GitHub 上的 rnnoise-examples-for-pico-2 代碼庫中找到。我們使用 RNNoise 項目 v0.1.1 中的 celt_lpc.c、denoise.c、kiss_fft.c、pitch.c、rnn.c 和 rnn_data.c 文件創(chuàng)建了一個新的 CMake 目標(biāo)庫。對 denoise.c 稍作修改,以便在 biquad 函數(shù)中使用單精度浮點計算,并使用 log10f(...) 和 sqrtf(...) 代替 log10(...) 和 sqrt(...) 函數(shù)。然后,可以將該庫集成到一個基準(zhǔn)測試應(yīng)用程序中,調(diào)用 rrnoise_create(...)函數(shù)初始化模型,然后再測量 rnnoise_process_frame(...) 函數(shù)處理 480 個樣本所需的時間。要將此基準(zhǔn)測試應(yīng)用程序部署到 Raspberry Pi Pico 1 或 Pico 2 板上,首先要遵循 "Raspberry Pi Pico 入門 "C/C++ SDK 指南的第 2 節(jié)和第 9 節(jié),然后運行以下命令來構(gòu)建 .uf2 應(yīng)用程序并部署到板上:
git clone --recurse-submodules \ https://github.com/ArmDeveloperEcosystem/rnnoise-examples-for-pico-2.gitcd rnnoise-examples-for-pico-2mkdir buildcmake ... -DPICO_BOARD=pico2make rnnoise-benchmark
編譯完成后,可以通過按住電路板上的白色 BOOTSEL 按鈕將 examples/benchmark/rnnoise-benchmark.uf2 文件部署到電路板上,同時將 USB 電纜插入計算機并將 .uf2 文件復(fù)制到 Pico 的 USB 磁盤上。
以下是 Pico 1 和 Pico 2 板上的基準(zhǔn)測試結(jié)果:
Pico (RP2040) Cortex-M0+ @ 125 MHz | Pico 2 (RP2350) Cortex-M33 @ 150 MHz | |
rnnnoise_process_frame(...) | 372,644微秒 | 22,093微秒 |
原始的 Pico 1大約需要372.6毫秒,而新的 Pico 2 需要22.1毫秒:這是電路板之間的16.87倍速度。
針對 16 kHz 音頻修改算法
電路板要以 48 kHz 的采樣率處理 480 個音頻樣本,就必須在 0.01 秒(480 / 48,000)或 10 毫秒內(nèi)完成 rnnoise_process_frame(...)函數(shù)。Pico 2 的基準(zhǔn)結(jié)果需要 22.1 毫秒,對于 48 kHz 音頻來說還不夠快,但對于處理采樣率為 16 kHz 的音頻來說已經(jīng)足夠快了,要求在 30 毫秒內(nèi)完成音頻處理。denoise.c 中的 eband5ms 變量可以輕松修改,以調(diào)整處理 16 kHz 數(shù)據(jù)的算法。該變量控制 22 個頻段的起始范圍。調(diào)整的方法是將原始值乘以 3(因為 16 kHz 音頻采集樣本的時間是 48 kHz 音頻的 3 倍),并將最大起始位置設(shè)為 120。以下是原始值:static const opus_int16 eband5ms[] = {
/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 20k*/
0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100
};以及用于16 kHz音頻的修改值:static const opus_int16 eband5ms[] = {
/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 20k*/
0, 3, 6, 9, 12, 15, 18, 21, 24, 60, 36, 42, 48, 60, 72, 84, 102, 120, 120, 120, 120, 120
};串行示例可編譯并部署到電路板上,以測試修改后的算法。該示例通過 USB 連續(xù)循環(huán)接收 480 個 16 位音頻樣本,使用去噪算法對其進行處理,然后通過 USB 傳輸經(jīng)過去噪處理的樣本。在個人電腦上,可以使用 serial_denoise.py Python 腳本從文件中發(fā)送 16 位、16 千赫的原始音頻,并將去噪音頻保存到文件中。這些原始值可導(dǎo)入 Audacity 等應(yīng)用程序,用于可視化和回放。下面是一個例子:第一軌是原始音頻(噪音),下面的第二軌是在 Pico 2 上去噪后的版本。

在Audacity應(yīng)用程序的兩個音軌的屏幕截圖。
頂部:原始音頻。底部:音頻的去音版本。
我選擇了一個噪聲明顯降低的區(qū)域。到目前為止一切順利;該算法已通過驗證,可在電路板上通過 USB 從個人電腦串流 16 kHz 音源!
將算法集成到USB麥克風(fēng)應(yīng)用程序中最初為 Pico 1 開發(fā)的 USB 麥克風(fēng)應(yīng)用程序現(xiàn)在可以通過板載去噪功能得到增強。
硬件
此應(yīng)用程序需要以下硬件:
可選的滑動開關(guān)將用作切換開關(guān),以便在運行時禁用或啟用噪聲抑制處理,而可選的輕觸開關(guān)則為重置電路板提供了方便。連接硬件如下:

項目接線圖
Raspberry Pi Pico 2 | PDM MEMS 麥克風(fēng)接口 | 滑動開關(guān)(可選) | 觸覺按鈕(可選) |
3V3(輸出) | 3V | ||
GND | GNDSEL | 中間針 | 底部針 |
RUN | 頂部針 | ||
GPIO21 | DAT | ||
GPIO22 | CLK | ||
GPIO17 | 底部針 |
接線完成后,你的試驗板將看起來像這樣:

軟件
應(yīng)用程序?qū)⑹褂?microphone-library-for-pico 從采樣率為 16 kHz 的 PDM 麥克風(fēng)采集 480 個 16 位采樣。該庫將 RP2350 的可編程 I/O (PIO) 和直接內(nèi)存訪問 (DMA) 功能與 OpenPDM2PCM 庫相結(jié)合,將原始 PDM 數(shù)據(jù)轉(zhuǎn)換為脈沖編碼調(diào)制 (PCM) 格式。16 位 PCM 數(shù)據(jù)被轉(zhuǎn)換為 32 位浮點,并使用 RNNoise 算法進行去噪。然后,將去噪幀轉(zhuǎn)換為 16 位整數(shù),并使用 TinyUSB 庫通過 USB 發(fā)送。USB 傳輸每 1 毫秒發(fā)送 16 個去噪采樣。

帶去噪功能的 USB 麥克風(fēng)框圖
RP2350 上兩個 Cortex-M33 內(nèi)核都用于此應(yīng)用。內(nèi)核 1 從 PDM 麥克風(fēng)捕獲原始數(shù)據(jù),對其進行過濾和去噪處理。內(nèi)核 0 利用 TinyUSB 庫和 RP2350 的 USB 接口通過 USB 傳輸去噪數(shù)據(jù)。
RNNoise 模型的語音活動檢測輸出將通過脈寬調(diào)制 (PWM) 顯示在 Pico 2 的內(nèi)置 LED 上。當(dāng) VAD 輸出接近 1.0 時,LED 將變亮;當(dāng)接近 0.0 時,LED 將熄滅。

記錄 Pico 2 電路板使用 RNNoise VAD 輸出通過 PWM 控制內(nèi)置 LED 亮度的情況應(yīng)用程序的源代碼可在 rnnoise-examples-for-pico-2 GitHub 代碼庫的 examples/usb_pdm_microphone 文件夾中找到。該應(yīng)用程序的編譯方式與基準(zhǔn)測試程序類似,使用以下 make 命令:make rnnoise_usb_pdm_microphone編譯完成后,按住 BOOTSEL 按鈕并重置電路板后,即可將 examples/usb_pdm_microphone/rnnoise_usb_pdm_microphone.uf2 文件復(fù)制到 Pico 2 的 USB 磁盤中。
測試
應(yīng)用程序加載到電路板后,可以使用 Audacity 測試音頻錄制,方法是首先單擊音頻設(shè)置按鈕 -> 重新掃描音頻設(shè)備,然后單擊音頻設(shè)置按鈕 -> 錄音設(shè)備 -> MicNode,再單擊錄音按鈕。

在Audacity中選擇MicNode作為記錄設(shè)備
如果連接了可選的滑動開關(guān),則可以通過將開關(guān)滑向 Pico 2 的 USB 接口,來禁用噪聲抑制功能,然后通過將開關(guān)滑離 USB 接口來重新啟用噪聲抑制功能。
下面錄制的演示視頻將 Pico 2 用作 USB 麥克風(fēng),首先關(guān)閉噪聲抑制功能,然后啟用噪聲抑制功能后使用相同的輸入。請觀看并聆聽噪聲抑制算法的結(jié)果!
禁用去噪后的語音和風(fēng)噪錄音
已啟用去噪功能的語音和風(fēng)噪錄音
錄音軌道截圖。
上軌:禁用去噪功能;下軌:啟用去噪功能
下一步工作
本博客演示了如何利用 Raspberry Pi Pico 2 的 Arm Cortex-M33 CPU 的額外計算能力,使用 ML 模型對從 PDM 麥克風(fēng)捕獲的 16 kHz 的 16 位實時音頻數(shù)據(jù)進行去噪處理。去噪算法利用了 Cortex-M33 的浮點運算單元 (FPU),運行速度比原始 Pico 板上的 Cortex-M0+ 快 16.87 倍。該應(yīng)用利用一個 CPU 捕捉、過濾和去噪數(shù)據(jù),另一個 CPU 通過 USB 將音頻數(shù)據(jù)傳輸?shù)?PC。下一步,您可以修改應(yīng)用程序,在通過 USB 向個人電腦發(fā)送降噪數(shù)據(jù)之前添加自動增益控制 (AGC)。另外,去噪數(shù)據(jù)也可以直接在電路板上使用,作為另一種數(shù)字信號處理 (DSP) 算法或 ML 模型的輸入,在核心 0 上運行,而不是 USB 棧。
-
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8466瀏覽量
133606 -
Raspberry Pi
+關(guān)注
關(guān)注
2文章
613瀏覽量
22543
發(fā)布評論請先 登錄
相關(guān)推薦
基于Raspberry Pi 5的情感機器人設(shè)計

開源項目!基于樹莓派制作一個番茄鐘機器人!
使用適用于 Raspberry Pi Pico 的 Kitronik 迷你控制器控制您的 XRP 機器人

如何在低功耗MCU上實現(xiàn)人工智能和機器學(xué)習(xí)
Banana Pi BPI-CanMV-K230D-Zero :AIoT 應(yīng)用的 Kendryte K230D RISC-V
Raspberry Pi Pico 2 W 發(fā)布

Raspberry Pi Pico 2

Banana Pi M5 與 Raspberry Pi 4 – 基準(zhǔn)測試

e絡(luò)盟開售Raspberry Pi新款產(chǎn)品
使用串行連接通過 Raspberry Pi 增強您的 XRP 項目

e絡(luò)盟發(fā)售功能強大的入門級 Raspberry Pi 5 2GB

評論