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

时间:2018-04-29 13:47:46

标签: python audio machine-learning deep-learning speech-recognition

我目前正在开发一个关键字定位系统,该系统使用深度神经网络识别0到9的数字。我有一个人们说数字的数据集(即德州仪器公司收集的TIDIGITS数据集),但数据并没有准备好输入神经网络,因为并非所有的音频数据都具有相同的音频长度,加上一些文件包含按顺序说出的几个数字,例如"一个二三"。

有谁能告诉我如何将这些wav文件转换为仅包含一位数声音的1秒wav文件?有没有办法自动执行此操作?单独准备音频文件会非常昂贵。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

这取决于您拥有的其他数据集,但这里有一种方法:只是盲目地从音频中剪下一秒片段,然后判断每个音频片段文件是否实际上是单个口述数字。

对于每个输入音频文件,定义一个第二个窗口,您可以将其拉出并保存到自己的文件中,然后将此窗口进一步滑入音频文件,然后再将下一个片段插入到自己的文件中。

由于我们需要一个第二个剪辑,并且我们不知道源输入文件中我们的数字位于何处,一旦第一个窗口片段被保存,只有幻灯片说100ms并且拔出下一个窗口。因此,对于每个输入音频文件,我们将创建一系列重叠片段,每个片段的起始点仅与前一个片段分开100毫秒。要轻松执行此操作,请使用命令行工具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

在parm -ss上面以秒为单位定义片段的起始点...所以0.60将在文件中开始600ms ... parm -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秒之间的变化......这将几何爆炸你生成的片段文件的数量...如果你添加另一个最外层的循环,你可以改变每个窗口起始点滑过的增量时间,因为100ms也应该是一个自由变量...所以你的代码应该为你的ffmpeg调用定义三个for循环(到跨输入文件前进,改变窗口宽度,改变窗口幻灯片)

ffmpeg是用于音频/视频操作的行业标准瑞士军刀(以及Sox)......除了命令行工具集之外,ffmpeg也是一组可以从任何语言调用的库(python,go ,. ..)

现在执行一些ML,以确定哪些片段与已知语音数字的最接近匹配,以识别您保留或丢弃的片段

答案 1 :(得分:0)

我会按照沉默的区域分割每个wav。从开始和结束修剪沉默。然后我会通过FFT运行每个部分的不同部分。在声音开始时较小的那些。然后我将频率标准化为基频。然后我将结果作为一个体积,频率和时间的3d数组输入NN。