Python音频处理librosa Python librosa 音频处理详解包含音频加载、梅尔频谱图、STFT、MFCC 特征、音高检测、音频可视化import librosaimport librosa.displayimport numpy as npimport matplotlib.pyplot as pltdef generate_test_tone(duration3.0, sr22050):生成一个测试音频信号包含两个不同频率的正弦波t np.linspace(0, duration, int(sr * duration), endpointFalse)# 440HzA4 音和 880HzA5 音的混合带淡入淡出tone1 0.5 * np.sin(2 * np.pi * 440 * t)tone2 0.3 * np.sin(2 * np.pi * 880 * t)signal tone1 tone2# 应用淡入淡出包络避免点击声fade_len int(sr * 0.05)fade_in np.linspace(0, 1, fade_len)fade_out np.linspace(1, 0, fade_len)signal[:fade_len] * fade_insignal[-fade_len:] * fade_outreturn signal, srdef plot_audio_features(y, sr, save_nameaudio_features.png):绘制音频的各种特征图plt.figure(figsize(14, 10))# 子图 1原始波形plt.subplot(4, 2, 1)librosa.display.waveshow(y, srsr)plt.title(波形图 (Waveform))plt.xlabel(时间 (秒)), plt.ylabel(振幅)# 子图 2短时傅里叶变换 (STFT) 频谱图plt.subplot(4, 2, 2)D librosa.stft(y) # STFT 返回复数矩阵# 将复数振幅转为分贝刻度视觉上更清晰D_db librosa.amplitude_to_db(np.abs(D), refnp.max)librosa.display.specshow(D_db, srsr, x_axistime, y_axishz)plt.title(STFT 频谱图 (Spectrogram))plt.colorbar(format%2.0f dB)# 子图 3梅尔频谱图模拟人耳感知plt.subplot(4, 2, 3)mel_spec librosa.feature.melspectrogram(yy, srsr, n_mels128)mel_db librosa.power_to_db(mel_spec, refnp.max)librosa.display.specshow(mel_db, srsr, x_axistime,y_axismel, fmax8000)plt.title(梅尔频谱图 (Mel Spectrogram))plt.colorbar(format%2.0f dB)# 子图 4MFCC 特征梅尔频率倒谱系数plt.subplot(4, 2, 4)mfcc librosa.feature.mfcc(yy, srsr, n_mfcc13)librosa.display.specshow(mfcc, srsr, x_axistime)plt.title(MFCC 特征 (13 维))plt.colorbar()# 子图 5色度特征Chroma12 个音级类别plt.subplot(4, 2, 5)chroma librosa.feature.chroma_stft(yy, srsr, n_chroma12)librosa.display.specshow(chroma, srsr, x_axistime, y_axischroma)plt.title(色度特征 (Chroma))plt.colorbar()# 子图 6谱质心Spectral Centroid—— 音色明亮度plt.subplot(4, 2, 6)cent librosa.feature.spectral_centroid(yy, srsr)times librosa.times_like(cent, srsr)plt.semilogy(times, cent.T, label谱质心, colorb)plt.ylabel(频率 (Hz)), plt.xlabel(时间 (秒))plt.title(谱质心 (Spectral Centroid))plt.grid(True)# 子图 7零交叉率Zero-Crossing Rateplt.subplot(4, 2, 7)zcr librosa.feature.zero_crossing_rate(y)plt.plot(librosa.times_like(zcr, srsr), zcr.T, colorg)plt.title(零交叉率 (ZCR))plt.xlabel(时间 (秒)), plt.ylabel(ZCR)plt.grid(True)# 子图 8RMS 能量Root Mean Square Energyplt.subplot(4, 2, 8)rms librosa.feature.rms(yy)plt.plot(librosa.times_like(rms, srsr), rms.T, colorr)plt.title(RMS 能量 (RMS Energy))plt.xlabel(时间 (秒)), plt.ylabel(RMS)plt.grid(True)plt.tight_layout()plt.savefig(save_name, dpi150)plt.show()# 1. 加载音频文件 # 尝试加载外部音频文件若失败则使用生成的测试信号audio_path input_audio.wavtry:y, sr librosa.load(audio_path, srNone)print(f加载音频: {audio_path}, 采样率{sr}Hz, 时长{len(y)/sr:.2f}s)except Exception:print(f文件 {audio_path} 不存在使用生成的测试音调。)y, sr generate_test_tone(duration3.0)print(f生成测试音频: 采样率{sr}Hz, 时长{len(y)/sr:.2f}s)# 2. 时域分析波形和过零率 print(f音频基本信息: 采样点数{len(y)}, 采样率{sr}Hz)print(f振幅范围: [{y.min():.4f}, {y.max():.4f}])# 3. 频域分析STFT 和频谱 # STFT 参数fft 窗口2048hop 长度512窗口类型汉宁窗D librosa.stft(y, n_fft2048, hop_length512, win_length2048)magnitude np.abs(D) # 幅度谱phase np.angle(D) # 相位谱print(fSTFT 矩阵形状: {D.shape} (频率 bins x 时间帧数))# 4. 梅尔频谱图 mel librosa.feature.melspectrogram(yy, srsr, n_mels128)mel_db librosa.power_to_db(mel, refnp.max)print(f梅尔频谱形状: {mel.shape})# 5. MFCC 特征提取 # MFCC 是语音识别中最常用的特征模拟人耳听觉特性mfcc librosa.feature.mfcc(yy, srsr, n_mfcc13, n_fft2048, hop_length512)mfcc_delta librosa.feature.delta(mfcc) # 一阶差分速度mfcc_delta2 librosa.feature.delta(mfcc, order2) # 二阶差分加速度print(fMFCC 形状: {mfcc.shape})print(fMFCC 均值: {mfcc.mean(axis1)})# 6. 音高检测基频估计 # 使用自相关法pyin 算法估计基频 F0f0, voiced_flag, voiced_probs librosa.pyin(y, fminlibrosa.note_to_hz(C2), # 最低 65Hzfmaxlibrosa.note_to_hz(C7), # 最高 2093Hzsrsr)# 将 NaN无声部分填充为 0f0 np.nan_to_num(f0)valid_pitches f0[f0 0]if len(valid_pitches) 0:print(f检测到音高范围: {valid_pitches.min():.1f}Hz ~ f{valid_pitches.max():.1f}Hz)# 将频率转为 MIDI 音符编号midi_notes librosa.hz_to_midi(valid_pitches)note_names [librosa.midi_to_note(int(n)) for n in midi_notes[:10]]print(f前 10 个有效音高的音符: {note_names})# 7. 节拍跟踪 tempo, beats librosa.beat.beat_track(yy, srsr)print(f估计速度: {tempo:.1f} BPM)if len(beats) 0:beat_times librosa.frames_to_time(beats, srsr)print(f检测到 {len(beats)} 个节拍位置)# 8. 绘制所有音频特征 plot_audio_features(y, sr)print(librosa 音频处理演示完成涵盖时域/频域/MFCC/音高/节拍分析。)