Advertisement

语音信号处理之时域特征、频谱特征、MFCC特征、语谱图特征、谱熵图特征的提取与可视化

阅读量:

一、准备工作

为了获取高质量音频数据,请您准备一段时长不超过八秒的无损音频文件。您可以利用 Audacity 等专业录音软件进行录制;此外,您还可以通过下载现有音频文件并转换为无损格式来获取所需数据。建议选用频率不低于16,000 Hz的采样率。此外,请确保您的 Python 环境中已安装所需库件,并以 PyCharm 社区版为例进行操作。

复制代码
 import numpy as np

    
 import matplotlib.pyplot as plt
    
 from python_speech_features import mfcc
    
 from python_speech_features import delta
    
 from sklearn.preprocessing import StandardScaler
    
 import librosa.display
    
 import pyworld

二、提取

2.1 读取音频文件

这里我是准备了两种方案,并且这两种方案之间存在细微差别;稍加留意即可达到预期效果。

2.1.1 通过librosa库提取具体实现细节参考代码。其核心优势在于能够将多通道音频转换为单通道,并不会改变原始音频的频谱特性。若需调整采样率至其他值如16000Hz,则需在函数调用时指定sr参数以调整采样率。

复制代码
    y, sr = librosa.load("audio.wav")

通过pyworld库进行音频提取这一过程的主要特点在于其能够有效实现声音的单通道转换功能,在具体操作中它不仅会自动完成音频转码工作而且会在默认设置下将采样率预设为16kHz

复制代码
    y, sr = pyworld.load("audio.wav")

如果不想自行下载该库,则可以通过Python解释器内的官方文档找到安装包;或者在终端中运行相应的安装命令完成.download

从解释器中获取(我通常采用这种方法,在某些情况下由于某些库无法通过这种方法获取而导致转而使用终端)。在下图中点击加号并搜索以获取文件。

2.1.2.2 终端命令下载。如下图,输入命令下载。

三、计算及其可视化

3.1 时域特征

复制代码
 # 可视化时域特征

    
 time = np.arange(len(y)) / sr
    
 plt.figure(figsize=(14, 5))
    
 plt.subplot(2, 1, 1)
    
 plt.plot(time, y)
    
 plt.xlabel('Time (s)')
    
 plt.ylabel('Amplitude')
    
 plt.title('Time-domain features')
    
 plt.tight_layout()
    
 plt.show()

3.2 频谱特征

复制代码
 # 可视化频域特征

    
 D = librosa.stft(y)
    
 D_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
    
 plt.subplot(2, 1, 2)
    
 librosa.display.specshow(D_db, sr=sr, x_axis='time', y_axis='log')
    
 plt.colorbar(format='%+2.0f dB')
    
 plt.title('Frequency-domain features')
    
 plt.tight_layout()
    
 plt.show()

3.3 MFCC特征

3.3.1 转换。在处理过程中,我们需要先将音频数据与采样率转换为MFCC特征,并在此基础上进行二阶时频变换。这种变换能够体现音频信号的动态特性。

复制代码
 # 将音频转化为MFCC特征

    
 mfcc_features = mfcc(y, sr)
    
 # 对MFCC特征进行delta处理
    
 delta_features = delta(mfcc_features, 2)

3.3.2 归一化处理。归一化处理的主要原因在于不同特征的量纲可能存在差异,在涉及数据间距离计算的场景中,这种差异可能导致最终计算结果的变化。

复制代码
 # 归一化处理

    
 scaler = StandardScaler()
    
 normalized_features = scaler.fit_transform(delta_features)
3.3.3 可视化。
复制代码
 # 可视化MFCC特征

    
 plt.figure(figsize=(10, 5))
    
 plt.imshow(normalized_features.T, origin='lower', aspect='auto', cmap='jet')
    
 plt.title('MFCC features')
    
 plt.xlabel('Frame index')
    
 plt.ylabel('MFCC coefficient index')
    
 plt.tight_layout()
    
 plt.show()

3.4 语谱图特征

复制代码
 # 计算语谱图

    
 S = librosa.feature.melspectrogram(y=y, sr=sr)
    
  
    
 # 转换为分贝单位
    
 S_db = librosa.power_to_db(S, ref=np.max)
    
  
    
 # 可视化语谱图
    
 plt.figure(figsize=(10, 5))
    
 librosa.display.specshow(S_db, sr=sr, x_axis='time', y_axis='mel')
    
 plt.colorbar(format='%+2.0f dB')
    
 plt.title('Mel Spectrogram')
    
 plt.tight_layout()
    
 plt.show()

3.5 谱熵图特征

复制代码
 # 计算短时傅里叶变换(STFT)

    
 D = librosa.stft(y)
    
 # 将STFT的幅度谱转换为概率分布
    
 P = librosa.amplitude_to_db(np.abs(D), ref=np.max)
    
 P = P / np.sum(P, axis=0)
    
 # 计算谱熵
    
 spectral_entropy = -np.sum(P * np.log2(P), axis=0)
    
  
    
 plt.plot(spectral_entropy)
    
 plt.xlabel('Frame index')
    
 plt.ylabel('Spectral Entropy')
    
 plt.title('Spectral Entropy Feature')
    
 plt.show()

四、结语

上述特征属于语音信号处理中常见的典型特征,在某些情况下可能与你的需求相符。如果你觉得对你有所帮助的话,请稍等片刻我会非常高兴地回应你。

全部评论 (0)

还没有任何评论哟~