0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

上海晶珩电子科技有限公司 2025-03-25 09:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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 传输。

07c133f2-091b-11f0-9434-92fbcf53809c.png

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

该算法背景介绍

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

07f158d4-091b-11f0-9434-92fbcf53809c.png

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

08266d30-091b-11f0-9434-92fbcf53809c.png

屏幕截图:RNNoise的“定义问题”部分:学习噪音抑制页面然后,42 个特征被用作神经网络的输入,神经网络会计算出 22 个频段的增益。计算出的增益可应用于原始音频信号,生成去噪版本。神经网络还会输出 "语音活动检测 "输出,该输出显示输入信号中存在语音的预测置信度,其值介于 0 和 1 之间。

08550082-091b-11f0-9434-92fbcf53809c.png

屏幕截图: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.gitcd rnnoise-examples-for-pico-2mkdir buildcmake ... -DPICO_BOARD=pico2make rnnoise-benchmark

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

Pico (RP2040) Cortex-M0+ @ 125 MHzPico 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 毫秒内完成 rnnoise_process_frame(...)函数。Pico 2 的基准结果需要 22.1 毫秒,对于 48 kHz 音频来说还不够快,但对于处理采样率为 16 kHz 的音频来说已经足够快了,要求在 30 毫秒内完成音频处理。denoise.c 中的 eband5ms 变量可以轻松修改,以调整处理 16 kHz 数据的算法。该变量控制 22 个频段的起始范围。调整的方法是将原始值乘以 3(因为 16 kHz 音频采集样本的时间是 48 kHz 音频的 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
};以及用于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 连续循环接收 480 个 16 位音频样本,使用去噪算法对其进行处理,然后通过 USB 传输经过去噪处理的样本。在个人电脑上,可以使用 serial_denoise.py Python 脚本从文件中发送 16 位、16 千赫的原始音频,并将去噪音频保存到文件中。这些原始值可导入 Audacity 等应用程序,用于可视化和回放。下面是一个例子:第一轨是原始音频(噪音),下面的第二轨是在 Pico 2 上去噪后的版本。

0897d7b8-091b-11f0-9434-92fbcf53809c.png

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

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

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

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

硬件

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

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

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

08c4d6a0-091b-11f0-9434-92fbcf53809c.png

项目接线图

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

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

08f6d06a-091b-11f0-9434-92fbcf53809c.jpg

软件

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

091d0190-091b-11f0-9434-92fbcf53809c.png

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

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

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

093c9a6e-091b-11f0-9434-92fbcf53809c.gif

记录 Pico 2 电路板使用 RNNoise VAD 输出通过 PWM 控制内置 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,再单击录音按钮。

09577e7e-091b-11f0-9434-92fbcf53809c.png

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

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

下面录制的演示视频将 Pico 2 用作 USB 麦克风,首先关闭噪声抑制功能,然后启用噪声抑制功能后使用相同的输入。请观看并聆听噪声抑制算法的结果!
禁用去噪后的语音和风噪录音
已启用去噪功能的语音和风噪录音099648fc-091b-11f0-9434-92fbcf53809c.png

录音轨道截图。

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

下一步工作

本博客演示了如何利用 Raspberry Pi Pico 2 的 Arm Cortex-M33 CPU 的额外计算能力,使用 ML 模型对从 PDM 麦克风捕获的 16 kHz 的 16 位实时音频数据进行去噪处理。去噪算法利用了 Cortex-M33 的浮点运算单元 (FPU),运行速度比原始 Pico 板上的 Cortex-M0+ 快 16.87 倍。该应用利用一个 CPU 捕捉、过滤和去噪数据,另一个 CPU 通过 USB 将音频数据传输到 PC。下一步,您可以修改应用程序,在通过 USB 向个人电脑发送降噪数据之前添加自动增益控制 (AGC)。另外,去噪数据也可以直接在电路板上使用,作为另一种数字信号处理 (DSP) 算法或 ML 模型的输入,在核心 0 上运行,而不是 USB 栈。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    67

    文章

    8570

    浏览量

    137428
  • Raspberry Pi
    +关注

    关注

    2

    文章

    622

    浏览量

    24135
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    医疗利器:NEVO+600ML噪音AC/DC模块化可配置电源

    医疗利器:NEVO+600ML噪音AC/DC模块化可配置电源 在医疗设备设计领域,电源的性能、尺寸、噪音等因素至关重要。今天要给大家介绍一款优秀的电源产品——NEVO+600ML
    的头像 发表于 04-27 10:15 129次阅读

    Visionfive V2 没有 ttyUSB* ,如何连接到串行 USB 设备?

    我在 USB 连接器连接了 Ublox GPS 接收器。它是标准串行连接。在我的 Raspberry Pi4 ,我看到一个 ttyUSB0,它让我可以连接到 GPS 接收器。但是在
    发表于 03-24 07:54

    Pico示波器如何实现多通道同步采集

    每通道100kSa/s实时采集。PICO示波器独特的流模式采样点不经过示波器的存储器直接写到上位机的硬盘实现真正不间断连续多通道同步采样强大的软件功能SSL1000A多通道高速数据采集
    发表于 03-17 11:28

    请问如何让 Sony-IMX219-Raspberry-Pi-V2-CMOS 相机与 VisionFive2 配合使用?

    我正在尝试获得我在 VisionFive2 版本 219a 放置的备用 Sony-IMX2-Raspberry-Pi-V1.2-CMOS 相机。由于 VisionFive 2 有 1
    发表于 03-11 06:26

    微型Pico Probe电路板开源项目介绍

    调试 Raspberry Pi Pico 项目总被接线折腾?用面包板临时搭建调试电路,线材杂乱还容易接触不良;手持操作更新固件又累又不稳;想选官方调试器,却少了 DIY 的动手乐趣和灵活适配性?
    的头像 发表于 03-09 10:07 1420次阅读
    微型<b class='flag-5'>Pico</b> Probe电路板开源项目介绍

    Banana Pi BPI-CM6 计算模块将 8 核 RISC-V 处理器带入 CM4 外形尺寸

    富的 I/O 解决方案完美结合,在一个小型封装中提供了以往需要多个开发板才能实现功能。此外,由于它兼容现有的 CM4 和 CM5 载板,因此对于已经身处 Raspberry Pi
    发表于 12-20 09:01

    探索RISC-V在机器人领域的潜力

    通信,listener终端能实时打印出talker发布的消息。这证明MUSE Pi Pro的ROS 2核心通信机制(如DDS)运行正常。 3. 实际应用尝试:
    发表于 12-03 14:40

    Banana Pi BPI-CM6 – 一款与 Raspberry Pi CM4/CM5 载板兼容的 SpacemiT K1 RISC-V 系统模块

    本的镜像。 RISC-V 模块的目标应用包括 NAS 系统、笔记本电脑、智能机器人、工业控制、AI 边缘计算和自动化。虽然我们已经见过许多基于 Arm 架构、配备兼容 B2B 连接器的 Raspberry
    发表于 11-28 16:59

    Banana Pi BPI-CM6 – 一款与 Raspberry Pi CM4/CM5 载板兼容的 SpacemiT K1 RISC-V 系统模块

    Banana Pi BPI-CM6 系统模块 (SoM) 采用 SpacemiT K1 8 核 RISC-V 处理器,并且与大多数为 Raspberry Pi CM4 或 CM5 设计的载板兼容
    的头像 发表于 11-28 16:57 2777次阅读
    Banana <b class='flag-5'>Pi</b> BPI-CM6 – 一款与 <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> CM4/CM5 载板兼容的 SpacemiT K1 RISC-V 系统模块

    语音芯片白噪音支持功能详解:打造舒适音频体验的关键技术 | 广州唯创电子语音IC厂家

    前言:探索语音芯片的白噪音技术世界在现代电子设备日益普及的今天,语音芯片的功能创新正在不断丰富着我们的日常生活体验。作为专业的语音IC厂家,广州唯创电子始终致力于音频技术的创新研发,其中白噪音
    的头像 发表于 11-06 08:56 717次阅读
    语音芯片白<b class='flag-5'>噪音</b>支持<b class='flag-5'>功能</b>详解:打造舒适<b class='flag-5'>音频</b>体验的关键技术 | 广州唯创电子语音IC厂家

    ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

    数据,它是关于如何使用I2S读取数据的一个应用,主要是将ESP32读取到的音频数据发送到串口上并实时显示波形,这个我们可以通过串口绘图仪来实现
    的头像 发表于 10-23 19:55 5158次阅读
    ESP32 I<b class='flag-5'>2</b>S<b class='flag-5'>音频</b>总线<b class='flag-5'>学习</b>笔记(二):I<b class='flag-5'>2</b>S读取INMP441<b class='flag-5'>音频</b>数据

    Banana Pi BPI-R4 Lite:新型单板计算机比 Raspberry Pi 5 更具优势

    Banana Pi BPI-R4 Lite 现已上市。具体来说,这款单板计算机在 Youyeetoo 的售价约为 86 美元,但客户在下单前请务必查看运输条款和费用。这是一款单板计算机,有望成为
    的头像 发表于 08-26 16:46 1825次阅读
    Banana <b class='flag-5'>Pi</b> BPI-R4 Lite:新型单板计算机比 <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> 5 更具优势

    超小型Neuton机器学习模型, 在任何系统级芯片(SoC)上解锁边缘人工智能应用.

    nRF54L15)运行,其效率之高,也完全符合nRF52805 等空间最 有限的SoC 的限制,只占用几千字节的非易失性存储器(NVM)。这样就可以在以前认为不可能的应用中增加 机器学习ML
    发表于 07-31 11:38

    边缘计算中的机器学习:基于 Linux 系统的实时推理模型部署与工业集成!

    你好,旅行者!欢迎来到Medium的这一角落。在本文中,我们将把一个机器学习模型(神经网络)部署到边缘设备,利用从ModbusTCP寄存器获取的实时数据来预测一台复古
    的头像 发表于 06-11 17:22 1204次阅读
    边缘计算中的<b class='flag-5'>机器</b><b class='flag-5'>学习</b>:基于 Linux 系统的<b class='flag-5'>实时</b>推理模型部署与工业集成!

    贸泽开售Raspberry Pi用于嵌入式和IIoT应用的RP2350微控制器

    RP2350 微控制器。RP2350建立在Raspberry PI RP2040的成功基础,旨在以实惠的价格提供更高的性能和安全性,非常适合嵌入式计算和工业物联网应用。   Raspberr
    发表于 05-27 14:50 1604次阅读