Python 课程23-LibROSA

news2024/10/3 18:35:04

前言

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.coloradmin.cn/o/2186685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java发送邮件email实战

1.首先在项目中增加依赖&#xff0c;在pom文件中添加如下坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>2.发邮件工具类如下 package com.example.demo.…

安卓13默认使用大鼠标 与配置分析 andriod13默认使用大鼠标 与配置分析

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 android13里面的鼠标貌似比以前版本的鼠标小了,有些客户想要把这个鼠标改大。这个功能,android有现成的,就在这里,设置 =》无障碍 =》色彩和动画 =》 大号鼠标指针。 我们通过…

JavaWeb - 8 - 请求响应 分层解耦

请求响应 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据 响应&#xff08;HttpServletResponse&#xff09;&#xff1a;设置响应数据 BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程…

【解决方案】关于 UART 接收数据时丢失数据的解决办法——环形缓冲存储区

文章目录 UART 通信丢失数据的常见原因总结串口&#xff08;UART&#xff09;数据丢失 Bug 的复现引入环形队列解决数据丢失问题总结 在嵌入式系统和物联网&#xff08;IoT&#xff09;设备中&#xff0c;串行通信是一种非常普遍且重要的数据传输方式。无论是通过 UART、RS-232…

【Godot4.3】基于中心点连线的矩形重叠检测

概述 这个方法是我自己想到的&#xff0c;经典的矩形重叠&#xff08;碰撞&#xff09;检测&#xff0c;是一段很复杂的逻辑判断&#xff0c;而根据两个矩形中点连线&#xff0c;与两个矩形宽度和高度之和一半的比较&#xff0c;就可以判断两个矩形是否重叠&#xff0c;并且能…

SQL进阶技巧:统计各时段观看直播的人数

目录 0 需求描述 1 数据准备 2 问题分析 3 小结 如果觉得本文对你有帮助&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通关指南 专栏 原价99&#xff0c;现在活动价39.9&#xff0c;十一国庆后将上升至59.9&#…

TransFormer 视频笔记

TransFormer BasicsAttention单头注意力 single head attentionQ&#xff1a; query 查寻矩阵 128*12288K key matrix 128*12288SoftMax 归一 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/19e3cf1ea28442eca60d5fc1303921f4.png)Value matrix 12288*12288 MLP Bas…

边缘概率 | 条件概率

关于什么是边缘概率分布和条件概率分布&#xff0c;在理论上&#xff0c;我自己也还没有理解&#xff0c;那么现在就根据我学习到的理解方式来记录一下&#xff0c;有错误指出&#xff0c;请大家指正&#xff01;&#xff01;&#xff01; 例如&#xff0c;一个箱子里有十个乒乓…

YOLO11改进|上采样篇|引入CARAFE上采样模块

目录 一、CARAFE上采样模块1.1CARAFE上采样模块介绍1.2CARAFE核心代码 五、添加MLCA注意力机制5.1STEP15.2STEP25.3STEP35.4STEP4 六、yaml文件与运行6.1yaml文件6.2运行成功截图 一、CARAFE上采样模块 1.1CARAFE上采样模块介绍 CARAFE 的主要思想&#xff1a; 将特征图的上采…

C# (.net6)实现Redis发布和订阅简单案例

概念&#xff1a; 在 .NET 6 中使用 Redis 的/订发布阅模式。发布/订阅&#xff08;Pub/Sub&#xff09;是 Redis 支持的一种消息传递模式&#xff0c;其中一个或多个发布者向一个或多个订阅者发送消息,Redis 客户端可以订阅任意数量的频道。 多个客户端可以订阅一个相同的频道…

【Java】—— 集合框架:Collection接口中的方法与迭代器(Iterator)

目录 1. 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 1.3 Java集合框架体系 1.4 集合的使用场景 2. Collection接口及方法 2.1 添加 2.2 判断 2.3 删除 2.4 其它 3. Iterator(迭代器)接口 3.1 Iterator接口 3.2 迭代器的执行原理 3.3 foreach循环 1. 集…

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统&#xff1a;windows11java版本&#xff1a;23android sdk版本&#xff1a;35android ndk版本&#xff1a;22rust版本&#xff1a; AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk&#xff0c;…

【Matlab绘图】从Excel导入表格并进行三维绘图

前言 今天手头上拿到一份论文的xlsx数据&#xff0c;要求使用MATLAB绘制进行三维图标坐标绘制。那么我们来看看如何使用如下数据进行绘图。 如上数据所示&#xff0c;数据是一个30行25列的数据&#xff0c;数据的内容是论文某项模型模拟的结果&#xff0c;我们希望把横坐标x取…

【ADC】ADC 系统失调和增益误差的校准方法

概述 本文学习于TI 高精度实验室课程&#xff0c;讨论如何计算增益和偏移误差并通过校准消除。首先对数据转换器系统进行偏移和增益误差计算&#xff0c;然后讨论几种校准此误差的方法。最后介绍一些难以校准的误差源。 文章目录 概述一、误差校准原理与方法二、实际应用问题举…

Linux进程概念二

我们利用fork函数来辅助我们讲解进程 首先认识两个调用进程地址的函数&#xff1a;getpid(),和getppid()&#xff0c;他们分别可以调用自己的pid和父进程的pid fork()可以在代码层面来创建子进程&#xff0c;一般而言&#xff0c;父进程fork出来的子进程与父进程代码和数据相…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件&#xff0c;可能会涉及到的会有&#xff1a; /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

[Cocoa]_[初级]_[绘制文本如何设置断行效果]

场景 在开发Cocoa程序时&#xff0c;表格NSTableView是经常使用的控件。其基于View Base的视图单元格模式就是使用NSCell或其子类来控制每个单元格的呈现。当一个单元格里的文字过多时&#xff0c;需要截断超出宽度的文字&#xff0c;怎么实现&#xff1f; 说明 Cocoa下的文本…

【java数据结构】顺序表

【java数据结构】顺序表 一、了解List接口二、顺序表2.1 线性表2.2 顺序表2.2.1 顺序表接口的实现给数组增加新元素判断数组数据是否为满在 pos 位置新增元素判定是否包含某个元素查找某个元素对应的位置获取 pos 位置的元素给 pos 位置的元素设为 value删除第一次出现的关键字…

Manim:使用Python绘制数学动画

Manim是一个由3Blue1Brown的Grant Sanderson开发的开源框架&#xff0c;用户可以通过编写Python代码来创建数学动画&#xff0c;适用于教学、科研和科普宣传等多个领域。 Manim的核心功能之一是动画效果的创建和控制。它提供了多种动画效果&#xff0c;如创建、变换、淡入淡出…

分布式数据库知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…