基于麦克风的呼吸声检测:从信号处理到睡眠监护应用

发布时间:2026/10/24 4:37:09
基于麦克风的呼吸声检测:从信号处理到睡眠监护应用 呼吸声检测这个题目我第一次做的时候纯粹是因为被客户一个需求问住了他们打算做一套睡眠监护方案不想用胸带、不想贴电极、也不想在床垫里埋压力传感器就问能不能靠一只普通麦克风把人睡着以后的呼吸状态“听”出来。我当时第一反应是这事儿不太靠谱因为麦克风听到的东西太杂了空调、风扇、翻身声、窗外的车流声全混在一起呼吸那点音量在里面简直像一根掉进草丛里的针。但调研了一圈之后发现呼吸声其实是有很强的声学规律的而且用不用穿戴设备去测呼吸在很多场景里简直天差地别。这个项目最后做出来的系统并不复杂核心就是一根麦克风加一套信号处理流程采集音频、滤掉环境底噪、提取呼吸包络、估算呼吸频率再结合一个轻量分类器判断当前是平稳呼吸、喘息还是长时间呼吸停顿。整个过程中真正难的不是算法有多高级而是对“呼吸声到底是什么声音”这件事理解得够不够细。这篇文章我把整个开发过程从头拆到尾包括方案选型、数据采集、滤波参数、特征提取、模型训练和实测排查适合正在做声学健康监测、语音信号处理或者智能家居睡眠监护的人参考照着走能少踩不少坑。1. 呼吸声检测的核心思路为什么非要用“听”而不是“测”1.1 技术路线怎么选麦克风方案凭什么胜出开始做技术选型的时候我列了一堆能测呼吸的办法雷达波测胸腹微动、热成像测口鼻气流温差、压电薄膜测体动、红外测距测胸廓起伏再加上麦克风听声音。五花八门每一条路都有成熟产品。我最后选麦克风做方案核心原因是三个字环境依赖。后面我会详细讲。先说对比技术路线核心原理优势致命短板雷达毫米波/多普勒发射电磁波反射信号受胸腹起伏调制穿透床单、抗遮挡能力强成本偏高对側躺和被子堆叠容易误判硬件门槛高热成像口鼻区域温度随呼出气流变化直观、准确对环境温湿度敏感设备贵侧睡时气流方向偏移就丢失信号压电体动传感器感知身体压迫引起的微压变化成本低、隐私性好对浅呼吸不敏感分不清是翻身还是呼吸信号被体动干扰得厉害麦克风音频方案采集气流经过呼吸道时产生的声学信号成本极低、部署灵活、可用现成智能设备信噪比难控制对环境噪声敏感雷达和热成像看着都很高级但有一个共同问题它们对“姿态”的依赖特别大。人睡着以后不可能一直保持平躺翻个身、侧躺、被子拉过头顶信号质量马上就崩。麦克风就不一样它不太关心人朝哪个方向睡只要呼吸道产生气流声声音就会辐射出来哪怕侧着睡脸埋进枕头里还是有一路微弱的声音透过织物传到空气中。另外还有一个现实考量麦克风硬件太普及了。很多智能家居设备、婴儿监护器、老人看护设备本身自带麦克风如果纯粹做软件方案连硬件都不用换。所以最后我用音频路线做了整套系统并且越做越觉得这条路是对的。1.2 系统整体架构和数据流整套系统的数据流是这么走的麦克风采集原始音频经过预处理去除环境底噪再分帧加窗提取特征之后进入两级检测逻辑——先判断有没有呼吸再判断呼吸节奏是否正常最后统一输出统计结果。为什么要做两级检测而不是一个模型直接输出主要原因是算力和实时性。在低功耗设备上如果每个音频帧都跑一遍复杂模型CPU占用和耗电量根本扛不住。我做的第一级是轻量规则判定用短时能量和频谱特征先做一个粗筛只有“疑似有呼吸”的片段才交给第二级做细致的呼吸周期解析。这样大部分时间系统都在低功耗的规则模式跑能把绝大多数静音片段和纯噪声挡在门外效果实测非常明显整体CPU占用能压到三分之一以下。项目初期我连摄像头的方案都考虑过后来被一个做医疗设备的朋友劝住了。他说得很直接睡眠场景里的隐私问题通常没有讨价还价的余地用户对“床上有摄像头”的接受度极低但你对“床附近有麦克风”的接受度就高很多因为很多智能音箱和监护设备本来就放在床头柜上用户已经习惯了。这也是麦克风方案真正落地的关键优势。2. 数据采集与预处理决定成败的前50米2.1 麦克风选型与摆放不是越贵越好是越合适越好很多人做声音项目上来就纠结麦克风买多贵的其实在实际测试里影响结果最大的根本不是麦头价格而是采样链路和摆放位置。我先后试过三种方案笔记本内置麦克风、手机领夹麦、USB桌面电容麦。笔记本内置麦克风的底噪太大尤其把录音增益拉到40%以上后能听到明显的电流嘶声呼吸信号被埋得死死的。手机领夹麦灵敏度很高近距离拾音效果惊艳但放在床头柜上稍微远一点就过载稍微近一点又削波非常难调到合适增益。最后我稳定用的是入门级USB电容麦克风16bit采样48kHz采样率放在离床头大概60到80厘米的位置。这里要重点讲一下摆放和增益。麦克风的拾音方向一开始被我忽略了直接对着床头放结果发现离风口近的时候房间里开空调会把风噪声全拾进来低频隆隆声甚至把我的带通滤波器都压不住。后来把麦克风放到床侧偏离空调出风口直线同时让拾音面微微朝上倾斜效果立刻改善很多。增益设置也是个反复试出来的细节。太低了呼吸声比环境底噪还低算法什么都提不出来太高了就在吸气瞬间信号削波虽然波形看不太出来但算短时能量的时候会出现刺耳峰值呼吸周期被切成碎片。我最后的经验是把增益调到日常说话音量时峰值电平大约-12dB到-6dB之间给呼吸声留足动态余量这样正常呼吸时信号不会削波深呼吸时也能兜住。采集格式我统一用WAV采样率48kHz位深16bit。实时采集用声卡API直接读PCM流每一帧1024个采样点帧移512这样对应的帧时间大约21毫秒对呼吸这种慢变化信号来说分辨率已经足够。2.2 预处理流程滤波、降噪的具体操作拿到原始音频之后第一步不是急着算特征而是把信号理干净。呼吸声本身的频率能量主要集中在低频和中低频段我在项目里测下来成年人正常呼吸的声学主峰大多落在250Hz到1000Hz之间婴幼儿略高但一般也不会超过1500Hz。这个频段特点非常关键——它意味着我可以大胆做一个带通滤波器把环境里的高频噪声和低频隆隆声挡在外面。我的预处理顺序是这样的去直流偏移DC removal有些声卡和麦克风电路会有轻微的直流偏置不去掉会导致后续能量计算有常数偏移。50Hz/60Hz工频陷波根据所在地区的市电频率做陷波处理我在实验环境里碰到的主要是低频嗡嗡声。巴特沃斯带通滤波我用的四阶巴特沃斯滤波器低端截止频率设置在100Hz高端设置在2000Hz。低切100Hz可以有效去掉空调低频轰鸣和墙壁传导的震动声高切2000Hz则是为了去掉蚊音、高频嘶声和电子设备啸叫。噪声基底估计和轻微谱减先取录音前两秒作为背景噪声估计段计算它的平均功率谱再从后续每一帧的功率谱里减去这个基底做一个“轻量谱减法”。这里要专门提醒一下谱减法不能做狠了。我一开始用经典谱减法减到舒服的时候发现呼吸声中间出现了很多音乐噪声就是那种像金属摩擦一样的毛毛躁躁声反而把呼吸的连续性破坏了。后来我把谱减法做成“软化版”只做大概六成的减噪强度然后把残余噪声基底保留一个最小值比如不让它低于原始噪声底的-40dB这样呼吸声听着是连续干净的不会出现明显的合成感。预处理做完之后我给每帧信号做加窗处理因为后面马上要做傅里叶变换不加窗会产生频谱泄漏。我用的是汉宁窗帧长1024个点傅里叶变换点数是2048频率分辨率大概23Hz足够区分呼吸声和环境噪声的谱形了。3. 特征提取把呼吸声翻译成机器能听懂的数字3.1 时域特征先解决“这段时间到底有没有呼吸”的问题预处理完成到特征提取阶段第一个要解决的问题就是怎么从一长段音频里判断出某个瞬间到底有没有呼吸。这个用数学模型说就是“周期性检测”问题我的做法是先提取信号包络再做自相关运算找周期。先说包络提取。呼吸声和普通语音有个非常大的区别舌头、声带和牙齿都不参与发声声音纯粹是气流摩擦产生的因此它的波形不像语音那样有清晰的音调周期而是更像一种“连续的、起伏的噪声”。这里可以做包络提取来观察呼吸的起伏节奏。我用的方法是希尔伯特变换把实信号包络提出来然后再做一次滑动平均平滑窗口大概300毫秒把细小毛刺抹掉。做完包络之后正常成年人的呼吸曲线长什么样呢你可以想象一条波浪线吸气段有一个快速上升的峰呼气段有一个更长更平缓的拖尾中间几乎没有停顿。所以正常呼吸的包络大概每3到5秒会出现一个峰谷周期对应每分钟大约12到20次两个呼吸峰之间的间隔通常在1到2秒之间。拿到包络曲线后我做了两件事一是算短时能量在包络窗口内求平方和判断“呼吸事件”是否发生二是用自相关函数算呼吸周期。自相关是为了找周期这招对慢信号特别好用因为环境噪声通常是随机的自相关峰值不明显而呼吸是有规律重复的在对应呼吸周期的时延处会产生一个明显的高峰。我当时用自相关检测呼吸周期的效果比硬找峰值稳定得多尤其对那种吸气弱呼气强的非对称呼吸特别有效。3.2 频域特征用频谱形状区分“呼吸”和“噪声”时域特征能答“有没有”但答不好“是不是”。很多环境噪声——尤其风扇电机声、远处空调压缩机的嗡嗡声——也是周期性出现的光靠包络和自相关很容易误判。这时候就要交给频域特征。呼吸声的频谱有一个很典型的特点能量集中在中等偏低频高频部分衰减非常快。这意味着两个重要特征可以配合使用一个是频谱质心另一个是梅尔频段能量。频谱质心衡量的是“这个声音的能量主峰集中在哪个频率附近”呼吸声的质心通常落在300到900Hz之间而风扇噪声的质心往往被分散到1kHz以上。两者一对比就能明显分开。梅尔频带能量我开始用的是梅尔频率倒谱系数MFCC这是语音识别里最常用的特征后来发现直接做呼吸检测有点踩坑—— MFCC做了离散余弦变换DCT把频带能量压成一堆系数反而不直观。于是我改成了直接用梅尔尺度的对数能量谱取前16个梅尔频带的能量值作为特征向量的主体。这个改法让分类器的可解释性好了很多也方便我后续针对异常数据做特征调试。最终我喂给分类器的特征向量是这么拼的梅尔频带能量16维、频谱质心1维、频谱带宽1维、包络短时能量1维、过零率1维总共20维。每帧算一次帧和帧之间再做一次少量重叠的平滑避免因为单帧噪声导致分类结果频繁跳动。4. 检测与分类阈值规则、模型训练与实时性之间的平衡4.1 初版方案用自适应阈值和规则过滤做“粗检测”第一版系统我没上任何模型纯用规则逻辑。现在回头看这套规则方案虽然笨但它像一块特别好的试金石逼着我把信号的基本特征摸透了。核心规则是三条短时能量超过当前环境噪声基准的倍率阈值比如3到4倍就标记为“疑似呼吸事件”。相邻两次疑似呼吸事件的时间间隔必须落在呼吸周期的生理范围内。成年人在0.6秒到5秒之间婴儿因为呼吸频率更高会收紧到0.4秒到2秒之间超出这个范围的事件直接丢弃。单个呼吸事件的持续时间必须大于0.3秒小于3秒。这个规则是用来挡咳嗽、打喷嚏、翻身这一类短促尖锐声音的。阈值不是写死的而是实时自适应更新。我维护了一个长度为2秒的滑动窗口窗口内取背景噪声的能量百分位数比如90分位作为当前环境动态基准。这样空调一开、背景噪声变大阈值也会跟着升高不至于把所有声音都当成呼吸。这套机制在安静卧室里实测效果不错准确率能到90%左右但一到开空调或者有马路低频噪声的环境就露馅了因为风扇频谱和呼吸频谱在低频段重叠非常严重规则挡不住。4.2 进阶方案随机森林分类器与实时推理规则方案顶到天花板之后我换成了数据驱动的分类器。项目数据是分几天录的场景包括安静房间、开空调、开风扇、盖厚被子侧躺、平躺呼吸轻浅等不同情况总共采集了大概20个小时有效音频标注出呼吸、说话、翻身摩擦、风扇噪声、静音这五类片段。模型我选了随机森林理由很务实特征只有20维数据量不大用不上深度学习随机森林在几百棵树之内推理速度极快在单核ARM设备上跑一帧特征也就几毫秒完全没有实时性压力。训练集6000条样本测试集1500条五分类任务的平均F1分数做到0.86左右其中“呼吸”类别的召回率在0.9以上——这说明大部分呼吸片段都被正确挑出来了漏的情况不多。识别逻辑最后做成这样每帧跑分类器得到呼吸和非呼吸的概率然后对连续多帧做中值滤波窗口大概5帧。如果连续超过15帧都被判为呼吸才正式确认一次“呼吸事件”连续超过20帧都不是呼吸则结束当前呼吸事件。这个平滑策略非常关键否则模型输出会像心电图一样不停抖动呼吸事件会被切得乱七八糟。整个系统跑在真实设备上的表现CPU占用平均不到10%一帧音频的处理总延迟在30毫秒以内呼吸频率统计结果跟人工数呼吸对比误差在每分钟1到2次以内。5. 实测翻车记录与排查心得5.1 常见问题速查表做任何声学项目前期设计再完美一进实地场景还是会不停翻车。我整理了整个项目里遇到的几类高频问题直接做成一张排查表现象可能原因解决方式呼吸频率忽快忽慢数值不停跳环境噪声被误判为呼吸事件或者呼吸包络因削波被切成多个峰调高能量阈值重新校准增益避免信号削波检查自相关窗口长度是否合理侧睡时完全检测不到呼吸侧睡呼吸声朝向枕头声音被吸收调整麦克风朝床侧偏转用多点测试找到最佳拾音位置不要正对床头翻身的被子摩擦声被当成呼吸摩擦声短促尖锐波形和呼吸很不一样但频谱接近增加频谱质心特征约束把质心偏高的事件过滤掉重叠的包络峰用持续时间规则清理空调/风扇噪声导致误报率飙升风扇的周期性低频噪声和呼吸在低频段重叠加强带通滤波低端截止频率比如从100Hz提高到150Hz训练集加入风扇噪声样本鼾声混入后呼吸频率翻倍鼾声本身有节奏和呼吸包络叠加成了双峰单独标注鼾声类型在分类器加上鼾声类别呼吸周期计算改用峰值间隔中位数而不是均值咳嗽、清嗓子被算成呼吸停顿咳嗽前的停顿和咳嗽后的恢复被错误拼接把咳嗽片段也作为一个训练类别用呼吸事件的“时长分布”规则做二次过滤5.2 数据标注和验证——容易被低估的“脏活”这个项目最耗费精力的反而不是算法是做数据标注。呼吸声的标注跟语音标注完全不一样单看波形图很容易认错因为呼吸和翻身声在一段短录音里看起来很相似。我的做法是标注人员必须使用分段试听每一段30秒的正穿合成回放一边听一边在波形图上标记呼吸的起止点同时记录环境状态和姿势状态比如“平躺”“侧卧”“空调开”“安静”之类。这么做过之后我发现了一个很有意思的问题不同标注员对“一次呼吸”的起止点判定能差10%到20%。因为呼吸本身没有绝对的起止时刻吸气是渐起渐弱的两个人对“呼气结束”和“下一次吸气开始”的边界理解可能完全不同。我最后统一的标准是包络曲线最低点算相邻两次呼吸的边界并且做成标注工具里的半自动辅助先把自相关算出的周期位置展示给标注员参考让他们微调确认这样一致性才提到可用的水平。5.3 实时部署与设备校准的额外提醒模型在电脑上跑得好不代表放到真实设备上就稳。我踩过一个大坑是不同麦克风的频率响应差异。同一套模型在A设备上识别正常换到B设备上准确率掉一截就是因为不同麦克风的频响曲线差异很大有的在低频段增益低有的在1kHz附近有峰。第二次我就学乖了把特征提取模块做成可校准的部署到新设备时先跑一段背景噪声采集自动算出一个均衡因子补偿麦克风频响差异。另外增益校准建议每个部署周期做一次因为设备固件更新、系统音量设置变化都可能导致实际采样电平变化。我最后在采集程序里加了个自动电平校准功能启动后先播放一段标准音量参考音通过声卡采集回读实际电平再用软件增益把有效电平调到目标区间。这一招省了我大量维护时间。写在最后的一点实际体会这个项目做到后期我发现真正的门槛不在算法而在对物理场景的理解。呼吸声检测首先是一个工程问题然后才是一个算法问题。麦克风怎么摆、增益怎么调、滤波器截止频率怎么选这些看似“低端”的细节每一个都比模型的准确率更影响最终体验。你也别急着上深度学习先把数据采集和特征工程这块做扎实用一套规则模型跑通全流程再考虑模型复杂度这是我自己走下来最顺畅的一条路。如果以后要做扩展建议从多设备协同入手比如一个麦克风放在床头柜、一个放在床尾两路信号交叉验证能大幅提升遮挡场景下的稳定性和不同睡姿的鲁棒性这也是我现在正打算做的新方向。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询