唇语识别技术的开源教程,听不见声音我也能知道你说什么!

做者 | Amirsina Torfi、Seyed Mehdi Iranmanesh、Nasser M. Nasrabadipython

译者 | 清爹git

整理 | Jane程序员

出品 | AI科技大本营github

 

【导读】唇语识别系统使用机器视觉技术,从图像中连续识别出人脸,判断其中正在说话的人,提取此人连续的口型变化特征,随即将连续变化的特征输入到唇语识别模型中,识别出讲话人口型对应的发音,随后根据识别出的发音,计算出可能性最大的天然语言语句。算法

 

唇语识别并不是最近才出现的技术,早在 2003 年,Intel 就开发了唇语识别软件 Audio Visual Speech Recognition(AVSR),开发者得以可以研发能够进行唇语识别的计算机;2016 年 Google DeepMind 的唇语识别技术就已经能够支持 17500 个词,新闻测试集识别准确率达到了 50% 以上。网络

 

640?wx_fmt=jpeg架构

 

你们必定很好奇唇语识别系统要怎么实现。Amirsina Torfi 等人实现了使用 3D 卷积神经网络的交叉视听识别技术进行唇语识别,并将代码托管到 GitHub 上开源: 框架

 

传送门:性能

https://github.com/astorfi/lip-reading-deeplearning测试

 

接下来就为你们介绍如何使用 3D 卷积神经网络的交叉视听识别技术进行唇语识别,完整的论文可参阅: 

 

https://ieeexplore.ieee.org/document/8063416

 

下面是进行唇语识别的简单实现方法。

 

640?wx_fmt=gif640?wx_fmt=gif640?wx_fmt=gif

 

用户须要按照格式准备输入数据。该项目使用耦合 3D 卷积神经网络实现了视听匹配(audio-visual matching)。唇语识别就是这个项目的具体应用之一。

 

 

概况

 

当音频损坏时,视听语音识别(Audio-visual recognition,AVR)被认为是完成语音识别任务的另外一种解决方案,同时,它也是一种在多人场景中用于验证讲话人的视觉识别方法。AVR 系统的方法是利用从某种模态中提取的信息,经过填补缺失的信息来提升另外一种模态的识别能力。

 

 

问题与方法

 

这项工做的关键问题是找出音频和视频流之间的对应关系。咱们提出了一种耦合 3D 卷积神经网络架构,该架构能够将两种模式映射到一个表示空间中,并使用学到的多模态特征来判断视听流间的对应关系。

 

 

如何利用 3D 卷积神经网络

 

咱们提出的该架构将结合时态信息和空间信息,来有效地发现不一样模态的时态信息之间的相关性。咱们的方法使用相对较小的网络架构和更小的数据集,并在性能上优于现有的视听匹配方法,而现有方法主要使用 CNN 来表示特征。咱们还证实了有效的对选择(pair selection)方法能够显著提升性能。

 

 

代码实现

 

输入管道须由用户提供。其他部分的实现包含基于话语的特征提取的数据集。

 

 

唇语识别

 

就唇语识别来说,必须将视频做为输入。首先,使用 cd 命令进入相应的目录:

 

640?wx_fmt=png

 

运行专用的 python file 以下:

 

640?wx_fmt=png

 

运行上述脚本,经过保存每一个帧的嘴部区域来提取唇部动做,并在画框圈出嘴部区域来建立新的视频,以便进行更好的可视化。

 

所需的 arguments 由如下 Python 脚本定义, VisualizeLip.py 文件中已定义该脚本:

 

640?wx_fmt=png

 

一些已定义的参数有其默认值,它们并不须要进一步的操做。

 

 

处理

 

视觉部分,视频经过后期处理,使其帧率相等,均为 30f/s。而后,使用 dlib 库跟踪视频中的人脸和提取嘴部区域。最后,全部嘴部区域都调整为相同的大小,并拼接起来造成输入特征数据集。数据集并不包含任何音频文件。使用 FFmpeg 框架从视频中提取音频文件。数据处理管道以下图所示:

 

640?wx_fmt=gif

 

 

输入管道

 

咱们所提出的架构使用两个不相同的卷积网络(ConvNet),输入是一对语音和视频流。网络输入是一对特征,表示从 0.3 秒的视频中提取的唇部动做和语音特征。主要任务是肯定音频流是否与唇部运动视频在所需的流持续时间内相对应。在接下来的两个小节中,咱们将分别讲解语音和视觉流的输入。

 

 

语音网络(Speech Net)

 

在时间轴上,时间特征是非重叠的 20ms 窗口,用来生成局部的频谱特征。语音特征输入以图像数据立方体的形式表示,对应于频谱图,以及 MFEC 特征的一阶导数和二阶导数。这三个通道对应于图像深度。从一个 0.3 秒的视频剪辑中,能够导出 15 个时态特征集(每一个都造成 40 个 MFEC 特征),这些特征集造成了语音特征立方体。一个音频流的输入特征维数为 15x40x3。以下图所示:

 

640?wx_fmt=gif

 

语音特征使用 SpeechPy 包进行提取。

 

要了解输入管道是如何工做的,请参阅:

 

code/speech_input/input_feature.py

 

 

视觉网络(Visual Net)

 

在这项工做中使用的每一个视频剪辑的帧率是 30 f/s。所以,9 个连续的图像帧造成 0.3 秒的视频流。网络的视频流的输入是大小为 9x60x100 的立方体,其中 9 是表示时态信息的帧数。每一个通道是嘴部区域的 60x100 灰度图像。

 

640?wx_fmt=jpeg

 

 

架构

 

该架构是一个耦合 3D 卷积神经网络,其中必须训练具备不一样权重的两个网络。在视觉网络中,唇部运动的空间信息和时态信息相结合,以此来利用时间相关性。在音频网络中,提取的能量特征做为空间维度,堆叠的音频帧构成了时间维度。在咱们提出的 3D 卷积神经网络架构中,卷积运算是在连续的时间帧上对两个视听流执行的。

 

640?wx_fmt=png

 

 

训练 / 评估

 

首先,克隆存储库。而后,用 cd 命令进入专用目录:

 

640?wx_fmt=png

 

最后,必须执行 train.py 文件:

 

 

640?wx_fmt=png

 

对于评估阶段,必须执行相似脚本:

 

640?wx_fmt=png

 

 

运行结果

 

下面的结果代表了该方法对收敛准确度和收敛速度的影响。

640?wx_fmt=png

 

最好的结果,也就是最右边的结果,属于咱们提出的方法。

640?wx_fmt=png

 

所提出的在线对选择方法的效果如上图所示。

 

分析到这,但愿你们能够到 Github 上找到源码,开始练起!附上做者给的代码演示。

 

DEMO 演示地址

1.Training/Evaluation :

https://asciinema.org/a/kXIDzZt1UzRioL1gDPzOy9VkZ

2.Lip Tracking:

https://asciinema.org/a/RiZtscEJscrjLUIhZKkoG3GVm

 

--【完】--

 

推荐阅读

象棋人工智能算法的C++实现(三)——注重功能分区!

Google 全球员工围攻 Google!

全面梳理百度世界大会,李彦宏又新吹了几个牛!

她说:真的,没事别嫁程序员

中心化交易所弊端尽显,DEX时代即将到来?用户分析告诉你

2019秋招AI岗位竞争究竟有多激烈?

南开大学提出最新边缘检测与图像分割算法,精度刷新记录(附开源地址)

 

点击阅读原文,查看大会更多详情。2018 AI开发者大会——摆脱焦虑,拥抱技术前沿。