当前位置: 首页 > news >正文

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

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 目标库。
对 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  11.2 1.4 1.6  22.4 2.8 3.2  44.8 5.6 6.8  89.6 1215.6 20k*/
0,  1,  2,  3,  4,  5,  6,  7,  8101214162024283440486078100};
以及用于16 kHz音频的修改值:static const opus_int16 eband5ms[] = {/*0  200 400 600 800  11.2 1.4 1.6  22.4 2.8 3.2  44.8 5.6 6.8  89.6 1215.6 20k*/0,  3,  6,  9,  121518212460364248607284102120120120120120};
串行示例可编译并部署到电路板上,以测试修改后的算法。该示例通过 USB 连续循环接收 480 个 16 位音频样本,使用去噪算法对其进行处理,然后通过 USB 传输经过去噪处理的样本。在个人电脑上,可以使用 serial_denoise.py Python 脚本从文件中发送 16 位、16 千赫的原始音频,并将去噪音频保存到文件中。
这些原始值可导入 Audacity 等应用程序,用于可视化和回放。下面是一个例子:第一轨是原始音频(噪音),下面的第二轨是在 Pico 2 上去噪后的版本。

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

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

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

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

硬件

此应用程序需要以下硬件:
  • Raspberry Pi Pico 2 主板
  • Adafruit PDM MEMS 麦克风接口
  • 半尺寸试验板
  • 跳线
  • 滑动开关(可选)
  • 触觉按钮(可选)
可选的滑动开关将用作切换开关,以便在运行时禁用或启用噪声抑制处理,而可选的轻触开关则为重置电路板提供了方便。
连接硬件如下:

项目接线图
Raspberry Pi Pico 2PDM MEMS 麦克风接口滑动开关(可选)触觉按钮(可选)
3V3(输出)3V
GNDGNDSEL中间针底部针
RUN顶部针
GPIO21DAT
GPIO22CLK
GPIO17底部针
接线完成后,你的试验板将看起来像这样:

软件

应用程序将使用 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 个去噪采样。

带去噪功能的 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 麦克风捕获的 16 kHz 的 16 位实时音频数据进行去噪处理。去噪算法利用了 Cortex-M33 的浮点运算单元 (FPU),运行速度比原始 Pico 板上的 Cortex-M0+ 快 16.87 倍。该应用利用一个 CPU 捕捉、过滤和去噪数据,另一个 CPU 通过 USB 将音频数据传输到 PC。
下一步,您可以修改应用程序,在通过 USB 向个人电脑发送降噪数据之前添加自动增益控制 (AGC)。另外,去噪数据也可以直接在电路板上使用,作为另一种数字信号处理 (DSP) 算法或 ML 模型的输入,在核心 0 上运行,而不是 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中的元组&#xff08;Tuple&#xff09;是一种用于存储多个项目&#xff08;可以是不同类型&#xff09;的序列数据结构&#xff0c;但它与列表&#xff08;List&#xff09;不同&#xff0c;主要区别在于元组是不可变的&#xff08;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&#xff08;Human-Machine Interface&#xff0c;人机界面&#xff09;芯片。两颗芯片硬件PIN TO PIN&#xff1b;区别在于内置的PSRAM大小不同。该…...

Python 函数返回yield还是return?这是个问题

如果你刚入门 Python&#xff0c;你可能之前没有遇到过yield。虽然它看起来很奇怪&#xff0c;但它是你编码工具库中的一个重要工具。在成为 Python 大师的道路上&#xff0c;你必须掌握它。 返回列表的函数 假设有一个函数&#xff0c;它可以一次性生成一系列值&#xff0c;…...

Linux系统性能调优

Linux系统性能调优是一个复杂而细致的过程&#xff0c;涉及硬件、软件、内核参数、进程管理等多个方面。以下将从多个角度详细介绍Linux系统性能调优的技巧&#xff0c;旨在帮助用户提升系统的运行效率和稳定性。 一、硬件层面的调优 内存升级&#xff1a; 增加物理内存可以减…...

PHPStorm 环境配置与应用详解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; PHPStorm 是 JetBrains 出品的一款专业 PHP 集成开发环境&#xff08;IDE&#xff09;&#xff0c;凭借其智能的代码补全、调试功能、深度框架支持和前端开发工具&#xff0c;为用户提供了丰富的功能和工具…...

前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载

前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载 各种文本文件预览&#xff08;pdf, xlsx, docx, cpp, java, sql, py, vue, html, js, json, css, xml, rust, md, txt, log, fa, fasta, tsv, csv 等各种文本文件&#xff09; 其中 除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 已发布&#xff0c;欢迎体验&#xff01; http://datagear.tech/pro/ 企业版 1.2.0 修复严重漏洞&#xff0c;新增文件源管理模块&#xff0c;新增JWT统一登录支持&#xff0c;MQTT数据集主题支持通配符&#xff0c;具体更新内容如下&#xff1a; 新增…...

为啥https比http慢

Https有ssl的握手 HTTP没有 HTTPS TCP 和HTTP 的TCP 时间差不是很大 HTTPS请求中,ssl所占的时间比例是请求时间总和93.37%, HTTPS请求中,ssl的请求会是tcp请求的14倍,而HTTP中没有这个问题 建议:对安全要求不是很高的,不要使用https请求 图例...

软件测试需要具备的基础知识【功能测试】---后端知识(三)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 为了更好的学习软件测试的相关技能&#xff0c;需要具备一定的基础知识。需要学习的基础知识包括&#xff1a; 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写&#xff0c;这是第三篇 …...

详解 Redis 队列 实现

Redis 是一个高性能的键值存储系统&#xff0c;它的多种数据结构使其能够以不同方式实现队列&#xff0c;包括普通队列、延时队列和异步队列的介绍和示例。 介绍 Redis 的 List 数据结构可以用来实现普通的队列。 生产者使用 LPUSH 或 RPUSH 命令将消息添加到列表的头部或尾部…...

分析SQL的count(*)并优化

最近优化过几个慢查询接口的性能&#xff0c;总结了一些心得体会拿出来跟大家一起分享一下&#xff0c;希望对你会有所帮助。 我们使用的数据库是Mysql8&#xff0c;使用的存储引擎是Innodb。这次优化除了优化索引之外&#xff0c;更多的是在优化count(*)。 通常情况下&#…...

Java学习日记(day18)

一、软件的结构 C/S (Client - Server 客户端-服务器端) 典型应用&#xff1a;QQ软件 &#xff0c;飞秋&#xff0c;印象笔记。 特点&#xff1a; 必须下载特定的客户端程序。服务器端升级&#xff0c;客户端升级。 B/S &#xff08;Broswer -Server 浏览器端- 服务器端&a…...

Oracle(61)什么是外部表(External Table)?

外部表&#xff08;External Table&#xff09;是Oracle数据库中的一种特殊表类型&#xff0c;用于访问存储在外部文件系统中的数据&#xff0c;而不需要将数据实际加载到数据库内部。外部表的主要优势在于允许数据库用户在不移动或复制数据的情况下&#xff0c;直接查询和处理…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...