语音信号处理:时域波形、频域谱线和对数谱图可视化

本文将介绍如何使用Python库Librosa和Matplotlib对语音信号进行时域波形、频域谱线和对数谱图的可视化。

代码示例

# - * - coding: utf-8 - * -
import librosa
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft

plt.figure(dpi=600) # 将显示的所有图分辨率调高
matplotlib.rc("font",family='SimHei') # 显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 显示符号


def displayWaveform(): # 显示语音时域波形
    '''
    display waveform of a given speech sample
    :param sample_name: speech sample name
    :param fs: sample frequency
    :return:
    '''
    samples, sr = librosa.load('your wav file path', sr=16000)
    # samples = samples[6000:16000]

    print(len(samples), sr)
    time = np.arange(0, len(samples)) * (1.0 / sr)

    plt.plot(time, samples)
    plt.title("语音信号时域波形")
    plt.xlabel("时长(秒)")
    plt.ylabel("振幅")
    # plt.savefig("your dir\语音信号时域波形图", dpi=600)
    plt.show()

def displaySpectrum(): # 显示语音频域谱线
    x, sr = librosa.load('your wav file path', sr=16000)
    print(len(x))
    # ft = librosa.stft(x)
    # magnitude = np.abs(ft)  # 对fft的结果直接取模(取绝对值),得到幅度magnitude
    # frequency = np.angle(ft)  # (0, 16000, 121632)

    ft = fft(x)
    print(len(ft), type(ft), np.max(ft), np.min(ft))
    magnitude = np.absolute(ft)  # 对fft的结果直接取模(取绝对值),得到幅度magnitude
    frequency = np.linspace(0, sr, len(magnitude))  # (0, 16000, 121632)

    print(len(magnitude), type(magnitude), np.max(magnitude), np.min(magnitude))
    print(len(frequency), type(frequency), np.max(frequency), np.min(frequency))

    # plot spectrum,限定[:40000]
    # plt.figure(figsize=(18, 8))
    plt.plot(frequency[:40000], magnitude[:40000])  # magnitude spectrum
    plt.title("语音信号频域谱线")
    plt.xlabel("频率(赫兹)")
    plt.ylabel("幅度")
    plt.savefig("your dir\语音信号频谱图", dpi=600)
    plt.show()

    # # plot spectrum,不限定 [对称]
    # plt.figure(figsize=(18, 8))
    # plt.plot(frequency, magnitude)  # magnitude spectrum
    # plt.title("语音信号频域谱线")
    # plt.xlabel("频率(赫兹)")
    # plt.ylabel("幅度")
    # plt.show()


def displaySpectrogram():
    x, sr = librosa.load('your wav file path', sr=16000)

    # compute power spectrogram with stft(short-time fourier transform):
    # 基于stft,计算power spectrogram
    spectrogram = librosa.amplitude_to_db(librosa.stft(x))

    # show
    librosa.display.specshow(spectrogram, y_axis='log')
    plt.colorbar(format='%+2.0f dB')
    plt.title('语音信号对数谱图')
    plt.xlabel('时长(秒)')
    plt.ylabel('频率(赫兹)')
    plt.show()


if __name__ == '__main__':
    displayWaveform()
    displaySpectrum()
    displaySpectrogram()

# 如何修改文件路径内容:将代码中的'your wav file path'修改为包含实际.wav文件的完整路径即可,例如:
# 'C:\Users\user\Desktop\audio.wav'

代码解释

  1. 导入库: 导入必要的库,包括librosa用于音频处理,matplotlib用于绘图,numpy用于数值计算,scipy.fft用于快速傅里叶变换。
  2. 设置绘图参数: 设置绘图参数,例如分辨率、字体和符号。
  3. displayWaveform函数: 该函数用于显示语音信号的时域波形。
    • 使用librosa.load加载音频文件,并指定采样率为16000Hz。
    • 计算时间轴。
    • 使用plt.plot绘制波形图。
    • 设置标题、横轴和纵轴标签。
    • 使用plt.show显示图像。
  4. displaySpectrum函数: 该函数用于显示语音信号的频域谱线。
    • 使用librosa.load加载音频文件。
    • 使用scipy.fft.fft进行快速傅里叶变换。
    • 计算幅度和频率。
    • 使用plt.plot绘制频谱图。
    • 设置标题、横轴和纵轴标签。
    • 使用plt.savefig保存图像。
    • 使用plt.show显示图像。
  5. displaySpectrogram函数: 该函数用于显示语音信号的对数谱图。
    • 使用librosa.load加载音频文件。
    • 使用librosa.stft计算短时傅里叶变换。
    • 使用librosa.amplitude_to_db将幅度转换为对数尺度。
    • 使用librosa.display.specshow绘制对数谱图。
    • 使用plt.colorbar添加颜色条。
    • 设置标题、横轴和纵轴标签。
    • 使用plt.show显示图像。
  6. 运行程序: 运行程序,即可分别显示时域波形、频域谱线和对数谱图。

总结

本文介绍了使用Python库Librosa和Matplotlib对语音信号进行时域波形、频域谱线和对数谱图的可视化。这些可视化方法可以帮助我们更好地理解语音信号的特征,为后续的语音处理任务提供参考。

注意: 请将代码中的'your wav file path'替换为包含实际.wav文件的完整路径。


原文地址: https://www.cveoy.top/t/topic/nqHT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录