问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Raspberry Pi Pico 2 实现:实时机器学习音频噪音抑制功能

创作时间:
作者:
@小白创作中心

Raspberry Pi Pico 2 实现:实时机器学习音频噪音抑制功能

引用
CSDN
1.
https://blog.csdn.net/EDATEC/article/details/141166274

Arm公司的首席软件工程师Sandeep Mistry展示了一种在Raspberry Pi Pico 2上实现音频噪音抑制的新方法。通过将基于机器学习的噪音抑制算法部署到Pico 2的RP2350微控制器上,开发者可以实现实时音频处理功能。本文将详细介绍这一过程的技术细节和具体实现步骤。

机器学习(ML)技术彻底改变了软件应用程序的开发方式。开发者现在可以整理包含大量输入和输出示例的数据集,用于训练ML模型。在训练过程中,ML模型从输入和输出中学习模式。训练好的模型会被部署到设备上,这些设备会对来自真实世界的输入进行推理,并使用ML模型的预测输出来执行一个或多个操作。

可以部署到基于微控制器的设备(如新Pico 2板上使用的Arm Cortex-M33微控制器RP2350)上的小型ML模型只需要几千字节的内存。将ML模型部署到微控制器上可以降低系统的延迟,因为数据是在靠近输入数据源的设备上处理的。

这篇博客将深入探讨如何将基于现有ML的音频噪音抑制算法部署到新Pico 2板上使用的RP2350微控制器。RP2350的双核Arm Cortex-M33 CPU使应用程序开发人员能够部署更多计算密集型应用程序,这些应用的性能超过了原始Raspberry Pi Pico板中使用的RP2040微控制器。

然后,该算法将被集成到我为原始Pico板开发的USB麦克风应用程序中。最初的应用程序从数字脉冲密度调制(PDM)麦克风捕获数据,并将其处理成与USB音频标准兼容的格式,通过USB传输。


Hackster.io上使用Raspberry Pi Pico指南创建USB麦克风的屏幕截图

该算法背景介绍

2018年,Jean-Marc Valin发表了一篇关于实时全带语音增强的混合DSP/深度学习方法的论文。本文介绍了如何使用基于递归神经网络(RNN)的ML模型来抑制音频源中的噪声。如果您有兴趣了解有关该算法的更多信息,请阅读Jean-Marc的RNNoise:学习噪声抑制页面。该页面涵盖了算法的详细信息,并包括交互式示例。该项目的源代码可在RNNoise Git存储库中找到。

RNNoise的屏幕截图:学习噪声抑制页面在高层次上,该算法通过将信号分成22个频段,从10毫秒的48kHz音频源中提取出42个特征。


屏幕截图:RNNoise的“定义问题”部分:学习噪音抑制页面

然后,42个特征被用作神经网络的输入,神经网络会计算出22个频段的增益。计算出的增益可应用于原始音频信号,生成去噪版本。神经网络还会输出"语音活动检测"输出,该输出显示输入信号中存在语音的预测置信度,其值介于0和1之间。

屏幕截图:RNNoise的“深度架构”部分:学习噪声抑制页面

移植和基准测试算法

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文件创建了一个新的CMake目标库。

对denoise.c稍作修改,以便在biquad函数中使用单精度浮点计算,并使用log10f(...)和sqrtf(...)代替log10(...)和sqrt(...)函数。

然后,可以将该库集成到一个基准测试应用程序中,调用rrnoise_create(...)函数初始化模型,然后再测量rnnoise_process_frame(...)函数处理480个样本所需的时间。

要将此基准测试应用程序部署到Raspberry Pi Pico 1或Pico 2板上,首先要遵循"Raspberry Pi Pico入门"C/C++ SDK指南的第2节和第9节,然后运行以下命令来构建.uf2应用程序并部署到板上:

git clone --recurse-submodules \   
https://github.com/ArmDeveloperEcosystem/rnnoise-examples-for-pico-2.git  
cd rnnoise-examples-for-pico-2  
mkdir build  
**cmake** ... -DPICO_BOARD=pico2  
make rnnoise-benchmark  

编译完成后,可以通过按住电路板上的白色BOOTSEL按钮将examples/benchmark/rnnoise-benchmark.uf2文件部署到电路板上,同时将USB电缆插入计算机并将.uf2文件复制到Pico的USB磁盘上。

以下是Pico 1和Pico 2板上的基准测试结果:

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倍速度。

针对16kHz音频修改算法

电路板要以48kHz的采样率处理480个音频样本,就必须在0.01秒(480 / 48,000)或10毫秒内完成rnnoise_process_frame(...)函数。Pico 2的基准结果需要22.1毫秒,对于48kHz音频来说还不够快,但对于处理采样率为16kHz的音频来说已经足够快了,要求在30毫秒内完成音频处理。denoise.c中的eband5ms变量可以轻松修改,以调整处理16kHz数据的算法。该变量控制22个频段的起始范围。调整的方法是将原始值乘以3(因为16kHz音频采集样本的时间是48kHz音频的3倍),并将最大起始位置设为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};  

以及用于16kHz音频的修改值:

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连续循环接收480个16位音频样本,使用去噪算法对其进行处理,然后通过USB传输经过去噪处理的样本。在个人电脑上,可以使用serial_denoise.py Python脚本从文件中发送16位、16千赫的原始音频,并将去噪音频保存到文件中。

这些原始值可导入Audacity等应用程序,用于可视化和回放。下面是一个例子:第一轨是原始音频(噪音),下面的第二轨是在Pico 2上去噪后的版本。

在Audacity应用程序的两个音轨的屏幕截图。

顶部:原始音频。底部:音频的去音版本。

我选择了一个噪声明显降低的区域。到目前为止一切顺利;该算法已通过验证,可在电路板上通过USB从个人电脑串流16kHz音源!

将算法集成到USB麦克风应用程序中

最初为Pico 1开发的USB麦克风应用程序现在可以通过板载去噪功能得到增强。

硬件

此应用程序需要以下硬件:

  • Raspberry Pi Pico 2主板
  • Adafruit PDM MEMS麦克风接口
  • 半尺寸试验板
  • 跳线
  • 滑动开关(可选)
  • 触觉按钮(可选)

可选的滑动开关将用作切换开关,以便在运行时禁用或启用噪声抑制处理,而可选的轻触开关则为重置电路板提供了方便。

连接硬件如下:


项目接线图

Raspberry Pi Pico 2 PDM MEMS 麦克风接口 滑动开关(可选) 触觉按钮(可选)
3V3(输出) 3V
GND GNDSEL 中间针 底部针
RUN 顶部针
GPIO21 DAT
GPIO22 CLK
GPIO17 底部针

接线完成后,你的试验板将看起来像这样:

软件

应用程序将使用microphone-library-for-pico从采样率为16kHz的PDM麦克风采集480个16位采样。该库将RP2350的可编程I/O (PIO) 和直接内存访问 (DMA) 功能与OpenPDM2PCM库相结合,将原始PDM数据转换为脉冲编码调制 (PCM) 格式。16位PCM数据被转换为32位浮点,并使用RNNoise算法进行去噪。然后,将去噪帧转换为16位整数,并使用TinyUSB库通过USB发送。USB传输每1毫秒发送16个去噪采样。

带去噪功能的USB麦克风框图

RP2350上两个Cortex-M33内核都用于此应用。内核1从PDM麦克风捕获原始数据,对其进行过滤和去噪处理。内核0利用TinyUSB库和RP2350的USB接口通过USB传输去噪数据。

RNNoise模型的语音活动检测输出将通过脉宽调制 (PWM) 显示在Pico 2的内置LED上。当VAD输出接近1.0时,LED将变亮;当接近0.0时,LED将熄灭。

应用程序的源代码可在rnnoise-examples-for-pico-2 GitHub代码库的examples/usb_pdm_microphone文件夹中找到。该应用程序的编译方式与基准测试程序类似,使用以下make命令:

make rnnoise_usb_pdm_microphone

编译完成后,按住BOOTSEL按钮并重置电路板后,即可将examples/usb_pdm_microphone/rnnoise_usb_pdm_microphone.uf2文件复制到Pico 2的USB磁盘中。

测试

应用程序加载到电路板后,可以使用Audacity测试音频录制,方法是首先单击音频设置按钮 -> 重新扫描音频设备,然后单击音频设置按钮 -> 录音设备 -> MicNode,再单击录音按钮。

在Audacity中选择MicNode作为记录设备

如果连接了可选的滑动开关,则可以通过将开关滑向Pico 2的USB接口,来禁用噪声抑制功能,然后通过将开关滑离USB接口来重新启用噪声抑制功能。

录音轨道截图

上轨:禁用去噪功能;下轨:启用去噪功能

下一步工作

本博客演示了如何利用Raspberry Pi Pico 2的Arm Cortex-M33 CPU的额外计算能力,使用ML模型对从PDM麦克风捕获的16kHz的16位实时音频数据进行去噪处理。去噪算法利用了Cortex-M33的浮点运算单元 (FPU),运行速度比原始Pico板上的Cortex-M0+快16.87倍。该应用利用一个CPU捕捉、过滤和去噪数据,另一个CPU通过USB将音频数据传输到PC。

下一步,您可以修改应用程序,在通过USB向个人电脑发送降噪数据之前添加自动增益控制 (AGC)。另外,去噪数据也可以直接在电路板上使用,作为另一种数字信号处理 (DSP) 算法或ML模型的输入,在核心0上运行,而不是USB栈。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号