当前位置: 首页 > news >正文

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 技术提取视频台词、字幕

目录 一.引言 二.视频处理 1.视频样式 2.视频截取 ◆ 裁切降帧 ◆ 处理效果 3.视频分段 三.OCR 处理 1.视频帧处理 2.文本识别结果 3.后续工作与优化 ◆ 识别去重 ◆ 多线程提效 ◆ 片头片尾优化 四.总结 一.引言 视频经常会配套对应的台词或者字幕&#xff0c…...

VUE页面导出PDF方案

1&#xff0c;技术方案为&#xff1a;html2canvas把页面生成canvas图片&#xff0c;再通过jspdf生成PDF文件&#xff1b; 2&#xff0c;安装依赖&#xff1a; npm i html2canvas -S npm i jspdf -S 3&#xff0c;封装导出pdf方法exportPdf.js: // 页面导出为pdf格式 //titl…...

机器学习笔记 - WGAN生成对抗网络概述和示例

一、简述 Wasserstein GAN或WGAN是一种生成对抗网络,它最小化地球移动器距离 (EM) 的近似值,而不是原始 GAN 公式中的 Jensen-Shannon 散度。与原始 GAN 相比,它的训练更加稳定,模式崩溃的证据更少,并且具有可用于调试和搜索超参数的有意义的曲线。 Wasserstein 生成对抗网…...

HoudiniVex笔记_P0_Houdini中文文档与翻译

1、19.0版本中文说明文档 链接&#xff1a;https://pan.baidu.com/s/1oJcX5pdnBZ_YWWwOSnFB5g?pwdz3tw 提取码&#xff1a;z3tw 2、翻译插件 有上网条件的同学可以试试这个翻译插件&#xff1a;双语网页翻译 - 电子书翻译 - PDF翻译 - 字幕文件翻译浏览器扩展 | 沉浸式翻译…...

基于PowerWord的储能在主动配电网中的仿真研究

摘要 主动配电网是智能配电网技术发展的高级阶段&#xff0c;分布式储能是主动配电网的重要组成部分&#xff0c;分布式储能的应用对主动配电网的规划、运行、网络拓扑、故障处理和保护、可再生能源电源的协调优化等方面带来不容忽视的影响&#xff0c;针对这一现状&#xff0c…...

并查集与最小生成树

并查集 HDOJ-1232 畅通工程 题目&#xff1a; 省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通&#xff0c;输入现有城镇道路统计表&#xff08;表中列出了每条道路直接连通的城镇&#xff09;&#xff0c;求最少还需要建设的道路数量。&#xff08;城镇从1到…...

平面运动机器人的传感器外参标定

简述 对任意两个传感器进行外参标定可以采用手眼标定算法来完成&#xff0c;但是&#xff0c;传统手眼标定算法对于运动具有一定的要求&#xff0c;可以证明&#xff0c;至少需要两个以上轴角方向不同的旋转运动才可以正确估计出外参旋转&#xff0c;因此&#xff0c;如果使用…...

【星海随笔】SDN neutron (二) Neutron-plugin(ML2)

Neutron架构之Neutron-plugin Core-plugin(ML2)篇 Neutron-server接收两种请求&#xff1a; REST API请求&#xff1a;接收REST API请求&#xff0c;并将REST API分发到对应的Plugin&#xff08;L3RouterPlugin&#xff09;。 RPC请求&#xff1a;接收Plugin agent请求&#…...

野火i.MX6ULL开发板检测按键evtest(Linux应用开发)

之前一直查找不到evtest&#xff0c;因为没有下载成功&#xff0c;很可能是网络不好&#xff0c;下次可以软件源可以换成国内大学镜像网站。 重新断开板子电源启动&#xff0c;再次连接网络&#xff0c;下载evtest成功&#xff01;&#xff01;...

k8s存储

nfs 理论上nfs 其实并不是存储设备&#xff0c;它是一种远程共享存储服务。 k8s 存储卷 volume emptyDir&#xff1a;可以实现pod中的容器之间共享数据&#xff0c; 但是存储卷不能持久化数据&#xff0c;且会随着pod的生命周期一起删除。 hostpash&#xff1a;可以实现持久…...

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…...

实用技巧:嵌入式人员使用http服务模拟工具模拟http服务器测试客户端get和post请求

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134305752 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…...

P9836 种树

容易想到分解因数。 对于一个数 p p p 的因数个数&#xff0c;假设它可以被分解质因数成 a 1 i 1 a 2 i 2 a 3 i 3 ⋯ a k c k a_1^{i_1} a_2^{i_2} a_3^{i_3}\cdots a_k^{c_k} a1i1​​a2i2​​a3i3​​⋯akck​​ 的形式&#xff0c;则其因数个数为 ( i 1 1 ) ( i 2 1 )…...

C# 查询腾讯云直播流是否存在的API实现

应用场景 在云考试中&#xff0c;为防止作弊行为的发生&#xff0c;会在考生端部署音视频监控系统&#xff0c;当然还有考官方监控墙系统。在实际应用中&#xff0c;考生一方至少包括两路直播流&#xff1a; &#xff08;1&#xff09;前置摄像头&#xff1a;答题的设备要求使…...

JAVA开源项目 于道前端项目 启动步骤参考

1. 安装 启动过程有9个步骤&#xff1a; 1.1 安装 Node JS , V18版本的 &#xff08;安装步骤省略&#xff09; 1.2 安装 npm install -g yarn &#xff0c;node JS里边好像自带npm &#xff0c;通过npm的命令安装 yarn 1.3 切换到项目中去安装&#xff0c;npm install &a…...

深入理解ElasticSearch分片

1. 路由计算 当索引一个文档的时候&#xff0c;文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢&#xff1f;当我们创建文档时&#xff0c;它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢&#xff1f;首先这肯定不会是随机的&…...

【Python】AppUI自动化—appium自动化元素定位、元素事件操作(17)下

文章目录 前言一.Appium 元素定位1.定位方式种类2.如何定位2.1 id定位2.2 className定位2.3 content-desc 定位2.4 Android Uiautomator定位4.1 text定位4.2 text模糊定位4.3 text正则匹配定位4.4 resourceId定位4.5 resourceId正则匹配定位4.6 className定位4.7 className正则…...

SpringBoot使用MyBatis多数据源

SpringBoot使用MyBatis多数据源 我们以 Mybatis Xml和注解两种版本为例&#xff0c;给大家展示如何如何配置多数据源。 1、注解方式 数据库文件&#xff1a; DROP TABLE IF EXISTS users; CREATE TABLE users (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键id,userN…...

小程序版本审核未通过,需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path,请设置后再提交代码审核

小程序版本审核未通过&#xff0c;需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path&#xff0c;请设置后再提交代码审核 因小程序尚未发布&#xff0c;订单中心不能正常打开查看&#xff0c;请先发布小程序后再提交订单中心PATH申请 初次提交…...

Netty入门指南之NIO Selector监管

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言问题解…...

ESXi 虚拟机与 QNAP NAS Virtualization Station 部署 Ubuntu 并安装 OpenClaw 完整指南

发布日期: 2026-04-13 标签: [OpenClaw, Ubuntu, ESXi, QNAP, NAS, 虚拟机, AI助手, 部署指南] 分类: [技术实践] 提要: 本文详细介绍了在ESXi虚拟机和QNAP NAS Virtualization Station上部署Ubuntu 24.04并完整安装配置OpenClaw AI助手平台的完整步骤。涵盖硬件要求、系统安装…...

美胸-年美-造相Z-Turbo参数详解:Xinference模型注册、Gradio端口映射与资源分配

美胸-年美-造相Z-Turbo参数详解&#xff1a;Xinference模型注册、Gradio端口映射与资源分配 1. 引言&#xff1a;从模型到服务的一站式部署 如果你手头有一个精心调校好的文生图模型&#xff0c;比如“美胸-年美-造相”这个LoRA版本&#xff0c;怎么才能让它变成一个随时可以…...

SPIRAN ART SUMMONER应用场景:虚拟偶像运营团队的内容视觉统一生成方案

SPIRAN ART SUMMONER应用场景&#xff1a;虚拟偶像运营团队的内容视觉统一生成方案 1. 引言&#xff1a;虚拟偶像的视觉挑战与机遇 想象一下&#xff0c;你是一个虚拟偶像运营团队的负责人。每天&#xff0c;你需要为偶像的社交媒体账号更新头像、发布宣传海报、制作直播背景…...

IndexTTS 2.0问题解决:多音字发音不准?用拼音标注一键搞定

IndexTTS 2.0问题解决&#xff1a;多音字发音不准&#xff1f;用拼音标注一键搞定 1. 多音字问题&#xff1a;语音合成的常见痛点 在中文语音合成领域&#xff0c;多音字问题一直是个令人头疼的技术难点。想象一下&#xff0c;当你用AI生成"银行行长在银行门口行走"…...

HUNYUAN-MT 7B翻译终端与微信小程序开发结合:实现实时对话翻译工具

HUNYUAN-MT 7B翻译终端与微信小程序开发结合&#xff1a;实现实时对话翻译工具 你有没有遇到过这样的场景&#xff1f;在国外旅行&#xff0c;想和当地人交流却语言不通&#xff1b;或者工作中需要和外国同事沟通&#xff0c;但双方语言有障碍。这时候&#xff0c;一个能装在手…...

宝塔面板+CentOS 7.X:新手小白的第一个前端网站部署全流程(含安全组配置避坑)

宝塔面板CentOS 7.X&#xff1a;零基础前端部署实战指南 第一次将前端项目部署到线上服务器&#xff0c;对很多转行前端或在校学生来说既兴奋又忐忑。兴奋的是终于能让自己的作品被更多人看到&#xff0c;忐忑的是面对陌生的服务器环境和复杂的配置流程。本文将带你用最直观的方…...

做不规则多变量时序预测,试试ReIMTS递归多尺度框架,我实验涨点明显!

不规则多变量时间序列的预测任务在医疗、气象等领域至关重要&#xff0c;但其面临着采样间隔不均和数据缺失两大挑战。传统方法难以在稀疏数据中捕捉可靠模式&#xff0c;而现有的大型预训练模型多为规则采样数据设计。 针对这些问题&#xff0c;研究者们提出了创新的解决方案…...

[最新战况]融入止盈止损模块!收益曲线更平稳!ETF三因子轮动实盘跟踪!股票量化分析工具QTYX-V3.4.5

前言我们的股票量化系统QTYX在实战中不断迭代升级!!!分享QTYX系统目的是提供给大家一个搭建量化系统的模版&#xff0c;帮助大家搭建属于自己的系统。因此我们提供源码&#xff0c;可以根据自己的风格二次开发。 关于QTYX的使用攻略可以查看链接&#xff1a;QTYX使用攻略QTYX一…...

港科大等联合发布让实验室变身“智能侦探“的贝叶斯优化教程

想象一下&#xff0c;如果有一位超级聪明的侦探助手&#xff0c;能够记住你做过的每一次实验、分析每一个结果的规律&#xff0c;然后准确告诉你下一步最应该尝试什么——这听起来像科幻小说&#xff0c;但实际上已经成为现实。来自香港科技大学&#xff08;广州&#xff09;、…...

如何用STM32CubeMX快速验证你的硬件设计:以UART通信为例

如何用STM32CubeMX快速验证你的硬件设计&#xff1a;以UART通信为例 在嵌入式开发中&#xff0c;硬件验证往往是最耗时且最容易出错的环节之一。想象一下&#xff0c;当你精心设计的电路板终于到手&#xff0c;却发现某个外设无法正常工作&#xff0c;那种挫败感足以让任何开发…...