如何对音频数据进行预处理以输入神经网络

3
我正在开发一个关键词识别系统,使用深度神经网络识别从0到9的数字。我有一个人们说数字的数据集(即在德克萨斯仪器公司收集的TIDIGITS数据集),但该数据不适合输入神经网络,因为并非所有音频数据具有相同的音频长度,而且一些文件包含多个按顺序说出的数字,例如“一二三”。
有人能告诉我如何将这些wav文件转换为只包含单个数字声音的1秒wav文件吗?是否有自动执行此操作的方法?逐个准备音频文件会非常耗时。
预先感谢你!

你有浏览过以下内容吗:一个免费的语音数字数据集。类似于MNIST,但是针对语音... https://github.com/Jakobovski/free-spoken-digit-dataset - Scott Stensland
你好@ScottStensland!感谢您的回复!我在这个项目中使用的数据集是必需的,所以我不能真正改变它 :/ - UrmLmn
相关 https://dev59.com/nnjZa4cB1Zd3GeqPZRDQ - Nikolay Shmyrev
2个回答

4
这取决于您拥有哪些其他数据集,但以下是一种方法:只需从音频中盲目地剪切出一个秒的片段,然后根据每个音频片段文件是否实际上是单个口语数字进行判断。
对于每个输入音频文件,定义一个一秒钟的窗口,将其拔出并保存到自己的文件中,然后将此窗口滑动到音频文件中,并再次将下一个片段拔出到自己的文件中。
由于我们想要一秒钟的片段,而且我们不知道源输入文件中我们的数字位于何处,在保存第一个窗口片段之后,仅向前滑动100ms并提取下一个窗口。因此,对于每个输入音频文件,我们将创建一系列重叠的片段,每个片段的起点与前一个片段仅相隔100ms。为了轻松执行此操作,请使用命令行工具ffmpeg。 https://ffmpeg.org/ffmpeg.html https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax
input_audio=audio_from_your_dataset.wav

output_audio=output/aaa

ffmpeg -i $input_audio -ss 0    -t 1 -acodec copy ${output_audio}.0.00.wav
ffmpeg -i $input_audio -ss 0.20 -t 1 -acodec copy ${output_audio}.0.20.wav
ffmpeg -i $input_audio -ss 0.40 -t 1 -acodec copy ${output_audio}.0.40.wav
ffmpeg -i $input_audio -ss 0.60 -t 1 -acodec copy ${output_audio}.0.60.wav
ffmpeg -i $input_audio -ss 0.80 -t 1 -acodec copy ${output_audio}.0.80.wav
ffmpeg -i $input_audio -ss 1.00 -t 1 -acodec copy ${output_audio}.1.00.wav  
ffmpeg -i $input_audio -ss 1.20 -t 1 -acodec copy ${output_audio}.1.20.wav

在上面的参数中,-ss定义了片段的起始点(以秒为单位)...因此0.60将从文件的第600毫秒开始...参数-t定义了窗口的长度(以秒为单位)。

因此它的输出将是:

./output/aaa.0.00.wav
./output/aaa.0.20.wav
./output/aaa.0.40.wav
./output/aaa.0.60.wav
./output/aaa.0.80.wav
./output/aaa.1.00.wav   
./output/aaa.1.20.wav

在命令行上运行上述问题,不仅限于wav格式,其他编解码器也可以使用。现在,您有几个从相同输入音频中提取的一秒片段音频文件。然后我会将上述过程包装在一个元进程中,该过程变化您窗口的宽度。并没有明确规定必须是1秒,所以对于窗口长度从0.1秒到1秒的所有窗口都执行上述操作。这将呈几何级数增加您生成的片段文件数量。如果您添加另一个最外层循环来使每个窗口起始点滑动的增量时间发生变化,则额外得分。因此,您的代码应该在ffmpeg调用周围定义三个循环(跨越输入文件,变化窗口宽度,变化窗口滑动)。
FFmpeg是音视频处理的行业标准瑞士军刀(和Sox一样)。除了一组命令行工具之外,FFmpeg还是可从任何语言(例如Python,Go等)调用的库集合。
现在进行一些机器学习以识别哪些片段与已知的口述数字最相似,以确定要保留或丢弃哪些片段。

非常感谢您的回答!我会尝试这种方法! - UrmLmn

1
我会将每个音频文件按静默区域分割。从开头和结尾裁剪静音。然后,我会对不同部分的音频进行FFT处理。在声音开始时处理较小的部分。然后,我会根据基频归一化频率。接下来,我会将结果作为3D数组的音量、频率和时间输入神经网络中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接