语音的时域分析和频域分析是语音分析的两种重要方法,但是都存在着局限性。时域分析对语音信号的频率特性没有直观的了解,频域特性中又没有语音信号随时间的变化关系。而语谱图综合了时域和频域的优点,明显的显示出了语音频谱随时间的变化情况、语谱图的横轴为时间,纵轴为频率,任意给定频率成分在给定时刻的强弱用颜色深浅来表示。颜色深的,频谱值大,颜色浅的,频谱值小。语谱图上不同的黑白程度形成不同的纹路,称之为声纹,不同讲话者的声纹是不一样的,可用作声纹识别。
下面是在python中绘制语谱图:
# 导入相应的包
import numpy, wave import matplotlib.pyplot as plt import numpy as np import os filename = 'bluesky3.wav'
# 调用wave模块中的open函数,打开语音文件。 f = wave.open(filename,'rb')
# 得到语音参数 params = f.getparams() nchannels, sampwidth, framerate,nframes = params[:4]
# 得到的数据是字符串,需要将其转成int型 strData = f.readframes(nframes) wavaData = np.fromstring(strData,dtype=np.int16)
# 归一化 wavaData = wavaData * 1.0/max(abs(wavaData))
# .T 表示转置 wavaData = np.reshape(wavaData,[nframes,nchannels]).T f.close()
# 绘制频谱 plt.specgram(wavaData[0],Fs = framerate,scale_by_freq=True,sides='default') plt.ylabel('Frequency') plt.xlabel('Time(s)') plt.show()