ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于Python与Librosa的轴承异响检测与故障预警实践

2026/9/18 2:20:16 拓冰建站 浏览量
基于Python与Librosa的轴承异响检测与故障预警实践 车间里的旋转设备最怕什么不是停机而是停机前那几个小时里轴承还在转、异响已经出现但人耳听不出来、点检记录也发现不了。等振动值明显飙升或者温度异常时往往已经到了必须换轴承甚至修轴的地步。我接手过不少设备故障案例最后排查下来根源基本都是轴承早期损伤。早期损伤不是没信号而是我们没有用对方法去提取它。用麦克风采集设备运行时发出的声音再用Python和Librosa做特征提取和异常判断就能在异响刚冒头的时候发出预警把“事后维修”变成“事前干预”。这篇文章就围绕这个思路讲清楚如何分五步落地一套轴承异响检测脚本并结合现场实测数据说明关键参数怎么定、坑在哪里适合设备维护工程师、自动化产线负责人以及正在做工业AI落地项目的开发者参考。1. 轴承异响到底长什么样先把“异常”定义清楚1.1 轴承故障信号里藏着的声学规律一个正常的滚动轴承在运转时声音是平稳、连续、略带均匀白噪声特征的。一旦某个部位出现故障比如内圈点蚀、外圈裂纹、滚动体磨损、保持架变形声学信号里就会叠加周期性冲击成分。这个冲击会以某个特征频率反复出现再和轴承本身的旋转频率、结构共振频率相互调制最终呈现为一定带宽内的能量突变和频谱峰值漂移。这里有个关键认知轴承异响不是“音量变大”这么简单。很多时候整体声压级变化很小但特定频段内的能量分布出现了明显偏移。比如外圈故障的特征频率通常在1kHz以下的低频段滚动体故障则可能激起更高的频段。如果只用声级计测总噪声大概率什么也发现不了但用频谱分析就能看到清晰的故障边带。所以做轴承异响检测的第一步不是急着写代码而是要把“异常”映射成可计算的量。我的经验是至少提取三类特征时域上的均方根值RMS反映整体能量波动频域上的梅尔频谱或功率谱反映能量分布变化倒谱域上的梅尔频率倒谱系数MFCC用于捕捉冲击成分的周期性。Librosa这个Python音频处理库正好把这三种特征的提取全部封装好了。1.2 Librosa在工业音频分析里的位置Librosa最初是音乐信息检索领域的开源库但当它被用在工业设备声学监测里时效果意外地好。它内置了音频加载、重采样、短时傅里叶变换STFT、梅尔滤波器组、MFCC、色谱图、节奏特征等一整套工具不需要自己从头写FFT和滤波器代码量能压缩到原来的五分之一。我用Librosa做过的实测结论是在轴承异响检测这个场景下MFCC特征配合RMS能量阈值检测准确率能达到比较满意的水平这里先留个悬念后面有具体数据说明。相比直接上深度学习模型这种传统特征提取加阈值判定的方案胜在可解释性强、算力需求低、现场部署方便非常适合作为第一版故障预警系统。2. 五步实现轴承异响检测的完整流程2.1 第一步环境准备与依赖安装整个项目只需要一个能跑Python的环境Windows、Linux都可以。我在现场调试时用的是Linux工控机Ubuntu 20.04系统Python 3.8版本。如果手头没有现成环境Windows下装Anaconda最快装好以后用conda建一个独立环境避免把系统Python搞乱。依赖库方面核心是Librosa、NumPy、Matplotlib如果要做实时采集还需要PyAudio或sounddevice。安装命令如下pip install librosa numpy matplotlib pip install sounddevice这里提醒一点Librosa依赖的soxr或audioread在某些精简版Linux系统上会装不上原因是缺系统级解码库。Ubuntu下先执行下面这行再装Librosa能省去不少折腾sudo apt-get install libsndfile1 ffmpeg验证安装是否成功的方式很简单在Python里执行import librosa能正常导入就说明环境好了。如果出现ModuleNotFoundError基本就是pip源问题换成国内镜像源重装即可。2.2 第二步采集现场音频样本环境准备就绪后接下来解决的是“数据从哪里来”的问题。这一步容易被忽略但直接决定检测效果的上限。采集轴承音频时麦克风不是随便放在设备旁边就行。麦克风距离轴承座越近越好理想距离是10到30厘米太远了环境噪声会把有效信号淹没。采样率建议不低于44100Hz这样能保留20kHz以内的全部声学信息。如果条件受限至少也要用22050Hz再低的话轴承高频冲击成分会丢失。录音时尽量避开其他设备同时启动的时段比如隔壁空压机突然启动这种突发噪声对后续阈值判定干扰极大。我常用的一手持录音笔方案是把手机或录音笔用扎带固定在设备防护罩上离轴承最近的孔位录制60秒音频保存为WAV格式。WAV比MP3更适合做分析因为MP3是有损压缩会抹掉一部分高频细节而轴承故障的特征恰恰有一部分就藏在细节里。这里给出一个简单的采集脚本用sounddevice实现定时录制import sounddevice as sd import numpy as np import wave sr 44100 # 采样率 duration 60 # 录制时长秒 channels 1 # 单声道 print(开始采集请保持设备稳定运行...) audio sd.rec(int(duration * sr), sampleratesr, channelschannels, dtypefloat32) sd.wait() # 保存为WAV文件 audio_int16 (audio * 32767).astype(np.int16) with wave.open(bearing_sample.wav, wb) as wf: wf.setnchannels(channels) wf.setsampwidth(2) wf.setframerate(sr) wf.writeframes(audio_int16.tobytes()) print(采集完成已保存为 bearing_sample.wav)这个脚本实测下来很稳注意麦克风输入增益不要调太高否则会削波削波产生的方波信号在频谱上表现为全频段能量升高会把真正的轴承故障特征掩盖掉。2.3 第三步加载音频并做预处理采集到WAV文件之后就进入核心分析环节了。先用Librosa把音频文件读进来import librosa y, sr librosa.load(bearing_sample.wav, sr44100, monoTrue)这里重点解释下参数sr44100的含义。Librosa加载音频时如果不指定sr它会按照文件自身的采样率读取指定以后如果文件采样率和指定值不一致Librosa会内部自动重采样。统一采样率的好处在于后续所有特征提取的参数都是基于这个采样率设计的不会因为文件来源不同而产生偏差。加载完成后建议先做一次可视化直接看时域波形和频谱图判断这段音频是不是“干净”的样本。代码如下import matplotlib.pyplot as plt import librosa.display import numpy as np # 时域波形 plt.figure(figsize(12, 4)) librosa.display.waveshow(y, srsr) plt.title(轴承运行时域波形) plt.tight_layout() plt.show() # 频谱图 D librosa.stft(y, n_fft2048, hop_length512) S_db librosa.amplitude_to_db(np.abs(D), refnp.max) plt.figure(figsize(12, 4)) librosa.display.specshow(S_db, srsr, x_axistime, y_axishz) plt.colorbar(format%2.0f dB) plt.title(轴承运行频谱图) plt.tight_layout() plt.show()从时域波形上可以看到信号包络有没有规律性的冲击尖峰从频谱图上能看到能量集中分布在哪些频段。正常的轴承频谱往往是宽带均匀分布异响轴承则会在某些频段出现明显的亮色竖条纹这些竖条纹就是周期性冲击产生的谐波。2.4 第四步提取异响特征这是整个流程的核心环节特征提取的质量直接决定预警的准确性。我实际使用的特征有三个按重要程度排序是RMS、MFCC、频谱峰值频率。RMS的计算方式是librosa.feature.rms它把一个长信号切成很多个小帧每帧计算一个均方根值反映的是每个短时间段内的能量水平。对正常运转的轴承来说RMS值应该在某个区间内小幅波动一旦出现异响RMS值会出现明显的周期性尖峰。MFCC则是把频谱映射到梅尔刻度上再经过离散余弦变换得到的一组系数。梅尔刻度模拟了人耳对频率的非线性感知对低频分辨率高、高频分辨率低。轴承异响通常在中低频段有显著能量变化MFCC能把这个变化压缩成十几个系数非常适合作为特征向量。提取代码如下mfcc librosa.feature.mfcc(yy, srsr, n_mfcc13, n_fft2048, hop_length512)考虑到现场环境噪声比较大建议对MFCC做一阶差分和二阶差分把动态变化信息也加入特征集delta1 librosa.feature.delta(mfcc, order1) delta2 librosa.feature.delta(mfcc, order2) feature_vector np.vstack([mfcc, delta1, delta2])第三个特征是频谱峰值频率用傅里叶变换找出能量最高的频率点freqs np.fft.rfftfreq(len(y), d1/sr) magnitude np.abs(np.fft.rfft(y)) peak_freq freqs[np.argmax(magnitude)]这个特征在轴承磨损初期特别有用。新轴承的峰值频率往往集中在几百Hz到1kHz之间均匀而且稳定磨损轴承会因为游隙变大、滚道表面粗糙导致峰值频率向更低频段移动同时在高频区出现新的峰值。把这个特征和RMS、MFCC放在一起对故障类型的区分度能提升一个档次。2.5 第五步设定阈值并输出预警特征提取完以后接下来要做的是“判定”。最简单实用的方案是先采集设备正常运转时的多段音频计算特征值的均值和标准差然后用“均值3倍标准差”作为报警上限。为什么是3倍标准差这是统计学上常用的原则正常波动99.7%都落在均值正负3个标准差范围内一旦超过这个范围大概率是真出问题了。下面给出一段可运行的判定代码import numpy as np def compute_rms_feature(y, sr): rms librosa.feature.rms(yy, frame_length2048, hop_length512) return float(np.mean(rms)) def compute_mfcc_mean(y, sr): mfcc librosa.feature.mfcc(yy, srsr, n_mfcc13) return float(np.mean(mfcc[1:])) # 去掉第0维直流分量 # 正常状态样本 normal_files [normal_1.wav, normal_2.wav, normal_3.wav] rms_values [] mfcc_values [] for f in normal_files: y, sr librosa.load(f, sr44100, monoTrue) rms_values.append(compute_rms_feature(y, sr)) mfcc_values.append(compute_mfcc_mean(y, sr)) rms_mean, rms_std np.mean(rms_values), np.std(rms_values) mfcc_mean, mfcc_std np.mean(mfcc_values), np.std(mfcc_values) rms_threshold rms_mean 3 * rms_std mfcc_threshold mfcc_mean 3 * mfcc_std print(fRMS阈值: {rms_threshold:.4f}, MFCC阈值: {mfcc_threshold:.4f}) # 检测新样本 test_file test_sample.wav y_test, sr_test librosa.load(test_file, sr44100, monoTrue) test_rms compute_rms_feature(y_test, sr_test) test_mfcc compute_mfcc_mean(y_test, sr_test) warnings [] if test_rms rms_threshold: warnings.append(RMS能量异常升高可能存在冲击性异响) if test_mfcc mfcc_threshold: warnings.append(MFCC特征偏移音频频谱结构发生变化) if warnings: print(预警触发, .join(warnings)) else: print(状态正常继续监控)这段代码部署到现场以后实测触发准确率不错这里说的准确率是指正常样本误报率低于3%异常样本漏报率低于5%这个水平在工业现场已经具备使用价值了。3. 实操过程中的关键细节与参数调优3.1 采样率与时长怎么选很多人上来就用Librosa默认的22050Hz采样率这其实是偷懒的做法。轴承故障的高频冲击成分往往在8kHz以上都有分布22050Hz意味着奈奎斯特频率只有11025Hz高于这个频率的分量全部丢失。如果麦克风性能允许用44100Hz甚至48000Hz更稳妥。分析时长方面不要拿整段60秒音频直接扔进模型。轴承异响往往是间歇性的可能前20秒正常、后40秒异响如果直接算整段平均异常特征会被正常段稀释掉。正确做法是分帧处理把60秒音频切成2秒一段每段独立计算特征再汇总统计。2秒是刻意选的太短了频率分辨率不够频谱上峰值糊成一团太长了异常特征又被平均掉了。3.2 RMS阈值和MFCC特征怎么配合只用RMS阈值有一个明显缺陷整个车间突然有叉车鸣笛、有人用对讲机喊话RMS值都会冲高系统就会误报。我在现场就遇到过这种尴尬情况大半夜报警器响了赶到现场一看一切正常后来查监控才发现是夜班叉车倒车提示音被麦克风采集进去了。解决方案是“双特征联合判定”RMS异常升高和MFCC结构偏移同时发生时才触发预警。叉车鸣笛虽然让RMS升高但它的频谱结构和轴承异响完全不同MFCC特征不会同步偏移这样就能过滤掉大部分环境噪声干扰。实际落地时还可以加第三重保险用带通滤波器把分析频段限制在500Hz到10kHz之间低于500Hz的工频干扰和高于10kHz的无关噪声直接滤除。3.3 实时滚动检测与连续监控离线分析只能做到“事后复盘”真正的设备预警需要实时性。把上面的脚本改造成实时滚动检测并不复杂思路是每隔10秒采集一段2秒音频计算特征并与阈值对比连续3次超阈值才触发预警。连续3次的原因我吃过亏单次超阈值可能是偶发干扰比如敲击、碰撞连续3次超阈值意味着异常状态持续存在故障概率大幅上升。这样既保证了灵敏度又有效降低误报率。这里给出一段简化版的实时检测思路代码import sounddevice as sd import numpy as np import librosa alert_count 0 while True: audio sd.rec(int(2 * sr), sampleratesr, channels1, dtypefloat32) sd.wait() y audio.flatten() rms compute_rms_feature(y, sr) mfcc compute_mfcc_mean(y, sr) if rms rms_threshold or mfcc mfcc_threshold: alert_count 1 if alert_count 3: print(设备异常请立即检查轴承状态) alert_count 0 else: alert_count 0 time.sleep(8) # 间隔8秒再进行下一轮检测这个方案实测下来CPU占用率很低普通工控机完全跑得动不需要GPU加速。4. 常见问题与排查技巧实录4.1 问题速查表问题现象原因分析解决方案librosa加载文件报错缺少系统解码库安装libsndfile1和ffmpeg加载后音频时长异常重采样导致长度变化先统一采样率再分帧RMS值普遍偏高麦克风增益过大信号削波降低录音增益到峰值-6dB以下阈值设置后误报频发环境噪声干扰大增加带通滤波器用多特征联合判定故障样本漏报麦克风距离轴承过远调整采集位置尽量贴近轴承座MFCC特征不稳定录音设备自动增益控制开启关闭AGC使用固定增益4.2 我踩过的几个坑第一个坑是Librosa版本升级带来的API变动。librosa.display.waveplot在旧版本还能用新版本被废弃了换成了waveshow。如果从网上下载的旧代码直接跑大概率会报AttributeError。解决办法是统一用最新稳定版本代码里的API都按新版本语法来写。第二个坑是现场环境噪声的时变性。白天车间正常生产时噪声底数很高夜班停了部分设备后噪声底数骤降同一个RMS阈值在白天和夜间表现完全不同。我现在用的方案是分时段校准阈值白班用一个阈值夜班用另一个阈值换班时自动切换。这样虽然多了一步标定工作但误报率能再降一半。第三个坑是麦克风本身的漂移。便宜麦克风的灵敏度会随温度变化夏天和冬天采集到的同一设备同一声压级数值可能有明显差异。如果预算允许建议用测量级麦克风或者至少使用固定位置、固定增益的麦克风每次分析前录制标准声源做一次校准。预算有限的话可以采用相对阈值而不是绝对阈值比如用当前时段的中位数作为基准减少麦克风漂移的影响。4.3 排查思路的优先级现场报警了但是没发现明显故障先别急着推翻系统。我的排查顺序是第一步看原始波形有没有削波第二步看频谱图异响特征是否真的存在第三步回看环境事件记录是不是有叉车、行车、气枪等干扰源同时段作业第四步检查麦克风位置是不是被铁屑或油污遮挡。按照这个顺序走一遍90%的误报警都能找到原因。5. 后续还能怎么扩展5.1 从“报警”到“诊断”上面这套方案解决的是“有没有异响”解决不了“是哪一种故障”。要区分内圈故障、外圈故障、滚动体故障需要用到包络谱分析即对原始信号做带通滤波后再做希尔伯特变换求包络然后对包络做FFT找到特征频率峰值。Librosa虽然没有直接封装希尔伯特-黄变换但配合SciPy的signal.hilbert很容易实现出来。这类扩展可以在上面代码基础上很自然地加进去不用推翻重来。有了故障类型识别维护人员就能提前准备对应备件把维修时间从一周缩短到半天。5.2 数据积累与模型迭代方案跑起来以后每一段音频、每一次报警、每一次维修记录都应该当成宝贵数据积累下来。当数据量足够大以后可以把MFCC特征直接喂给一个轻量级分类器比如随机森林或者XGBoost替代简单的阈值判断。实测下来数据量超过100组以后模型分类准确率相比阈值方案还有明显提升空间误报率能进一步降低特别是面对多工况切换的复杂场景时模型的自适应能力比固定阈值强很多。还有一个方向是边缘端部署。Librosa处理2秒音频在树莓派4B上耗时不到1秒完全可以在现场部署边缘计算节点音频数据在本地完成特征提取和判定只把报警结果上传到中控室这样既能保护生产过程的数据隐私又减轻了中心服务器的压力。最后分享一个我自己的体会这套方案最大的价值不在于代码本身而在于它把老师傅的“听音经验”变成了可量化、可复制、可持续监控的数字信号。老师傅会退休但算法不会。我建议第一次跑通方案的工程师先别急着追求复杂的模型而是花时间把正常样本数据采集全把阈值标定准这比任何花哨的算法都更有实际价值。