基于Arduino与Edge Impulse的嵌入式鸟类声音分类系统实践 1. 项目概述当嵌入式设备学会“听鸟语”如果你对观鸟、生态监测或者嵌入式机器学习感兴趣那么你很可能已经厌倦了传统的方案在野外架设一个录音设备录下海量音频再把这些数据全部传回云端服务器进行分析。这个过程不仅耗电、依赖网络还存在严重的延迟和隐私问题。想象一下你希望设备能实时告诉你“刚才飞过去的是只啄木鸟”而不是等几个小时甚至几天后收到一封分析报告。这正是边缘AI的魅力所在——让智能发生在数据产生的源头。我最近完成了一个项目基于一块小小的Arduino Nano 33 BLE Sense开发板实现了一个完全在设备端运行的鸟类声音分类系统。整个系统就像一个装在火柴盒里的“鸟类学家”它通过板载麦克风持续监听环境声音利用本地部署的微型神经网络模型实时分辨出是亚洲噪鹃在鸣叫还是仅仅是风吹树叶的噪音。这个项目的核心价值在于其“自给自足”性。它不依赖云端连接功耗极低使用电池可连续工作数天响应速度在毫秒级并且所有音频数据都在本地处理没有隐私泄露的风险。无论是用于后院生物多样性监测、自然保护区的研究还是作为一款有趣的DIY自然教育工具都非常合适。接下来我将拆解整个实现过程从硬件选型、数据准备、模型训练到最终部署分享其中每一步的实操细节和我踩过的坑。2. 核心硬件与平台选型解析2.1 为什么是Arduino Nano 33 BLE Sense在资源受限的边缘设备上跑机器学习模型硬件选型是第一步也是最关键的一步。市面上开发板众多我最终锁定Arduino Nano 33 BLE Sense是基于以下几个维度的综合考量第一性能与资源的平衡。它的核心是一颗Arm Cortex-M4F处理器运行频率64MHz拥有1MB的Flash存储和256KB的RAM。对于音频分类这类任务这个配置属于“够用且紧凑”的甜点区。Cortex-M4F支持单精度浮点运算单元FPU这对于运行神经网络中的大量乘加运算至关重要能显著提升推理速度。相比之下更便宜的M0系列板子没有硬件FPU浮点运算靠软件模拟会慢几十倍而性能更强的板子如ESP32-S3虽然算力更强但功耗和成本也上去了对于持续监听的场景反而不够经济。第二集成的传感器套件。这块板子之所以叫“Sense”是因为它集成了9轴IMU加速度计、陀螺仪、磁力计、温湿度、气压、光照、颜色以及一个数字麦克风MP34DT05。这个麦克风是关键。它本身是一个PDM脉冲密度调制麦克风输出的是1位高速数据流需要经过板载的专用电路转换为I2S接口信号才能被MCU处理。这意味着硬件层面已经帮你完成了最底层的信号采集和转换我们只需要调用Arduino的PDM库或I2S库就能拿到可用的音频数据省去了外接麦克风模块的复杂电路设计和调试工作。第三开发生态的成熟度。Arduino Nano 33 BLE Sense是Edge Impulse官方深度支持的设备之一。Edge Impulse为我们提供了从数据采集、模型训练到部署的一站式工具链。你只需要在电脑上安装一个数据转发工具edge-impulse-daemon开发板就能通过串口将传感器数据实时上传到Edge Impulse的云端工作室进行标注和训练。这种无缝对接极大地降低了开发门槛让我们能把精力集中在模型和算法本身而不是底层的数据管道上。注意购买时请认准“Nano 33 BLE Sense”Arduino还有一款“Nano 33 BLE”没有Sense后者没有集成麦克风无法直接用于本项目。2.2 Edge Impulse边缘AI的“快速原型工厂”如果说Arduino是身体那么Edge Impulse就是赋予其智能的大脑和训练营。它是一个为嵌入式设备优化机器学习模型而生的在线平台其设计哲学就是让嵌入式工程师和开发者也能轻松上手AI。它的核心工作流程可以概括为采集 - 设计 - 训练 - 部署。采集通过连接的真实设备或上传已有数据集收集原始传感器数据如音频波形。设计定义“脉冲”Impulse即数据处理流水线。包括如何切割数据窗口、用什么方法提取特征如MFCC、MFE、用什么类型的神经网络进行分类。训练平台基于你设计的流水线在云端自动进行模型训练、验证并提供直观的准确率、混淆矩阵等评估指标。部署一键将训练好的模型转换成高度优化的C库或TensorFlow Lite Micro格式供你下载并集成到嵌入式设备中。对于本项目的价值在于特征工程自动化音频分类的关键是将原始的波形数据转换为能表征声音特性的“特征”。Edge Impulse内置了MFCC梅尔频率倒谱系数和MFE梅尔滤波器组能量这两种最常用的音频特征提取算法。我们不需要自己写复杂的信号处理代码只需在界面上配置几个参数如滤波器数量、帧长等。模型轻量化平台训练的神经网络模型天生就是为微控制器优化的。它会自动进行量化将32位浮点权重转换为8位整数并应用剪枝等技术在保证精度的前提下让模型小到足以塞进Nano 33 BLE Sense有限的Flash和RAM中。实时测试训练过程中你可以随时使用“实时分类”功能让连接着的开发板现场采集一段声音立刻看到模型的分类结果这种即时反馈对调试模型性能至关重要。选择Edge Impulse相当于站在了巨人的肩膀上避免了从零搭建机器学习流水线的巨大工程开销。3. 数据集的构建从“野外录音”到“训练样本”机器学习项目七分靠数据三分靠模型。对于鸟类声音分类构建一个高质量、有代表性的数据集是成功的一半。这个过程远比想象中繁琐但每一步都直接影响最终模型的鲁棒性。3.1 数据来源与筛选策略公开的鸟类声音数据库是我们的起点。我主要使用了Xeno-Canto这是一个全球性的鸟类录音共享社区资源极其丰富。但直接下载使用会面临几个问题质量参差不齐录音背景中可能有强烈的风声、雨声、人声干扰。格式与长度不一文件可能是MP3、WAV等各种格式时长从几秒到几分钟不等。目标声音不纯一段录音中可能包含多种鸟叫或者目标鸟叫只出现在某一小段。我的筛选原则是优先选择“A”评级录音Xeno-Canto上用户会对录音质量评级A级表示背景噪音小目标声音清晰。聚焦单一鸟种尽量选择只包含目标鸟种叫声的片段。如果一段录音里有多种鸟叫我会在后续预处理中用Audacity将其精确裁剪出来。考虑地域和个体差异同一种鸟在不同地区、不同季节、不同个体间的叫声可能有差异。我尽量为每种鸟收集来自不同录音者和地点的样本以增加模型的泛化能力。基于这些原则我选取了四种在我国城市和郊区环境中相对常见的鸟类作为初始分类目标亚洲噪鹃声音响亮有特点、家八哥鸣叫频繁、珠颈斑鸠咕咕声易识别以及背景噪音。背景噪音作为一个独立的类别至关重要它教会模型“什么时候不该响应”。3.2 数据预处理与增强实战从网上下载的原始音频文件通常是.mp3或.flac格式不能直接扔给模型。我们需要一套标准化的预处理流程第一步格式统一与重采样。Edge Impulse对上传音频的格式有要求单声道、16kHz采样率、16位PCM编码的WAV文件是最稳妥的。我使用开源工具Audacity进行批量处理导入音频确保是单声道如果是立体声使用轨道 - 立体声音轨转换为单音轨。检查采样率。如果不是16000 Hz使用轨道 - 重采样将采样率设置为16000 Hz。这个采样率是语音/声音识别的常用标准能覆盖大部分鸟类鸣叫的主要频率成分通常低于8kHz同时保持数据量可控。导出为WAV格式16位PCM。第二步有效片段裁剪与标注。这是最耗时但最关键的一步。在Audacity中我需要仔细聆听每一段录音手动选取出纯净的、只包含目标鸟叫的片段。例如一段5分钟的录音里可能只有4次每次持续2秒的鸟叫是有效的。我会精确地选中这8秒的音频将其导出为一个独立的WAV文件并以bird_species_001.wav这样的格式命名。这个过程确保了数据集的“干净”让模型学习的是鸟叫的本质特征而不是无关的背景。第三步数据增强——以小博大的艺术。初始收集的每种鸟可能只有几十个有效片段这对于训练一个稳健的模型是远远不够的。数据增强就是在现有数据的基础上人工制造出更多的“变体”模拟真实世界中的各种情况。我主要采用了以下方法添加背景噪音从“背景噪音”类别的录音中随机选取一段环境噪音如风声、树叶沙沙声、远处车流声以较低的音量例如-20dB混入到干净的鸟叫录音中。这能极大地提升模型在嘈杂环境下的识别能力。时间拉伸与音高微调使用代码库如librosa的time_stretch和pitch_shift函数对音频进行轻微的速度加快/放慢0.9-1.1倍和音高升高/降低±2个半音。这模拟了不同个体鸟类叫声的细微差异。随机裁剪从一个较长的音频片段中随机截取一个固定长度如2秒的窗口。这能增加样本的多样性并让模型学会不依赖于叫声在时间轴上的绝对位置。通过这套组合拳我将每种鸟的几十个原始样本扩充到了200个以上的训练样本构成了一个相对平衡的数据集。4. Edge Impulse模型训练全流程拆解有了高质量的数据集我们就可以在Edge Impulse平台上构建和训练模型了。这个过程是一个典型的“设计-实验-评估”的迭代循环。4.1 脉冲设计定义数据处理流水线在Edge Impulse中“脉冲”是你的机器学习流水线蓝图。它定义了从原始数据输入到最终分类输出的完整路径。对于音频分类一个典型的脉冲包含以下环节1. 时间序列数据切片音频是连续的流。我们需要将其切割成固定长度的小段称为“窗口”进行分析。这里有两个关键参数窗口大小我设置为2500毫秒2.5秒。这个长度的选择基于对鸟类叫声的观察大部分有辨识度的鸣叫或鸣唱片段都在1到3秒之间。2.5秒的窗口有足够的信息量又不至于因过长而包含太多无关背景或混合多种声音。窗口增量我设置为1250毫秒。这意味着窗口之间有50%的重叠。例如第一个窗口分析0-2.5秒的数据第二个窗口分析1.25-3.75秒的数据。重叠窗口是处理时间序列数据的常用技巧它能有效增加训练样本数量数据增强并且在进行实时连续分类时可以让分类结果更加平滑稳定避免因为切割点刚好落在叫声中间而导致漏检。2. 特征提取块从波形到特征向量原始的音频波形数据一系列振幅值对于神经网络来说并不是最友好的输入形式。我们需要将其转换为更能体现声音频谱特性的特征。我选择了MFE作为处理块。MFE vs MFCCMFCC是在MFE的基础上再经过离散余弦变换DCT得到的它去除了各滤波器输出之间的相关性更专注于声音的“形状”。而MFE保留了更多的原始频谱能量信息。在初步实验中我发现对于鸟类叫声这种频谱结构相对清晰的声音MFE和MFCC的表现相差不大有时MFE甚至略好。考虑到MFE计算量稍小我最终选择了它。参数配置我基本采用了Edge Impulse的默认参数滤波器数量为40个帧长为0.02秒帧移为0.01秒。这意味着每2.5秒的音频窗口会被转换成大约(2.5 / 0.01) * 40 10000个特征点实际会少一些因为首尾处理。这些参数对于捕捉鸟类叫声的谐波和共振峰结构已经足够。3. 学习块轻量级神经网络分类器特征提取后我们得到了一个二维的特征图时间帧 vs 梅尔滤波器组。我选择了Keras神经网络作为分类器。Edge Impulse会自动为你构建一个适用于嵌入式设备的卷积神经网络CNN架构通常包含1-2个卷积层用于捕捉频谱图中的局部模式如某个频段在特定时间的能量爆发。池化层用于降低数据维度增强平移不变性。全连接层将学习到的特征映射到最终的分类类别上。Dropout层用于防止过拟合。在神经网络配置中最重要的参数是训练周期数。初期可以设置为30-50个周期观察训练损失和验证损失曲线。如果曲线早已平稳说明可以提前停止如果验证损失开始上升而训练损失下降则是过拟合的迹象需要增加Dropout率或使用更多数据增强。4.2 训练、验证与性能调优上传数据并设计好脉冲后点击“开始训练”平台就会在云端自动完成训练。训练完成后我们需要重点关注以下几个指标准确率模型在预留的测试集上的总体分类正确率。初次训练能达到85%以上就算不错。混淆矩阵这是更重要的诊断工具。它能清晰显示模型具体在哪些类别上容易混淆。例如你可能会发现“鸟A”的声音有15%被误判为“背景噪音”而“鸟B”和“鸟C”之间也容易搞混。这直接指明了改进方向A vs 噪音说明“鸟A”的叫声样本可能不够典型或者背景噪音样本中包含了类似鸟A叫声的环境音。需要补充更多纯净的、有代表性的鸟A叫声并检查噪音数据的纯净度。B vs C说明这两种鸟的叫声在声学特征上可能非常相似。需要回到数据层面检查它们的频谱图是否有明显区别。如果没有可能需要考虑合并这两个类别或者寻找更能区分它们的特征但MFE/MFCC可能已到极限。模型调优的实战心得数据永远是第一位的如果准确率不高第一个要怀疑的就是数据质量。回头去听那些被错误分类的样本你经常会发现录音质量差、叫声不典型、或者标注有误。谨慎调整模型复杂度不要一上来就增加网络层数或神经元数量。更复杂的模型在资源受限的设备上可能跑不动也更容易过拟合。优先尝试调整数据增强的强度、窗口参数或者清洗数据。利用“实时分类”快速验证这是Edge Impulse最好用的功能之一。训练完模型后直接让连接着的Arduino板子录制一段现场声音比如用手机播放鸟叫立刻就能看到分类结果和置信度。这种端到端的即时测试能最真实地反映模型在实际硬件上的表现。5. 模型部署与Arduino端集成当模型在Edge Impulse Studio中达到满意的性能后下一步就是将它“塞进”小小的Arduino Nano 33 BLE Sense里让它真正独立运行。5.1 从云端模型到嵌入式库在Edge Impulse项目的“部署”页面选择“Arduino库”作为输出格式。平台会做以下几件关键事情量化将训练好的浮点数权重转换为8位整数int8。这能将模型大小减少约75%并且整数运算在微控制器上比浮点运算快得多。代码生成生成一个完整的、包含模型权重和推理引擎的C库。这个库已经集成了EON编译器优化针对Cortex-M架构进行了指令集优化。封装提供一个清晰的API通常包含一个run_classifier函数你只需要将预处理好的特征数据传入就能得到分类结果和置信度。点击“构建”后下载得到一个ZIP文件。在Arduino IDE中通过项目 - 加载库 - 添加.ZIP库将这个库导入到你的开发环境中。5.2 编写设备端推理程序Edge Impulse库自带丰富的示例。对于音频分类最常用的是static_buffer或continuous示例。我以continuous为例它展示了如何实现连续监听和分类。核心代码逻辑拆解#include bird_sound_classifier_inferencing.h // 你生成的模型库头文件 #include PDM.h // Arduino Nano 33 BLE Sense的PDM麦克风库 // 定义音频缓冲区 static signed short sampleBuffer[2048]; // PDM库填充的缓冲区 static bool debug_nn false; // 设置为true以查看EI_CLASSIFIER调试信息 // PDM数据就绪回调函数 void onPDMdata() { int bytesAvailable PDM.available(); // 查询可读字节数 PDM.read(sampleBuffer, bytesAvailable); // 将音频数据读入缓冲区 // 注意这里需要将数据复制到Edge Impulse库所需的环形缓冲区中 // 示例代码中通常有一个audio_buffer全局变量和相应的写入逻辑 } void setup() { Serial.begin(115200); // 初始化PDM麦克风 PDM.onReceive(onPDMdata); if (!PDM.begin(1, 16000)) { // 通道数1采样率16kHz Serial.println(Failed to start PDM!); while (1); } // 初始化Edge Impulse库 ei_printf(Edge Impulse standalone inferencing (Arduino Nano 33 BLE Sense)\\n); } void loop() { // 1. 等待并收集足够时长的音频数据例如一个窗口2.5秒 // 这通常通过判断环形缓冲区中是否积累了 16000 Hz * 2.5s 40000 个样本来实现 uint32_t required_samples (EI_CLASSIFIER_RAW_SAMPLE_COUNT / 1000) * 16000; // 根据模型定义计算 if (/* 缓冲区数据量 required_samples */) { // 2. 信号预处理将int16样本转换为模型需要的float32格式 signal_t signal; // ... 将sampleBuffer中的数据转换为signal结构 ... // 3. 运行推理 ei_impulse_result_t result { 0 }; EI_IMPULSE_ERROR res run_classifier(signal, result, debug_nn); // 4. 处理结果 if (res ! EI_IMPULSE_OK) { ei_printf(ERR: Failed to run classifier (%d)\\n, res); return; } // 5. 输出分类结果 ei_printf(Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \\n, result.timing.dsp, result.timing.classification, result.timing.anomaly); for (size_t ix 0; ix EI_CLASSIFIER_LABEL_COUNT; ix) { ei_printf( %s: %.5f\\n, result.classification[ix].label, result.classification[ix].value); } // 6. 判断并执行动作例如找到置信度最高的类别 float max_value 0.0; int max_index -1; for (int i 0; i EI_CLASSIFIER_LABEL_COUNT; i) { if (result.classification[i].value max_value) { max_value result.classification[i].value; max_index i; } } if (max_value 0.7) { // 设置一个置信度阈值例如0.7 ei_printf(- Detected: %s (%.2f)\\n, result.classification[max_index].label, max_value); // 可以在这里触发动作点亮对应颜色的LED通过蓝牙发送消息等 } else { ei_printf(- Uncertain or background noise.\\n); } // 7. 滑动窗口丢弃一部分旧数据为下一次推理做准备 // ... 移动环形缓冲区的读指针 ... } }关键配置与避坑指南采样率匹配PDM.begin()中的采样率必须与你在Edge Impulse中训练模型时使用的采样率16000 Hz严格一致。缓冲区管理这是最容易出问题的地方。PDM库的回调函数onPDMdata()是在后台中断中调用的它快速填充sampleBuffer。你的主程序需要安全地将这些数据搬运到一个更大的环形缓冲区中并跟踪写指针。同时推理线程loop中的逻辑从环形缓冲区读取数据并跟踪读指针。必须处理好这两个指针的同步避免数据竞争或覆盖。示例代码通常已经实现了这个环形缓冲区务必理解其原理。内存限制Nano 33 BLE Sense只有256KB RAM。音频缓冲区、特征计算中间变量、神经网络中间激活值都会占用内存。如果模型太大或音频窗口太长可能会导致内存不足而崩溃。在Edge Impulse部署时平台会给出内存估算。如果接近或超过限制需要返回去设计更小的模型减少层数、特征维度或更短的窗口。功耗优化对于电池供电的场景不能让MCU一直全速运行。可以在没有检测到有效声音如所有类别置信度都很低时让设备进入休眠模式由麦克风或定时器中断唤醒。这需要更复杂的电源管理代码。5.3 功能扩展与系统集成一个基础的分类器跑起来后你可以根据应用场景扩展其功能本地指示连接一个RGB LED让不同的鸟叫对应不同的颜色闪烁。数据记录添加一个SD卡模块将检测到的事件时间戳、鸟种类、置信度记录到CSV文件中供后续分析。低功耗无线传输利用板载的BLE功能仅在检测到高置信度的鸟叫时才唤醒蓝牙将简要结果发送到附近的手机或网关设备实现数据的稀疏上报极大节省电量。多传感器融合结合板载的温湿度、光照传感器记录鸟类活动时的环境条件为生态研究提供更丰富的数据维度。6. 实战问题排查与性能优化记录在实际部署和测试过程中我遇到了不少典型问题。这里将这些问题、排查思路和解决方案整理成表希望能帮你绕过这些坑。问题现象可能原因排查步骤与解决方案编译错误内存不足模型太大或音频缓冲区开得太大超过了256KB RAM。1. 在Edge Impulse部署页面查看“内存使用”估算。2. 减小模型复杂度在EI Studio尝试减少神经网络层数或每层神经元数。3. 缩短“窗口大小”例如从2500ms减到2000ms。4. 优化代码检查全局变量和缓冲区确保没有不必要的内存占用。运行时崩溃或卡死1. 堆栈溢出。2. 中断服务程序如PDM回调执行时间过长。3. 内存碎片化。1. 在platformio.ini如果使用PlatformIO或修改Arduino IDE的编译选项适当增大堆栈大小。2. 确保onPDMdata()回调函数只做最简单的数据搬运复制到环形缓冲区绝不在其中进行打印等耗时操作。3. 避免在循环中动态分配内存如malloc,new尽量使用静态或全局缓冲区。分类结果全是噪音或随机乱跳1. 音频数据流未正确对齐或损坏。2. 特征计算与训练时不一致。3. 实际环境噪音与训练集差异巨大。1.关键检查通过串口打印出原始音频样本的几个值看看是否在合理范围内如-32768到32767。如果全是0或固定值说明麦克风未正确初始化或数据通路有问题。2. 确保设备端代码中的MFE特征提取参数滤波器数、帧长等与EI Studio中训练模型时使用的参数完全一致。这些参数通常固化在生成的模型库中但也要确认你的预处理代码没有擅自改动。3. 在真实环境中重新采集一些背景噪音加入到训练集的“噪音”类别中重新训练。置信度始终很低0.51. 模型未正确识别特征。2. 输入音频音量过低或过高。1. 使用Edge Impulse的“实时分类”功能用同一块开发板录制声音查看云端模型的表现。如果云端表现好而部署后差问题在部署端如果云端也差问题在模型或数据。2. 在代码中添加自动增益控制或音量归一化预处理。在推理前计算音频缓冲区的RMS均方根值如果音量太低则放大信号如果太高则衰减。确保输入模型的音频振幅范围与训练时相近。特定鸟种识别率低1. 该鸟种训练数据不足或质量差。2. 该鸟种叫声与背景噪音或其他鸟种相似度高。1. 回到数据阶段针对性补充该鸟种在不同场景、不同个体下的高质量叫声样本。2. 在EI Studio的“混淆矩阵”中确认是否与该鸟种与其他类别混淆。如果是可以尝试对该鸟种的数据进行更多样化的增强如添加特定类型的噪音。3. 考虑是否将该鸟种与易混淆的类别合并作为一个更大的“类群”来识别。功耗过高电池消耗快MCU和麦克风持续全速工作。1.实现间歇性监听让设备工作监听2.5秒推理1秒然后深度睡眠如10秒。这需要配置定时器中断唤醒。2.利用硬件特性Nano 33 BLE Sense的麦克风是否支持低功耗模式查阅数据手册。3.降低时钟频率如果不影响推理实时性可以尝试在睡眠后以较低的主频运行。一个关键的调试技巧可视化中间结果。在怀疑特征提取有问题时我修改了设备端代码将计算出的MFE特征数组通过串口打印出来注意数据量很大需要分批打印并可能降低波特率。然后将这些数据复制到电脑上用Python的Matplotlib绘制成频谱图。将这幅图与在Edge Impulse Studio中对同一段音频进行“实时分类”时生成的频谱图进行对比。如果两者形状差异巨大那就铁定是设备端的预处理代码出了问题。这个对比方法在定位信号处理链路上的bug时非常有效。7. 项目总结与未来演进思考完成这个项目最深的体会是边缘AI落地的核心在于权衡——在有限的算力、内存和功耗约束下权衡模型的精度、速度和大小。你不可能在MCU上跑一个ResNet50但通过精心设计的数据集、合适的特征提取和高度优化的轻量级网络完全可以在特定任务上达到实用级的性能。这个鸟类声音分类系统目前只是一个原型但它清晰地验证了技术路线的可行性。从技术角度看后续可以从几个方向深化模型层面的优化可以尝试更高效的神经网络架构如MobileNetV1/V2的深度可分离卷积变体或者专为音频设计的MCUNet等。也可以探索知识蒸馏用一个在云端训练好的大模型教师模型来指导这个小模型学生模型的训练从而在不增加推理成本的前提下提升精度。工程化与产品化是另一个维度。真正的野外部署需要坚固的防水外壳、太阳能电池板锂电池的供电系统、以及更健壮的固件看门狗、OTA升级等。在算法上可以引入语音活动检测模块只有检测到可能的鸟叫声时才启动完整的分类流程进一步省电。还可以结合时间序列分析识别鸟类的鸣唱模式而不仅仅是孤立的叫声片段。这个项目的意义超出了技术本身。它提供了一个模板展示了如何将看似高深的机器学习以一种低成本、可复现的方式应用到环境保护、生物监测等具体领域。你可以用同样的技术栈Arduino Nano 33 BLE Sense Edge Impulse去识别昆虫鸣叫、监测森林中的非法砍伐声、或者进行简单的工业设备异常声音诊断。当智能从云端下沉到边缘它便拥有了更即时、更隐私、更广阔的用武之地。