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

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

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

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

屏幕截圖:RNNoise的“深度架構(gòu)”部分:學(xué)習(xí)噪聲抑制頁(yè)面
移植和基準(zhǔn)測(cè)試算法
RNNoise 項(xiàng)目的原始 C 代碼可以集成到使用 Raspberry Pi Pico SDK 的 CMake 項(xiàng)目中。移植的所有源代碼都可以在 GitHub 上的 rnnoise-examples-for-pico-2 代碼庫(kù)中找到。我們使用 RNNoise 項(xiàng)目 v0.1.1 中的 celt_lpc.c、denoise.c、kiss_fft.c、pitch.c、rnn.c 和 rnn_data.c 文件創(chuàng)建了一個(gè)新的 CMake 目標(biāo)庫(kù)。對(duì) denoise.c 稍作修改,以便在 biquad 函數(shù)中使用單精度浮點(diǎn)計(jì)算,并使用 log10f(...) 和 sqrtf(...) 代替 log10(...) 和 sqrt(...) 函數(shù)。然后,可以將該庫(kù)集成到一個(gè)基準(zhǔn)測(cè)試應(yīng)用程序中,調(diào)用 rrnoise_create(...)函數(shù)初始化模型,然后再測(cè)量 rnnoise_process_frame(...) 函數(shù)處理 480 個(gè)樣本所需的時(shí)間。要將此基準(zhǔn)測(cè)試應(yīng)用程序部署到 Raspberry Pi Pico 1 或 Pico 2 板上,首先要遵循 "Raspberry Pi Pico 入門 "C/C++ SDK 指南的第 2 節(jié)和第 9 節(jié),然后運(yùn)行以下命令來(lái)構(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
編譯完成后,可以通過(guò)按住電路板上的白色 BOOTSEL 按鈕將 examples/benchmark/rnnoise-benchmark.uf2 文件部署到電路板上,同時(shí)將 USB 電纜插入計(jì)算機(jī)并將 .uf2 文件復(fù)制到 Pico 的 USB 磁盤上。
以下是 Pico 1 和 Pico 2 板上的基準(zhǔn)測(cè)試結(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倍速度。
針對(duì) 16 kHz 音頻修改算法
電路板要以 48 kHz 的采樣率處理 480 個(gè)音頻樣本,就必須在 0.01 秒(480 / 48,000)或 10 毫秒內(nèi)完成 rnnoise_process_frame(...)函數(shù)。Pico 2 的基準(zhǔn)結(jié)果需要 22.1 毫秒,對(duì)于 48 kHz 音頻來(lái)說(shuō)還不夠快,但對(duì)于處理采樣率為 16 kHz 的音頻來(lái)說(shuō)已經(jīng)足夠快了,要求在 30 毫秒內(nèi)完成音頻處理。denoise.c 中的 eband5ms 變量可以輕松修改,以調(diào)整處理 16 kHz 數(shù)據(jù)的算法。該變量控制 22 個(gè)頻段的起始范圍。調(diào)整的方法是將原始值乘以 3(因?yàn)?16 kHz 音頻采集樣本的時(shí)間是 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
};串行示例可編譯并部署到電路板上,以測(cè)試修改后的算法。該示例通過(guò) USB 連續(xù)循環(huán)接收 480 個(gè) 16 位音頻樣本,使用去噪算法對(duì)其進(jìn)行處理,然后通過(guò) USB 傳輸經(jīng)過(guò)去噪處理的樣本。在個(gè)人電腦上,可以使用 serial_denoise.py Python 腳本從文件中發(fā)送 16 位、16 千赫的原始音頻,并將去噪音頻保存到文件中。這些原始值可導(dǎo)入 Audacity 等應(yīng)用程序,用于可視化和回放。下面是一個(gè)例子:第一軌是原始音頻(噪音),下面的第二軌是在 Pico 2 上去噪后的版本。

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

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

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

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

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

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

開(kāi)源項(xiàng)目!基于樹(shù)莓派制作一個(gè)番茄鐘機(jī)器人!
使用適用于 Raspberry Pi Pico 的 Kitronik 迷你控制器控制您的 XRP 機(jī)器人

Raspberry Pi樹(shù)莓派新手指南
如何在低功耗MCU上實(shí)現(xiàn)人工智能和機(jī)器學(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)測(cè)試

AI深度噪音抑制技術(shù)

e絡(luò)盟開(kāi)售Raspberry Pi新款產(chǎn)品
使用串行連接通過(guò) Raspberry Pi 增強(qiáng)您的 XRP 項(xiàng)目

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

評(píng)論