利用OCR、OpenCV识别、提取视频字幕
从视频提取硬字幕要做以下事情:
把视频切成若干张包含字幕的静态图片(默认每秒1张)。应在考虑调用成本的前提下尽量细切,保证字幕都切到。
京东OCR能返回识别的文字、对应坐标和可信度,筛选可信度。
去重有两个目的:
1.防止结果重复
2.能把固定位置的文字收敛(比如台标),避免字幕定位错误。
每张图可能识别出若干组文字(每组都有位置信息),在获得所有切图的OCR结果后,我们需要确定哪些是字幕的内容。
这里有两个假设:
- 字幕的纵向位置基本不变
- 字幕是整个视频中同一位置不同内容文字量最大的部分
有这两个假设之后:
- 把top相近的识别结果分成一组
- 去重后字幕量最大的就是字幕组
Windows / Linux 系统(macOS 未经测试,但是理论上没有问题)
Python 3.x,Python 2.x 的许多语法和 3.x 不一样,无法使用
OpenCV,pip install opencv-python
方法一:
git clone https://github.com/drsanwujiang/video-subtitle-recognize.git
方法二:右上角 - clone or download - download zip
https://neuhub.jd.com/ai/api/ocr/general
在京东AI开放平台注册,创建通用文字识别应用得到 APP_KEY 、 SECRET_KEY ,就可以用了。
每天免费调用50000次,QPS是2。
修改 config.py 文件在 'APP_KEY' 、 'SECRET_KEY' 后填写自己的 APP_KEY 、 SECRET_KEY
参数说明:
split_duration 默认1 视频切片频率,字幕密度低的情况下可以调至2,提高效率
jpg_quality 默认40 改变图片质量,在保证字幕清晰的情况下减小质量可以提高网络效率,但太小可能频繁触发QPS限制
probability 默认0.66 OCR返回的可信度的下限,可信度低于此下限的识别结果会被废弃,根据需要可适当放宽
subtitle_top_rate 默认0.66 字幕范围倍率,(此倍率 * 视频高度)以下的文字被认为是字幕,即默认下三分之一的文字是字幕
remove_duplicate 默认False 强制去除所有重复,一般不需要启用
创建 video 文件夹,把视频文件放进去。
执行 index.py
等待脚本执行完成,打开 output 文件夹查看结果