音频特征工具Librosa包的使用

深入探索Mamba模型架构与应用 - 商品搜索 - 京东

DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东

要使用深度学习与语音特征进行抽取,首先需要准备能够对语音特征进行解析的工具。

Librosa是一个用于音频、音乐分析与处理的Python工具包,常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大。Librosa提供了多种音频读取和写入的方法,支持多种音频格式的读取和写入,如WAV、FLAC、MP3等。Librosa提供了多种音频特征提取的方法,如MFCC、Chromagram等。此外,Librosa还提供了多种音频可视化的方法,如绘制声谱图、绘制频谱图等。

下面将使用Librosa完成音频信号的特征提取和可视化,并对其涉及的内容进行详细讲解。

15.1.1 基于Librosa的音频信号读取

音频信号是日常生活中最常见且人们接触最多的信号类型,它们以具有频率、带宽、分贝等参数的音频信号形式存在。典型的音频信号可以表示为振幅随时间变化的函数,如图15-1所示。

图15-1 音频信号的分解

而落实到具体的音频文件上来说,音频文件的格式多种多样,可以使用计算机读取和分析它们。比如:

  • MP3格式。
  • WMA(Windows媒体音频)格式。
  • WAV(波形音频文件)格式。

对于已经存储在计算机中的音频文件,需要使用特定的Python库进行处理。在这里,作者选择的是Librosa。这是一个Python第三方库,主要用于分析音频信号,尤其适合音乐分析。Librosa涵盖了构建音乐信息检索(Music Information Retrieval,MIR)系统的具体细节。它提供了详尽的文档记录,以及丰富的示例和教程。

1. 采用Librosa对音频进行读取

为了简化起见,在这里首先使用Librosa对音频信号进行读取,代码如下:

复制代码
import librosa as lb

audio_path = "../第三章/carsound.wav"

audio, sr = lb.load(audio_path)
print(len(audio),type(audio))
print(sr,type(sr))

此时的load函数直接根据音频地址对数据进行读取,这里读取出的两个参数,audio为音频序列,而sr则是音频的采样率,输出结果如下:

复制代码
88200 <class 'numpy.ndarray'>
22050 <class 'int'>

第一行是音频的长度与生成的数据类型,而第二行是音频的采样率。此时,如果想更换采样率对音频信号进行采集,则可以使用如下代码:

复制代码
audio, sr = lb.load(audio_path,sr=16000)

同样,可以对结果进行打印,请读者自行尝试。

对于将音频采样率修正后的复制和写入操作,读者可以使用SciPy库来完成,代码如下:

复制代码
from scipy.io import wavfile

wavfile.write("example.wav",sr, audio)

读者可以自行尝试。

2. 音频可视化

对于获取的音频,读者可以使用以下代码对音频进行生成:

复制代码
import matplotlib.pyplot as plt

import librosa.display

librosa.display.waveshow(audio, sr=sr)

plt.show()

这里使用waveshow函数对读取到的音频进行转换,并将结果输出。形成的图形如图15-2所示。

图15-2 音频转换结果

3. 一般频谱图(非MFCC)的可视化展示

频谱图是音频信号频谱的直观表示,前面在3.3.2节中使用短时傅里叶变换完成了一般频谱图的展示,在这里可以使用同样的函数对信号进行处理,代码如下:

复制代码
audio = lb.stft(audio)                    # 短时傅里叶变换

audio_db = lb.amplitude_to_db(abs(audio))  # 将幅度频谱转换为dB标度频谱。也就是对序列取对数

lb.display.specshow(audio_db, sr=sr, x_axis='time', y_axis='hz')

plt.colorbar()

plt.show()

这里首先使用短时傅里叶变换完成了图谱转换,而amplitude_to_db的作用将幅度频谱转换为dB标度频谱。也就是对序列取对数,读者可以使用如下代码对其进行验证,这里不再过多阐述。

复制代码
arr = [10000,20000]

audio_db = librosa.amplitude_to_db(arr)

print(audio_db)

specshow是用于展示图谱的函数,生成的音频图谱如图15-3所示(颜色越红,表示信息含量越多)。

图15-3 特定音频的频谱图(颜色越红,表示信息含量越多)

图15-3是生成的音频频谱图,横坐标是时间的延续,而纵坐标是显示频率(0~10000Hz),注意到图谱的底部信息含量比顶部多,可以对纵坐标进行变换,即对所有的数值取对数。代码如下:

复制代码
lb.display.specshow(audio_db, sr=sr, x_axis='time', y_axis='log')

新的图谱如图15-4所示。

图15-4 取对数处理后的频谱图

可以明显看出,与原始频谱图相比,取对数后的频谱图对信息丰富的部分提供了更为显著的显示。

15.1.2 基于Librosa的音频多特征提取

对于音频特征较为常用的分别是MFCC(梅尔频率倒谱系数)、chroma_stft(色度频率)以及梅尔频谱图,而Librosa库也为我们提供了专门的特征提取方法。下面我们依次对这些特征及其提取方法进行详细讲解。

1. MFCC音频特征

我们首先使用Librosa完成MFCC特征的抽取,代码如下:

复制代码
import librosa as lb

import matplotlib.pyplot as plt



audio , sr = lb.load("example.wav",sr=16000)

melspec = lb.feature.mfcc(y=audio, sr=sr, n_mels=40)



lb.display.specshow(melspec, sr=sr, x_axis='time', y_axis='log')

plt.colorbar()

plt.show()

生成的波形图请读者自行查看。

在生成MFCC频谱的基础上,还可以执行特征缩放,使得每个系数维度具有零均值和单位方差:

复制代码
from sklearn import preprocessing

melspec = preprocessing.scale(melspec, axis=1)

请读者自行尝试使用。

2. chroma_stft音频特征

除常用的MFCC外,Librosa还提供了其他一些特征提取函数。其中,librosa.feature.chroma_stft 是Librosa库中的一个函数,用于计算音频信号的基于音高的谱图特征。该函数首先使用短时傅里叶变换(Short-Time Fourier Transform,STFT)将音频信号转换为频谱图,然后计算出每个分带中的基于音高的强度。

具体来说,librosa.feature.chroma_stft函数的输入参数包括音频时间序列和采样率,输出结果是一个二维数组,其中每一行代表一个分带,每一列代表一个时间帧,数组中的值表示该时间帧在该分带中的基于音高的强度。其实现代码如下:

复制代码
import librosa as lb

import matplotlib.pyplot as plt

import numpy as np



audio , sr = lb.load("example.wav",sr=16000)



stft=np.abs(lb.stft(audio))

chroma = lb.feature.chroma_stft(S=stft, sr=sr)

lb.display.specshow(chroma, sr=sr, x_axis='time', y_axis='log')

plt.colorbar()

plt.show()

请读者自行打印图谱图形。

顺便讲一下,chroma_stft和MFCC都是音频处理中常用的特征提取方法。其中,MFCC是一种基于梅尔倒谱系数的特征,用于描述音频信号的频谱特性;而chroma_stft则是基于音高的谱图特征,用于描述音频信号的时域特性。

3. 梅尔频谱图

librosa.feature.melspectrogram是Librosa库中的一个函数,用于计算音频信号的梅尔频谱图。该函数的输入参数包括音频时间序列y和采样率sr,输出结果是一个二维数组,其中每一行代表一个时间帧,每一列代表一个频率,数组中的值表示该时间帧在该频率中的梅尔频谱强度。实现代码如下:

复制代码
mel = lb.feature.melspectrogram(y=audio, sr=sr, n_mels=40, fmin=0, fmax=sr//2)

mel = lb.power_to_db(mel)

lb.display.specshow(mel, sr=sr, x_axis='time', y_axis='log')

plt.colorbar()

plt.show()

梅尔频谱图形请读者自行查看。

梅尔频谱图则是先将音频信号进行分帧,并对每一帧音频信号进行短时傅里叶变换,得到每个时间帧对应的频谱图。接着,对每个频谱图应用梅尔滤波器组进行变换,得到每个频率对应的梅尔功率谱密度。最后,将所有频率对应的梅尔功率谱密度合并成一个二维数组,即为梅尔频谱图。

MFCC和梅尔频谱图都是音频信号处理中常用的特征提取方法。其中,MFCC是一种基于梅尔倒谱系数的特征,用于描述音频信号的频谱特性;而梅尔频谱图则是基于梅尔滤波器组的变换,将音频信号从时域转换到频域,然后计算出每个频率对应的梅尔功率谱密度。

相关推荐
邪恶的贝利亚1 小时前
《ffplay 读线程与解码线程分析:从初始化到 seek 操作,对比视频与音频解码的差异》
ffmpeg·php·音视频
说码解字1 小时前
ExoPlayer 如何实现音画同步
开发语言·学习·音视频
清水迎朝阳7 小时前
火山RTC 6 自定义视频
音视频·实时音视频·火山rtc·自定义视频
天上路人12 小时前
采用AI神经网络降噪算法的语言降噪消回音处理芯片NR2049-P
深度学习·神经网络·算法·硬件架构·音视频·实时音视频·可用性测试
清月电子14 小时前
KT148A语音芯片发码很难播放_将4脚对地一下再发正常,什么原因?
单片机·嵌入式硬件·物联网·音视频
科技小E1 天前
WebRTC实时音视频通话技术EasyRTC嵌入式音视频通信SDK,助力智慧物流打造实时高效的物流管理体系
人工智能·音视频
Icoolkj1 天前
可灵 AI:开启 AI 视频创作新时代
人工智能·音视频
SuperW1 天前
视频编码原理讲解一:VCL层和NAL层的讲解
音视频
Panesle2 天前
HunyuanCustom:文生视频框架论文速读
人工智能·算法·音视频·文生视频