单人组队:
- RainEggplant, 2017******
- aoa_estimator.py : 估计远场声源角度的主程序
- result_train.txt: 训练集上的角度估计结果
- result_test.txt: 测试集上的角度估计结果
Python 3.7, Windows 10 x86
usage: aoa_estimator.py [-h] -d DIRECTORY -n NUMBER
This tool will estimate the Angle of Arrival (AoA) of the sound source from
audio files.
optional arguments:
-h, --help show this help message and exit
-d DIRECTORY, --directory DIRECTORY
the parent directory of audio files
-n NUMBER, --number NUMBER
the number of audio files
判断声源的角度的基本思路是利用信号到达两个麦克风的时间差 (TDOA)。在题目的设置下(如下图),设麦克风间距为
但是,题目给出的音频是不能直接用于计算的,因为它存在着以下问题:
- 叠加了强噪音
- 采样率很低
- 有混响干扰
如果直接使用,结果误差会非常大。因此需要先针对这些问题进行信号处理。
我之前曾经学习过录音与混音,一个常见的操作是使用 EQ 压低噪声、调整音色,这完全可以应用到题目中语音信号的处理上。考虑到女声的基频大致在 200 Hz - 1200 Hz 区间,再考虑到保留泛音和高频噪声的平衡,我应用了 [200 Hz, 3000 Hz] 的带通线性相位 FIR 滤波器。这样,可以去除部分低频的混响和高频噪声,而使得人声更加清晰。
这一方法对估计精度的提升效果是较显著的。我将这一方法告诉了多位同学,他们都表示结果有明显提升。
该步处理采用 scipy.signal
中的 firwin
和 lfilter
实现。
仅作低切、高切处理是不够的,还需要处理通带内的噪声。我采用的去噪方法的原理是谱减法,即先采得一段噪声(本次作业中默认为开始处的一小段音频),计算得其频谱。然后再对音频分帧计算频谱并减去噪声谱,逆变换得去噪后的信号。
该步处理采用 noisereduce.reduce_noise
实现。
题目所给的原始音频文件的采样率仅为 20000 Hz, 由此计算的延时仅有 11 种是落在有效区间的,因此必须进行升采样。
该步处理采用 librosa.resample
实现。
在实验中,我发现程序得出的
这样可以使得
该程序平均 2s 分析一条音频(既然助教说时间不是硬要求所以我就多算一会)。
在训练集上运行,结果请见 report_train.txt
。其与真实值的平均误差为
在测试集上运行,结果请见 report_test.txt
。
该程序仍有进一步优化的方向,例如加入对混响的消除、分段估计并统计等。但是对于本次题目,前面的处理已经使得误差达到了很小的程度。此时,估计精度应当主要受限于采样率,采用这些方法能提升的空间比较有限,所以并没有进行实现。