AI处理漫画转视频
AI处理漫画转视频
第一步 从漫画PDF文件读取图片
第二部 图片信息剪裁
第三步 OCR识别处理图片,获取漫画对应的文本信息
第四步 运用阿里云通义大模型千文处理提取的文本信息更符合文本语言
第五步 运用FishVideo大模型将文本信息转变为对应的语音
第六步 图片转视频处理将图片与语音结合并添加转场
第七步 合并视频段
从PDF文件读取图片
1 | import fitz # PyMuPDF |
代码解析
这段代码的主要功能是从指定的PDF文件中提取所有图片,并将这些图片按顺序保存到指定的文件夹中。下面是代码的详细分析:
导入库
1 | import fitz # PyMuPDF |
fitz是PyMuPDF库的一个模块,用于处理PDF文件,包括读取和提取内容。os模块用于文件和目录的操作。
提取函数
1 | def extract_images_from_pdf(pdf_path, output_folder): |
- 定义一个名为
extract_images_from_pdf的函数,接受两个参数:pdf_path表示PDF文件的路径,output_folder表示保存提取图片的文件夹。
创建输出目录
1 | os.makedirs(output_folder, exist_ok=True) |
- 使用
os.makedirs创建保存图片的目录,exist_ok=True表示如果目录已存在则不抛出异常。
打开PDF文件
1 | doc = fitz.open(pdf_path) |
- 使用
fitz.open打开PDF文件,并将其赋值给doc对象。
初始化计数器
1 | image_count = 0 |
- 初始化
image_count变量,用于统计提取的图片数量。
遍历每一页
1 | for page_num in range(len(doc)): |
- 使用
for循环遍历PDF的每一页,doc.load_page(page_num)加载当前页。
获取和处理图片
1 | image_list = page.get_images(full=True) |
- 获取当前页的所有图片,并将其存储在
image_list中。
1 | for image_index, img in enumerate(image_list, start=1): |
- 对于每个图片,提取图片的引用(xref),然后获取其详细信息,包括二进制数据和扩展名。
保存图片
1 | image_filename = f"image_{image_count + 1}.{ext}" |
- 生成图片文件名,构造完整的文件路径,并使用
with open将图片数据写入文件。
提示成功信息
1 | print(f"成功提取 {image_count} 张图片到目录: {output_folder}") |
- 在控制台输出提取成功的图片数量及其保存路径。
主程序块
1 | if __name__ == "__main__": |
- 仅当该脚本作为主程序运行时,以下代码才会执行。
配置参数
1 | pdf_file = "D:\\BaiduNetdiskDownload\\一-人-之-下第051-100话.pdf" # PDF文件路径 |
- 设置要提取图片的PDF文件路径。
自动生成输出文件夹路径
1 | base_name = os.path.splitext(os.path.basename(pdf_file))[0] |
- 自动生成输出文件夹的名称,格式为
PDF文件名_images。
执行提取
1 | extract_images_from_pdf(pdf_file, output_dir) |
- 调用提取函数,开始提取图片。
Markdown 文件内容
1 | # 从PDF提取图片的Python脚本 |
提取函数
1 | def extract_images_from_pdf(pdf_path, output_folder): |
- 参数:
pdf_path: PDF文件的路径。output_folder: 存储提取图片的文件夹路径。
创建输出目录
1 | os.makedirs(output_folder, exist_ok=True) |
打开PDF文件
1 | doc = fitz.open(pdf_path) |
初始化计数器
1 | image_count = 0 |
遍历每一页
1 | for page_num in range(len(doc)): |
获取和处理图片
1 | image_list = page.get_images(full=True) |
保存图片
1 | image_filename = f"image_{image_count + 1}.{ext}" |
提示成功信息
1 | print(f"成功提取 {image_count} 张图片到目录: {output_folder}") |
主程序块
1 | if __name__ == "__main__": |
- 配置PDF文件路径和输出文件夹。
使用说明
- 安装PyMuPDF库:
pip install PyMuPDF。 - 修改
pdf_file变量为要提取的PDF文件路径。 - 运行脚本,提取的图片将存储在指定的文件夹中。
注意事项
- 确保PDF文件路径正确。
- 输出文件夹将自动创建,若已存在则会被忽略。
图片信息剪裁
1 | from PIL import Image |
代码解析
该代码的主要功能是批量裁剪指定文件夹中的图片,保持左右宽度不变,只调整上下边界。裁剪后的图片将保存到指定的输出文件夹中。以下是代码的详细分析:
导入库
1 | from PIL import Image |
PIL(Python Imaging Library): 用于图像处理,主要用于打开、操作和保存图像文件。os: 用于与操作系统交互,进行文件和目录操作。
批量裁剪函数
1 | def batch_crop_images(input_folder, output_folder, top, bottom): |
- 该函数接受四个参数:
input_folder: 输入文件夹路径,包含待裁剪的图片。output_folder: 输出文件夹路径,保存裁剪后的图片。top: 裁剪区域的上边界。bottom: 裁剪区域的下边界。
确保输出文件夹存在
1 | if not os.path.exists(output_folder): |
- 检查输出文件夹是否存在,如果不存在则创建该文件夹。
遍历输入文件夹中的所有文件
1 | for filename in os.listdir(input_folder): |
- 遍历输入文件夹中的所有文件,并筛选出支持的图片格式(.png, .jpg, .jpeg, .bmp, .gif)。
打开和裁剪图片
1 | image_path = os.path.join(input_folder, filename) |
- 构造每个图片的完整路径,使用
Image.open()打开图片,并获取其宽度和高度。
动态调整裁剪区域
1 | adjusted_bottom = min(bottom, height) |
- 确保下边界不超过图片的实际高度,避免裁剪超出图片范围。
裁剪并保存图片
1 | cropped_img = img.crop((0, top, width, adjusted_bottom)) |
- 使用
crop()方法进行裁剪,裁剪区域为左=0,上=top,右=width,下=adjusted_bottom。裁剪后的图片保存到输出路径,并打印保存消息。
示例调用
1 | input_folder = "D:\\BaiduNetdiskDownload\\051-100_images" |
- 指定输入文件夹、输出文件夹及裁剪的上下边界,然后调用
batch_crop_images函数进行批量裁剪操作。
Markdown 文件内容
1 | # 批量裁剪图片脚本 |
PIL: 用于图像处理。os: 用于文件和目录操作。
批量裁剪函数
1 | def batch_crop_images(input_folder, output_folder, top, bottom): |
- 函数接受输入文件夹路径、输出文件夹路径、上边界和下边界。
确保输出文件夹存在
1 | if not os.path.exists(output_folder): |
遍历输入文件夹中的所有文件
1 | for filename in os.listdir(input_folder): |
打开和裁剪图片
1 | image_path = os.path.join(input_folder, filename) |
动态调整裁剪区域
1 | adjusted_bottom = min(bottom, height) |
裁剪并保存图片
1 | cropped_img = img.crop((0, top, width, adjusted_bottom)) |
示例调用
1 | input_folder = "D:\\BaiduNetdiskDownload\\051-100_images" |
使用说明
- 确保已安装Pillow库(可以使用
pip install Pillow)。 - 指定输入文件夹和输出文件夹路径。
- 调整上边界和下边界参数。
- 运行脚本,裁剪后的图片将保存到输出文件夹中。
注意事项
- 确保输入文件夹中存在支持的图片格式。
- 裁剪区域的上边界和下边界应确保合理,以避免裁剪超出图片范围。
OCR识别处理图片,获取漫画对应的文本信息
1 | import easyocr |
代码解析
该代码的主要功能是使用EasyOCR库从指定文件夹中的图片中提取文本,并将提取的文本保存到相应的文本文件中。使用了OpenCV库来读取图像,并且通过PyTorch对GPU进行优化。以下是代码的详细分析:
导入库
1 | import easyocr |
easyocr: 用于图像文本识别(OCR)。cv2: OpenCV库,用于图像处理。os: 用于文件和目录操作。torch: PyTorch库,用于深度学习相关操作。collect: 从gc模块中导入,用于强制内存回收。
配置区域
1 | input_folder = r'D:\BaiduNetdiskDownload\051-100_images2' |
input_folder: 输入图片的文件夹路径。languages: 指定OCR识别的语言,这里包括简体中文和英语。supported_exts: 支持的图片扩展名列表。
GPU优化参数
1 | config = { |
batch_size: 设置为4以适应显存限制。workers: 工作线程数,避免过多线程竞争。fp16: 由于GTX 1050Ti不支持Tensor Core,设置为False以关闭半精度。model_load: 使用平衡模式优化显存使用。
段落合并函数
1 | def merge_paragraphs(results): |
- 该函数负责将OCR识别的文本结果进行段落合并,以便更好地处理文本输出。
合并逻辑
- 按Y坐标排序,并根据行间距(超过50像素视为新段落)将文本合并。
图像处理函数
1 | def process_image(reader, image_path, output_path): |
- 处理单张图片并管理显存,读取图片,执行OCR,合并段落并保存结果。
读取和检查图片
1 | img = cv2.imread(image_path) |
执行OCR
1 | results = reader.readtext( |
- 使用EasyOCR的
readtext方法提取文本,设置详细级别为1以获取坐标。
保存结果
1 | with open(output_path, 'w', encoding='utf-8') as f: |
内存回收
1 | finally: |
主程序块
1 | if __name__ == "__main__": |
- 确保该代码块仅在脚本作为主程序运行时执行。
验证CUDA
1 | if not torch.cuda.is_available(): |
- 检查CUDA是否可用,以确保可以使用GPU进行加速。
初始化Reader
1 | reader = easyocr.Reader( |
- 初始化EasyOCR的Reader对象,配置使用GPU。
遍历处理图片
1 | total = len([f for f in os.listdir(input_folder) if any(f.endswith(ext) for ext in supported_exts)]) |
- 统计输入文件夹中支持的图片数量。
处理每张图片
1 | for filename in os.listdir(input_folder): |
- 遍历输入文件夹中的每个文件,检查扩展名并调用
process_image处理。
打印处理状态
1 | print(f"处理中 [{processed+1}\{total}]: {filename[:20]}...", end='', flush=True) |
- 输出当前处理进度。
1 | print(f"\n完成!成功处理 {processed}\{total} 张图片") |
- 最后输出处理结果。
Markdown 文件内容
1 | # 使用EasyOCR从图片中提取文本的Python脚本 |
配置区域
1 | input_folder = r'D:\BaiduNetdiskDownload\051-100_images2' |
GPU优化参数
1 | config = { |
段落合并函数
1 | def merge_paragraphs(results): |
- 合并OCR结果中的段落,以提高可读性。
图像处理函数
1 | def process_image(reader, image_path, output_path): |
- 读取图片,执行OCR,合并段落并保存结果。
主程序块
1 | if __name__ == "__main__": |
- 检查CUDA是否可用,并初始化EasyOCR的Reader对象。
遍历处理图片
1 | total = len([f for f in os.listdir(input_folder) if any(f.endswith(ext) for ext in supported_exts)]) |
- 统计待处理的图片数量,逐一处理并输出处理进度。
使用说明
- 安装必要的库:
pip install easyocr opencv-python torch。 - 修改
input_folder为要处理的图片文件夹路径。 - 运行脚本,提取的文本将保存为相应的
.txt文件。
注意事项
- 确保安装了支持CUDA的PyTorch版本。
- 确保输入文件夹中存在支持的图片格式。
运用阿里云通义千文处理提取的文本信息更符合文本语言
1 | import os |
代码解析
该代码的主要功能是批量处理指定文件夹中的文本文件,使用OpenAI的API对文本内容进行处理,然后将处理的记录保存到Excel文件中,并记录错误日志。以下是代码的详细分析:
导入库
1 | import os |
os: 用于文件和目录操作。glob: 用于查找符合特定规则的文件路径名。datetime: 用于处理日期和时间。OpenAI: 用于与OpenAI API交互。openpyxl: 用于处理Excel文件。
初始化OpenAI客户端
1 | client = OpenAI( |
- 初始化OpenAI API客户端,需提供API密钥。
初始化Excel文件
1 | excel_file = "D:\\text_processing_log.xlsx" |
- 检查Excel文件是否存在,若不存在则创建新的Excel工作簿,并设置工作表标题和表头。
保存数据到Excel
1 | def save_to_excel(question, answer, file_path): |
- 该函数接受问题、答案和文件路径,并将它们写入Excel文件中,同时记录当前时间。
打印对话
1 | def print_dialog(question, answer, max_width=80): |
- 在命令行窗口美观地打印问题和答案,使用分隔线以增强可读性。
记录错误日志
1 | def log_error(log_file, message, error=None): |
- 记录错误信息到日志文件中,格式化输出时间和错误详情。
处理单个文件
1 | def process_file(file_path, log_file): |
- 该函数负责读取文本文件,处理每一行文本,并调用OpenAI的API进行文本修改。
检查文件内容
1 | if os.path.getsize(file_path) == 0: |
- 跳过空文件和内容为空的文件。
读取和处理文本
1 | with open(file_path, 'r+', encoding='utf-8') as f: |
- 读取文件所有行,并逐行处理。
调用OpenAI API
1 | completion = client.chat.completions.create( |
- 使用OpenAI的API进行文本修改,API模型为
qwen-plus。
保存修改后的文本
1 | f.write(modified + line[len(line.rstrip('\n\r')):]) |
- 将修改后的文本写回文件,同时保留行末的换行符。
处理整个文件夹
1 | def process_folder(folder_path): |
- 遍历指定文件夹中的所有文本文件,并调用
process_file进行处理。
日志记录
1 | log_file = os.path.join(folder_path, "processing_errors.log") |
- 创建一个日志文件来记录处理过程中出现的错误信息。
查找文本文件
1 | txt_files = glob.glob(os.path.join(folder_path, '**', '*.txt'), recursive=True) |
- 使用
glob模块查找指定文件夹下的所有文本文件。
主程序
1 | if __name__ == "__main__": |
- 该部分保证代码在作为主程序运行时执行文件夹处理函数。
Markdown 文件内容
1 | # 文本处理脚本 |
初始化OpenAI客户端
1 | client = OpenAI( |
初始化Excel文件
1 | excel_file = "D:\\text_processing_log.xlsx" |
保存数据到Excel
1 | def save_to_excel(question, answer, file_path): |
- 保存处理记录到Excel文件。
打印对话
1 | def print_dialog(question, answer, max_width=80): |
- 在命令行窗口美观地打印问题和答案。
记录错误日志
1 | def log_error(log_file, message, error=None): |
- 记录错误信息到日志文件中。
处理单个文件
1 | def process_file(file_path, log_file): |
- 读取文本文件,处理每一行文本,并调用OpenAI的API进行文本修改。
处理整个文件夹
1 | def process_folder(folder_path): |
- 遍历指定文件夹中的所有文本文件,并调用
process_file进行处理。
使用说明
- 确保安装了必要的库:
pip install openai openpyxl。 - 填写OpenAI API密钥。
- 修改文件夹路径以处理文本文件。
- 运行脚本,处理记录将保存到Excel文件中,错误日志将保存在文件夹中。
注意事项
- 确保OpenAI API服务可用。
- 检查文件夹路径和文件权限。
运用FishVideo大模型将文本信息转变为对应的语音
1 | import os |
代码解析
该代码的主要功能是处理指定目录下的文本文件,利用fish_audio_sdk库将文本转换为语音,并生成相应的音频文件。以下是代码的详细分析:
导入库
1 | import os |
os: 用于文件和目录操作。logging: 用于记录日志,方便后续的错误追踪和调试。fish_audio_sdk: 语音合成SDK,主要用于将文本转换为语音。
配置日志
1 | logging.basicConfig( |
- 配置日志记录,日志将被写入
tts_errors.log文件,记录错误信息及时间戳。
处理目录函数
1 | def process_directory(target_dir: str): |
- 该函数接受一个参数
target_dir,表示包含文本文件和生成音频文件的目录。
初始化变量
1 | session = Session("") |
- 创建一个
Session对象以进行语音合成。 - 初始化计数器:
processed用于记录成功处理的文件数量,skipped用于记录跳过的文件数量,errors用于记录处理失败的文件数量。
遍历文件
1 | for filename in os.listdir(target_dir): |
- 遍历指定目录下的文件,筛选出扩展名为
.txt的文件。
处理每个文件
1 | file_path = os.path.join(target_dir, filename) |
- 拼接文件路径和音频文件的保存路径。
读取文本内容
1 | with open(file_path, "r", encoding="utf-8") as f: |
- 读取文本文件内容,并去除首尾空格。
跳过空文件
1 | if not text: |
- 如果文件内容为空,则记录日志并跳过处理。
生成语音文件
1 | with open(audio_path, "wb") as f: |
- 调用
session.tts生成语音文件并写入到指定的路径。TTSRequest中包含了文本和一个参考ID。
成功处理
1 | print(f"生成成功: {filename} -> {os.path.basename(audio_path)}") |
- 打印生成成功的消息,并增加成功处理计数。
错误处理
1 | except Exception as e: |
- 捕获异常,记录错误并增加失败计数。
输出统计报告
1 | print(f"\n处理完成: 成功 {processed} 个 | 跳过 {skipped} 个 | 失败 {errors} 个") |
- 在处理完成后输出统计报告。
主程序
1 | if __name__ == "__main__": |
- 主程序入口,调用
process_directory处理指定目录下的文本文件。
Markdown 文件内容
1 | # 文本转语音处理脚本 |
配置日志
1 | logging.basicConfig( |
- 配置日志记录,记录错误信息到
tts_errors.log文件中。
处理目录函数
1 | def process_directory(target_dir: str): |
- 处理指定目录下的文本文件,并生成语音文件。
初始化变量
1 | session = Session("") |
遍历文件
1 | for filename in os.listdir(target_dir): |
- 只处理扩展名为
.txt的文件。
处理每个文件
1 | file_path = os.path.join(target_dir, filename) |
- 生成文本文件的路径和对应的音频文件路径。
读取文本内容
1 | with open(file_path, "r", encoding="utf-8") as f: |
跳过空文件
1 | if not text: |
生成语音文件
1 | with open(audio_path, "wb") as f: |
输出统计报告
1 | print(f"\n处理完成: 成功 {processed} 个 | 跳过 {skipped} 个 | 失败 {errors} 个") |
使用说明
- 确保已安装
fish_audio_sdk库。 - 将要处理的文本文件放入指定目录。
- 运行脚本,生成的音频文件将与文本文件保存在同一目录中。
注意事项
- 确保
fish_audio_sdk的配置正确,API密钥和参考ID有效。 - 检查文件权限,确保可以读取文本文件和写入音频文件。
图片转视频处理将图片与语音结合并添加转场
1 | import os |
代码解析
该代码的主要功能是使用FFmpeg将指定文件夹中的图片转换为视频,并在视频中添加与图片同名的音频文件(如果存在)。以下是代码的详细分析:
导入库
1 | import os |
os: 用于文件和目录操作。glob: 用于查找符合特定规则的文件路径名。subprocess: 用于执行外部命令,这里用来调用FFmpeg。
支持的文件扩展名
1 | IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp'] |
- 定义支持的图像和音频文件扩展名。
查找音频文件
1 | def find_audio_file(image_path): |
- 该函数接收图片路径,查找是否存在与之同名的音频文件,并返回找到的音频文件路径,如果未找到则返回
None。
创建视频
1 | def create_video(image_path, output_folder): |
- 函数负责使用FFmpeg将图片转换为视频。
构建FFmpeg命令
1 | cmd = [ |
- 使用
-loop 1选项使图片循环显示。
添加音频
1 | if audio_path := find_audio_file(image_path): |
- 如果找到与图片同名的音频文件,则将其添加到FFmpeg命令中;否则,使用虚拟音频源(无声)生成长度为3秒的音频。
设定视频输出参数
1 | cmd += [ |
- 设置视频过滤器,确保宽高是偶数,并设置每秒帧数(fps)为24。视频编码器为
libx264,音频编码器为aac。
运行FFmpeg命令
1 | try: |
- 执行命令并处理可能出现的错误。
处理文件夹
1 | def process_folder(folder_path): |
- 该函数遍历指定目录,处理所有支持的图片文件。
收集图片文件
1 | image_files = [] |
- 使用
glob查找所有支持的图片文件。
创建输出目录
1 | output_folder = os.path.join(folder_path, "output_videos") |
- 创建一个名为
output_videos的文件夹,用于保存生成的视频文件。
处理每个图片文件
1 | for img_file in image_files: |
- 对每个图片文件调用
create_video函数,并报告处理结果。
主程序
1 | if __name__ == "__main__": |
- 主程序入口,检查目标文件夹是否存在,并调用
process_folder处理图像。
Markdown 文件内容
1 | # 图片转视频处理脚本 |
支持的文件扩展名
1 | IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp'] |
查找音频文件
1 | def find_audio_file(image_path): |
- 查找与图片同名的音频文件。
创建视频
1 | def create_video(image_path, output_folder): |
- 使用FFmpeg将图片转换为视频。
构建FFmpeg命令
1 | cmd = [ |
添加音频
1 | if audio_path := find_audio_file(image_path): |
设置视频输出参数
1 | cmd += [ |
处理文件夹
1 | def process_folder(folder_path): |
- 处理指定目录中的所有图片文件,并生成视频。
主程序
1 | if __name__ == "__main__": |
- 检查目标目录并执行处理。
使用说明
- 确保已安装FFmpeg并将其路径添加到系统环境变量。
- 将要处理的图片文件放入指定目录。
- 运行脚本,生成的视频文件将保存到
output_videos子目录中。
注意事项
- 确保文件夹路径和文件权限正确。
- 处理时请检查FFmpeg的输出信息以获取错误提示。
合并视频段
1 | import os |
下面是对您提供的Python代码的详细解析,以及生成的Markdown文件内容。
代码解析
导入库
1 | import os |
os: 用于文件和目录操作。subprocess: 用于执行外部命令,这里用来调用FFmpeg。
合并视频函数
1 | def merge_videos(folder_path, output_file): |
- 该函数接受两个参数:一个是包含视频文件的文件夹路径,另一个是合并后输出视频文件的名称。
获取视频文件
1 | video_files = [f for f in os.listdir(folder_path) if f.endswith(('.mp4', '.mkv', '.avi', '.mov'))] |
- 获取指定文件夹中的所有视频文件,筛选出扩展名为
.mp4、.mkv、.avi和.mov的视频文件,并将其按名称排序,以确保合并顺序正确。
生成FFmpeg输入列表文件
1 | list_file = os.path.join(folder_path, 'file_list.txt') |
- 创建一个名为
file_list.txt的文本文件,FFmpeg将使用这个文件来读取需要合并的视频文件路径。每行包含一个视频文件的路径。
执行FFmpeg命令
1 | ffmpeg_cmd = f'ffmpeg -f concat -safe 0 -i "{list_file}" -c copy "{output_file}"' |
- 构建FFmpeg命令,使用
-f concat选项来合并文件,并使用-c copy选项以快速地复制视频流而不进行重新编码。通过subprocess.run执行命令。
清理临时文件
1 | os.remove(list_file) |
- 合并完成后删除临时的
file_list.txt文件,并打印合并完成的消息。
使用示例
1 | merge_videos("D:\\BaiduNetdiskDownload\\001-050_images\\output_videos", "output.mp4") |
- 调用
merge_videos函数,传入包含视频文件的文件夹路径和输出文件名。
Markdown 文件内容
1 | # 视频合并脚本 |
os: 用于文件和目录操作。subprocess: 用于执行外部命令,这里用来调用FFmpeg。
合并视频函数
1 | def merge_videos(folder_path, output_file): |
- 该函数接受两个参数:包含视频文件的文件夹路径和合并后输出视频文件的名称。
获取视频文件
1 | video_files = [f for f in os.listdir(folder_path) if f.endswith(('.mp4', '.mkv', '.avi', '.mov'))] |
生成FFmpeg输入列表文件
1 | list_file = os.path.join(folder_path, 'file_list.txt') |
执行FFmpeg命令
1 | ffmpeg_cmd = f'ffmpeg -f concat -safe 0 -i "{list_file}" -c copy "{output_file}"' |
清理临时文件
1 | os.remove(list_file) |
使用说明
- 确保已安装FFmpeg并将其路径添加到系统环境变量。
- 将要合并的视频文件放入指定文件夹。
- 运行脚本,将多个视频合并为一个视频文件。
注意事项
- 确保所有视频文件格式相同,以避免合并时出现问题。
- 处理时请检查FFmpeg的输出信息以获取可能的错误提示。
仓库代码
AIDrow
