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

这篇具有很好参考价值的文章主要介绍了Python - 利用 OCR 技术提取视频台词、字幕。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

目录

一.引言

二.视频处理

1.视频样式

2.视频截取

◆ 裁切降帧

◆ 处理效果

3.视频分段

三.OCR 处理

1.视频帧处理

2.文本识别结果

3.后续工作与优化

◆ 识别去重

◆ 多线程提效

◆ 片头片尾优化

四.总结


一.引言

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

二.视频处理

1.视频样式

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

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

视频中字幕展示位置位于视频正下发居中位置,为了减少 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) 以降低需要处理的视频帧数量,提高效率。

处理效果

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

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

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

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

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

3.视频分段

    epoch = 10
    step = cut_clip.duration / epoch

    # 截取多个片段
    clips = []
    index = 0
    while index < epoch:
        # 获取分段的起止时间
        start = index * step
        end = 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:
            break
        index += 1

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

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

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

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

三.OCR 处理

1.视频帧处理

    from paddleocr import PaddleOCR

    def process_frame_by_ocr(st, tmp_clip):
        ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=True)
        frame_rate = 1 / 3

        for cnt, cur_frame in enumerate(tmp_clip.iter_frames()):
            cur_start = frame_rate * (cnt + 1) + st

            try:
                # 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:

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

2.文本识别结果

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

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

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

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

片头片尾优化

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

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

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip

四.总结

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

ocr视频字幕识别去重,深度学习,Python,ocr,moviepy,VideoFileClip文章来源地址https://www.toymoban.com/news/detail-768828.html

到了这里,关于Python - 利用 OCR 技术提取视频台词、字幕的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Python】好用的办公能手:利用OCR进行PDF文档解析(附教程)

    【Python】好用的办公能手:利用OCR进行PDF文档解析(附教程)

    OCR (Optical Character Recognition,光学字符识别)是通过计算机视觉对图像中的文本进行检测和提取的过程。它是在第一次世界大战期间发明的,当时以色列科学家伊曼纽尔·戈德堡(Emanuel Goldberg)发明了一台能读取字符并将其转换为电报代码的机器。到了现在该领域已经达到了一个非

    2024年02月15日
    浏览(7)
  • OCR提取学历证信息

    OCR提取学历证信息

    2024年02月12日
    浏览(7)
  • javaCV实现java图片ocr提取文字效果

    引入依赖: 引入中文语言训练数据集:chi_sim GitHub - tesseract-ocr/tessdata: Trained models with fast variant of the \\\"best\\\" LSTM models + legacy models Trained models with fast variant of the \\\"best\\\" LSTM models + legacy models - GitHub - tesseract-ocr/tessdata: Trained models with fast variant of the \\\"best\\\" LSTM models + legacy models https:/

    2024年02月11日
    浏览(7)
  • 利用python对视频字幕进行识别

    大家运行程序注意一下几点: 1.更改视频地址,选择你需要进行字幕识别的视频地址 2.对所截取的视频字幕图片进行二值化,其中阈值可以自己更改 3.相邻图片的相似值的阈值可以进行更改。  总体来说,识别还是有一些问题的,大家将这个代码跑完之后就会发现问题所在,

    2023年04月20日
    浏览(12)
  • 提取图像中的文本信息(Tesseract OCR 和 pytesseract)

    提取图像中的文本信息(Tesseract OCR 和 pytesseract)

    安装Tesseract:点这里参考本人博客 这个库只自带了一个英语的语言包,这个时候如果我们图片中有对中文或者其他语言的识别需求,就需要去下载其他语言包 进入官网以后进入Traineddata Files 找到这个位置 tessdata_best适用于愿意以大量速度换取稍微好一点的准确性的人。它也是

    2024年02月12日
    浏览(38)
  • 免费,开源,可批量的离线图片文字提取软件OCR

    免费,开源,可批量的离线图片文字提取软件OCR

    免费,开源,可批量的离线OCR软件 适用于 Windows7 x64 及以上 免费 :本项目所有代码开源,完全免费。 方便 :解压即用,离线运行,无需网络。 批量 :可批量导入处理图片,结果保存到本地 txt / md / jsonl 多种格式文件。也可以即时截屏识别。 高效 :采用 PaddleOCR-json C++ 识别

    2024年02月07日
    浏览(40)
  • 第十九篇【传奇开心果系列】Python的OpenCV库技术点案例示例:文字识别与OCR

    第十九篇【传奇开心果系列】Python的OpenCV库技术点案例示例:文字识别与OCR

    OpenCV文字识别与OCR:用于识别图像中的文字内容,并进行光学字符识别。 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理计算机视觉算法。虽然CV 本身并不包含专门的 OCR(Optical Character Recognition,光学字符识别)功能,但可以配合其他

    2024年02月20日
    浏览(13)
  • 金融OCR领域实习日志(一)——OCR技术从0到1全面调研

    金融OCR领域实习日志(一)——OCR技术从0到1全面调研

    OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相)检查纸上打印的字符,经过检测暗、亮的模式肯定其形状,而后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的

    2024年01月25日
    浏览(9)
  • 离线视频ocr识别

    离线视频ocr识别

    windows安装方法: 下载安装 https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-5.3.3.20231005.exe 下载 去掉版本依赖,修改如下: 之后安装 如果遇到 RuntimeError: Failed to init API, possibly an invalid tessdata path: ./ 则需要设置环境变量TESSDATA_PREFIX为C:Program FilesTesseract-OCRtessdata 默认只能

    2024年02月03日
    浏览(12)
  • OCR文字识别技术

    OCR文字识别技术

    OCR全称是optical character recognition,中文光学字符识别。 主要技术是:把图像形状转变为文本字符。 简单来说,OCR技术就是通过图像处理和模式识别技术对光学的字符进行识别,即,对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。 OCR 支持各

    2024年02月08日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包