本文目录导读:

- 方法一:使用 Python + EasyOCR(OCR识别)
- 方法二:使用 PaddleOCR(更精准)
- 方法三:使用 Whisper(语音识别)
- 方法四:使用 ffmpeg(提取软字幕)
- 方法五:使用视频字幕提取工具
- 安装依赖
- 使用建议
使用 Python + EasyOCR(OCR识别)
import easyocr
import cv2
from PIL import Image
import numpy as np
def extract_subtitles(video_path, frame_interval=2):
"""
从视频中提取字幕(通过OCR识别)
"""
# 初始化OCR
reader = easyocr.Reader(['ch_sim', 'en']) # 支持中英文
# 打开视频
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
subtitles = []
current_text = ""
for frame_num in range(0, total_frames, int(fps * frame_interval)):
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num)
ret, frame = cap.read()
if not ret:
break
# 提取字幕区域(通常是底部1/3)
height, width = frame.shape[:2]
subtitle_region = frame[int(height*0.7):, :]
# OCR识别
result = reader.readtext(subtitle_region)
text = ' '.join([item[1] for item in result])
if text and text != current_text:
subtitles.append({
'timestamp': frame_num / fps,
'text': text
})
current_text = text
cap.release()
return subtitles
# 使用示例s = extract_subtitles('your_video.mp4')
for sub in subtitles:
print(f"[{sub['timestamp']:.1f}s] {sub['text']}")
使用 PaddleOCR(更精准)
from paddleocr import PaddleOCR
import cv2
def extract_with_paddle(video_path, interval=1):
"""
使用PaddleOCR提取字幕
"""
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
cap = cv2.VideoCapture(video_path)
subtitles = []
fps = int(cap.get(cv2.CAP_PROP_FPS))
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
for i in range(0, total_frames, fps * interval):
cap.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame = cap.read()
if not ret:
break
# 获取字幕区域
h, w = frame.shape[:2]
roi = frame[int(h*0.7):, :]
# OCR识别
result = ocr.ocr(roi, cls=True)
if result:
text = ' '.join([line[1][0] for line in result[0]])
subtitles.append({
'time': i / fps,
'text': text
})
cap.release()
return subtitles
使用 Whisper(语音识别)
import whisper
def extract_with_whisper(video_path):
"""
使用OpenAI Whisper提取字幕(从音频)
"""
# 加载模型(支持多语言)
model = whisper.load_model("base")
# 识别
result = model.transcribe(video_path, language="zh")
# 输出字幕
for segment in result["segments"]:
print(f"[{segment['start']:.1f}s - {segment['end']:.1f}s] {segment['text']}")
# 保存为SRT格式
with open("subtitles.srt", "w", encoding="utf-8") as f:
for i, segment in enumerate(result["segments"], 1):
start = segment['start']
end = segment['end']
text = segment['text']
f.write(f"{i}\n")
f.write(f"{format_timestamp(start)} --> {format_timestamp(end)}\n")
f.write(f"{text}\n\n")
return result
def format_timestamp(seconds):
"""格式化时间戳"""
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
return f"{int(h):02d}:{int(m):02d}:{int(s):02d},000"
使用 ffmpeg(提取软字幕)
# 提取内嵌字幕流 ffmpeg -i input.mp4 -map 0:s:0 subtitles.srt # 列出所有字幕流 ffmpeg -i input.mp4 # 提取特定字幕流 ffmpeg -i input.mp4 -map 0:s:1 -f srt subtitle1.srt
使用视频字幕提取工具
import subprocess
import os
def extract_with_tool(video_path, output_srt="output.srt"):
"""
使用第三方工具(如VideoSubFinder等)
"""
# 确保安装了工具
if os.path.exists("VideoSubFinder_CLI"):
# 提取字幕帧
subprocess.run([
"./VideoSubFinder_CLI",
"-i", video_path,
"-o", "output_frames"
])
# OCR识别字幕帧
subprocess.run([
"tesseract",
"output_frames",
output_srt.replace('.srt', ''),
"-l", "chi_sim+eng"
])
安装依赖
# 方法一所需 pip install easyocr opencv-python # 方法二所需 pip install paddlepaddle paddleocr # 方法三所需 pip install openai-whisper # ffmpeg sudo apt install ffmpeg # Linux/macOS # Windows下载: https://ffmpeg.org/download.html
使用建议
- 字幕在画面底部:视频字幕通常在底部1/3区域
- 视频清晰度:清晰的视频OCR效果更好
- 字幕样式:颜色和字体影响识别准确率
- 性能优化:可以设置帧间隔,避免每帧都处理
需要我帮你实现其中某一种方法的具体应用吗?