15
在我使用神经网络进行音频信号分析时,我没有在TensorFlow中找到可以处理音频的函数,这给我的项目进度带来了一些困难,所以我决定自己用TensorFlow来写一个音频信号短时傅里叶变换的脚本。
在带有音频输入的TensorFlow中使用人工神经网络进行实验的常用流程是首先对音频进行预处理,然后将其提供给神经网络。TensorFlow附带了快速傅立叶变换的实现,但还不够。在这篇文章中,我将解释我们如何实现它并提供代码,以便可以在计算中的更加方便的使用短时傅里叶变换。
1
音频预处理
在使用深度神经网络开发语音识别引擎时,我们需要将音频提供给神经网络,表示声音有两种常用方法:
时域:每个样本代表气压的变化。
频域:在每个时间戳我们指示每个频率的幅度。
尽管Deep Neural Networks非常擅长自动学习特征,但依靠已知特征来提供我们正在尝试解决的任务所需的信息始终是一个好主意。对于大多数应用,包括语音识别引擎,仍需要对声音的频域进行特征编码提供特征包含的信息量。
2
频谱图和短时傅里叶变换
频谱图是通过对信号的时域计算来显示信号的频率内容如何随时间变化。此操作称为短时傅立叶变换。我可以让神经网络弄清楚如何学习这个操作,但是用1个隐藏层来学习是非常困难的。我可以添加更多层,但我希望保持神经网络的复杂性尽可能小,并且只在最需要的地方学习特征。我使用了开发自动语音识别的例子使用频谱图作为深度神经网络的输入对于涉及非语音音频的类似任务也很常见,如降噪,音乐类型分类,鲸鱼呼叫检测等。
3
为何选择TensorFlow?
我在实现人工神经网络时主要使用TensorFlow,因为我没有在TF中找到短时傅里叶变换的实现,所以我决定实现自己的。
为了理解如何计算STFT,您需要了解如何计算离散傅立叶变换。离散傅里叶变换 - DFT对于那些不熟悉这些概念的人来说,这部分看起来非常技术性,但我认为重要的是要通过一些数学来完整地理解代码。
理论:傅立叶分析基本上是一种将函数表示为周期分量之和,以及从这些分量中恢复函数的方法。当函数及其傅里叶变换都被离散化的对应物替换时,它被称为离散傅里叶变换(DFT)。
给定n个输入幅度的向量x,例如:离散傅立叶变换产生一组n个频率幅度。
DFT由以下等式定义:
其中;k用于表示频域序数
n用于表示时域序数
N是要转换的序列的长度
4
快速傅立叶变换
快速傅立叶变换是一种有效的实现DFT公式。信号必须限制为2的幂。这解释了为什么N(输入到DFT功能的信号的大小)必须是2的幂,以及为什么它必须为零填充。人们可以在python中非常简单地检测x是否是2的幂。
正弦波可以使用欧拉公式表示为复杂正弦波的总和
因为DFT是线性函数,所以总的DFT是每个正弦波的DFT的总和。因此,对于频谱情况,您将获得2个DFT,一个用于正频率,一个用于负频率,这是对称的。这种对称性发生在真实信号上,可以看作是无限(或在我们的例子中是有限的)正弦波之和。
零相位填充
为了使用FFT,输入信号必须具有2长度的功率。如果输入信号的长度不正确,则可以在开始和结束时将零附加到信号本身。
因为零样本最初位于输入信号的中心,所以我将填充信号分开到中间并交换这两个部分的顺序。
5
短时傅里叶变换
您现在计算DFT以评估信号的频率内容有了大致的了解。当频率内容随时间变化时,STFT用于分析信号的频率内容。
你可以这样做:
拍摄信号的片段。
将这些信号从信号的其余部分中剔除,并将DFT应用于每个段。
沿每个段滑动此窗口。
您可以获得DFT系数作为时间和频率的函数。
完整的代码在2个部分被划分:helpers.py和stft.py。
代码可参见github
github地址:https://github.com/dariocazzani/TensorFlow-audio-processing
结论
在TensorFlow中进行STFT的可能性允许机器学习从业者在计算图中的任何地方执行从时域到频域的信号转换。新工具总能带来新的想法,我们希望这篇文章将成为开发新的深度学习解决方案的新思路的源泉。
领取专属 10元无门槛券
私享最新 技术干货