Python 课程23-LibROSA

news/2024/10/4 0:14:52 标签: python, 开发语言, LibROSA

前言

LibROSA 是一个用于音频分析的 Python 库,特别擅长音乐信号处理和音频特征提取。它提供了广泛的工具来处理音频文件,包括加载、变换、特征提取、可视化等功能。LibROSA 在音乐信息检索(MIR)、机器学习中的音频预处理和音频信号处理等领域被广泛使用。

本教程将带你从基础的音频加载到高级的音频特征提取与分析。你将学会如何使用 LibROSA 处理音频数据、提取特征(如 MFCC、频谱图等),并进行常见的音频操作。


目录

  1. LibROSA 基础

    • 安装 LibROSA
    • 加载音频文件
    • 音频基本操作(播放、裁剪、变速)
  2. 音频处理

    • 计算短时傅里叶变换(STFT)
    • 频谱图与梅尔频谱图
    • 音频过滤与降噪
  3. 特征提取

    • 提取 MFCC 特征
    • 提取零交叉率
    • 提取色度特征
    • 提取音调与和声特征
  4. 可视化音频特征

    • 绘制波形图
    • 绘制频谱图与梅尔频谱图
    • 可视化 MFCC 特征
  5. 音频分析与处理应用

    • 音乐节奏检测
    • 音频分类
    • 自动和弦检测


1. LibROSA 基础

安装 LibROSA

首先,你可以通过 pip 安装 LibROSA

pip install librosa

LibROSA 依赖于 NumPy、SciPy 和 Matplotlib,所以确保这些库已经安装。

加载音频文件

LibROSA 提供了方便的 librosa.load() 函数来加载音频文件,它会返回音频信号和采样率。

import librosa

# 加载音频文件
audio_path = 'audio_file.wav'
y, sr = librosa.load(audio_path, sr=None)  # sr=None 保持原采样率
  • y:包含音频信号的数据。
  • sr:音频的采样率(如 22050 Hz)。

音频基本操作

  • 播放音频:你可以使用 IPython.display 来播放音频。
import IPython.display as ipd

# 播放音频
ipd.Audio(y, rate=sr)
  •  变速操作:通过 librosa.effects.time_stretch() 可以改变音频的播放速度。
# 加速音频
y_fast = librosa.effects.time_stretch(y, rate=1.5)
ipd.Audio(y_fast, rate=sr)
  •  裁剪音频:你可以使用数组切片来裁剪音频信号。
# 裁剪前 10 秒
y_trimmed = y[:10 * sr]
ipd.Audio(y_trimmed, rate=sr)

2. 音频处理

计算短时傅里叶变换(STFT)

短时傅里叶变换(STFT) 是音频信号处理中的基础操作,用于分析信号的频谱随时间的变化。

import librosa.display
import numpy as np
import matplotlib.pyplot as plt

# 计算 STFT
D = librosa.stft(y)

# 转换为幅度谱
D_abs = np.abs(D)

# 绘制 STFT
plt.figure(figsize=(10, 6))
librosa.display.specshow(librosa.amplitude_to_db(D_abs, ref=np.max), sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('STFT (Short-time Fourier Transform)')
plt.show()

频谱图与梅尔频谱图

LibROSA 可以轻松计算并绘制 频谱图梅尔频谱图

  • 频谱图
# 绘制频谱图
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
S_dB = librosa.power_to_db(S, ref=np.max)

plt.figure(figsize=(10, 6))
librosa.display.specshow(S_dB, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram')
plt.show()

音频过滤与降噪

你可以通过应用滤波器来降低音频中的噪音,或者提取特定频段的信号。LibROSA 提供了 librosa.effects 模块来实现这些功能。

  • 应用高通滤波器
# 应用高通滤波器去除低频噪声
y_filtered = librosa.effects.preemphasis(y, coef=0.97)

3. 特征提取

LibROSA 提供了丰富的工具来提取音频特征,这些特征常用于音频分类、语音识别、音乐推荐等任务。

提取 MFCC 特征

MFCC(梅尔频率倒谱系数) 是常用的音频特征,特别在语音识别中广泛使用。

# 计算 MFCC
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)

# 绘制 MFCC
plt.figure(figsize=(10, 6))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
plt.colorbar()
plt.title('MFCC')
plt.show()

提取零交叉率

零交叉率 用于衡量信号穿过零值的频率,通常用于分析音调特性。

# 计算零交叉率
zero_crossings = librosa.feature.zero_crossing_rate(y)

plt.figure(figsize=(10, 4))
plt.plot(zero_crossings[0])
plt.title('Zero Crossing Rate')
plt.show()

提取色度特征

色度特征 是表示音调强度的常用特征,特别适合分析音乐中的和弦和音调。

# 计算色度特征
chroma = librosa.feature.chroma_stft(y=y, sr=sr)

# 绘制色度图
plt.figure(figsize=(10, 6))
librosa.display.specshow(chroma, sr=sr, x_axis='time', y_axis='chroma')
plt.colorbar()
plt.title('Chroma Feature')
plt.show()

提取音调与和声特征

你可以使用 LibROSA 提取音频的音调、和声成分等特征。

# 提取和声成分
harmonic, percussive = librosa.effects.hpss(y)

# 提取音调
pitch, mag = librosa.core.piptrack(y=harmonic, sr=sr)

4. 可视化音频特征

绘制波形图

你可以使用 librosa.display.waveplot() 绘制音频的波形图。

plt.figure(figsize=(10, 4))
librosa.display.waveshow(y, sr=sr)
plt.title('Waveform')
plt.show()

绘制频谱图与梅尔频谱图

通过 librosa.display.specshow(),你可以绘制频谱图、梅尔频谱图等音频特征图。

# 绘制频谱图
plt.figure(figsize=(10, 6))
librosa.display.specshow(S_dB, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram')
plt.show()

可视化 MFCC 特征

同样可以通过 librosa.display.specshow() 可视化 MFCC 特征。

plt.figure(figsize=(10, 6))
librosa.display.specshow(mfccs, sr=sr, x_axis='time')
plt.colorbar()
plt.title('MFCC')
plt.show()

5. 音频分析与处理应用

音乐节奏检测

LibROSA 支持自动检测音频中的节拍,可以帮助你进行节奏分析。

tempo, beats = librosa.beat.beat_track(y=y, sr=sr)
print(f"Estimated Tempo: {tempo} BPM")

音频分类

通过提取音频特征,你可以将这些特征输入机器学习模型(如 Scikit-learn)来进行音频分类任务。

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

# 使用 MFCC 特征作为输入
X = mfccs.T
y = [0 if i < len(X) // 2 else 1 for i in range(len(X))]  # 假设这是二分类数据

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用支持向量机 (SVM) 进行分类
clf = SVC()
clf.fit(X_train, y_train)

# 预测与评估
y_pred = clf.predict(X_test)
accuracy = sum(y_pred == y_test) / len(y_test)
print(f"分类准确率: {accuracy:.2f}")

在这个例子中,使用 MFCC 特征来训练一个支持向量机(SVM)分类器。你可以根据数据集修改标签 y 并添加更多的特征,以便更好地训练模型。

自动和弦检测

通过使用色度特征和其他频率特征,LibROSA 可以帮助检测音频文件中的和弦。

# 自动和弦检测
import librosa.display

# 提取色度特征
chroma = librosa.feature.chroma_cqt(y=y, sr=sr)

# 检测节奏
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)

# 使用节拍同步色度特征
chroma_sync = librosa.util.sync(chroma, beat_frames, aggregate=np.median)

# 绘制节拍同步的色度图
plt.figure(figsize=(10, 6))
librosa.display.specshow(chroma_sync, sr=sr, x_axis='time', y_axis='chroma')
plt.colorbar()
plt.title('Chord Detection (Chroma Features)')
plt.show()

这个例子展示了如何使用 色度特征节拍同步 来检测音频中的和弦。


结论

通过本详细的 LibROSA 教程,你已经学会了如何使用 LibROSA 进行音频信号的加载、处理、特征提取和分析。从基础的音频文件操作到高级特征提取如 MFCC频谱图色度特征LibROSA 提供了一套完整的工具,特别适合音乐信息检索、语音处理和音频分类等任务。

LibROSA 的灵活性和强大的音频分析功能,使其成为音频数据处理和音乐信号分析中的重要工具。无论是在研究、开发音乐相关应用程序,还是在机器学习中的音频预处理,你都可以依赖 LibROSA 来轻松完成复杂的音频分析任务。

如果你有更多的问题或者希望深入探讨,欢迎随时联系我!


http://www.niftyadmin.cn/n/5689164.html

相关文章

CentOS常用命令收集

系统相关 重置root密码 1. 通过GRUB菜单重置 重启系统进入GRUB菜单&#xff0c;按e键编辑启动参数。找到以linux16开头的行&#xff0c;更改ro为 rw init/sysroot/bin/sh按Ctrl X启动系统进入后执行以下命令&#xff1a;chroot /sysroot passwd root touch /.autorelabel完…

论文推荐 |【Agent】自动化Agent设计系统

论文标题&#xff1a; Automated Design of Agentic Systems 论文地址&#xff1a; https://arxiv.org/abs/2408.08435 GitHub地址&#xff1a; https://github.com/ShengranHu/ADAS 自动化代理设计在性能和通用性方面显著超越了手动方法。 • 引入了自动化代理系统设计&am…

【Ubuntu】PlantUML工具 | 安装 | 语法 | 使用工具画序列图

🌱 PlantUML是一个通用性很强的工具,可以快速、直接地创建各种图表。 目录 1 安装 2 使用PlantUML画序列图 ① 语法 ②示例和效果 利用简单直观的语言,用户可以毫不费力地绘制各种类型的图表。PlantUML 是一个开源项目,支持快速绘制:• 时序图• 用例图• 类图• 对

Python知识点:如何使用Flink与Python进行实时数据处理

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用Flink与Python进行实时数据处理 Apache Flink是一个流处理框架&#xf…

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理&#xff1a; Cannot add merged region …

Git面试题总结

1.列举工作中常用的几个git命令&#xff1f; 初始化git仓库 &#xff1a;git init 新增文件的命令&#xff1a;git add file或者git add . 提交文件的命令&#xff1a;git commit –m或者git commit –a(直接提交) 查看工作区状况&#xff1a;git status –s(简洁形式查看)…

【09】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Class类基础全解(属性、方法、继承复用、判断)

序言&#xff1a; 本文详细讲解了关于我们在程序设计中所用到的class类的各种参数及语法。 笔者也是跟着B站黑马的课程一步步学习&#xff0c;学习的过程中添加部分自己的想法整理为笔记分享出来&#xff0c;如有代码错误或笔误&#xff0c;欢迎指正。 B站黑马的课程链接&am…

详解JavaScript作为命名空间的函数

8.5 作为命名空间的函数 函数作用域&#xff0c;在函数中声明的变量在整个函数体内都是可见的&#xff0c;函数外部是不可见的。 不在任何函数内声明的变量是全局变量&#xff0c;整个JS程序中都是可见的。 JS中无法声明只在一个代码块内可见的变量&#xff0c;基于这个原因…