DSP - Lab 3: MFCC: Mel 频率的倒谱系数
本实验中,我们实现了一个端点检测算法,并构造了一个 Mel 滤波器组处理信号的能量谱,最后利用离散余弦变换(DCT)得到了信号的 MFCC 系数。
Digital Signal Processing @ Fudan University, fall 2021.
实验简介
Quote
- 录音,用 8 kHz 采样,朗读单词 shop。
- 端点检测(画出语音波形,标出起点和终点)。
- 从语音起点开始取 \(L\) 个窗口,窗度为 \(N\),窗口重叠 \(N/2\)。
- 每一个窗口,计算 MFCC 系数(维度为 \(D\))。用表格列出 \(L\) 个 \(D\) 维 MFCC 系数。
注意:参数 \(L\), \(N\), \(D\) 请合理设定。
实验报告
1 预加重
1 2 3 4 5 6 | |
在载入音频后,我们需要先进行一些预处理,这里主要是进行了预加重(pre-emphasis)和归一化。其中预加重的目的是为了补偿输入信号中的高频分量,这是因为在信号的传输过程中,信号频率越高,能量衰减越大。由于预加重并不影响噪声,因此预加重可以有效提高信号的整体信噪比。
预加重的计算方法如下:
\[y(n) = x(n)-\alpha x(n-1)\]
其本质就是一个 \(H(z) = 1-\alpha z^{-1}\) 的高通滤波器,其中系数 \(\alpha\) 在本实验中的取值为 \(0.97\)。
2 端点检测
1 2 3 4 5 6 | |
接下来我们将音频中的语音部分提取出来,在这一步我们将确定语音的起点和终点。其基本原理是利用语音的短时平均幅度和短时过零率(Zero-Crossing Rate, ZCR)。
2.1 分帧计算短时平均幅度和短时过零率
首先将信号分帧,同之前讲过的 STFT 过程,这里不再赘述。
1 2 3 | |
分帧后,我们就可以计算每帧的平均幅度 \(\overline{M_i}\) 和过零率 \(\overline{Z_i}\) 了。
平均幅度:
\[\overline{M_i} = \frac{1}{N} \sum\limits_{n=i}^{i+N-1} |S(n)|\]
其中 \(N\) 为窗口宽度,\(S\) 为信号幅度。本实验中 \(N\) 的取值为 \(128\)。
1 | |
过零率:
\[\overline{Z_i} = \frac{1}{2T} \sum\limits_{n=i+1}^{i+N-1} |\operatorname{sgn}S(n)-\operatorname{sgn}S(n-1)|\]
其中 \(T\) 为窗口时间宽度,\(\operatorname{sgn}\) 为符号函数。本实验中 \(T\) 的取值为 \(16\ \mathrm{ms}\)。
1 2 3 | |
2.2 利用短时平均幅度(高阈值)初步判断区间
1 2 3 4 5 6 7 8 9 | |
第一步,我们顺序遍历所有帧,将所有短时平均幅度高于阈值 \(M_H\) 的区间提取出来。这里进行了一个区间重叠判断,如果当前帧和上一帧的间距不超过 2,则判定重叠,将当前帧并入上一个区间。本实验中 \(M_H\) 的取值为 \(0.6\%\)。
通过这一步,我们至少可以找到信号中所有的浊音。不过对于测试音频 shop 来说,浊音 -o- 和清音 -p 之间存在一个小的间隔,且清音 -p 的持续时间很短,这可能导致清音 -p 无法被检测到。因此这里将阈值 \(M_H\) 设置得比较低,目的是为了在这一步能同时检测到幅度较小的清音,但副作用是如果背景噪声较大,可能会影响端点检测的结果。
2.3 利用短时平均幅度(低阈值)扩展区间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
第二步,我们对上一步得到的区间进行扩展,分别向前和向后查找新的起点和终点。当短时平均幅度降低到阈值 \(M_L\) 以下时,即可确定新的端点。这里采用了和第一步类似的区间重复判断。本实验中 \(M_L\) 的取值为 \(0.2\%\)。
通过这一步,我们基本利用平均幅度的信息找到了语音段的大致区间。不过由于清音段的幅度较小,难以与无声段区分,因此为了得到更精确的端点位置,我们需要利用清音段相较无声段过零率显著更高的特点。
2.4 利用短时过零率扩展区间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
第三步,我们进一步扩展区间,这一步主要是为了精确判断清音段和无声段的分界点。观察信号的过零率曲线:
可见,无声情况下的短时过零率均值在 \(2.0\ \mathrm{kHz}\) 左右,而清音段的短时过零率均值则在 \(6.0\ \mathrm{kHz}\) 左右,因此不妨将过零率阈值 \(Z_0\) 设置为 \(4.5\ \mathrm{kHz}\)。类似第二步,分别向前和向后查找,当短时过零率降低到阈值 \(Z_0\) 以下时,即可确定新的端点。
通过这一步,我们就确定了语音段的范围。
1 | |

3 构造 Mel 滤波器组
1 2 3 4 5 | |
基于人耳的听觉特性,我们可以构造 Mel 滤波器组来模拟人耳对声音的非线性感知。具体来说,Mel 频率与实际频率的对应关系如下:
\[ \begin{align*} B(f) &= 2595\log_{10}(1+\frac{f}{700}) \\\\ B^{-1}(f_{\mathrm{mel}}) &= 700\cdot (10^{f_{\mathrm{mel}}/2595}-1) \end{align*} \]
因此,首先我们将实际频域映射到 Mel 频域。这里我们取频域下限 \(f_{\min}\) 为 \(20\ \mathrm{Hz}\),也就是人类能听到的最低频率;取频域上限 \(f_{\max}\) 为 \(4000\ \mathrm{Hz}\),也就是采样频率 \(f_s\) 的一半(由 Nyquist 定理可知)。
1 2 3 4 | |
然后在 Mel 频域等间隔地取 \(M\) 个滤波器的中心频率 \(f_{\mathrm{c}}(m)\),再映射回实际频域,并转换为 FFT 频率点的位置 \(f(m)\),有
\[f(m) = \frac{N}{f_s} B^{-1}(B(f_{\min}) + \frac{m}{M+1}(B(f_{\max})-B(f_{\min})))\]
其中 \(N\) 为窗口宽度,\(f_s\) 为采样频率。本实验中 \(M\) 的取值为 \(14\)。
1 2 | |
得到各 Mel 滤波器的中心频率后,我们就可以构造这 \(M\) 个滤波器了。Mel 滤波器是具有三角形状的带通滤波器,其频率响应定义为:
\[ H_m(k) = \begin{cases} 0 &k < f(m-1) \\\\ \large \frac{k-f(m-1)}{f(m)-f(m-1)} &f(m-1) \le k \le f(m) \\\\ \large \frac{f(m+1)-k}{f(m+1)-f(m)} &f(m) < k \le f(m+1) \\\\ 0 &k > f(m+1) \end{cases} \]
1 2 3 4 5 6 7 | |
如此我们就得到了 Mel 滤波器组。
4 使用 Mel 滤波器组处理能量谱
1 2 3 4 5 6 7 8 | |
然后我们就可以使用这个 Mel 滤波器组处理信号的能量谱。这里能量谱就是频谱的平方,频谱的生成方法可参见上一个实验报告。
处理前的对数频谱图:
处理后的对数能量谱:
5 生成 MFCC 系数
1 2 | |
最后,我们对刚才得到的对数能量谱使用离散余弦变换(Discrete Cosine Transform, DCT),就可以得到 Mel 频率的倒谱系数(Mel-Frequency Cepstral Coefficient, MFCC)。其中 DCT 的计算方法如下:
\[ \begin{align*} F(0) &= \frac{1}{\sqrt{M}} \sum\limits_{x=0}^{M-1} f(x) &u=0 \\\\ F(u) &= \sqrt{\frac{2}{M}} \sum\limits_{x=0}^{M-1} f(x)\cos(\frac{\pi u}{2M}(2x+1)) &u=1,2,...,D-1 \end{align*} \]
其中 \(M\) 为 Mel 滤波器的个数,\(D\) 为 MFCC 的维度。本实验中 \(D\) 的取值为 \(13\),即取计算结果的 \(0\) ~ \(12\) 阶 MFCC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
最终生成的 MFCC 如下所示(窗口总数 \(L=61\),窗口宽度 \(N=128\),MFCC 维度 \(D=13\)):
MFCC 系数表
窗口 \ 阶数 0 1 2 3 4 5 6 7 8 9 10 11 12 1 -136.184 -13.031 -2.768 -10.172 4.658 7.187 3.683 2.385 -0.476 0.321 -1.567 0.348 1.143 2 -113.156 -35.058 0.548 -10.253 -3.016 1.534 4.940 1.142 -2.413 2.069 2.118 1.584 1.352 3 -107.730 -29.099 -3.024 -7.169 -8.689 4.982 0.501 -4.845 -6.363 -2.063 -0.074 0.039 3.631 4 -98.901 -36.441 -2.307 -8.584 -6.138 3.381 -1.805 -0.057 -4.116 -0.884 1.934 0.269 -0.232 5 -88.325 -44.003 8.463 -8.954 -8.032 4.853 -3.866 -0.217 -5.332 -2.305 0.061 0.164 1.579 6 -86.533 -50.468 -0.195 -13.077 -11.467 0.751 4.591 2.563 -1.104 4.104 -0.182 -2.775 -2.728 7 -82.730 -47.477 1.002 -10.279 -10.261 -3.788 -0.606 1.254 -2.126 1.093 0.833 1.140 1.035 8 -83.094 -54.283 2.142 -11.372 -10.434 0.357 0.665 -0.255 -0.374 3.381 -4.290 1.005 2.238 9 -73.489 -50.941 -4.853 -16.360 -9.717 -1.993 0.968 -1.636 -1.547 1.331 -0.682 0.714 1.014 10 -68.593 -54.086 -1.231 -8.640 -5.727 -2.803 1.445 1.063 2.173 1.980 -1.929 -2.717 -0.450 11 -64.761 -50.818 2.196 -9.272 -12.094 0.615 0.593 1.870 2.324 3.188 1.526 1.009 3.088 12 -68.797 -52.801 0.712 -8.430 -6.441 2.140 0.398 2.069 2.026 0.724 1.715 -0.268 0.725 13 -67.070 -57.691 4.079 -7.627 -6.656 -2.388 -2.193 -1.457 2.654 4.594 1.064 1.558 3.697 14 -63.204 -60.329 -0.783 -12.126 -13.913 -10.426 -1.648 1.546 -2.268 3.003 4.350 -4.372 0.337 15 -61.749 -60.104 -2.259 -8.640 -6.072 -2.335 1.580 0.421 -0.451 1.244 -0.682 -2.551 -3.528 16 -59.701 -53.818 -1.713 -8.944 -11.393 -5.488 1.591 1.150 2.175 -0.404 1.979 -1.483 -0.296 17 -54.643 -55.298 -7.180 -10.801 -10.501 -1.316 3.031 2.901 -0.468 -0.385 3.052 -2.538 -2.586 18 -51.996 -54.282 -6.788 -11.559 -3.813 -7.531 -0.045 -1.870 -2.358 1.667 -0.571 -0.498 0.586 19 -47.938 -52.046 -8.799 -12.181 -12.693 -8.973 -0.286 1.462 -1.973 4.162 3.661 -0.950 -0.675 20 -54.073 -45.529 -1.579 -6.090 -13.352 -9.212 3.667 5.096 -2.889 -3.497 -0.128 -3.200 -3.036 21 -44.500 -13.196 6.911 -1.505 -5.380 -10.804 1.867 1.111 -6.114 -3.165 -0.386 -4.764 1.208 22 10.939 8.281 -11.060 -10.537 -7.030 -13.155 0.460 0.896 -3.942 -3.485 -3.573 -3.913 -1.956 23 32.596 -4.224 -12.394 -13.728 -6.199 -13.283 -3.092 5.254 -4.413 -6.222 -2.737 -2.436 -1.954 24 31.060 -2.636 -8.457 -20.845 -6.658 -7.516 -10.579 8.323 -2.906 -6.316 -5.256 -1.880 0.650 25 29.661 0.514 -8.408 -25.574 -1.311 -0.314 -15.937 8.631 -0.984 -5.522 -8.682 -1.518 4.536 26 25.615 2.361 -10.610 -26.771 0.671 1.439 -15.957 12.016 -5.455 -2.977 -5.927 -2.258 2.603 27 19.973 2.203 -10.316 -28.870 -2.639 1.115 -13.998 9.789 -7.097 3.087 -4.951 -2.216 2.303 28 9.436 5.840 -11.957 -37.355 -1.369 1.719 -13.554 7.657 -3.748 4.033 -1.986 1.356 2.989 29 9.146 16.361 -10.860 -33.274 0.107 6.190 -6.977 0.676 -3.818 0.382 -4.042 -3.915 1.445 30 17.490 7.615 -9.744 -32.910 4.054 9.422 -7.651 2.823 -5.391 2.916 -4.786 -5.969 0.914 31 3.992 3.183 -12.607 -43.151 -3.386 2.429 -8.197 -0.504 -7.460 2.286 -2.254 -5.539 -0.098 32 3.799 7.630 -12.942 -37.780 0.484 5.422 -6.598 -3.043 -6.092 1.890 -3.919 -6.462 0.361 33 1.741 8.624 -6.672 -35.705 -1.732 5.926 -3.015 1.736 -5.107 2.008 -3.003 -4.846 -0.786 34 -9.919 3.179 -15.739 -36.457 -3.975 4.729 -2.200 2.849 -3.383 2.000 0.109 0.085 2.412 35 -15.646 8.968 -8.959 -33.854 1.472 9.122 1.843 3.937 -3.870 1.170 -1.108 -5.017 -1.938 36 -20.836 15.396 -11.368 -38.449 3.036 6.562 -6.068 -2.413 -4.966 -0.969 -7.324 -3.543 -1.175 37 -26.521 13.695 -11.808 -35.462 3.098 8.545 -4.209 0.126 -3.227 -1.414 -6.059 -2.327 -0.107 38 -37.598 5.751 -17.405 -36.898 3.517 4.346 -3.525 3.940 -2.532 1.085 -4.538 -1.043 2.290 39 -44.037 4.908 -5.998 -33.543 6.719 4.484 -0.873 3.632 -1.912 3.161 -2.066 -2.119 0.506 40 -54.880 14.961 -5.015 -30.692 9.378 2.551 -6.917 -0.244 -3.498 4.220 -5.074 -1.149 -0.330 41 -50.737 18.469 -7.010 -26.559 5.575 4.381 -4.626 2.512 -4.038 2.283 -6.958 -3.240 -0.381 42 -79.521 13.416 -6.584 -25.720 2.132 8.239 -2.727 3.353 -2.931 -0.800 -5.412 -0.427 3.383 43 -82.772 18.596 -4.013 -18.647 5.185 7.213 0.271 1.833 -1.365 -0.187 -3.130 0.401 0.647 44 -87.535 19.907 -3.356 -20.160 -5.426 -1.762 -1.774 5.000 0.684 -1.017 -2.955 0.367 1.294 45 -94.737 19.109 -3.676 -16.580 3.534 6.083 -1.064 -2.777 -6.796 -4.260 -4.687 2.547 2.741 46 -100.118 21.012 -3.546 -16.181 0.048 6.209 -0.702 6.520 -5.159 -2.413 -4.863 -1.805 -0.625 47 -107.109 19.482 -4.193 -16.937 1.714 1.714 -7.896 -3.074 -3.345 1.195 -2.037 -0.186 -0.128 48 -114.674 20.465 -9.934 -9.570 5.330 7.618 4.003 -2.378 -10.432 -1.421 -2.696 0.462 2.127 49 -122.764 16.336 -10.797 -11.067 1.057 2.650 -0.685 -2.364 -8.969 -0.321 -5.542 -0.868 0.691 50 -118.829 16.269 -3.310 -1.799 5.975 0.537 -1.193 -0.224 -9.996 3.418 -4.118 -1.198 -0.648 51 -128.750 19.342 -7.934 -8.196 1.346 2.066 -3.675 3.006 -8.899 0.076 -6.086 1.114 2.204 52 -125.066 14.624 -4.327 -2.610 -1.293 2.212 0.614 1.074 -2.920 -4.057 -4.420 -0.355 3.185 53 -63.111 -9.510 10.596 -13.107 -13.977 -0.802 -0.894 0.088 -4.749 2.264 -1.841 -2.590 -0.605 54 -75.429 -6.416 -8.053 -13.452 -7.041 -5.357 0.200 5.779 -1.239 5.943 0.409 -1.878 -0.257 55 -102.627 -10.736 -5.331 -2.975 0.717 -2.020 -0.730 -1.294 -3.260 -2.508 0.068 -1.186 -3.313 56 -91.079 -11.605 -13.268 -4.555 7.649 -1.049 1.801 1.114 -2.578 3.295 -1.534 -1.702 -3.832 57 -90.934 -8.823 -7.553 -9.166 2.696 -2.614 -0.105 -3.861 -5.866 -0.505 -6.371 -0.657 -1.076 58 -90.366 -15.204 -23.178 -12.567 -3.657 -5.083 2.840 1.356 -3.565 3.116 -2.158 -4.485 0.072 59 -94.910 -5.865 -9.891 -4.758 -1.676 -3.209 2.390 0.711 -6.012 0.002 -3.331 -3.450 0.867 60 -108.855 -6.600 -20.903 -19.265 -11.843 -8.288 -2.796 -0.791 -3.762 -0.621 -4.780 -5.844 -1.353 61 -110.043 1.888 -8.338 -10.473 -2.708 2.267 7.620 -1.592 -2.277 1.735 -5.547 -1.750 -0.975
6 运行代码
6.1 安装
配置环境前,首先需要安装以下依赖:
- Anaconda 2022.05 或以上(含 Python 3.9)
然后创建并激活 conda 虚拟环境,同时安装所有依赖包:
1 2 | |
6.2 使用
将音频文件放置于 ./data/dev_set 目录下,执行以下命令启动程序:
1 | |
生成的语音波形图、MFCC 系数以及过程中产生的其他图像将保存在 ./assets/mfcc 目录下。
6.3 测试
本实验中,我们使用了预录制的音频文件 shop.dat,其内容是单词 shop 的一段语音,按 8000 Hz 采样。
运行程序后,程序将在 ./assets/mfcc 目录下生成以下文件:
foobar_time_domain.png:原音频foobar.dat的语音波形图,包括检测到的语音段范围foobar_zcr.png:信号的过零率(ZCR)曲线mel_filters_n_fmin-fmax.png:窗口宽度为 \(N\),频率范围为 \([f_{\min}, f_{\max}]\ \mathrm{Hz}\) 的 Mel 滤波器组foobar_spectrogram_tms_hamming.png:信号在 \(t\ \mathrm{ms}\) 窗口宽度下的语谱图foobar_power_spec_tms_hamming_filtered.png:信号经 Mel 滤波器组处理后的能量图foobar_mfcc.txt:利用离散余弦变换(DCT)得到的 Mel 频率倒谱系数(MFCC)foobar_mfcc.png:上述 MFCC 系数的可视化图像