Raspberry Pi Pico 2 上实现:实时机器学习(ML)音频噪音抑制功能
Arm 公司的首席软件工程师 Sandeep Mistry 为我们展示了一种全新的巧妙方法: 在 Raspberry Pi Pico 2 上如何将音频噪音抑制应用于麦克风输入。
该算法背景介绍
2018年,Jean-Marc Valin 发表了一篇关于实时全带语音增强的混合DSP/深度学习方法的论文。本文介绍了如何使用基于递归神经网络(RNN)的ML模型来抑制音频源中的噪声。如果您有兴趣了解有关该算法的更多信息,请阅读Jean-Marc的RNNoise:学习噪声抑制页面。该页面涵盖了算法的详细信息,并包括交互式示例。该项目的源代码可在RNNoise Git存储库中找到。
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 MHz | Pico 2 (RP2350) Cortex-M33 @ 150 MHz | |
| rnnnoise_process_frame(...) | 372,644微秒 | 22,093微秒 |
针对 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};
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};

在Audacity应用程序的两个音轨的屏幕截图。
顶部:原始音频。底部:音频的去音版本。
我选择了一个噪声明显降低的区域。到目前为止一切顺利;该算法已通过验证,可在电路板上通过 USB 从个人电脑串流 16 kHz 音源!
将算法集成到USB麦克风应用程序中硬件
此应用程序需要以下硬件:- Raspberry Pi Pico 2 主板
- Adafruit PDM MEMS 麦克风接口
- 半尺寸试验板
- 跳线
- 滑动开关(可选)
- 触觉按钮(可选)

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

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 上实现:实时机器学习(ML)音频噪音抑制功能
Arm 公司的首席软件工程师 Sandeep Mistry 为我们展示了一种全新的巧妙方法: 在 Raspberry Pi Pico 2 上如何将音频噪音抑制应用于麦克风输入。 机器学习(ML)技术彻底改变了许多软件应用程序的开发方式。应用程序开发人员现在可以为所需系统整…...
安全自动化和编排:如何使用自动化工具和编排技术来提高安全操作效率。(第二篇)
深入理解Kubernetes环境中的安全自动化与编排(第二篇) 1. 引言 Kubernetes作为现代容器编排平台的主流选择,正在被越来越多的企业用于部署和管理其容器化应用。在Kubernetes环境中实施安全自动化与编排,既能够提升系统的安全性&…...
HarmonyOS WebView
HarmonyOS WebView Web组件提供基础的前端页面加载的能力,包括加载网络页面、本地页面、html格式文本数据。Web组件提供丰富的页面交互的方式,包括:设置前端页面深色模式,新窗口中加载页面,位置权限管理,C…...
解决elementUI表格里嵌套输入框,检验时错误信息被遮挡
1.表格 自定义错误信息显示div <el-form-item label"租赁价格" prop"supplierId"><el-table-column prop"salePrice" label"销售价" align"center"><template slot-scope"scope"><el-form-…...
Unity读取Android外部文件
最近近到个小需求,需要读Android件夹中的图片.在这里做一个记录. 首先读写部分,这里以图片为例子: 一读写部分 写入部分: 需要注意的是因为只有这个地址支持外部读写,所以这里用到的地址都以 :Application.persistentDataPath为地址起始. private Texture2D __CaptureCamera…...
【5.3 python中的元组】
5.3 python中的元组 Python中的元组(Tuple)是一种用于存储多个项目(可以是不同类型)的序列数据结构,但它与列表(List)不同,主要区别在于元组是不可变的(immutable&#…...
Debezium报错处理系列之第116篇:Caused by: java.lang.NumberFormatException: null
Debezium报错处理系列之第116篇:Caused by: java.lang.NumberFormatException: null 一、完整报错二、错误原因三、解决方法Debezium从入门到精通系列之:研究Debezium技术遇到的各种错误解决方法汇总: Debezium从入门到精通系列之:百篇系列文章汇总之研究Debezium技术遇到的…...
【启明智显技术分享】工业级HMI芯片Model3C/Model3A开发过程中问题记录笔记二
一、Model3C/Model3A芯片介绍 Model3C/Model3A是启明智显针对工业、行业以及车载产品市场推出的一款高性能、低成本的工业级HMI(Human-Machine Interface,人机界面)芯片。两颗芯片硬件PIN TO PIN;区别在于内置的PSRAM大小不同。该…...
Python 函数返回yield还是return?这是个问题
如果你刚入门 Python,你可能之前没有遇到过yield。虽然它看起来很奇怪,但它是你编码工具库中的一个重要工具。在成为 Python 大师的道路上,你必须掌握它。 返回列表的函数 假设有一个函数,它可以一次性生成一系列值,…...
Linux系统性能调优
Linux系统性能调优是一个复杂而细致的过程,涉及硬件、软件、内核参数、进程管理等多个方面。以下将从多个角度详细介绍Linux系统性能调优的技巧,旨在帮助用户提升系统的运行效率和稳定性。 一、硬件层面的调优 内存升级: 增加物理内存可以减…...
PHPStorm 环境配置与应用详解
大家好,我是程序员小羊! 前言: PHPStorm 是 JetBrains 出品的一款专业 PHP 集成开发环境(IDE),凭借其智能的代码补全、调试功能、深度框架支持和前端开发工具,为用户提供了丰富的功能和工具…...
前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载
前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载 各种文本文件预览(pdf, xlsx, docx, cpp, java, sql, py, vue, html, js, json, css, xml, rust, md, txt, log, fa, fasta, tsv, csv 等各种文本文件) 其中 除p…...
【Qt】QPluginLoader 类学习
文章目录 一、简介二、常用方法2.1 构造函数2.2 动态加载方法——load()2.3 检查是否加载成功——isLoaded()2.4 访问插件中的根组件——instance()2.5 卸载插件——unload() 一、简介 QPluginLoader 类在运行时加载插件。 QPluginLoader 提供对Qt插件的访问。Qt插件存储在共享…...
DataGear 企业版 1.2.0 发布,数据可视化分析平台
DataGear 企业版 1.2.0 已发布,欢迎体验! http://datagear.tech/pro/ 企业版 1.2.0 修复严重漏洞,新增文件源管理模块,新增JWT统一登录支持,MQTT数据集主题支持通配符,具体更新内容如下: 新增…...
为啥https比http慢
Https有ssl的握手 HTTP没有 HTTPS TCP 和HTTP 的TCP 时间差不是很大 HTTPS请求中,ssl所占的时间比例是请求时间总和93.37%, HTTPS请求中,ssl的请求会是tcp请求的14倍,而HTTP中没有这个问题 建议:对安全要求不是很高的,不要使用https请求 图例...
软件测试需要具备的基础知识【功能测试】---后端知识(三)
您好,我是程序员小羊! 前言 为了更好的学习软件测试的相关技能,需要具备一定的基础知识。需要学习的基础知识包括: 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写,这是第三篇 …...
详解 Redis 队列 实现
Redis 是一个高性能的键值存储系统,它的多种数据结构使其能够以不同方式实现队列,包括普通队列、延时队列和异步队列的介绍和示例。 介绍 Redis 的 List 数据结构可以用来实现普通的队列。 生产者使用 LPUSH 或 RPUSH 命令将消息添加到列表的头部或尾部…...
分析SQL的count(*)并优化
最近优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。 我们使用的数据库是Mysql8,使用的存储引擎是Innodb。这次优化除了优化索引之外,更多的是在优化count(*)。 通常情况下&#…...
Java学习日记(day18)
一、软件的结构 C/S (Client - Server 客户端-服务器端) 典型应用:QQ软件 ,飞秋,印象笔记。 特点: 必须下载特定的客户端程序。服务器端升级,客户端升级。 B/S (Broswer -Server 浏览器端- 服务器端&a…...
Oracle(61)什么是外部表(External Table)?
外部表(External Table)是Oracle数据库中的一种特殊表类型,用于访问存储在外部文件系统中的数据,而不需要将数据实际加载到数据库内部。外部表的主要优势在于允许数据库用户在不移动或复制数据的情况下,直接查询和处理…...
手把手教你用MOS管搭建防反接电路:从原理图到PCB布局的避坑指南(以立创EDA为例)
从零构建MOS管防反接电路:立创EDA实战全流程解析 电源反接是电子设计中最常见的"低级错误"之一,却可能造成毁灭性后果。想象一下:你花费数周完成的智能家居控制器,因为电池装反而瞬间烧毁主控芯片——这种场景在创客社区…...
UE Viewer技术深度解析:如何逆向工程实现跨版本虚幻引擎资源查看
UE Viewer技术深度解析:如何逆向工程实现跨版本虚幻引擎资源查看 【免费下载链接】UEViewer Viewer and exporter for Unreal Engine 1-4 assets (UE Viewer). 项目地址: https://gitcode.com/gh_mirrors/ue/UEViewer UE Viewer(又称Umodel&#…...
无需写代码!用 PackSoft 做数字展厅大屏
前言 做过展厅项目的朋友都懂这种痛—— 客户参观来了,讲解员打开浏览器,地址栏、书签栏、收藏夹全暴露在屏幕上,旁边还挂着一个没关的 QQ 弹窗……高端大气的数字展厅,体验瞬间拉低一个档次。 更麻烦的是:大屏全屏…...
一键批量下载网易云音乐FLAC无损音乐:Golang高效解决方案
一键批量下载网易云音乐FLAC无损音乐:Golang高效解决方案 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 你是否曾梦想拥有一个完整的无损…...
WaveTools终极指南:免费解锁鸣潮120FPS帧率限制的完整方案
WaveTools终极指南:免费解锁鸣潮120FPS帧率限制的完整方案 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》PC版设计的开源工具箱,通过创新技术方案帮助…...
微信小程序二维码生成神器:5分钟搞定前端二维码生成
微信小程序二维码生成神器:5分钟搞定前端二维码生成 【免费下载链接】weapp-qrcode weapp.qrcode.js 在 微信小程序 中,快速生成二维码 项目地址: https://gitcode.com/gh_mirrors/we/weapp-qrcode 还在为微信小程序中的二维码功能而烦恼吗&#…...
B站视频转文字终极指南:3分钟学会用开源工具提取视频内容
B站视频转文字终极指南:3分钟学会用开源工具提取视频内容 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为手动记录B站视频内容而烦恼吗&…...
18.地下室的服务器
六月第一个周末的深夜,暴雨如注。陈远坐在书桌前,屏幕上是花花绿绿的监控图表,代表着他那台二手服务器资源使用率的曲线,正像垂死病人的心电图一样剧烈地上下跳动。CPU占用率长时间维持在90%以上,内存也逼近红线。这已…...
GitHub 被分号击穿信任防线,AI 逆向工具敲响闭源系统安全警钟
GitHub 被分号击穿三层信任,AI 填平逆向护城河敲响闭源系统安全警钟 2026 年 3 月 4 日,GitHub 收到 Wiz 通过 Bug Bounty 提交的报告,报告描述的攻击入口极其简单:一条构造过的 git push,带一个 push optionÿ…...
规划求解(Solver)实战:利用Excel的Solver工具进行投资组合优化
投资界有句老话:"别把鸡蛋放在一个篮子里。"但很少有人告诉你后半句:“每个篮子放多少鸡蛋,才是大学问。“Solver就是投资组合的"营养师”,帮你配出最佳"营养比例”。就像投资界的红绿灯,约束条件告诉你什么可以做,什么不可以碰。 一、什么是规划求解…...
