点击上方关注,All in AI中国
作者:黄功详(Steeve Huang)
随着机器学习的迅速发展,尤其是深度学习的提高,语音辨认技术得到了分明的提高。这种技术依赖于大量高质量的数据。但是,为非盛行言语构建的模型比盛行言语(英语等)的表现还要差。这是由于只要多数可用的训练数据集,并且很难有效地搜集高质量的数据。这篇文章将向大家展现如何有效地搜集任何言语的语音辨认数据。
虽然Mozilla公司推出了一个名为Common Voice的开源项目,这个项目鼓励人们发表本人的意见,但大多数人或者不了解这个项目,或者不情愿参与其中。下图显示了Common Voice中不同言语的小数据搜集进度。
Common Voice的小数据搜集进度(https://voice.mozilla.org/en/languages) 由于视频网站Youtube上提供了丰富的电视节目和电视剧,因此可以高效地搜集语音辨认数据,通常经过人工参与来实施。
流星花园(https://www.youtube.com/watch?v=DsuN185H58I)
如上图所示,这些戏剧或节目中的一些嵌入了字幕,可以经过OCR提取。然后,提取的文本连同剪辑的音频可以构成语音辨认数据的样本。
概述
下图显示了包含多个模块的整个数据搜集管道的概述。我们首先运用Youtube V3 API搜索下载与指定的电视节目称号相关的视频。应用FFMPEG将视频分割成帧,每个帧由自我训练的Mask-RCNN处理(稍后更详细叙说)以仅保留图像的字幕区域。然后,处理后的图像将发送到Google Vision API,以获取预测的文本和置信度。运用Pandas库,我们按工夫戳对结果停止排序,然后将它们聚合在一同,为每个视频生成一个SRT文件。以下内容将向大家展现如何完成这些模块。
先决条件
Python==3.6 FFMPEG joblib==0.12.0 numpy==1.13.3 pandas==0.23.3 tensorflow-gpu==1.4.0 keras==2.1.3 google-cloud-vision==0.32.0 pafy==0.5.4 youtube-dl==2017.12.2 tqdm==4.23.4 editdistance==0.4
实施
此部分由数据搜集管道中的模块划分,每个子部分对应一个模块。
下载视频和提取音频
转到Youtube搜索你感兴味的电视剧。确保你可以找到该节目的播放列表,由于播放列表中的视频质量往往是一致的。检查第一个视频能否包含嵌入的字幕,我们可以假设整个播放列表都是字幕嵌入的。
播放列表中的Youtube视频
下面的代码显示了如何搜索Youtube播放列表。你需求央求API密钥才能运用Youtube V3 API客户端。在第27行
字面上执行Youtube搜索,查询是戏剧称号,并前往第一个结果的播放列表ID。运用播放列表ID,我们可以获取此播放列表中一切视频的视频ID。
异样,在第15行,
在给定播放列表ID的状况下,搜索最多50个视频的ID(受API限制)。然后,我们可以末尾下载视频了。
Pafy Python包用于下载可用的最高分辨率的视频。下载视频后,我们应用FFMPEG从每个视频中提取音频。
由于FFMPEG不支持python SDK,我们需求在shell中调用它。经过触发subprocess.call()函数,可以执行参数中指定的shell命令。如今,已成功下载指定电视节目的视频和音频。
拆分视频
然后,我们将下载的视频拆分为运转OCR的帧。
只要中间60%的部分视频被分割成帧,由于第一部分和最后20%的部分能够包含收场或结尾的歌曲,不能用于语音辨认。
异样,在子进程的shell中调用FFMPEG。分割视频的参数描画如下:
ss:以秒为单位的末尾工夫 t:以秒为单位分割视频的工夫跨度 r:采样率
采样率越高,预测的字幕工夫跨度越准确。但是,需求在工夫和准确性之间停止权衡。在这里,我把它设置为2。
训练和评价Mask-RCNN
如今,你已从每个视频中获得了帧。假如你在Google Vision API官方网站上试用一些图像停止OCR()(文档文本检测,由于字幕是键入的字符)。就会发现结果并不令人称心,由于这些图像的背景非常复杂。
这是Mask-RCNN发挥作用的时分。Mask-RCNN是2017年发布的用于对象检测和实例分割的RCNN系列的一部分。它可以在像素级别停止分类。
Mask-RCNN演示(https://github.com/matterport/Mask_RCN
我们的目的是训练Mask-RCNN,以协助我们辨认哪些像素是字幕。
为了确保训练有素的模型足够广泛以顺应各种视频,我从十几个电视剧和动画中下载视频。运用不同的字体大小,字体类型和字体垂直地位以丰富训练数据集。底部40%的图像被裁剪,以便我们确保在训练数据上手动添加的字幕不与原始字幕堆叠。这也确保了非字幕部分来自高度相似的颜色空间分布。
下面的代码应用Python PIL包将文本添加到图像上。由于Mask-RCNN将每个衔接的组件视为一个实例,因此在某些言语中,一个字符可以由不同的实例组成。例如,字符"把"包括左和右两个分量。要查找衔接的组件,我们可以在skimage包中运用label()函数,如以下代码所示。
生成的训练数据如下图所示。左侧显示输入图像,右侧显示地面实况。正如你可以从右侧某些字符的颜色差异中看到的那样,单个字符可以包含多个实例。
生成的Mask-RCNN训练数据
为了训练Mask-RCNN,我在这个Github Repo中运用了Keras和Tensorflow的优秀完成。我们需求做的是指定Training模型的配置,如下所示。
你只需求设置NUM_CLASSES=1+1(字幕+背景),并指定IMAGE_MIN_DIM以及IMAGE_MAX_DIM,这取决于你的训练数据的分辨率。需求手动计算MEAN_PIXEL才能在预处理阶段停止标准化。然后,你可以末尾加载数据和训练。
评价
经过100个周期的训练后,让我们末尾在一些图像上运转训练有素的模型。
不同电视节目的评价结果
顶部显示左侧显示输入图像,而右侧显示输入图像。您可以看到字幕已被清楚地辨认出来。虽然下面有一些噪音,但在运转OCR时对下面的字幕预测没有影响。次要成绩是有时Mask-RCNN太严厉了,它删除了文本的某些部分。在下面的第二个例子中,第二个字符"难"被部分删除,这能够会降低OCR的功能。为了恢复这个错误,我决议运用Ensemble。
单一模型预测
集合是指运用多个模型停止预测。我没有运用单个模型停止预测,如上图所示,而是运用不同的配置训练另一个模型。输入图像被输入这两个模型,最终结果将是这两个模型预测的结合。
集合预测
由Mask-RCNN处理的结果帧如下所示。左下角是原始输入图像,右下角是仅有一个模型的预测,左上角是全体结果。 (右上角是测试工夫加强结果,已被当前管道中的全体取代)
Mask-RCNN处理过的图像。左下角:原创。右下:单一模型。左上角:合成。右上:测试工夫添加(未讨
运转OCR
运用Mask-RCNN模块处理图像后,我们就可以在这些图像上运转OCR。与Youtube API密钥不同,你需求在谷歌云平台上央求Vision API凭据,并将其存储在本地磁盘中。
下面的代码对你的图像文件停止编码,发送到OCR API并接收呼应。呼应包含预测字符,每个字符的边界框坐标以及每个字符的置信度。你可以决议本人的阈值来过滤低置信度结果。最终结果写入CSV文件,每行代表每个帧。
生成SRT最终结果
最后,这是管道的最后一个模块!通常一段字幕持续2-3秒,这意味着大约有4-6个延续帧包含相反的字幕。成绩照旧是我们如何将不同帧的结果合并为一个,决议语音的末尾工夫、结束工夫和副标题。我们只需求检查当前字幕能否与最后一个字幕婚配。一个次要应战是有时两个帧具有相反的字幕,但OCR预测不同的结果。你需求确定两个字幕能否相反的算法应该可以处理这些状况。
下面的代码基于启示方法的。假如来自当前帧和最后一帧的这两个字符串中的字符与70%相反,则前往True,而不管每个字符的顺序如何。
结论
假如你正确遵照上述阐明,则表明你已成功构建自动语音辨认数据集搜集管道。你可以根据FFMPEG指定的工夫轻松分割音频,但有一个小成绩,由于字幕出现的工夫和相应语音的工夫能够有些不同,因此语音和文本之间能够存在一些没有对齐的状况。这可以经过言语模型来处理,以基于语音稍微调整每个字幕的工夫。
有关更多信息和详细信息,请参阅此https://github.com/khuangaf/ITRI-speech-recognition-dataset-generation
|