Python - 利用 OCR 技术提取视频台词、字幕

2023-11-11 22:45

本文主要是介绍Python - 利用 OCR 技术提取视频台词、字幕,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一.引言

二.视频处理

1.视频样式

2.视频截取

◆ 裁切降帧

◆ 处理效果

3.视频分段

三.OCR 处理

1.视频帧处理

2.文本识别结果

3.后续工作与优化

◆ 识别去重

◆ 多线程提效

◆ 片头片尾优化

四.总结


一.引言

视频经常会配套对应的台词或者字幕,通过文本与字幕可以更好地理解视频内容。本文介绍如何使用 moviepy 库处理视频并使用 paddleocr 库实现视频文本识别,从而获取视频中出现的文字信息。

二.视频处理

1.视频样式

样例中我们以老电视剧 <三国演义> 为例,处理其剧集信息并获取对话文本。

视频中字幕展示位置位于视频正下发居中位置,为了减少 OCR 的识别工作量,提高 OCR 识别成功率,我们会优先对视频截取,只保留下方台词部分的关键帧信息。

2.视频截取

裁切降帧

    from moviepy.editor import *# 对视频进行裁剪与缩放clip = VideoFileClip('/Users/Desktop/1.mkv')print("Ori FPS:{} Duration:{} Height:{} Width:{}".format(clip.fps, clip.duration, clip.w, clip.h))cut_clip = clip.crop(y2=clip.h - 11, height=70)cut_clip = cut_clip.set_fps(3)print("Cut FPS:{} Duration:{} Height:{} Width:{}".format(cut_clip.fps, cut_clip.duration, cut_clip.w, cut_clip.h))

- VideoFileClip

电影文件的视频剪辑类,必传的只有 filename 即视频文件的名称。它支持多种视频格式: .ogov、.mp4、.mpeg、.avi、.mov、.mkv 等。这里下载的 <三国演义> 使用的是 .mkv 格式。

- crop

crop 方法用于裁切视频。x1、y1 代表裁剪区域的左上角坐标。默认为视频的左上角;x2、y2 代表裁剪区域的右下角坐标。默认为视频的右下角。width,height 代表裁剪区域的宽度和高度。如果设置了这两个参数,x2、y2 的值将被忽略。center 代表裁剪区域的中心点坐标,如果设置了这个参数,x1、y1、x2、y2 的值将被忽略。所有坐标值都是以像素为单位的。当剪辑是图像剪辑时,可以进一步通过指定参数来优化裁剪效果。上面的参数含义表示将 clip 视频的底部向上 11 个像素开始裁剪,向上裁剪出 70 个像素高度的新片段,获得剪辑后的新视频。

- set_fps

set_fps 参数是用于设置帧率的。帧率是指在视频中每秒钟展示多少个连续的画面,单位是 fps(frames per second),译为 '每秒帧数'。如果你想让视频播放得更流畅,可以将帧率设置得更高。原始视频帧率较高 FPS=25,由于 OCR 识别相同帧内容可能相同,所以我们 set_fps(3) 以降低需要处理的视频帧数量,提高效率。

处理效果

Ori FPS:25.0 Duration:2625.36 Height:704 Width:528
Cut FPS:3 Duration:2625.36 Height:704 Width:70

通过打印视频关键信息,我们得到裁切后的视频参数,可以看到新的视频宽度已缩减,且 FPS 帧率也下降为每秒 3 帧:

这里不同视频字母位置不同,大家可以本地测试几次,就能大致选到合适的位置参数。

3.视频分段

    epoch = 10step = cut_clip.duration / epoch# 截取多个片段clips = []index = 0while index < epoch:# 获取分段的起止时间start = index * stepend = min(start + step, clip.duration)if start < clip.duration:sub_clip = cut_clip.subclip(start, end)print("index: {} start: {} end: {}".format(index, start, end))clips.append([start, sub_clip])else:breakindex += 1

为了并发处理视频帧,我们可以将视频分为多段 cut,每一个 cut 启动一个 Process 进行 OCR 识别,所以我们通过 subclip 方法对视频进行了分段截取。这里 start、end 对应视频的秒数,通过 clip.duration 可以获取视频的总长,自定义分段数即可,这里我们划分 10 段:

可以通过 save 方法将每个分段保存到目录下供本地检查和校对:

三.OCR 处理

1.视频帧处理

    from paddleocr import PaddleOCRdef process_frame_by_ocr(st, tmp_clip):ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=True)frame_rate = 1 / 3for cnt, cur_frame in enumerate(tmp_clip.iter_frames()):cur_start = frame_rate * (cnt + 1) + sttry:# det=True 表示在进行光学字符识别(OCR)之前,先对图像进行检测。result = ocr.ocr(cur_frame, det=True)if result is not None:see = result[0][0][1]cur_time = int(cur_start)doc_json = {'st': cur_time, "text": see}ocr_text = json.dumps(doc_json, ensure_ascii=False)open('result.json', 'a', encoding='utf-8').write(ocr_text + '\n')except Exception:pass

这里引入 paddleocr 库进行视频帧的 OCR 文字识别,由于我们修改刷新率 FPS=3,所以每 s 有3帧视频,这里通过 frame_rate 记录每一帧出现的时间,其次调用 .ocr 方法识别图像,如果 result 识别到字幕即 text,我们会 'a' 添加至我们的 result.json 中并记录该台词出现的时间。下图为运行日志,由于识别过程中可能存在无字幕的情况,针对这类情况直接 pass:

2.文本识别结果

result.json 中会保存字幕在视频中出现的对应时间,text 除了识别内容外,还有一个概率标识其置信度,置信度越高,识别效果越靠谱。

3.后续工作与优化

识别去重

我们看到,虽然设置了 FPS=3,但是重复的文本还是很多,在得到原始的 result.json 文件后,我们还需要对文件进行去重和优选的步骤,一方面我们可以根据时间先后和字符长度,选择更为完整的句子,另一方面我们可以标胶不同识别结果的置信度,我们可以取数值更高置信度更高的样本作为最终结果。

多线程提效

我们可以尝试使用 multiprocessing 多线程处理多个分段任务,这里处理一集大约耗时为 5 min,采用多线程可以大大提高处理的效率。

[2023/11/09 14:14:15] ppocr DEBUG: rec_res num  : 0, elapsed : 1.1920928955078125e-06
...
[2023/11/09 14:19:30] ppocr DEBUG: rec_res num  : 0, elapsed : 0.0

片头片尾优化

查看 result.json 的前端部分可以看到类似的滚动识别字幕,这是因为片头曲的滚动字幕造成的。我们可以像视频 APP 那样掐头去尾,获取更纯净的视频内容。这与片头片尾时间,最简单的就是我们打开视频掐一下,转换成 s 单位即可。

四.总结

本文介绍了基本的视频截取与识别的方法,就功能性而言,其实现了基本的功能。但是就结果而言,如果想要获取一些传统剧集的字幕与时间,我们可以直接到对应的字幕网站或者解析视频自带的字幕 SRT 文件,肥肠的方便:

这篇关于Python - 利用 OCR 技术提取视频台词、字幕的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/393333

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip