简单使用Tesseract提取视频字幕

简单使用Tesseract提取视频字幕

二月 25, 2025 阅读量

帮朋友提取视频里的字幕,不管用语音转文字,还是OCR识别,准确率都不是很高……用Tesseract提取纯色图片还好,视频那种斑驳背景的准确率不高,英文还好,中文更是一言难尽

简介

Tesseract是一个开源的 文本识别 (OCR Optical Character Recognition,光学字符识别) 引擎。Tesseract可以通过命令行直接使用,或者使用API从图像中提取打印文本。它支持各种语言并且免费。

官方文档:https://tesseract-ocr.cn/
GitHub地址:https://github.com/tesseract-ocr/tesseract

安装

下载地址可以参考官方文档,这里从官方提供的第三方下载Windows安装包,安装时Additional language data勾选了简体中文Chinese(Simplified)和Chinese(Simplified vertical)。

将安装路径配置到环境变量Path

命令提示符执行tesseract -v查看Tesseract版本信息

简单命令行使用

1
2
3
4
5
6
7
8
最简单的 OCR 图像调用 tesseract + 图片 + 输出txt文件名 默认英语
tesseract imagename outputbase

-l LANG[+LANG] 指定语言
英语
tesseract imagename outputbase -l eng
英语+简体中文
tesseract imagename outputbase -l eng+chi_sim

图片英文测试


图片中文测试

视频字幕提取

这里使用Python,需要安装的依赖
OpenCV(open source computer vision library)是一个基于BSD许可(开源)发行的跨平台计算机视觉库
pip install opencv-python pytesseract difflib
我这里很久没用了,根据提示先更新了pip,然后装了opencv-python和pytesseract。difflib之前应该装过了

直接把视频剪辑成光剩字幕,简单写个代码测试下

1
2
3
4
5
6
7
import cv2, pytesseract
video = cv2.VideoCapture("test.mp4")
success, image = video.read()
while success:
text = pytesseract.image_to_string(image, lang='chi_sim') # 中文识别
print(text)
success, image = video.read()

结果就是识别的很差,一个“大家好”都不能准确识别

然后录制了一个双语视频,并优化了下代码:
限定字幕区域,指定字幕位置(需根据视频调整坐标),避免全帧识别,提升速度和准确率。也可以动态检测字幕区域。
图像预处理,将字幕区域转为灰度图并二值化,增强文字对比度。
减少重复字幕,计算当前文本与上一帧文本的相似度,若高于阈值,视为重复内容,跳过写入。控制处理频率(如每5帧处理1帧),减少冗余计算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import cv2
import pytesseract
from difflib import SequenceMatcher

# 视频路径和输出文件路径
video_path = "input_video.wmv"
output_file = "extracted_text.txt"

# 定义字幕区域(根据视频分辨率调整:x, y, width, height)
#subtitle_area = (50, 900, 1800, 100) # 示例:底部居中区域
subtitle_area = (0, 0, 1512, 124) #我所选择视频因为截取了,就选择了整个视频大小

# 初始化
video = cv2.VideoCapture(video_path)
prev_text = ""
similarity_threshold = 0.8 # 文本相似度阈值(高于此值视为重复)
frame_skip = 5 # 跳帧数(每隔几帧处理一帧,平衡速度与准确性)

with open(output_file, "w", encoding="utf-8") as f:
frame_count = 0
while True:
success, frame = video.read()
if not success:
break

frame_count += 1
if frame_count % frame_skip != 0:
continue # 跳帧处理

# 截取字幕区域
x, y, w, h = subtitle_area
roi = frame[y:y+h, x:x+w]

# 图像预处理(提高OCR精度)
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)

# OCR识别
text = pytesseract.image_to_string(thresh, lang='chi_sim+eng') # 中英文混合

# 去空格和换行
text = text.strip().replace("\n", " ")

# 跳过空文本
if not text:
continue

# 计算与上一帧文本的相似度
similarity = SequenceMatcher(None, prev_text, text).ratio()
if similarity < similarity_threshold:
f.write(f"{text}\n")
prev_text = text # 更新前一次文本

video.release()
print(f"文字已提取到 {output_file}")

最终效果如下,中文依旧不尽人意,英语准确率很高

这里只是简单尝试,如何提高准确率,可以根据视频情况,调整图像处理方式,以及增加纠错处理等等。或者更换OCR引擎,听说PaddleOCR对中文支持更好。