Python实现为语音文件创建声谱图(包括窄带声谱和宽带声谱)

选题自(数字语音处理理论及应用)

Python实现画语音文件的声谱图

  • 代码部分
  • 结果以及分析

参数选用:
窗函数:汉明窗
宽带声谱窗长:5ms
宽带声谱FFT长度:1024
窄带声谱窗长:50ms
窄带声谱FFT长度:1024
使用对数幅度
声谱图为彩色

代码部分

import matplotlib.pyplot as plt   #画图用
import librosa.core as lc   #计算stft使用
import numpy as np   #使用了其中的一些工具函数
import librosa.display   #画声谱图用
from scipy.io import wavfile   #获取wav文件的采样率

path = "/Users/mine/Desktop/wavefiles/s5.wav"    
fs, y_ = wavfile.read(path)        #读取文件的采样率
fs = fs       
n_fft = 1024         #FFT长度
y, sr = librosa.load(path, sr=fs)

#获取宽带声谱图
mag = np.abs(lc.stft(y, n_fft=n_fft, hop_length=10, win_length=40, window='hamming'))        #进行短时傅里叶变换,并获取幅度
D = librosa.amplitude_to_db(mag, ref=np.max)    #幅度转换为db单位
librosa.display.specshow(D, sr=fs, hop_length=10, x_axis='s', y_axis='linear')             #画声谱图
plt.colorbar(format='%+2.0f dB')
plt.title('broadband spectrogram')
plt.savefig('broader.png')
plt.show()

#获取窄带声谱图
mag1 = np.abs(lc.stft(y, n_fft=n_fft, hop_length=100, win_length=400, window='hamming'))
mag1_log = 20*np.log(mag1)
D1 = librosa.amplitude_to_db(mag1, ref=np.max)
librosa.display.specshow(D1, sr=fs, hop_length=100, x_axis='s', y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('narrowband spectrogram')
plt.savefig('narrowband.png')
plt.show()

结果以及分析

宽带声谱图如下:
Python实现为语音文件创建声谱图(包括窄带声谱和宽带声谱)_第1张图片
窄带声谱图如下
Python实现为语音文件创建声谱图(包括窄带声谱和宽带声谱)_第2张图片
结果分析:
声谱图也即是语音短时傅里叶变换的幅度画出的2D图,
宽带声谱图参数:
FFT长度:1024
声谱窗长:5ms(8k采样率时设置为40)
窗移:(8k采样率时设置为10)
窄带声谱图参数:
FFT长度:1024
声谱窗长:50ms(8k采样率时设置为400)
窗移:(8k采样率时设置为100)

在宽带声谱图中,可以看出时间分辨率很好,频率分辨率较低,不能很好反映声音的纹理特性,反映了频谱的时变特性,能很好分辨出共振峰的大致位置,但分辨不清谐波结构。
在窄带声谱图中可以观察到有清楚的谐波结构,而且频率分辨率非常好,可以清楚地看到各音阶出现的时刻,以及各时刻对应频率处的能量强弱,但是时间上的分辨率不太理想,因为频率分辨率太过精细,因而不能很好体现出共振峰的大致位置,即反映不出基波的变化特性。

你可能感兴趣的:(语音处理)