分类
ASRT 智能语音技术

语音声学特征提取:用于ASRT的语谱图特征的算法原理与实现

(在苹果系统下,如果文章中的图片不能正常显示,请升级Safari浏览器到最新版本,或者使用Chrome、Firefox浏览器打开。)

AI柠檬博主在之前的一篇文章里讲了常见的MFCC、FBank、LogFBank等语音特征提取算法。不过ASRT语音识别系统在声学特征的提取上,使用的既不是大家所熟知的MFCC算法,也不是FBank(或LogFBank)算法,而是一种语谱图特征。不过这种语谱图特征也是AI柠檬博主从MFCC和FBank算法修改而来的,原则是保留更多的原始信息以供神经网络计算,避免经过人工特征设计的滤波器产生大量的信息损失。

       语谱图特征是有别于mfcc和logfBank特征的另一种声学特征,与其说是提取特征,不如说是仅仅对声音信号进行预处理。传统的MFCC特征、fBank和logfBank等特征在傅里叶变换后,都存在各种类型人工设计的滤波器,如Mel滤波器。这些基于人工特征算法的语音特征提取,会造成频域中的语音信号,尤其是高频区域的信号,其声音信息的损失会比较大。而那些传统语音特征提取算法,在时域上还存在着非常大的时间窗偏移,其目的是用来降低运算量,所以也会导致声音信息的损失问题,尤其是说话人语速较快时[1]。

以下是传统的MFCC特征提取算法的流程图:

MFCC算法流程
图1 MFCC算法流程

       语谱图则在logfBank特征去掉离散余弦变换的基础上,再去掉人工特征滤波器(Mel滤波器),以及第一步预加重的过程,直接将快速傅里叶变换并取模之后得到的“时-频”幅度谱取对数,得到的结果作为语音特征的表示。

       这种不直接经过人工设计的滤波器进行特征提取,得到“时域-频域”的对数幅度谱,就是我们这里所说的语谱图。这种特征的好处是将进一步的特征提取交给后续的神经网络模型来实现,神经网络可以在训练的过程中,自动学习到类似Mel滤波器的提取特征,由于包含了更多传统算法丢掉的信息,所以在当前的实际应用中,效果往往优于传统特征提取算法。

下面是应用于ASRT语音识别系统的一段实现代码[2]:

x=np.linspace(0, 400 - 1, 400, dtype = np.int64)
w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1) ) # 汉明窗

def GetFrequencyFeature4(wavsignal, fs):
	
	if(16000 != fs):
		raise ValueError('[Error] ASRT currently only supports wav audio files with a sampling rate of 16000 Hz, but this audio is ' + str(fs) + ' Hz. ')
	
	# wav波形 加时间窗以及时移10ms
	time_window = 25 # 单位ms
	window_length = fs / 1000 * time_window # 计算窗长度的公式,目前全部为400固定值
	
	wav_arr = np.array(wavsignal)
	#wav_length = len(wavsignal[0])
	wav_length = wav_arr.shape[1]
	
	range0_end = int(len(wavsignal[0])/fs*1000 - time_window) // 10 + 1 # 计算循环终止的位置,也就是最终生成的窗数
	data_input = np.zeros((range0_end, window_length // 2), dtype = np.float) # 用于存放最终的频率特征数据
	data_line = np.zeros((1, window_length), dtype = np.float)
	
	for i in range(0, range0_end):
		p_start = i * 160
		p_end = p_start + 400
		
		data_line = wav_arr[0, p_start:p_end]
		
		data_line = data_line * w # 加窗
		
		data_line = np.abs(fft(data_line)) / wav_length
		
		
		data_input[i]=data_line[0: window_length // 2] # 设置为400除以2的值(即200)是取一半数据,因为是对称的
		
	#print(data_input.shape)
	data_input = np.log(data_input + 1)
	return data_input

参考资料Refference

  1. 王海坤, 潘嘉, 刘聪. 语音识别技术的研究进展与展望[J]. 电信科学, 2018.
  2. AI柠檬, ASRT语音识别系统, GitHub, https://github.com/nl8590687/ASRT_SpeechRecognition .
版权声明
本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。
本文地址: https://blog.ailemon.net/2021/03/08/speech-acoustic-feature-extraction-the-principle-and-implement-of-the-spectrogram-algorithm-for-asrt/
All articles are under Attribution-NonCommercial-ShareAlike 4.0

关注“AI柠檬博客”微信公众号,及时获取你最需要的干货。


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

4 + 6 =

如果您是第一次在本站发布评论,内容将在博主审核后显示,请耐心等待