Arm 公司的首席软件工程师 Sandeep Mistry 为我们展示了一种全新的巧妙方法: 在 Raspberry Pi Pico 2 上如何将音频噪音抑制应用于麦克风输入。
机器学习(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 毫秒的 48 kHz 音频源中提取出 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 目标库。