📜  TensorFlow音频识别

📅  最后修改于: 2021-01-11 11:06:03             🧑  作者: Mango

TensorFlow音频识别

音频识别是计算语言学的一个跨学科子领域,它发展了各种方法和技术,使计算机可以将口语识别和翻译成文本。语音识别通常用于操作设备,执行命令和书写,而无需借助键盘,鼠标或按任何按钮

如今,它是在具有ASR (自动语音识别)软件程序的计算机上完成的。许多ASR程序要求用户“培训” ASR程序以识别其语音,以便它可以更准确地将语音转换为文本。

例如,我们可以说“打开Google chorme ”,然后计算机将打开Internet浏览器镶边。

第一台ASR设备于1952年投入使用,任何用户都可以识别出单个数字。在当今时代,ASR程序用于许多行业,包括军事,医疗保健,电信个人计算机

我们可能使用语音识别的示例: Google语音,自动电话系统,数字语音,数字助手,车载蓝牙。

语音识别系统的类型

自动语音识别是语音识别的一个示例。以下是语音识别系统的其他一些示例。

  • 取决于说话者的系统-语音识别在使用前必须经过培训,这要求我们阅读一系列单词短语
  • 扬声器独立系统-语音识别软件无需培训即可识别大多数用户的语音。
  • 离散语音识别-用户必须在每个单词之间停顿,以便语音识别可以识别每个单独的单词。
  • 连续语音识别-语音识别可以理解标准的讲话速度。
  • 自然语言-语音识别不仅可以理解语音,还可以返回问题或其他询问的答案。像图像的MNIST一样,这应该使我们对所涉及的技术有基本的了解。完成本TensorFlow音频识别教程后,我们将拥有一个模型,该模型尝试将一秒钟的音频片段分类为:
  • 安静
  • 一个未知的词
  • 没有
  • 向上
  • 剩下

TensorFlow音频识别培训

要开始TensorFlow音频识别中的训练过程,请代表TensorFlow源并编写以下内容:

 Python tensorflow/examples/speech_commands/train.py 

该命令可以下载包含65k的语音数据集。 Wav音频文件,人们可以看到30个不同的单词。

TensorFlow中的混淆矩阵

前400个步骤将为我们提供:

1. I0730 17:57:38.073667 55030 train.py:243] Confusion of  the matrix: 
2. [[258 0 0 0 0 0 0 0 0 0 0 0 0 ]
3. [ 7 6 76 94 7 49 1 15 50 2 0 11]
4. [ 10 1 107 80 13 33 0 13 10 1 0 4]
5. [ 1 3 16 164 6 48 0 5 10 1 0 17]
6. [ 15 1 17 114 44 13 0 9 22 5 0 9]
7. [ 1 1 6 97 3 86 1 12 46 0 0 10]
8. [ 8 6 84 86 13 24 1 9 9  1 6 0]
9. [ 9 3 32 112 9 26 1 36 19 0 0 9]
10. [ 9 2 12 94 9 49 0 6 72 0 0 2]
11. [ 16 1 39 75 29 52 0 6 37 9 0 3]
12. [ 15 6 17 71 60 37 0 6 32 3 1 9]
13. [ 11 1 6 151 5 43 0 8 16 0 0 20]]

我们看到第一部分是一个矩阵。每列代表一组针对每个关键字估算的样本。在上面的矩阵中,第一列代表所有被预测为静音的剪辑,第二列代表未知单词,第三列为“是”,依此类推。

TensorFlow中的TensorBoard

我们使用TensorBoard可视化培训进度。这些事件将保存到/ tmp / retrain_logs ,并使用以下语法加载:

tensorboard --logdir /tmp/retrain_logs

完成音频识别培训

经过几个小时的培训,该脚本完成了大约20,000个步骤,打印出了最终的混淆矩阵以及准确率

我们可以使用给定的代码以紧凑的形式导出到移动设备:

python tensorflow speech_commands/freeze.py\ 
--start_checkpoint=/tmp/speech_commands_train/conv.ckpt-18000 \
--output_file=/tmp/my_frozen_graph.pb

语音识别模型的工作

它基于CNN的类型,对于像我们在以前的教程之一中已经使用过图像识别的任何人,都非常熟悉。音频是一维信号,不会对二维空间问题感到困惑。

现在,我们必须解决这个问题,方法是定义一个适合我们口语的时隙,并将该时隙中的信号更改为图像。为此,我们可以将输入的音频分成短段,然后计算频率强度。每个段都被视为数字矢量,它们按时间排列以形成2D数组。值的数组可以像单通道图像一样对待,也称为频谱图。我们可以查看音频样本产生的图像类型:

bazel run tensorflow/examples/wav_to_spectogram:wav_to_spectogram -- \
--input_wav=/tmp/speech_dataset/happy/ab00c4b2_nohash_0.wv \
--output_png=/tmp/spectrogram.png

/tmp/spectrogram.png将向我们显示:

这是一个2d单通道表示,因此我们也倾向于将其像图像一样。

然后将生成的图像输入到多层卷积神经网络中,该层具有完全连接的层,最后是softmax。

TensorFlow中的命令识别

未知类别

我们的应用可能会听到不属于我们训练集的声音。为了使网络了解抵制哪种声音,我们需要提供不属于我们课堂的音频片段。为此,我们可以创建“嘘声”,“喵”声,并用动物发出的噪音填充它们。语音命令数据集包括其未知类别中的20个单词,包括数字(从零到九)以及随机名称。

背景噪音

任何捕获的音频片段中都有背景噪音。要构建可抵抗这种噪音的模型,我们需要针对具有相同属性的录制音频对模型进行训练。语音命令数据集中的文件被记录在多个设备上和不同的环境中,从而为培训提供了帮助。

然后,我们可以从文件中随机选择少量提取物,并在训练过程中将其少量混合成片段。

客制化

该脚本所使用的模型非常庞大,它使用940k权重参数,将进行过多的计算,无法在资源有限的设备上以高速运行。解决此问题的其他方法是:

low_latency_conv:准确性低于conv,但是权重参数的数量几乎相同,并且速度更快

我们应该指定-model -architecture = low_latency_conv在命令行上使用此模型。

我们应该添加参数,学习率= 0.01,步数= 20,000。

low_latency_svdf:准确度低于conv,但它仅使用750k参数,并具有优化的执行。在命令行上键入-model_architecture = low_latency_svdf以使用模型,并指定训练速度和步骤数以及:

python tensorflow/examples/speech_commands/train \
--model_architecture=low_latency_svdf \
--how_many_training_steps=100000,35000 \
--learning_rate=0.01,0.005