语音识别中的预加重

信息处理 过滤器 语音处理 线性预测
2022-01-29 00:16:56

通常,在语音识别中,所使用的技术是基于线性预测模型(Fant,1960)。

与此平行,人类语音产生机制会导致能量在频率上下降,从而导致声学模型中的信息减少。特别是,与较低频率相比,较高频率的能量更少,因此线性预测模型的结果很差。

为了解决这个问题,对信号应用高通滤波器以增强这些分量并获得分布更均匀的频谱。这称为预强调步骤。

我正在使用 Essentia (essentia.upf.edu) 一个用于音频分析的库。我正在使用由下式给出的预加重滤波器:

x(t)=x(t)α×x(t1)

我用以下参数构造了一个过滤器:

  • 分子 = [1 0]
  • 分母 = [1,α], 在哪里α= 0.97

对应于上述滤波器 Z 域中传递函数的参数。

下图显示了一个音频帧(512 个样本)的频谱及其过滤版本。

Spectrum 及其过滤版本

我有两个问题:

  • 我没有看到滤波频谱的高频分量有很大的增强,所以它看起来像这一步的预期结果(预加重)吗?
  • 如何找到最佳截止频率来设计更精确的滤波器?例如,是否有一种更强大的预加重技术,可以根据给定频谱的频率分布重新调整截止频率的值?

这是源代码:

import essentia.standard as std

loader = std.MonoLoader(filename='../../data/audio.wav')
audio = loader()
f = std.FrameGenerator(audio, frameSize=512, hopSize=128, startFromZero=True)
s = std.Spectrum()
w = std.Windowing(type='hann')

specs = []
for frame in f:
    specs.append(s(w(frame))

filter = filter = std.IIR(denominator=[1, 0.97], numerator=[1, 0])

plot(specs[100], label="spectrum")
plot(filter(specs[100]), label="filtered spectrum")
legend(loc=1, borderaxespad=0.)
0个回答
没有发现任何回复~