将音频信号分帧后,我们会得到一系列短音频片段。然而,这种分帧处理会带来一个问题。每个帧都存在突然、尖锐的起始和结束,这是原始连续声波中不存在的人为不连续性。如果我们直接分析这些帧中的频率,这些尖锐的边缘会引入大量原始语音中没有的高频噪声。这种现象称为频谱泄漏,即来自特定频率的能量“泄漏”到其他频率中,扭曲了信号的真实频率成分。为了获得准确的表示,我们必须先平滑这些边缘。窗口函数的作用窗口函数是一种数学函数,我们将其应用于每个帧,以解决频谱泄漏问题。其目的是减小信号在帧的起始和结束处的振幅,使其平滑地趋近于零。你可以将其理解为让每个帧在开始时轻柔地淡入,在结束时轻柔地淡出。通过将帧的音频数据与窗口函数相乘,我们最大程度地减小边界处的尖锐不连续性。这会得到一个更适合频率分析的信号,这是特征提取中重要的一步。汉明窗尽管存在多种类型的窗口函数,例如汉宁窗和布莱克曼窗,但对于语音识别而言,汉明窗是一种非常常用且有效的选择。汉明窗的形状是中间值接近一,并在边缘处平滑地趋向于小的非零值。过程很简单:音频帧中的每个采样点都乘以窗口函数中对应的采样点。让我们把这个过程可视化。首先,想象我们有一个具有尖锐边缘的音频帧。{"layout":{"xaxis":{"title":"采样点编号","showgrid":false},"yaxis":{"title":"振幅"},"margin":{"l":50,"r":20,"t":20,"b":40}},"data":[{"x":[0,10,20,30,40,50,60,70,80,90,100],"y":[0,0.84,0.91,-0.14,-0.99,-0.76,0.28,1,0.65,-0.42,-1],"type":"scatter","mode":"lines","name":"原始帧","line":{"color":"#228be6","width":2.5}}]}从信号中分出的一个音频帧。注意其非零的突然起始和结束值。接下来,我们有与帧长度相同的汉明窗。{"layout":{"xaxis":{"title":"采样点编号","showgrid":false},"yaxis":{"title":"权重"},"margin":{"l":50,"r":20,"t":20,"b":40}},"data":[{"x":[0,10,20,30,40,50,60,70,80,90,100],"y":[0.08,0.11,0.21,0.39,0.61,0.82,0.96,1,0.96,0.82,0.61,0.39,0.21,0.11,0.08],"type":"scatter","mode":"lines","name":"汉明窗","line":{"color":"#12b886","width":2.5}}]}一个汉明窗。其值在中间最高,并趋向于边缘。最后,我们对帧和窗进行逐点相乘。得到的“加窗”帧现在在接近零处开始和结束,形成了一个更平滑的片段。{"layout":{"xaxis":{"title":"采样点编号","showgrid":false},"yaxis":{"title":"振幅"},"margin":{"l":50,"r":20,"t":20,"b":40}},"data":[{"x":[0,10,20,30,40,50,60,70,80,90,100],"y":[0,0.09,0.19,-0.05,-0.6,-0.62,0.27,1,0.62,-0.34,-0.61],"type":"scatter","mode":"lines","name":"加窗帧","line":{"color":"#be4bdb","width":2.5}}]}应用汉明窗后的音频帧。信号现在在两端平滑地趋于零。与重叠帧的关联加窗处理有助于说明我们为什么要使用重叠帧,这是上一节的一个内容。由于窗口函数会减小每个帧边缘处信号的振幅,我们有丢失这些部分所含信息的风险。通过重叠帧,我们确保在一个帧末尾被弱化的信息在下一个帧的中间部分得到充分的体现。这个过程保证音频信号的任何部分在分析过程中都不会被忽略。graph G { rankdir=TB; splines=true; overlap=false; node [shape=none, fontname="sans-serif", fontsize=10]; edge [style=invis]; subgraph cluster_0 { label="重叠窗加权后的信号"; style="rounded"; bgcolor="#e9ecef"; fontname="sans-serif"; fontsize=12; a1 [label="帧 1\n(加权)"]; b1 [label="帧 2\n(加权)"]; c1 [label="帧 3\n(加权)"]; a1 -- b1 -- c1; {rank=same; a1; b1; c1;} a2 [pos="1,0!", shape=point, style=invis]; b2 [pos="2,0!", shape=point, style=invis]; c2 [pos="3,0!", shape=point, style=invis]; d2 [pos="4,0!", shape=point, style=invis]; edge [style=solid, color="#845ef7", penwidth=2]; a2 -- b2 [label="", headport=n, tailport=n, constraint=false, pos="c,1.5,1 c,1,1"]; b2 -- c2 [label="", headport=n, tailport=n, constraint=false, pos="c,2.5,1 c,2,1"]; c2 -- d2 [label="", headport=n, tailport=n, constraint=false, pos="c,3.5,1 c,3,1"]; } subgraph cluster_1 { labeljust="l"; label="来自原始信号的信息"; style="rounded,dashed"; bgcolor="#f8f9fa"; fontname="sans-serif"; fontsize=10; x [label="帧 1 末尾丢失的信息..."]; y [label="...在帧 2 中间被捕获。"]; x -- y [style=solid, constraint=false, color="#495057", penwidth=1, arrowhead=vee, headport=n, tailport=s, pos="e,2.15,0.7 b,1.85,1.2"]; } }帧之间的重叠确保了一个加窗帧末尾被减弱的信息在后续帧中得到适当分析。我们的音频现在已经分帧并加窗,信号已妥善准备好进行预处理的下一个也是最重要阶段:提取机器学习模型可以用来区分不同声音的特征。