• python中如何画语谱图


    1.导包

    Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大

    import librosa
    import librosa.display
    import matplotlib.pyplot as plt
    import numpy as np
    
    • 1
    • 2
    • 3
    • 4

    2,导入音频

    y,sr = librosa.load('./data/noisy/p226_001_0.wav',sr=None)
    print(y,sr)
    
    • 1
    • 2

    3,提取特征

    1. Log-Mel Spectrogram:是音频信号的时频表示特征
    melspec = librosa.feature.melspectrogram(y,sr,n_fft=1024,hop_length=512,n_mels = 128)
    logmelspec = librosa.power_to_db(melspec)
    print(logmelspec.shape)
    
    • 1
    • 2
    • 3
    1. MFCC是一种在自动语音识别和说话人识别中广泛使用的特征
    mfccs = librosa.feature.mfcc(y=y,sr=sr,n_mfcc=40)
    print(mfccs.shape)
    
    • 1
    • 2

    4,绘图显示

    1. 波形图:librosa.display.waveplot(y,sr)
    plt.figure()
    librosa.display.waveplot(y,sr)
    plt.title('Beat wavform')
    plt.gcf().set_size_inches(20, 12) # get current figure
    plt.savefig("./png/clean.png",dpi=300)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. mel谱图:其实就是非线性语谱图,因为梅尔刻度是针对人耳设计的,因此梅尔频谱很大程度上保留了人耳理解原本语音所需的信息,这就是梅尔频谱的精髓所在。(logmelspec是上面得到的值)
      librosa.display.specshow( logmelspec, sr = sr, x_axis = ‘time’, y_axis = ‘mel’ )

    直接画:

    plt.figure()
    librosa.display.specshow(logmelspec,sr=sr,x_axis='time',y_axis='mel')
    plt.title('mel spectrogram')
    plt.savefig("./png/clean_mel.png",dpi=300)
    
    • 1
    • 2
    • 3
    • 4

    归一化之后画:

    # 第二种
    L = len(y)
    print("time:",L * sr)
    y = y*1.0/max(y)
    framelength = 0.025
    # NFFT点数=0.025*sr
    framesize = int (framelength * sr)
    print("NFFT:",framesize)
    #提取mel特征
    mel_spect = librosa.feature.melspectrogram(y, sr=sr, n_fft=framesize)
    #转化为log形式
    mel_spect = librosa.power_to_db(mel_spect, ref=np.max)
    librosa.display.specshow(mel_spect, sr=sr, x_axis='time', y_axis='mel')
    plt.ylabel('Mel Frequency')
    plt.xlabel('Time(s)')
    plt.title('Mel Spectrogram')
    plt.savefig("./png/clean_mel2.png")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 语谱图:(横轴为时间,纵轴为频率,颜色为幅值)也称为声音的时频域表示(时频图)
      这种画的好看点,进行了加窗和归一化
    plt.figure()
    # sr=None声音保持原采样频率, mono=False声音保持原通道数
    data, rs = librosa.load('./data/noisy/p226_001_0.wav', sr=None, mono=False) 
    L = len(data)
    print('Time:', L / rs)
    #归一化
    data = data * 1.0 / max(data)
    #0.025s
    framelength = 0.025
    #NFFT点数=0.025*fs
    framesize = int(framelength * rs)
    print("NFFT:", framesize)
    #画语谱图
    plt.specgram(data, NFFT=framesize, Fs=rs, window=np.hanning(M=framesize))
    plt.ylabel('Frequency')
    plt.xlabel('Time(s)')
    plt.title('Spectrogram')
    plt.savefig("./png/clean_linear2.png")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    语谱图

    5,将多张图画在同一张图中

    plt.subplot(2,3,1)也可以简写plt.subplot(231)表示把显示界面分割成2*3的网格。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号

    # 3.4 将波形和频谱画在同一张图中
    plt.figure()
    # plt.subplot(2,3,1)也可以简写plt.subplot(231)表示把显示界面分割成2*3的网格。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号
    plt.subplot(2,1,1)
    librosa.display.waveplot(y,sr)
    plt.title('Beat wavform')
    
    plt.subplot(2,1,2)
    librosa.display.specshow(logmelspec,sr=sr,x_axis='time',y_axis='mel')
    plt.title('Mel spectrogram')
    plt.tight_layout() #保证图不重叠
    plt.savefig("./png/clean_mix.png",dpi=300)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    语音基础知识

  • 相关阅读:
    HDMI线EMI超标整改方案
    React Native将 ipad 端软件设置为横屏显示后关闭 Modal 弹窗报错
    Eureka 服务注册源码探秘——图解、源码级解析
    Makefile基础
    【CSS】各百分比透明度 opacity 对应的 16 进制颜色值(例如:#FFFFFF80)
    Vector容器(黑马程序员)
    UEFI之DXE阶段
    C18【关键字】
    Model Fusion of Heterogeneous Neural Networks via Cross-Layer Alignment论文阅读
    解决pip下载速度过慢的问题
  • 原文地址:https://blog.csdn.net/qq_43964318/article/details/126909541