python:audioFlux 使用教程
AudioFlux 是一个专为音频和音乐分析、特征提取设计的开源 Python 库。它支持广泛的音频处理功能,包括特征提取、音高检测、时频分析、谱图处理等。这些功能被广泛应用于机器学习、深度学习、信号处理等领域,特别是对于音乐信息检索(MIR)、音频分类、语音增强等任务极为有效。
python audioFlux
是一个用于音频信号处理和分析的 Python 库,它提供了丰富的功能,如频谱分析、特征提取等。以下是 audioFlux
的使用教程:
1. 安装
你可以使用 pip
来安装 audioFlux
:
pip install audioflux
audioflux-0.1.9-py3-none-any.whl (70.8 MB)
pip install librosa
librosa-0.11.0-py3-none-any.whl (260 kB)
audioread-3.0.1-py3-none-any.whl (23 kB)
2. 读取音频文件
使用 audioFlux
读取音频文件通常借助 librosa
库(audioFlux
本身没有内置的音频读取功能),示例如下:在使用时,要将 'your_audio_file.wav'
替换为实际的音频文件路径。
import audioflux as af
import librosa
# 读取音频文件
audio_path = 'your_audio_file.wav'
audio_data, sample_rate = librosa.load(audio_path, sr=None)
编写 audio_librosa_load.py 如下
# -*- coding: utf-8 -*-
""" use librosa read audio_file """
import os
import sys
from tkinter import filedialog
import audioflux as af
import librosa
# main()
if len(sys.argv) ==1:
filetypes = [('wav file','.wav')]
f1 = filedialog.askopenfilename(initialdir='D:/Music', filetypes=filetypes)
elif len(sys.argv) ==2:
f1 = sys.argv[1]
else:
print('usage: python audio_librosa_load.py file1.wav')
sys.exit(1)
if not os.path.exists(f1):
print(f"{f1} is not exists.")
sys.exit(2)
fn,ext = os.path.splitext(f1)
if ext.lower() != '.wav':
print('ext is not .wav ')
sys.exit(2)
# 读取音频文件
#audio_path = 'your_audio_file.wav'
audio_data, sample_rate = librosa.load(f1, sr=None)
print('sample_rate:', sample_rate)
运行 \python\audio_librosa_load.py your_audio.wav
3. 频谱分析
以计算短时傅里叶变换(STFT)为例:编写 audio_stft.py 如下
# -*- coding: utf-8 -*-
""" 频谱分析:以计算短时傅里叶变换(STFT)为例 """
import audioflux as af
import librosa
import numpy as np
import matplotlib.pyplot as plt
# 读取音频文件
audio_path = 'your_audio_file.wav'
audio_data, sample_rate = librosa.load(audio_path, sr=None)
# 计算 STFT
stft_obj = af.STFT(radix2_exp=12, window_type=af.type.WindowType.RECT, slide_length=1024)
spec_arr = stft_obj.stft(audio_data)
# 计算幅度谱
mag_arr = np.abs(spec_arr)
# 绘制幅度谱
plt.figure(figsize=(10, 6))
plt.imshow(librosa.amplitude_to_db(mag_arr, ref=np.max), origin='lower', aspect='auto')
plt.colorbar(format='%+2.0f dB')
plt.title('STFT Magnitude Spectrum')
plt.xlabel('Time Frames')
plt.ylabel('Frequency Bins')
plt.show()
4. 特征提取
提取 mel 梅尔频率倒谱系数(MFCC):编写 audio_mfcc.py 如下
# -*- coding: utf-8 -*-
""" 特征提取:提取 mel 梅尔频率倒谱系数(MFCC) """
import audioflux as af
import librosa
import matplotlib.pyplot as plt
# 读取音频文件
audio_path = 'your_audio_file.wav'
audio_data, sample_rate = librosa.load(audio_path, sr=None)
# 提取 MFCC
mfcc_obj = af.MFCC(samplate=sample_rate, num_mfcc=13)
mfcc_arr = mfcc_obj.mfcc(audio_data)
# 绘制 MFCC
plt.figure(figsize=(10, 6))
plt.imshow(mfcc_arr, origin='lower', aspect='auto')
plt.colorbar()
plt.title('MFCC')
plt.xlabel('Time Frames')
plt.ylabel('MFCC Coefficients')
plt.show()
5. 音频合成
通过逆短时傅里叶变换(ISTFT)进行音频合成:编写 audio_istft.py 如下
# -*- coding: utf-8 -*-
""" 音频合成:通过逆短时傅里叶变换(ISTFT)进行音频合成
由于在 librosa 版本 0.8.0 之后,librosa.output.write_wav 方法被弃用,并且在后续版本中被移除了。
如今可以使用 soundfile 库来替代它完成音频文件的保存操作。
"""
import librosa
import audioflux as af
import soundfile as sf
# 读取音频文件
audio_path = 'your_audio_file.wav'
audio_data, sample_rate = librosa.load(audio_path, sr=None)
# 计算 STFT
stft_obj = af.STFT(radix2_exp=12, window_type=af.type.WindowType.RECT, slide_length=1024)
spec_arr = stft_obj.stft(audio_data)
# 进行 ISTFT
audio_reconstructed = stft_obj.istft(spec_arr)
# 使用 soundfile 保存合成后的音频文件
sf.write('reconstructed_audio.wav', audio_reconstructed, sample_rate)
总结
- 读取音频:可借助
librosa
库读取音频文件。 - 频谱分析:利用
STFT
类进行短时傅里叶变换,获取频谱信息。 - 特征提取:使用
MFCC
类提取梅尔频率倒谱系数。 - 音频合成:通过
ISTFT
方法进行逆短时傅里叶变换,实现音频合成。
在频谱分析中,如何选择合适的窗函数?
在频谱分析里,窗函数的选择至关重要,它会直接影响到频谱分析的性能和结果。下面为你详细介绍选择合适窗函数的相关要点:
窗函数的基本作用
在进行离散傅里叶变换(DFT)时,实际信号往往是无限长的,需要进行截断处理。而直接截断会产生频谱泄漏等问题,窗函数就是用来对信号进行加权处理,以改善频谱特性。
常见窗函数及其特点
- 矩形窗(Rectangular Window)
- 特点:主瓣宽度最窄,频率分辨率最高,但旁瓣较高,会产生较大的频谱泄漏。
- 适用场景:当需要高频率分辨率,且信号本身持续时间较短、频谱较集中时适用,比如在测量单频信号的频率时。
- 汉宁窗(Hanning Window)
- 特点:旁瓣相对较低,能有效抑制频谱泄漏,但主瓣宽度比矩形窗宽,频率分辨率有所降低。
- 适用场景:适用于大多数情况,尤其是信号中包含多个频率成分,需要在抑制频谱泄漏和保持一定频率分辨率之间取得平衡时。
- 汉明窗(Hamming Window)
- 特点:与汉宁窗类似,旁瓣抑制能力稍弱于汉宁窗,但主瓣宽度基本相同。
- 适用场景:常用于音频处理、语音信号处理等领域。
- 布莱克曼窗(Blackman Window)
- 特点:旁瓣非常低,对频谱泄漏的抑制效果很好,但主瓣宽度更宽,频率分辨率更低。
- 适用场景:当需要强烈抑制频谱泄漏,对频率分辨率要求不是特别高时使用,例如在测量噪声频谱时。
- 高斯窗(Gaussian Window)
- 特点:窗函数形状呈高斯分布,主瓣和旁瓣的过渡比较平滑,没有明显的旁瓣振荡。
- 适用场景:适用于对信号的时域和频域局部特性都有要求的场合,如时频分析。
选择窗函数的考虑因素
- 频率分辨率
- 若需要精确测量信号的频率成分,希望主瓣宽度尽可能窄,此时应选择矩形窗等主瓣较窄的窗函数。例如,在雷达信号处理中,需要精确测量目标的速度(与频率相关),就需要较高的频率分辨率。
- 频谱泄漏抑制
- 当信号中包含多个频率成分,且各频率成分之间的间隔较小时,为了避免频谱泄漏导致的频率成分相互干扰,应选择旁瓣较低的窗函数,如汉宁窗、布莱克曼窗等。比如在分析音乐信号的频谱时,由于音乐中包含多个不同频率的音符,需要抑制频谱泄漏以准确分析每个音符的频率。
- 信号特性
- 如果信号是周期信号,且周期与窗函数的长度匹配,矩形窗可能是一个不错的选择。而对于非周期信号或随机信号,汉宁窗、汉明窗等更合适。
- 计算复杂度
- 不同窗函数的计算复杂度有所不同。矩形窗的计算最简单,只需要对信号进行简单的截断;而一些复杂的窗函数,如布莱克曼窗,计算相对复杂。在对计算资源有限的情况下,需要考虑选择计算复杂度较低的窗函数。
在 audioFlux
中使用窗函数
在 audioFlux
中进行频谱分析时,可以通过设置 STFT
类的 window_type
参数来选择窗函数。以下是一个示例代码:编写 audio_stft_win_type.py 如下
# -*- coding: utf-8 -*-
""" 在 audioFlux 中进行频谱分析时,可以通过设置 STFT 类的 window_type 参数来选择窗函数"""
import librosa
import audioflux as af
import numpy as np
import matplotlib.pyplot as plt
# 读取音频文件
audio_path = 'your_audio_file.wav'
audio_data, sample_rate = librosa.load(audio_path, sr=None)
# 选择窗函数类型,这里以汉宁窗为例
window_type = 'hann'
# 计算 STFT
stft_obj = af.STFT(radix2_exp=12, slide_length=1024,
window_type=af.type.WindowType.HANN)
spec_arr = stft_obj.stft(audio_data)
# 计算幅度谱
mag_arr = np.abs(spec_arr)
# 绘制幅度谱
plt.figure(figsize=(10, 6))
plt.imshow(librosa.amplitude_to_db(mag_arr, ref=np.max), origin='lower', aspect='auto')
plt.colorbar(format='%+2.0f dB')
plt.title('STFT Magnitude Spectrum with Hanning Window')
plt.xlabel('Time Frames')
plt.ylabel('Frequency Bins')
plt.show()
在上述代码中,window_type
参数设置为 'hann'
表示使用汉宁窗。你可以根据需要将其修改为其他窗函数类型,如 'rect'
(矩形窗)、'hamm'
(汉明窗)等。
总之,选择合适的窗函数需要综合考虑频率分辨率、频谱泄漏抑制、信号特性和计算复杂度等因素,根据具体的应用场景做出合理的选择。
除了 MFCC(梅尔频率倒谱系数),在音频处理领域还有许多其他常用的特征提取方法,下面为你详细介绍:
时域特征
- 零交叉率(Zero Crossing Rate, ZCR)
- 原理:零交叉率指的是在一个音频帧中,信号波形穿过零电平的次数。它反映了音频信号的频率特性,高频信号的零交叉率通常较高,低频信号则较低。
- 应用场景:常用于语音端点检测、语音 / 音乐分类等任务。例如在语音识别系统中,可以利用零交叉率来区分语音和静音部分。
- 均方根能量(Root Mean Square Energy, RMSE)
- 原理:计算音频信号在每个帧内的能量,通过对信号平方后求平均值再开方得到。它反映了音频信号的强度或响度。
- 应用场景:在音频降噪、语音活动检测等方面有广泛应用。比如在音频降噪中,可以根据均方根能量判断音频是否为噪声。
频域特征
- 频谱质心(Spectral Centroid)
- 原理:频谱质心表示音频频谱的重心位置,它反映了音频信号的音调高低。频谱质心越高,音频的音调越高。
- 应用场景:常用于音乐分类、情绪分析等。例如在音乐分类中,可以根据频谱质心区分高音调的音乐(如小提琴曲)和低音调的音乐(如贝斯演奏)。
- 频谱带宽(Spectral Bandwidth)
- 原理:频谱带宽描述了音频频谱的分布宽度,它反映了音频信号的频率丰富程度。带宽越宽,说明音频包含的频率成分越丰富。
- 应用场景:在音频质量评估、乐器识别等方面有应用。比如在乐器识别中,不同乐器的频谱带宽可能不同,可以作为区分的特征之一。
时频域特征
- 线性预测倒谱系数(Linear Predictive Cepstral Coefficients, LPCC)
- 原理:基于线性预测分析,通过对音频信号进行线性预测建模,然后将预测系数转换为倒谱系数。LPCC 能够反映音频信号的声道特性。
- 应用场景:常用于语音识别、说话人识别等任务。在说话人识别中,LPCC 可以捕捉到不同说话人的声道特征差异。
- 伽马通频率倒谱系数(Gammatone Frequency Cepstral Coefficients, GFCC)
- 原理:模拟人类听觉系统的伽马通滤波器组对音频信号进行滤波,然后提取倒谱系数。GFCC 更符合人类听觉特性。
- 应用场景:在语音识别、环境声音分类等领域有较好的效果。例如在复杂环境下的语音识别中,GFCC 能够更好地抵抗噪声干扰。
其他特征
- 韵律特征
- 原理:韵律特征主要包括音长、音高、音强等方面的变化规律。音长指的是音频信号的持续时间,音高反映了音频的音调高低,音强表示音频的响度。
- 应用场景:在语音情感识别、语音合成等方面有重要应用。比如在语音情感识别中,愤怒的语音通常音高较高、音强较大,而悲伤的语音音高较低、音长较长。
- 谱平坦度(Spectral Flatness)
- 原理:谱平坦度用于衡量音频频谱的平坦程度,它是频谱的几何平均值与算术平均值的比值。谱平坦度越接近 1,说明频谱越平坦,信号越接近白噪声。
- 应用场景:在音频质量评估、噪声检测等方面有应用。例如在音频质量评估中,谱平坦度可以反映音频的纯净程度。
这些特征提取方法各有优缺点,在实际应用中,通常会结合多种特征来提高音频处理任务的性能。