An open API service indexing awesome lists of open source software.

https://github.com/swhl/videosubfinder

Auto sync from https://videosubfinder.sourceforge.io/
https://github.com/swhl/videosubfinder

information-analysis ocr video

Last synced: 3 months ago
JSON representation

Auto sync from https://videosubfinder.sourceforge.io/

Awesome Lists containing this project

README

          

中文教程实时更新:https://docs.qq.com/doc/DRk9HWWlXdkRFa05o?&u=146bab4d9f414c3693447729af1de915

#--------------------关于程序--------------------

程序主要提供两个功能:
1)通过数字图像处理算法,自动检测视频中带有硬字幕的帧,生成只带有时间轴的空白字幕;
2)通过文本挖掘算法,用带有硬字幕的图片生成图形文字。可以用其他软件来进一步识别,如FineReader和Subtitle Edit,生成既有文本又有时间轴的字幕。

为了使程序正常运行,需要下载安装"Microsoft Visual C++ Redistributable runtime libraries 2022",
下载地址:https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
最新版本测试基于Windows 10 x64, Ubuntu 20.04.5 LTS, Arch Linux (EndeavourOS Cassini Nova 03-2023)

获得快速支持:https://vk.com/skosnits

#--------------------快速入门指南--------------------

1)点击菜单栏<<文件->打开视频>>(推荐使用OpenCV,提取的时间轴准确性更高);
2)在<<视频预览框>>中,通过移动垂直和水平分隔线来缩小检测区域,使结果更准确、时间轴更完整;
3)确认字幕在检测区域内的水平对齐方式:居中/左对齐/右对齐/任意位置,在<<设置>>标签页里的<<文本对齐方式>>中选择对应属性
4)强烈推荐使用<<字幕颜色滤镜>>来提高识别结果准确率,该步骤可以跳过:
*- 拖动进度条,找到带有字幕的图像
*- 鼠标点击<<视频预览框>>任意位置,选中后按"U",全屏查看图片,鼠标左键点击字幕像素点,即可获取字幕的颜色信息
*- 字幕颜色信息在<<设置>>标签页中的右下角,复制Lab颜色信息到左边的<<字幕颜色滤镜>>编辑栏中,如:Lab: l:0 a:128 b:128
*- 如果字幕颜色有多种,可以用"Ctrl+Enter"在<<字幕颜色滤镜>>编辑栏中添加新的一行颜色信息
5)在<<识别>>标签页中点击<<开始识别>>(如果你只需要时间轴,这步之后,直接跳到"OCR"标签页,选择<<根据原始视频图片生成只有时间轴的字幕(RGBImages->Sub)>>,生成一个只有时间轴信息的字幕)
6) 在ILAImages文件夹检查ILA图片: 正常情况下,在ILA图片中的字幕会显示为白色, 如果ILA中的字幕不完整或者不显示,可能是以下情况:
* 使用了强力滤镜
* 字幕没有描边,却使用字幕描边滤镜
* 字幕突然出现或消失
出现这样的情况最好改变设置或者删除对应的ILA图片
7)如果不用<<字幕颜色滤镜>>,则需要注意:
在继续下一步之前,检查字幕描边的颜色是否比字幕文本的颜色更深(大多数情况下是这样的,如果不是,取消选择在<<设置>>标签页中的右边栏中的第一个复选框)
在大多数情况下,程序能正确地识别与字幕文本相关联的颜色,但某些情况过于复杂,就需要通过其他参数设置来处理;
8) 如果使用颜色滤镜,ILA图片效果较好,推荐打开<<使用相交亮度区域(ILAImages)获取字符图片 >>以减少无关字符的产生
9)点击OCR标签页中的<<生成二值化文本图片(RGBImages->TXTImages)>>
10) 借助其他软件可获得可编辑的字幕文本(FineReader/Subtitle Edit等)
11) 在OCR标签页中根据需要生成完整字幕 (*.srt or *.ass)

相关视频教程:
https://www.bilibili.com/video/BV1U34y187vV/
https://www.youtube.com/watch?v=Cd36qODmYF8
https://www.youtube.com/watch?v=VHsUfqqAkWY&t=124s

#--------------------已知的问题--------------------

1) 用OpenCV和FFMPEG打开视频,提取出的时间轴会有细微的差别,在000-001毫秒之间。
2) 关于字幕中心对齐,如果字幕整体在检测区域的右边,将会被移除。
3) 字幕丢失。确保字幕长度不小于12帧(0.5S), 可在设置标签页中通过<<字幕持续的最小帧数>>修改。
4) 在TXTResults文件夹中的所有文本都应是UTF-8格式。
5) 如果字幕没有描边,不要使用<<字幕描边滤镜>>,会影响ILAImage和ISAImages的生成。

#--------------------参数设置--------------------

1)为了在<<开始识别>>和<<生成二值化文本图片(RGBImages->TXTImages)>>得到更好的结果
#---------生成RGB图片---------
*- 导入视频,参数设置好之后,在<<设置>>便签页点击<<测试>>按钮来进行测试,尽量多的选择视频中背景明暗度差异较大的帧来进行测试,比如背景太亮或者太暗
*- 通过用鼠标移动<<视频预览框>>中的垂直和水平分隔线来缩小检测区域
在某些复杂的情况下,你可以多次运行程序来识别不同区域的字幕,可以解决多行字幕可能出现分割问题
比如:识别双语字幕、对话在视频下面而注释在视频上面的情况
*- 确认字幕在检测区域里的水平对齐方式:居中/左对齐/右对齐/任意位置,在<<设置>>标签页里的<<文本对齐方式>>中选择对应属性
中心对齐:默认对齐方式
任意对齐:当前不如其他几种对齐方式好用
*- 为了减少在<<开始识别>>时出现的:丢轴、错轴,在<<生成二值化文本图片(RGBImages->TXTImages)>>时出现的:文字未被识别、只识别部分的情况,
对<<限制阈值>>参数的范围[0.25, 0.6]进行调整:
为了找到最佳的参数值,在<<测试>>时,需要对<<第一次/第二次/第三次过滤>>不同的阶段进行测试,
直到在右边的<<图片预览框>>中出现完整的白色字幕。
尽可能尝试那些太亮或太暗的画面,这样画面中大部分与字幕无关的像素将会被移除。
0.25 - 大多数视频通用,特别是1080p的视频,但是会生成大量无用的图片
0.5-0.6 - 适用于字幕描边明显的,像白字黑边框的字幕,或者画质低于480p的视频
0.1 - 适用于字幕没有描边或者字幕颜色比较浅的视频,但是会生成大量无用的图片
*- 使用<<字幕颜色滤镜>>可以极大提高结果的准确性:
丢轴、错轴的情况会极大的改善,图片二值化后的结果也会更好
*- 字幕的分割也受以下两个因素影响:
vedges_points_line_error = 0.3
ila_points_line_error = 0.3
0.3意为两个相近字幕的允许差异值为30%,比如:两条不同的字幕都只有十个字,在允许差异值为30%的情况下,其中一条字幕只要有七个字以上与另一条字幕相同,就视为同一条字幕。
同理,如果允许差异值为50%,则只需要五个字以上与另一条字幕相同就可视为同一条字幕
值越高,时间轴分割的越少
值越低,时间轴分割的越多
一般情况下,不推荐改动,只有在没有连续的字幕的情况下,才去降低参数值。

#---------二值化图片---------
*- 检查字幕颜色是否更深,如果不是,取消选择<<设置>>标签页中右边第一项<<字幕深色描边(字幕有描边时使用)>>的复选框

大多数情况下,软件能准确识别与字幕有关的颜色,但某些特殊复杂情况,则需要考虑一下参数设置:
*- 二值化过程中部分字符丢失
与<<缩放图片的限制阈值>>这个参数有关,参数范围[0.1-0.25]
0.25 - 大多数视频通用,如果有字符丢失,适当调低参数
0.1-0.15 - 适用于字幕描边不明显的或没有字幕描边的、字幕颜色与背景颜色相近的
推荐打开<<在二值化图片前根据字幕描边使用交叉亮度区域>>选项,能改善结果
*- 减少二值化过程中多余符号的产生
<<二值化图片多余字符处理(请勿用于象形文字或阿拉伯语)>>默认打开,但是可能会移除部分正确的字符

*- 其他能帮助二值化图片的选项
识别的语言不是符号、阿拉伯语、手写字幕
字符是完整的,有着稳定的亮度
使用<<字幕描边滤镜>>
如果使用了颜色滤镜,以及提取的ILAImages质量很好,推荐打开<<使用相交亮度区域(ILAImages)获取字符图片>>选项,可以减少多余符号的生成
打<<移除不规则的字(请勿用于阿拉伯语和手写文字)>>选项,减少多余字符的产生

2) 颜色滤镜参数详解
*- 常用颜色滤镜参数范围
Lab: l:180-255 a:108-148 b:108-148 (大多数视频通用)
Lab: l:200-255 a:118-138 b:118-138
Lab: l:220-255 a:118-138 b:118-138 (强力颜色滤镜,视频质量很好的情况下使用,字幕亮度不稳定不推荐使用)

参数格式:
Lab: l:l_val a:a_val b:b_lab_val
Lab: l:min_l_val-max_l_val a:min_a_val-max_a_val b:min_b_lab_val-max_b_lab_val
RGB: r:min_r_val-max_r_val g:min_g_val-max_g_val b:min_b_val-max_b_val
RGB: r:r_val g:g_val b:b_val L:l_val
RGB: r:r_val g:g_val b:b_val L:min_l_val-max_l_val

*- 描边的颜色参数范围同上,除非描边很明显,否则<<字幕描边滤镜>>选项不建议使用强力滤镜
*- 在<<视频预览框>>中,按"T"可全屏查看设置颜色滤镜后效果
可通过左右方向键和空格键来查看不同帧
*- 字幕颜色是红色的
*- 描边颜色是绿色的
*- 字幕和描边重合部分是黄色的

同样:
按"U"可全屏查看原始视频帧
按"Y"查看原视频中剥离出来的字幕的颜色,比如:字幕是黄色的,屏幕上应该就只出现黄色的字幕
按"I"查看原视频中剥离出来的描边的颜色
*- 如果使用<<字幕描边滤镜>>或ILAImages图像质量不错,推荐打开<<使用相交亮度区域(ILAImages)获取字符图片>>,可减少无效字符的出现

3) 二值化质量不高的视频
*- 字幕亮度不稳定的情况
打开<<字幕深色描边(字幕有描边时使用)>>,人工设定<<允许的最低亮度(仅在灰度扩展选项下生效)>>,最低亮度的值
如果使用颜色滤镜,建议把最低亮度的值设成跟颜色滤镜的"min_l_val"相等
参数范围:[min("允许的最低亮度", 自动检测的最低亮度), 自动检测的最高亮度]

<<伽马(Video Gamma)>>和<<对比度(Video Contrast)>>对结果也有帮助
某些情况下,设置<<伽马(Video Gamma)>> == 0.7、<<允许的最低亮度(仅在灰度扩展选项下生效)>> == 100、打开<<灰度扩展(在字幕亮度不稳定的时候使用)>>,会很有帮助
具体情况中,需要自己不断测试才能得到最优的参数值

*- 借助第三方图片增强软件
使用"Topaz Gigapixel AI": https://topazlabs.com/gigapixel-ai/,对提取的RGB图片进行增强
建议按默认的两倍放大增强,由于图片的名称就是字幕的时间轴,增强后的图片名称应与原来的一致

4) 二值化没有描边的字幕
这种情况下,某些字符的分离会变得很困难
可以打开<<在二值化图片前根据字幕描边使用交叉亮度区域 >>选项,会很有帮助
正确设置合适的字幕颜色滤镜
并且,在背景是动态的情况下,ILA images会很有帮助
以下列举的参数对背景分离也很有帮助:
"Min Sum Color Difference": min_sum_color_diff = 0
"Moderate Threshold": moderate_threshold = 0.1
"Moderate Threshold For Scaled Image": moderate_threshold_for_scaled_image = 0.1
"Use ILAImages for getting TXT symbols areas" - Turn Off: use_ILA_images_for_getting_txt_symbols_areas = 0

5) 一条字幕有多种颜色
用"Ctrl+Enter"在<<字幕颜色滤镜>>编辑栏中添加多条颜色参数后,打开<<合并到单个集群(可用于单行中有多种颜色的情况)>>选项

6) 提高软件二值化过程中的运行性能
默认的参数为:
"CPU kmeans initial loop iterations" == 20
"CPU kmeans loop iterations" = 30
以上参数适应于各种情况,特别是在字幕没有良好的描边的情况下,当字幕有明显的描边的时候,两个指标的参数都可以设为10。

#--------------------OCR相关--------------------
注意:创建的所有文本类型都应为UTF-8格式。

1) FineReader与Subtitle Edit相关教程
https://www.bilibili.com/video/BV1vp4y1i7Ek/?vd_source=1fba6762e7b2d878744d3b6ede0a9b26

2) Google Drive等在线OCR相关教程
1.通过"OCR"选项卡中的"拼合图片(TXT/RGBImages->ImagesJoined)"按钮合并TXT/RGBImages,生成拼合图片后,如果识别结果文件夹(TXTResults)内不存在"join_txt_results.txt"文件,将会自动创建。
在"OCR"选项卡页面左侧的设置中,可更改选项:
*- 拼合RGB图片或者拼合二值化图片。
*- 使用二值化图片的数据拼合RGB图片(最优选择),如果勾选,它只会拼合二值化时识别到文字的对应图片。
*- 拼图最大数量:将TXT/RGBImages拼合成一个图片时使用到的最大数量,在某些情况下,"缩放倍数 (根据原始RGB图像缩放)"== 1时最大数量可以填160,但根据OCR使用经验,填50比填100更准确。
*- 如果分隔符字号为"-1",会根据平均图像高度(以及在TXTImages中的行数)自动生成最佳的分隔符字号,你也可以手动设置范围(1-80)。
*- "缩放倍数 ":根据原始RGB图像缩放。
*- 拼合图片的分隔符,支持宏定义:[sub_id], [begin_time], [end_time]。
[重点]但想准确生成字幕,目前仅支持[sub_id]更改格式

注意:当程序在"TXTResults/join_txt_results.txt"中搜索相关字幕数据时,他会在末尾添加额外的[sub_id]
[重点]一般不需要更改,如果OCR无法正确识别分隔符时,可以尝试更改。

2.将ImagesJoined文件夹中合并的图片上传到Google云盘中的某个目录。

3.鼠标单击每个合并的图片→打开方式→谷歌文档(它会自动OCR并生成文档)
注意:如果OCR失败并且文档内容为空,你可以尝试修改:
*- "缩放倍数 (根据原始RGB图像缩放)"的数值,大多数情况下,谷歌文档对不缩放的图像OCR效果更好。

4.打开每个生成的文档,并将所有文本复制到"TXTResults/join_txt_results.txt"文件中,并以UTF8的格式保存。
注意:"\n"(换行)无关紧要,只需要依次将每个图片的识别结果复制到"TXTResults/join_txt_results.txt"内即可

5.通过单击OCR选项卡中的"根据文本生成字幕"按钮,根据"TXTResults/join_txt_results.txt"文件生成字幕(*.srt or *.ass)

3)百度OCR相关教程(推荐)
https://www.bilibili.com/video/BV1U34y187vV/

#--------------------后记--------------------
翻译:豆瓣@我在成都养熊猫
相较于英文版教程,进行了部分筛减和补充,完整版请查看英文版本
欢迎加入硬字幕提取交流群:1161766056,教程中提及的相关软件可进群下载