AI处理漫画转视频
AI处理漫画转视频
第一步 从漫画PDF文件读取图片
第二部 图片信息剪裁
第三步 OCR识别处理图片,获取漫画对应的文本信息
第四步 运用阿里云通义大模型千文处理提取的文本信息更符合文本语言
第五步 运用FishVideo大模型将文本信息转变为对应的语音
第六步 图片转视频处理将图片与语音结合并添加转场
第七步 合并视频段
从PDF文件读取图片
import fitz # PyMuPDF
import osdef extract_images_from_pdf(pdf_path, output_folder):"""从PDF文件中提取所有图片并按顺序保存到指定文件夹参数:pdf_path (str): PDF文件路径output_folder (str): 图片保存目录"""# 创建输出目录os.makedirs(output_folder, exist_ok=True)# 打开PDF文件doc = fitz.open(pdf_path)# 初始化图片计数器image_count = 0# 遍历每一页for page_num in range(len(doc)):page = doc.load_page(page_num)# 获取当前页所有图片列表image_list = page.get_images(full=True)# 遍历当前页的图片for image_index, img in enumerate(image_list, start=1):xref = img[0] # 获取图片xrefbase_image = doc.extract_image(xref) # 提取图片信息image_data = base_image["image"] # 获取图片二进制数据ext = base_image["ext"] # 获取图片扩展名# 生成图片文件名image_filename = f"image_{image_count + 1}.{ext}"image_path = os.path.join(output_folder, image_filename)# 保存图片with open(image_path, "wb") as img_file:img_file.write(image_data)image_count += 1print(f"成功提取 {image_count} 张图片到目录: {output_folder}")if __name__ == "__main__":# 配置参数(根据实际情况修改)pdf_file = "D:\\BaiduNetdiskDownload\\一-人-之-下第051-100话.pdf" # PDF文件路径# 自动生成输出文件夹路径(PDF文件名 + _images)base_name = os.path.splitext(os.path.basename(pdf_file))[0] # 去除扩展名folder_name = f"{base_name}_images" # 生成文件夹名称output_dir = os.path.join(os.path.dirname(pdf_file), folder_name) # 完整输出路径# 执行提取extract_images_from_pdf(pdf_file, output_dir)
代码解析
这段代码的主要功能是从指定的PDF文件中提取所有图片,并将这些图片按顺序保存到指定的文件夹中。下面是代码的详细分析:
导入库
import fitz # PyMuPDF
import os
fitz
是PyMuPDF库的一个模块,用于处理PDF文件,包括读取和提取内容。os
模块用于文件和目录的操作。
提取函数
def extract_images_from_pdf(pdf_path, output_folder):
- 定义一个名为
extract_images_from_pdf
的函数,接受两个参数:pdf_path
表示PDF文件的路径,output_folder
表示保存提取图片的文件夹。
创建输出目录
os.makedirs(output_folder, exist_ok=True)
- 使用
os.makedirs
创建保存图片的目录,exist_ok=True
表示如果目录已存在则不抛出异常。
打开PDF文件
doc = fitz.open(pdf_path)
- 使用
fitz.open
打开PDF文件,并将其赋值给doc
对象。
初始化计数器
image_count = 0
- 初始化
image_count
变量,用于统计提取的图片数量。
遍历每一页
for page_num in range(len(doc)):page = doc.load_page(page_num)
- 使用
for
循环遍历PDF的每一页,doc.load_page(page_num)
加载当前页。
获取和处理图片
image_list = page.get_images(full=True)
- 获取当前页的所有图片,并将其存储在
image_list
中。
for image_index, img in enumerate(image_list, start=1):xref = img[0] # 获取图片xrefbase_image = doc.extract_image(xref) # 提取图片信息image_data = base_image["image"] # 获取图片二进制数据ext = base_image["ext"] # 获取图片扩展名
- 对于每个图片,提取图片的引用(xref),然后获取其详细信息,包括二进制数据和扩展名。
保存图片
image_filename = f"image_{image_count + 1}.{ext}"
image_path = os.path.join(output_folder, image_filename)with open(image_path, "wb") as img_file:img_file.write(image_data)image_count += 1
- 生成图片文件名,构造完整的文件路径,并使用
with open
将图片数据写入文件。
提示成功信息
print(f"成功提取 {image_count} 张图片到目录: {output_folder}")
- 在控制台输出提取成功的图片数量及其保存路径。
主程序块
if __name__ == "__main__":
- 仅当该脚本作为主程序运行时,以下代码才会执行。
配置参数
pdf_file = "D:\\BaiduNetdiskDownload\\一-人-之-下第051-100话.pdf" # PDF文件路径
- 设置要提取图片的PDF文件路径。
自动生成输出文件夹路径
base_name = os.path.splitext(os.path.basename(pdf_file))[0]
folder_name = f"{base_name}_images"
output_dir = os.path.join(os.path.dirname(pdf_file), folder_name)
- 自动生成输出文件夹的名称,格式为
PDF文件名_images
。
执行提取
extract_images_from_pdf(pdf_file, output_dir)
- 调用提取函数,开始提取图片。
Markdown 文件内容
# 从PDF提取图片的Python脚本## 概述
该脚本用于从指定的PDF文件中提取所有图片并将其按顺序保存到指定的文件夹中。使用了`fitz`库(PyMuPDF)来处理PDF文件。## 代码解析### 导入库
```python
import fitz # PyMuPDF
import os
提取函数
def extract_images_from_pdf(pdf_path, output_folder):
- 参数:
pdf_path
: PDF文件的路径。output_folder
: 存储提取图片的文件夹路径。
创建输出目录
os.makedirs(output_folder, exist_ok=True)
打开PDF文件
doc = fitz.open(pdf_path)
初始化计数器
image_count = 0
遍历每一页
for page_num in range(len(doc)):page = doc.load_page(page_num)
获取和处理图片
image_list = page.get_images(full=True)
保存图片
image_filename = f"image_{image_count + 1}.{ext}"
image_path = os.path.join(output_folder, image_filename)with open(image_path, "wb") as img_file:img_file.write(image_data)image_count += 1
提示成功信息
print(f"成功提取 {image_count} 张图片到目录: {output_folder}")
主程序块
if __name__ == "__main__":
- 配置PDF文件路径和输出文件夹。
使用说明
- 安装PyMuPDF库:
pip install PyMuPDF
。 - 修改
pdf_file
变量为要提取的PDF文件路径。 - 运行脚本,提取的图片将存储在指定的文件夹中。
注意事项
- 确保PDF文件路径正确。
- 输出文件夹将自动创建,若已存在则会被忽略。
图片信息剪裁
from PIL import Image
import osdef batch_crop_images(input_folder, output_folder, top, bottom):"""批量裁剪图片(仅修改下边界,保持左右宽度不变):param input_folder: 输入文件夹路径:param output_folder: 输出文件夹路径:param top: 裁剪区域上边界:param bottom: 裁剪区域下边界"""# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历输入文件夹中的所有文件for filename in os.listdir(input_folder):if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):image_path = os.path.join(input_folder, filename)with Image.open(image_path) as img:width, height = img.size# 保持左右不变(left=0, right=图片宽度)# 动态调整下边界,确保不超过图片高度adjusted_bottom = min(bottom, height)# 裁剪区域:左=0, 上=top, 右=width, 下=adjusted_bottomcropped_img = img.crop((0, top, width, adjusted_bottom))output_path = os.path.join(output_folder, filename)cropped_img.save(output_path)print(f"裁剪并保存: {output_path}")# 示例调用
input_folder = "D:\\BaiduNetdiskDownload\\051-100_images"
output_folder = "D:\\BaiduNetdiskDownload\\051-100_images2"
top, bottom = 0, 1225 # 仅设置上边界和下边界batch_crop_images(input_folder, output_folder, top, bottom)
代码解析
该代码的主要功能是批量裁剪指定文件夹中的图片,保持左右宽度不变,只调整上下边界。裁剪后的图片将保存到指定的输出文件夹中。以下是代码的详细分析:
导入库
from PIL import Image
import os
PIL
(Python Imaging Library): 用于图像处理,主要用于打开、操作和保存图像文件。os
: 用于与操作系统交互,进行文件和目录操作。
批量裁剪函数
def batch_crop_images(input_folder, output_folder, top, bottom):
- 该函数接受四个参数:
input_folder
: 输入文件夹路径,包含待裁剪的图片。output_folder
: 输出文件夹路径,保存裁剪后的图片。top
: 裁剪区域的上边界。bottom
: 裁剪区域的下边界。
确保输出文件夹存在
if not os.path.exists(output_folder):os.makedirs(output_folder)
- 检查输出文件夹是否存在,如果不存在则创建该文件夹。
遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
- 遍历输入文件夹中的所有文件,并筛选出支持的图片格式(.png, .jpg, .jpeg, .bmp, .gif)。
打开和裁剪图片
image_path = os.path.join(input_folder, filename)
with Image.open(image_path) as img:width, height = img.size
- 构造每个图片的完整路径,使用
Image.open()
打开图片,并获取其宽度和高度。
动态调整裁剪区域
adjusted_bottom = min(bottom, height)
- 确保下边界不超过图片的实际高度,避免裁剪超出图片范围。
裁剪并保存图片
cropped_img = img.crop((0, top, width, adjusted_bottom))
output_path = os.path.join(output_folder, filename)
cropped_img.save(output_path)
print(f"裁剪并保存: {output_path}")
- 使用
crop()
方法进行裁剪,裁剪区域为左=0,上=top,右=width,下=adjusted_bottom。裁剪后的图片保存到输出路径,并打印保存消息。
示例调用
input_folder = "D:\\BaiduNetdiskDownload\\051-100_images"
output_folder = "D:\\BaiduNetdiskDownload\\051-100_images2"
top, bottom = 0, 1225 # 仅设置上边界和下边界batch_crop_images(input_folder, output_folder, top, bottom)
- 指定输入文件夹、输出文件夹及裁剪的上下边界,然后调用
batch_crop_images
函数进行批量裁剪操作。
Markdown 文件内容
# 批量裁剪图片脚本## 概述
该脚本用于批量裁剪指定文件夹中的图片,裁剪区域的上下边界可由用户自定义,保持左右宽度不变。裁剪后的图片将保存到指定的输出文件夹中。## 代码解析### 导入库
```python
from PIL import Image
import os
PIL
: 用于图像处理。os
: 用于文件和目录操作。
批量裁剪函数
def batch_crop_images(input_folder, output_folder, top, bottom):
- 函数接受输入文件夹路径、输出文件夹路径、上边界和下边界。
确保输出文件夹存在
if not os.path.exists(output_folder):os.makedirs(output_folder)
遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
打开和裁剪图片
image_path = os.path.join(input_folder, filename)
with Image.open(image_path) as img:width, height = img.size
动态调整裁剪区域
adjusted_bottom = min(bottom, height)
裁剪并保存图片
cropped_img = img.crop((0, top, width, adjusted_bottom))
output_path = os.path.join(output_folder, filename)
cropped_img.save(output_path)
print(f"裁剪并保存: {output_path}")
示例调用
input_folder = "D:\\BaiduNetdiskDownload\\051-100_images"
output_folder = "D:\\BaiduNetdiskDownload\\051-100_images2"
top, bottom = 0, 1225 # 仅设置上边界和下边界batch_crop_images(input_folder, output_folder, top, bottom)
使用说明
- 确保已安装Pillow库(可以使用
pip install Pillow
)。 - 指定输入文件夹和输出文件夹路径。
- 调整上边界和下边界参数。
- 运行脚本,裁剪后的图片将保存到输出文件夹中。
注意事项
- 确保输入文件夹中存在支持的图片格式。
- 裁剪区域的上边界和下边界应确保合理,以避免裁剪超出图片范围。
OCR识别处理图片,获取漫画对应的文本信息
import easyocr
import cv2
import os
import torch
from gc import collect # 内存回收# ------------------- 配置区域 -------------------
input_folder = r'D:\BaiduNetdiskDownload\051-100_images2'
languages = ['ch_sim', 'en']
supported_exts = ['.jpg', '.jpeg', '.png']
# ----------------------------------------------# GTX 1050Ti 优化参数
config = {'batch_size': 4, # 显存有限,建议4-6'workers': 2, # 避免过多线程竞争'fp16': False, # 1050Ti不支持Tensor Core,关闭半精度'model_load': 'balanced' # 显存优化模式
}def merge_paragraphs(results):"""轻量级段落合并算法"""if not results:return []# 按Y坐标排序sorted_results = sorted(results, key=lambda x: x[0][0][1])# 合并逻辑(简化版)paragraphs = []current_para = []prev_bottom = -100 # 初始间距for box, text, _ in sorted_results:top = box[0][1]# 行间距超过50像素视为新段落(根据漫画排版调整)if (top - prev_bottom) > 50:if current_para:paragraphs.append(' '.join(current_para))current_para = []current_para.append(text.strip())prev_bottom = box[3][1] # 更新底部坐标if current_para:paragraphs.append(' '.join(current_para))return paragraphsdef process_image(reader, image_path, output_path):"""处理单张图片并管理显存"""try:# 读取图片img = cv2.imread(image_path)if img is None:raise ValueError("图片读取失败")# 显存优化策略torch.cuda.empty_cache()# 执行OCRresults = reader.readtext(img,batch_size=config['batch_size'],workers=config['workers'],detail=1, # 必须为1才能获取坐标paragraph=False # 禁用内置段落合并(使用自定义算法))# 合并段落paragraphs = merge_paragraphs(results)# 保存结果with open(output_path, 'w', encoding='utf-8') as f:f.write('\n'.join(paragraphs))return Trueexcept Exception as e:print(f"处理失败: {str(e)}")return Falsefinally:collect() # 强制回收内存if __name__ == "__main__":# 验证CUDAif not torch.cuda.is_available():raise RuntimeError("CUDA不可用,请检查驱动")# 初始化Reader(显存优化配置)reader = easyocr.Reader(lang_list=languages,gpu=True,detector=True,recognizer=True,model_storage_directory=None,download_enabled=False,user_network_directory=None)# 遍历处理total = len([f for f in os.listdir(input_folder) if any(f.endswith(ext) for ext in supported_exts)])processed = 0for filename in os.listdir(input_folder):if not any(filename.lower().endswith(ext) for ext in supported_exts):continueimage_path = os.path.join(input_folder, filename)output_path = os.path.join(input_folder,f"{os.path.splitext(filename)[0]}.txt")print(f"处理中 [{processed+1}\{total}]: {filename[:20]}...", end='', flush=True)if process_image(reader, image_path, output_path):print(" ✓")processed += 1else:print(" ✗")print(f"\n完成!成功处理 {processed}\{total} 张图片")
代码解析
该代码的主要功能是使用EasyOCR库从指定文件夹中的图片中提取文本,并将提取的文本保存到相应的文本文件中。使用了OpenCV库来读取图像,并且通过PyTorch对GPU进行优化。以下是代码的详细分析:
导入库
import easyocr
import cv2
import os
import torch
from gc import collect # 内存回收
easyocr
: 用于图像文本识别(OCR)。cv2
: OpenCV库,用于图像处理。os
: 用于文件和目录操作。torch
: PyTorch库,用于深度学习相关操作。collect
: 从gc
模块中导入,用于强制内存回收。
配置区域
input_folder = r'D:\BaiduNetdiskDownload\051-100_images2'
languages = ['ch_sim', 'en']
supported_exts = ['.jpg', '.jpeg', '.png']
input_folder
: 输入图片的文件夹路径。languages
: 指定OCR识别的语言,这里包括简体中文和英语。supported_exts
: 支持的图片扩展名列表。
GPU优化参数
config = {'batch_size': 4, 'workers': 2, 'fp16': False, 'model_load': 'balanced'
}
batch_size
: 设置为4以适应显存限制。workers
: 工作线程数,避免过多线程竞争。fp16
: 由于GTX 1050Ti不支持Tensor Core,设置为False以关闭半精度。model_load
: 使用平衡模式优化显存使用。
段落合并函数
def merge_paragraphs(results):
- 该函数负责将OCR识别的文本结果进行段落合并,以便更好地处理文本输出。
合并逻辑
- 按Y坐标排序,并根据行间距(超过50像素视为新段落)将文本合并。
图像处理函数
def process_image(reader, image_path, output_path):
- 处理单张图片并管理显存,读取图片,执行OCR,合并段落并保存结果。
读取和检查图片
img = cv2.imread(image_path)
if img is None:raise ValueError("图片读取失败")
执行OCR
results = reader.readtext(img,batch_size=config['batch_size'],workers=config['workers'],detail=1,paragraph=False
)
- 使用EasyOCR的
readtext
方法提取文本,设置详细级别为1以获取坐标。
保存结果
with open(output_path, 'w', encoding='utf-8') as f:f.write('\n'.join(paragraphs))
内存回收
finally:collect() # 强制回收内存
主程序块
if __name__ == "__main__":
- 确保该代码块仅在脚本作为主程序运行时执行。
验证CUDA
if not torch.cuda.is_available():raise RuntimeError("CUDA不可用,请检查驱动")
- 检查CUDA是否可用,以确保可以使用GPU进行加速。
初始化Reader
reader = easyocr.Reader(lang_list=languages,gpu=True,detector=True,recognizer=True,model_storage_directory=None,download_enabled=False,user_network_directory=None
)
- 初始化EasyOCR的Reader对象,配置使用GPU。
遍历处理图片
total = len([f for f in os.listdir(input_folder) if any(f.endswith(ext) for ext in supported_exts)])
- 统计输入文件夹中支持的图片数量。
处理每张图片
for filename in os.listdir(input_folder):
- 遍历输入文件夹中的每个文件,检查扩展名并调用
process_image
处理。
打印处理状态
print(f"处理中 [{processed+1}\{total}]: {filename[:20]}...", end='', flush=True)
- 输出当前处理进度。
print(f"\n完成!成功处理 {processed}\{total} 张图片")
- 最后输出处理结果。
Markdown 文件内容
# 使用EasyOCR从图片中提取文本的Python脚本## 概述
该脚本通过EasyOCR库从指定文件夹中的图片中提取文本,并将提取的文本保存到相应的文本文件中。使用OpenCV库读取图像,并通过PyTorch对GPU进行优化。## 代码解析### 导入库
```python
import easyocr
import cv2
import os
import torch
from gc import collect # 内存回收
配置区域
input_folder = r'D:\BaiduNetdiskDownload\051-100_images2'
languages = ['ch_sim', 'en']
supported_exts = ['.jpg', '.jpeg', '.png']
GPU优化参数
config = {'batch_size': 4, 'workers': 2, 'fp16': False, 'model_load': 'balanced'
}
段落合并函数
def merge_paragraphs(results):
- 合并OCR结果中的段落,以提高可读性。
图像处理函数
def process_image(reader, image_path, output_path):
- 读取图片,执行OCR,合并段落并保存结果。
主程序块
if __name__ == "__main__":
- 检查CUDA是否可用,并初始化EasyOCR的Reader对象。
遍历处理图片
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版本。
- 确保输入文件夹中存在支持的图片格式。
运用阿里云通义千文处理提取的文本信息更符合文本语言
import os
import glob
import datetime
from openai import OpenAI
import openpyxl# 初始化OpenAI客户端
client = OpenAI(api_key="",base_url="https:\\dashscope.aliyuncs.com\compatible-mode\v1",
)# 初始化Excel文件
excel_file = "D:\\text_processing_log.xlsx"
if os.path.exists(excel_file):wb = openpyxl.load_workbook(excel_file)
else:wb = openpyxl.Workbook()
ws = wb.active
ws.title = "处理记录"
if ws.max_row == 1:ws.append(["类型", "内容", "文件路径", "处理时间"])def save_to_excel(question, answer, file_path):"""保存到Excel文件"""timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")ws.append(["问题", question, file_path, timestamp])ws.append(["回答", answer, file_path, timestamp])wb.save(excel_file)def print_dialog(question, answer, max_width=80):"""在CMD界面美观打印对话"""sep_line = '─' * max_widthprint(f"\n{sep_line}")print(" 问题 ".center(max_width, '░'))print(f"{question}\n")print(" 回答 ".center(max_width, '░'))print(f"{answer}")print(sep_line)def log_error(log_file, message, error=None):"""统一记录错误日志"""timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")with open(log_file, 'a', encoding='utf-8') as f:log_entry = f"[{timestamp}] {message}"if error:log_entry += f"\n错误详情: {str(error)}"log_entry += "\n" + "-"*50 + "\n"f.write(log_entry)def process_file(file_path, log_file):"""处理单个文件"""try:if os.path.getsize(file_path) == 0:print(f"跳过空文件: {file_path}")returnwith open(file_path, 'r+', encoding='utf-8') as f:original_lines = f.readlines()if not any(line.strip() for line in original_lines):print(f"跳过内容为空的文件: {file_path}")returnf.seek(0)f.truncate()for line_num, line in enumerate(original_lines, 1):try:if not line.strip():f.write(line)continueoriginal_text = line.strip()completion = client.chat.completions.create(model="qwen-plus",messages=[{'role': 'user','content': f'''原本句子中存在错词,不常见词语。可以修改词语和文字不采用偏僻词,不涵盖英语词汇,请严格按正常语序重组句子,只返回修改后的句子,不要任何解释。需要修改的句子:
{original_text}'''}])modified = completion.choices[0].message.contentf.write(modified + line[len(line.rstrip('\n\r')):])# 显示对话并保存print_dialog(original_text, modified)save_to_excel(original_text, modified, file_path)except Exception as e:error_msg = f"文件: {file_path} 第{line_num}行处理失败 - 保留原内容"print(f"\n! 处理异常: {error_msg}")log_error(log_file, error_msg, e)f.write(line)except Exception as e:error_msg = f"文件处理失败: {file_path}"print(f"\n! 严重错误: {error_msg}")log_error(log_file, error_msg, e)def process_folder(folder_path):"""处理整个文件夹"""log_file = os.path.join(folder_path, "processing_errors.log")with open(log_file, 'w', encoding='utf-8') as f:f.write("文本处理异常日志\n")f.write(f"开始时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")f.write("="*60 + "\n")txt_files = glob.glob(os.path.join(folder_path, '**', '*.txt'), recursive=True)if not txt_files:print(f"在 {folder_path} 中未找到txt文件")returnprint(f"开始批量处理,共发现 {len(txt_files)} 个文本文件")print(f"处理记录将保存至: {os.path.abspath(excel_file)}")print("="*60)for i, file_path in enumerate(txt_files, 1):print(f"\n正在处理文件 ({i}\{len(txt_files)}):{os.path.basename(file_path)}")process_file(file_path, log_file)print("\n" + "="*60)print(f"处理完成!错误日志已保存至: {log_file}")print(f"共处理 {len(txt_files)*2} 条记录到Excel文件")if __name__ == "__main__":try:process_folder('D:\\BaiduNetdiskDownload\\001-050_images')finally:wb.close()
代码解析
该代码的主要功能是批量处理指定文件夹中的文本文件,使用OpenAI的API对文本内容进行处理,然后将处理的记录保存到Excel文件中,并记录错误日志。以下是代码的详细分析:
导入库
import os
import glob
import datetime
from openai import OpenAI
import openpyxl
os
: 用于文件和目录操作。glob
: 用于查找符合特定规则的文件路径名。datetime
: 用于处理日期和时间。OpenAI
: 用于与OpenAI API交互。openpyxl
: 用于处理Excel文件。
初始化OpenAI客户端
client = OpenAI(api_key="",base_url="https:\\dashscope.aliyuncs.com\compatible-mode\v1",
)
- 初始化OpenAI API客户端,需提供API密钥。
初始化Excel文件
excel_file = "D:\\text_processing_log.xlsx"
if os.path.exists(excel_file):wb = openpyxl.load_workbook(excel_file)
else:wb = openpyxl.Workbook()
ws = wb.active
ws.title = "处理记录"
if ws.max_row == 1:ws.append(["类型", "内容", "文件路径", "处理时间"])
- 检查Excel文件是否存在,若不存在则创建新的Excel工作簿,并设置工作表标题和表头。
保存数据到Excel
def save_to_excel(question, answer, file_path):
- 该函数接受问题、答案和文件路径,并将它们写入Excel文件中,同时记录当前时间。
打印对话
def print_dialog(question, answer, max_width=80):
- 在命令行窗口美观地打印问题和答案,使用分隔线以增强可读性。
记录错误日志
def log_error(log_file, message, error=None):
- 记录错误信息到日志文件中,格式化输出时间和错误详情。
处理单个文件
def process_file(file_path, log_file):
- 该函数负责读取文本文件,处理每一行文本,并调用OpenAI的API进行文本修改。
检查文件内容
if os.path.getsize(file_path) == 0:print(f"跳过空文件: {file_path}")return
- 跳过空文件和内容为空的文件。
读取和处理文本
with open(file_path, 'r+', encoding='utf-8') as f:original_lines = f.readlines()
- 读取文件所有行,并逐行处理。
调用OpenAI API
completion = client.chat.completions.create(model="qwen-plus",messages=[{'role': 'user','content': f'''原本句子中存在错词,不常见词语。可以修改词语和文字不采用偏僻词,不涵盖英语词汇,请严格按正常语序重组句子,只返回修改后的句子,不要任何解释。需要修改的句子:
{original_text}'''}]
)
- 使用OpenAI的API进行文本修改,API模型为
qwen-plus
。
保存修改后的文本
f.write(modified + line[len(line.rstrip('\n\r')):])
- 将修改后的文本写回文件,同时保留行末的换行符。
处理整个文件夹
def process_folder(folder_path):
- 遍历指定文件夹中的所有文本文件,并调用
process_file
进行处理。
日志记录
log_file = os.path.join(folder_path, "processing_errors.log")
- 创建一个日志文件来记录处理过程中出现的错误信息。
查找文本文件
txt_files = glob.glob(os.path.join(folder_path, '**', '*.txt'), recursive=True)
- 使用
glob
模块查找指定文件夹下的所有文本文件。
主程序
if __name__ == "__main__":
- 该部分保证代码在作为主程序运行时执行文件夹处理函数。
Markdown 文件内容
# 文本处理脚本## 概述
该脚本用于批量处理指定文件夹中的文本文件,使用OpenAI的API对文本内容进行处理,并将处理记录保存到Excel文件中,同时记录错误日志。## 代码解析### 导入库
```python
import os
import glob
import datetime
from openai import OpenAI
import openpyxl
初始化OpenAI客户端
client = OpenAI(api_key="",base_url="https:\\dashscope.aliyuncs.com\compatible-mode\v1",
)
初始化Excel文件
excel_file = "D:\\text_processing_log.xlsx"
if os.path.exists(excel_file):wb = openpyxl.load_workbook(excel_file)
else:wb = openpyxl.Workbook()
ws = wb.active
ws.title = "处理记录"
if ws.max_row == 1:ws.append(["类型", "内容", "文件路径", "处理时间"])
保存数据到Excel
def save_to_excel(question, answer, file_path):
- 保存处理记录到Excel文件。
打印对话
def print_dialog(question, answer, max_width=80):
- 在命令行窗口美观地打印问题和答案。
记录错误日志
def log_error(log_file, message, error=None):
- 记录错误信息到日志文件中。
处理单个文件
def process_file(file_path, log_file):
- 读取文本文件,处理每一行文本,并调用OpenAI的API进行文本修改。
处理整个文件夹
def process_folder(folder_path):
- 遍历指定文件夹中的所有文本文件,并调用
process_file
进行处理。
使用说明
- 确保安装了必要的库:
pip install openai openpyxl
。 - 填写OpenAI API密钥。
- 修改文件夹路径以处理文本文件。
- 运行脚本,处理记录将保存到Excel文件中,错误日志将保存在文件夹中。
注意事项
- 确保OpenAI API服务可用。
- 检查文件夹路径和文件权限。
运用FishVideo大模型将文本信息转变为对应的语音
import os
import logging
from fish_audio_sdk import Session, TTSRequest, ReferenceAudio# 配置日志记录异常
logging.basicConfig(filename='tts_errors.log',level=logging.ERROR,format='%(asctime)s - %(levelname)s - %(message)s'
)def process_directory(target_dir: str):"""处理指定目录下的文本文件Args:target_dir: 包含文本文件和生成音频文件的目录"""session = Session("")processed = 0skipped = 0errors = 0for filename in os.listdir(target_dir):if not filename.endswith(".txt"):continuefile_path = os.path.join(target_dir, filename)base_name = os.path.splitext(filename)[0]audio_path = os.path.join(target_dir, f"{base_name}.mp3")try:# 读取文本内容with open(file_path, "r", encoding="utf-8") as f:text = f.read().strip()# 跳过空文件if not text:logging.info(f"跳过空文件: {filename}")skipped += 1continue# 生成语音文件with open(audio_path, "wb") as f:for chunk in session.tts(TTSRequest(reference_id="7f92f8afb8ec43bf81429cc1c9199cb1",text=text)):f.write(chunk)print(f"生成成功: {filename} -> {os.path.basename(audio_path)}")processed += 1except Exception as e:logging.error(f"文件 {filename} 处理失败: {str(e)}", exc_info=True)print(f"错误: {filename} 转换失败,详见日志")errors += 1# 输出统计报告print(f"\n处理完成: 成功 {processed} 个 | 跳过 {skipped} 个 | 失败 {errors} 个")if __name__ == "__main__":# 使用示例:处理当前目录下的文件process_directory(target_dir="D:\\BaiduNetdiskDownload\\001-050_images")
代码解析
该代码的主要功能是处理指定目录下的文本文件,利用fish_audio_sdk
库将文本转换为语音,并生成相应的音频文件。以下是代码的详细分析:
导入库
import os
import logging
from fish_audio_sdk import Session, TTSRequest, ReferenceAudio
os
: 用于文件和目录操作。logging
: 用于记录日志,方便后续的错误追踪和调试。fish_audio_sdk
: 语音合成SDK,主要用于将文本转换为语音。
配置日志
logging.basicConfig(filename='tts_errors.log',level=logging.ERROR,format='%(asctime)s - %(levelname)s - %(message)s'
)
- 配置日志记录,日志将被写入
tts_errors.log
文件,记录错误信息及时间戳。
处理目录函数
def process_directory(target_dir: str):
- 该函数接受一个参数
target_dir
,表示包含文本文件和生成音频文件的目录。
初始化变量
session = Session("")
processed = 0
skipped = 0
errors = 0
- 创建一个
Session
对象以进行语音合成。 - 初始化计数器:
processed
用于记录成功处理的文件数量,skipped
用于记录跳过的文件数量,errors
用于记录处理失败的文件数量。
遍历文件
for filename in os.listdir(target_dir):if not filename.endswith(".txt"):continue
- 遍历指定目录下的文件,筛选出扩展名为
.txt
的文件。
处理每个文件
file_path = os.path.join(target_dir, filename)
base_name = os.path.splitext(filename)[0]
audio_path = os.path.join(target_dir, f"{base_name}.mp3")
- 拼接文件路径和音频文件的保存路径。
读取文本内容
with open(file_path, "r", encoding="utf-8") as f:text = f.read().strip()
- 读取文本文件内容,并去除首尾空格。
跳过空文件
if not text:logging.info(f"跳过空文件: {filename}")skipped += 1continue
- 如果文件内容为空,则记录日志并跳过处理。
生成语音文件
with open(audio_path, "wb") as f:for chunk in session.tts(TTSRequest(reference_id="7f92f8afb8ec43bf81429cc1c9199cb1",text=text)):f.write(chunk)
- 调用
session.tts
生成语音文件并写入到指定的路径。TTSRequest
中包含了文本和一个参考ID。
成功处理
print(f"生成成功: {filename} -> {os.path.basename(audio_path)}")
processed += 1
- 打印生成成功的消息,并增加成功处理计数。
错误处理
except Exception as e:logging.error(f"文件 {filename} 处理失败: {str(e)}", exc_info=True)print(f"错误: {filename} 转换失败,详见日志")errors += 1
- 捕获异常,记录错误并增加失败计数。
输出统计报告
print(f"\n处理完成: 成功 {processed} 个 | 跳过 {skipped} 个 | 失败 {errors} 个")
- 在处理完成后输出统计报告。
主程序
if __name__ == "__main__":process_directory(target_dir="D:\\BaiduNetdiskDownload\\001-050_images")
- 主程序入口,调用
process_directory
处理指定目录下的文本文件。
Markdown 文件内容
# 文本转语音处理脚本## 概述
该脚本用于处理指定目录下的文本文件,通过`fish_audio_sdk`将文本转换为语音,并生成对应的音频文件。处理过程中会记录成功、跳过和失败的文件数量,并将错误日志保存到文件中。## 代码解析### 导入库
```python
import os
import logging
from fish_audio_sdk import Session, TTSRequest, ReferenceAudio
配置日志
logging.basicConfig(filename='tts_errors.log',level=logging.ERROR,format='%(asctime)s - %(levelname)s - %(message)s'
)
- 配置日志记录,记录错误信息到
tts_errors.log
文件中。
处理目录函数
def process_directory(target_dir: str):
- 处理指定目录下的文本文件,并生成语音文件。
初始化变量
session = Session("")
processed = 0
skipped = 0
errors = 0
遍历文件
for filename in os.listdir(target_dir):if not filename.endswith(".txt"):continue
- 只处理扩展名为
.txt
的文件。
处理每个文件
file_path = os.path.join(target_dir, filename)
base_name = os.path.splitext(filename)[0]
audio_path = os.path.join(target_dir, f"{base_name}.mp3")
- 生成文本文件的路径和对应的音频文件路径。
读取文本内容
with open(file_path, "r", encoding="utf-8") as f:text = f.read().strip()
跳过空文件
if not text:logging.info(f"跳过空文件: {filename}")skipped += 1continue
生成语音文件
with open(audio_path, "wb") as f:for chunk in session.tts(TTSRequest(reference_id="7f92f8afb8ec43bf81429cc1c9199cb1",text=text)):f.write(chunk)
输出统计报告
print(f"\n处理完成: 成功 {processed} 个 | 跳过 {skipped} 个 | 失败 {errors} 个")
使用说明
- 确保已安装
fish_audio_sdk
库。 - 将要处理的文本文件放入指定目录。
- 运行脚本,生成的音频文件将与文本文件保存在同一目录中。
注意事项
- 确保
fish_audio_sdk
的配置正确,API密钥和参考ID有效。 - 检查文件权限,确保可以读取文本文件和写入音频文件。
图片转视频处理将图片与语音结合并添加转场
import os
import glob
import subprocess# 支持的图片和音频扩展名
IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp']
AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg']def find_audio_file(image_path):"""查找与图片同名的音频文件"""base_name = os.path.splitext(image_path)[0]for ext in AUDIO_EXTENSIONS:audio_path = f"{base_name}{ext}"if os.path.exists(audio_path):return audio_pathreturn Nonedef create_video(image_path, output_folder):"""使用 FFmpeg 创建视频"""base_name = os.path.splitext(os.path.basename(image_path))[0]output_path = os.path.join(output_folder, f"{base_name}.mp4")cmd = ['ffmpeg','-y','-loop', '1','-i', image_path,]if audio_path := find_audio_file(image_path):cmd += ['-i', audio_path]else:cmd += ['-f', 'lavfi','-i', 'anullsrc=cl=stereo:r=44100','-t', '3']cmd += ['-vf', 'scale=trunc(iw\2)*2:trunc(ih\2)*2,fps=24,format=yuv420p', # 关键修改点'-c:v', 'libx264','-c:a', 'aac','-shortest','-movflags', '+faststart',output_path]try:subprocess.run(cmd, check=True, capture_output=True, text=True)return Trueexcept subprocess.CalledProcessError as e:print(f"FFmpeg 错误: {e.stderr}")return Falsedef process_folder(folder_path):"""处理整个文件夹"""# 收集所有图片文件image_files = []for ext in IMAGE_EXTENSIONS:image_files.extend(glob.glob(os.path.join(folder_path, '*' + ext)))# 创建输出目录output_folder = os.path.join(folder_path, "output_videos")os.makedirs(output_folder, exist_ok=True)# 处理每个图片文件for img_file in image_files:print(f"正在处理: {os.path.basename(img_file)}")if create_video(img_file, output_folder):print(f"成功创建: {os.path.basename(img_file)}.mp4")else:print(f"处理失败: {os.path.basename(img_file)}")print("-" * 50)if __name__ == "__main__":target_folder = "D:\\BaiduNetdiskDownload\\001-050_images"if not os.path.exists(target_folder):print(f"错误: 目录不存在 - {target_folder}")else:process_folder(target_folder)print("全部处理完成!")
代码解析
该代码的主要功能是使用FFmpeg将指定文件夹中的图片转换为视频,并在视频中添加与图片同名的音频文件(如果存在)。以下是代码的详细分析:
导入库
import os
import glob
import subprocess
os
: 用于文件和目录操作。glob
: 用于查找符合特定规则的文件路径名。subprocess
: 用于执行外部命令,这里用来调用FFmpeg。
支持的文件扩展名
IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp']
AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg']
- 定义支持的图像和音频文件扩展名。
查找音频文件
def find_audio_file(image_path):"""查找与图片同名的音频文件"""base_name = os.path.splitext(image_path)[0]for ext in AUDIO_EXTENSIONS:audio_path = f"{base_name}{ext}"if os.path.exists(audio_path):return audio_pathreturn None
- 该函数接收图片路径,查找是否存在与之同名的音频文件,并返回找到的音频文件路径,如果未找到则返回
None
。
创建视频
def create_video(image_path, output_folder):"""使用 FFmpeg 创建视频"""base_name = os.path.splitext(os.path.basename(image_path))[0]output_path = os.path.join(output_folder, f"{base_name}.mp4")
- 函数负责使用FFmpeg将图片转换为视频。
构建FFmpeg命令
cmd = ['ffmpeg','-y','-loop', '1','-i', image_path,
]
- 使用
-loop 1
选项使图片循环显示。
添加音频
if audio_path := find_audio_file(image_path):cmd += ['-i', audio_path]
else:cmd += ['-f', 'lavfi','-i', 'anullsrc=cl=stereo:r=44100','-t', '3']
- 如果找到与图片同名的音频文件,则将其添加到FFmpeg命令中;否则,使用虚拟音频源(无声)生成长度为3秒的音频。
设定视频输出参数
cmd += ['-vf', 'scale=trunc(iw\2)*2:trunc(ih\2)*2,fps=24,format=yuv420p','-c:v', 'libx264','-c:a', 'aac','-shortest','-movflags', '+faststart',output_path
]
- 设置视频过滤器,确保宽高是偶数,并设置每秒帧数(fps)为24。视频编码器为
libx264
,音频编码器为aac
。
运行FFmpeg命令
try:subprocess.run(cmd, check=True, capture_output=True, text=True)return True
except subprocess.CalledProcessError as e:print(f"FFmpeg 错误: {e.stderr}")return False
- 执行命令并处理可能出现的错误。
处理文件夹
def process_folder(folder_path):"""处理整个文件夹"""
- 该函数遍历指定目录,处理所有支持的图片文件。
收集图片文件
image_files = []
for ext in IMAGE_EXTENSIONS:image_files.extend(glob.glob(os.path.join(folder_path, '*' + ext)))
- 使用
glob
查找所有支持的图片文件。
创建输出目录
output_folder = os.path.join(folder_path, "output_videos")
os.makedirs(output_folder, exist_ok=True)
- 创建一个名为
output_videos
的文件夹,用于保存生成的视频文件。
处理每个图片文件
for img_file in image_files:print(f"正在处理: {os.path.basename(img_file)}")if create_video(img_file, output_folder):print(f"成功创建: {os.path.basename(img_file)}.mp4")else:print(f"处理失败: {os.path.basename(img_file)}")print("-" * 50)
- 对每个图片文件调用
create_video
函数,并报告处理结果。
主程序
if __name__ == "__main__":target_folder = "D:\\BaiduNetdiskDownload\\001-050_images"if not os.path.exists(target_folder):print(f"错误: 目录不存在 - {target_folder}")else:process_folder(target_folder)print("全部处理完成!")
- 主程序入口,检查目标文件夹是否存在,并调用
process_folder
处理图像。
Markdown 文件内容
# 图片转视频处理脚本## 概述
该脚本用于将指定文件夹中的图片文件转换为视频,并在视频中添加与图片同名的音频文件(如果存在)。生成的视频文件将保存到一个单独的输出目录中。## 代码解析### 导入库
```python
import os
import glob
import subprocess
支持的文件扩展名
IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp']
AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg']
查找音频文件
def find_audio_file(image_path):
- 查找与图片同名的音频文件。
创建视频
def create_video(image_path, output_folder):
- 使用FFmpeg将图片转换为视频。
构建FFmpeg命令
cmd = ['ffmpeg','-y','-loop', '1','-i', image_path,
]
添加音频
if audio_path := find_audio_file(image_path):cmd += ['-i', audio_path]
else:cmd += ['-f', 'lavfi','-i', 'anullsrc=cl=stereo:r=44100','-t', '3']
设置视频输出参数
cmd += ['-vf', 'scale=trunc(iw\2)*2:trunc(ih\2)*2,fps=24,format=yuv420p','-c:v', 'libx264','-c:a', 'aac','-shortest','-movflags', '+faststart',output_path
]
处理文件夹
def process_folder(folder_path):
- 处理指定目录中的所有图片文件,并生成视频。
主程序
if __name__ == "__main__":
- 检查目标目录并执行处理。
使用说明
- 确保已安装FFmpeg并将其路径添加到系统环境变量。
- 将要处理的图片文件放入指定目录。
- 运行脚本,生成的视频文件将保存到
output_videos
子目录中。
注意事项
- 确保文件夹路径和文件权限正确。
- 处理时请检查FFmpeg的输出信息以获取错误提示。
合并视频段
import os
import subprocessdef merge_videos(folder_path, output_file):# 获取所有视频文件video_files = [f for f in os.listdir(folder_path) if f.endswith(('.mp4', '.mkv', '.avi', '.mov'))]video_files.sort() # 根据名称排序,确保顺序正确# 生成 FFmpeg 需要的输入列表文件list_file = os.path.join(folder_path, 'file_list.txt')with open(list_file, 'w', encoding='utf-8') as f:for video in video_files:f.write(f"file '{os.path.join(folder_path, video)}'\n")# FFmpeg 合并视频ffmpeg_cmd = f'ffmpeg -f concat -safe 0 -i "{list_file}" -c copy "{output_file}"'subprocess.run(ffmpeg_cmd, shell=True, check=True)# 清理文件os.remove(list_file)print(f"合并完成:{output_file}")# 使用示例
merge_videos("D:\\BaiduNetdiskDownload\\001-050_images\\output_videos", "output.mp4")
下面是对您提供的Python代码的详细解析,以及生成的Markdown文件内容。
代码解析
导入库
import os
import subprocess
os
: 用于文件和目录操作。subprocess
: 用于执行外部命令,这里用来调用FFmpeg。
合并视频函数
def merge_videos(folder_path, output_file):
- 该函数接受两个参数:一个是包含视频文件的文件夹路径,另一个是合并后输出视频文件的名称。
获取视频文件
video_files = [f for f in os.listdir(folder_path) if f.endswith(('.mp4', '.mkv', '.avi', '.mov'))]
video_files.sort() # 根据名称排序,确保顺序正确
- 获取指定文件夹中的所有视频文件,筛选出扩展名为
.mp4
、.mkv
、.avi
和.mov
的视频文件,并将其按名称排序,以确保合并顺序正确。
生成FFmpeg输入列表文件
list_file = os.path.join(folder_path, 'file_list.txt')
with open(list_file, 'w', encoding='utf-8') as f:for video in video_files:f.write(f"file '{os.path.join(folder_path, video)}'\n")
- 创建一个名为
file_list.txt
的文本文件,FFmpeg将使用这个文件来读取需要合并的视频文件路径。每行包含一个视频文件的路径。
执行FFmpeg命令
ffmpeg_cmd = f'ffmpeg -f concat -safe 0 -i "{list_file}" -c copy "{output_file}"'
subprocess.run(ffmpeg_cmd, shell=True, check=True)
- 构建FFmpeg命令,使用
-f concat
选项来合并文件,并使用-c copy
选项以快速地复制视频流而不进行重新编码。通过subprocess.run
执行命令。
清理临时文件
os.remove(list_file)
print(f"合并完成:{output_file}")
- 合并完成后删除临时的
file_list.txt
文件,并打印合并完成的消息。
使用示例
merge_videos("D:\\BaiduNetdiskDownload\\001-050_images\\output_videos", "output.mp4")
- 调用
merge_videos
函数,传入包含视频文件的文件夹路径和输出文件名。
Markdown 文件内容
# 视频合并脚本## 概述
该脚本用于将指定文件夹中的多个视频文件合并为一个视频,使用FFmpeg工具来完成合并操作。## 代码解析### 导入库
```python
import os
import subprocess
os
: 用于文件和目录操作。subprocess
: 用于执行外部命令,这里用来调用FFmpeg。
合并视频函数
def merge_videos(folder_path, output_file):
- 该函数接受两个参数:包含视频文件的文件夹路径和合并后输出视频文件的名称。
获取视频文件
video_files = [f for f in os.listdir(folder_path) if f.endswith(('.mp4', '.mkv', '.avi', '.mov'))]
video_files.sort() # 根据名称排序,确保顺序正确
生成FFmpeg输入列表文件
list_file = os.path.join(folder_path, 'file_list.txt')
with open(list_file, 'w', encoding='utf-8') as f:for video in video_files:f.write(f"file '{os.path.join(folder_path, video)}'\n")
执行FFmpeg命令
ffmpeg_cmd = f'ffmpeg -f concat -safe 0 -i "{list_file}" -c copy "{output_file}"'
subprocess.run(ffmpeg_cmd, shell=True, check=True)
清理临时文件
os.remove(list_file)
print(f"合并完成:{output_file}")
使用说明
- 确保已安装FFmpeg并将其路径添加到系统环境变量。
- 将要合并的视频文件放入指定文件夹。
- 运行脚本,将多个视频合并为一个视频文件。
注意事项
- 确保所有视频文件格式相同,以避免合并时出现问题。
- 处理时请检查FFmpeg的输出信息以获取可能的错误提示。
仓库代码
AIDrow
相关文章:
AI处理漫画转视频
AI处理漫画转视频 第一步 从漫画PDF文件读取图片 第二部 图片信息剪裁 第三步 OCR识别处理图片,获取漫画对应的文本信息 第四步 运用阿里云通义大模型千文处理提取的文本信息更符合文本语言 第五步 运用FishVideo大模型将文本信息转变为对应的语音 第六步 图片转视…...
三维空间中的离散曲线段匹配方法
基于离散 F r e ˊ c h e t Fr\{e}chet Freˊchet距离实现工程中的三维曲线段匹配 在自动驾驶系统中, 准确匹配相邻车道线是实现安全导航, 变道决策和路径规划的核心任务. 由于道路网络存在交叉口, 弯道, 多车道并行等复杂场景, 如何衡量目标车道曲线与其他候选车道线的空间关…...
HTML的Canvas元素
<Canvas>元素 <Canvas>元素是HTML5引入的一个强大的绘图元素,它允许通过 JavaScript 在网页上动态绘制图形、动画和交互式内容。需要注意的是,<Canvas>元素只是图形的一个容器,绘制图形必须使用Javascript。 空画布 <…...
Django学习记录-2-数据库
Django学习记录-2-数据库 文章目录 Django学习记录-2-数据库参考贴连接数据库后台查看数据库后台改为中文 table增删改查Python使用hash保持一致 虽然网上教程都很多,但是感觉自己记录一下才属于自己,之后想找也方面一点,文采不佳看的不爽可绕…...
qq邮箱群发程序
1.界面设计 1.1 环境配置 在外部工具位置进行配置 1.2 UI界面设计 1.2.1 进入QT的UI设计界面 在pycharm中按顺序点击,进入UI编辑界面: 点击第三步后进入QT的UI设计界面,通过点击按钮进行界面设计,设计后进行保存到当前Pycharm…...
spring mvc 中 RestTemplate 全面详解及示例
RestTemplate 全面详解及示例 1. RestTemplate 简介 定义:Spring 提供的同步 HTTP 客户端,支持多种 HTTP 方法(GET/POST/PUT/DELETE 等),用于调用 RESTful API。核心特性: 支持请求头、请求体、URI 参数的…...
openEuler-22.03-LTS-SP3 编译安装 Greenplum-db 6.20.0
openEuler-22.03-LTS-SP3 编译安装 Greenplum-db 6.20.0 1、配置 yum 华为源2、安装依赖3、源码安装 openssl 1.0.1u3.1、openssl 1.1.1 降级到 openssl 1.0.1 4、源码安装 python 2.75、使用 pip3 安装 Python 相关依赖6、编译安装 Greenplum-db 6.20.06.1、修改配置6.2、基于…...
天锐蓝盾多模式加密技术,构筑企业数据安全堡垒
一旦企业发生数据泄露,将遭受严重的经济损失,声誉也会一落千丈,甚至可能在激烈的竞争中陷入绝境。那么,企业究竟该如何守护敏感数据,筑牢数据安全的 “护城河” 呢?天锐蓝盾数据泄露防护系统给出了全面且专…...
可编辑37页PPT | 建筑行业DeepSeek日常实操培训
荐言摘要:随着人工智能技术的快速发展,DeepSeek作为一款具有创新性的AI工具,正逐步渗透到建筑行业的各个环节。为帮助建筑行业从业者掌握DeepSeek的核心功能与应用技巧,提升工作效率与决策能力,特推出本次建筑行业Deep…...
C语言指针和函数
文章目录 C语言指针和函数一、指针与函数1.传递指针给函数2.指针函数3.函数指针4.回调函数 二、多级指针三、空指针四、野指针 C语言指针和函数 在C语言的编程领域中,指针是一把强大而又危险的“双刃剑”。它不仅能够直接操作内存,提升程序的运行效率&a…...
左右开弓策略思路
一、策略概述 本策略是一种基于多种技术指标的复杂交易策略,包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现,旨在通过分析历史价格数据来预测未来价格走势,并据此生成交易信号。 二、主要技术指标…...
mapbox基础,加载F4Map二维地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…...
doxygen自动生成文档,注释容易错位的补充
开发过程中,为了简化api开发文档的编写工作,我们可以使用doxygen的标注来进行文档注释,最后自动化的生成相关文档: 参考:https://developer.aliyun.com/article/935529 参考:https://blog.csdn.net/qq_3459…...
git操作0409
git init git add. git commit -m "Initial commit" git checkout 7890abc # 切换到旧版本代码(只读) git checkout master # 切回最新版本 git checkout -b new_branch 789abcd # 或 git checkout -b new_branch HEAD~3 很重点 git reflog …...
电阻的额定功率与额定电压详解
一、基本定义 额定功率(Rated Power) 定义:电阻在长期安全工作时允许消耗的最大功率,超过此值可能导致过热甚至烧毁。 公式: P I R 或 P V / R (I:电流,V:电压&#…...
【后端开发】SpringBoot与Spring MVC
文章目录 创建项目目录介绍Spring MVCservletMVCSpring MVCSpringboot与Spring MVC的区别Spring MVC交互 创建项目 新建一个Springboot项目 对应描述 目录介绍 src/main/java:Java 源代码 src/main/resources:为静态资源或配置⽂件: ----…...
如何禁用 PyCharm 的测试功能
如何禁用 PyCharm 的测试功能? PyCharm 的测试功能默认会自动检测项目中符合命名规则的测试文件(如以 test_ 开头的文件)并关联测试框架。若需禁用该功能,可通过以下方法操作: 方法一:全局禁用默认测试框架…...
【Spiffo】光速项目:LVGL v9框架下的MIPI简易相机_Part2
简介 本期接上回的工程部署讲一下整个工程的框架逻辑以及相关的模块作用机制,包括mipi抓图像以及后续传递到显示屏的链路逻辑等。 一、核心逻辑 1、如何抓到图像数据并显示 首先能够从摄像头捕获画面并显示是一个相机最起码要能实现的功能。所以先要搞清楚整个链…...
pycharm编译部署智能合约(solcx与web3搭配)
solcx 是一个 python 库,提供了 solidity 编译器的 python 绑定。它使开发者能够直接从 python 中编译 solidity 源代码,生成以太坊智能合约的字节码(Bytecode)和 ABI(Application Binary Interface)。这个库通常用于与 Web3 库配合使用,帮助开发者进行智能合约的部署、…...
微信小程序中的openid的作用
微信小程序中的openid的作用 引言 在当今数字化时代,用户体验成为了产品成功与否的关键因素之一。微信小程序作为连接用户与服务的重要桥梁,在提升用户体验方面发挥着重要作用。其中, openid(开放身份标识符)是微信小…...
AAAI 2025新研究!大语言模型+MARL=论文新思路?
最新研究显示,多智能体强化学习(MARL)正迎来一系列技术革新,让AI系统真正具备“群体智能”。同济大学团队提出的动态图通信网络(TGCNet),通过Transformer建模智能体间的动态协作关系,…...
旅行世界宠物养殖合成游戏源码
旅行世界宠物养殖合成游戏源码,游戏养成类系统,用户能够通过养狗和参加其他活动获取算力,每日任务不断更新,完结即可收取算力,算力能够兑换现金红包。 邀请好友得两级活跃收益提成,徒弟B100.%,徒…...
列表之链表_C
数据结构(邓俊辉):列表及相关概念_listnodeposi-CSDN博客 #include <stdio.h> #include <stdlib.h>// 定义Rank类型为int typedef int Rank;// 定义ListNode结构体 typedef struct ListNode {int data;struct ListNode* pred;st…...
图解Java设计模式
1、设计模式面试题 2、设计模式的重要性 3、7大设计原则介绍...
CCF GESP Python编程 四级认证真题 2025年3月
Python 四级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D C B C D C A A D B D A C B C 1 单选题(每题 2 分,共 30 分) 第 1 题 2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是…...
2025最新系统 Git 教程(四)
2.6 Git 基础 - 打标签 打标签 像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。 在本节中…...
数学知识——欧拉函数
欧拉函数 1 ∼ N 1∼N 1∼N 中与 N N N互质的数的个数被称为欧拉函数,记为 ϕ ( N ) \phi(N) ϕ(N)。 欧拉函数 对于 N p 1 α 1 p 2 α 2 p 3 α 3 . . . p k α k Np_1^{\alpha_1}p_2^{\alpha_2}p_3^{\alpha_3}...p_k^{\alpha_k} Np1α1p2α2p3α3…...
Dify 识别 “subject“ and “intention“ 的提示词
Dify 识别 "subject" and "intention" 的提示词 内容如下: You need to decompose the users input into "subject" and "intention" in order to accurately figure out what the users input language actually is. Not…...
Hi168云平台部署Ansible学习环境
前言 之前发布的文章已经介绍过了在Hi168云平台部署openEuler学习环境,那么既然能部署openEuler了,其他的各类学习环境自然也就可以部署了。 Ansible简介 Ansible 是一个运维自动化工具,可以通过 SSH 协议对远程主机进行管理,对…...
Anacond虚拟环境里安装GPU版本Pytorch
CUDA/cudnn/CUDAToolkit简单区分 pytorch与cuda关系简单介绍 pytorch是一个深度学习的框架,能够调用cuda进行gpu加速。一般来说你的电脑里是有相关cuda的驱动的(可用nvidia-smi命令验证,能运行就说明有,不能运行去搜索安装&#…...
FRP的proxies只是建立通道,相当于建立与服务器沟通的不同通道而不是直接将路由器与服务器云端沟通
没有更好的办法了吗,我看frpc.toml的里面可以设置两个proxies那我esp32的监听端口设置在frpc.toml里面它不也能跟云服务器建立联系吗,比如远程与本地端口都配置为5112那云服务器接收到的5112访问会以frp配置的本地端口5112转发到frp客户端的路由器&#…...
Android开发鸿蒙环境问题记录
Android开发鸿蒙环境问题记录 (用于记录开发中鸿蒙环境差异及问题,持续更新) 2025.4.9 问题 使用android.intent.action.TIME_TICK广播时,动态注册在鸿蒙4.0系统正常,但在鸿蒙3.0系统无法接收广播。 解决方案 在An…...
在 WSL2的 Ubuntu 20.04 中安装 Docker
WSL1升级到WSL2参考:WSL1升级到WSL2注意事项-CSDN博客 1. 更新系统包 首先,确保系统包是最新的: sudo apt update sudo apt upgrade -y sudo apt upgrade -y 是 Ubuntu/Debian Linux 系统中的一条命令,用于升级所有已安装的软…...
LeetCode 252 会议室题全解析:Swift 实现 + 场景还原
文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在这篇文章中,我们将深入探讨LeetCode第252题“会议室”的问题,提供一个用Swift编写的解决方案,并结合实际场景进行分析。通过这篇文章,你将…...
Postman的内网使用教程
在软件开发和测试过程中,接口测试是确保系统间通信正常的重要环节。当处于内网环境,无法直接访问外网资源时,如何高效地使用Postman进行接口测试也逐渐成为许多开发者关心的问题。 前期准备 安装Postman 从官方网站下载并安装最新版本的Pos…...
【软件测试】Postman中如何搭建Mock服务
在 Postman 中,Mock 服务是一项非常有用的功能,允许你在没有实际后端服务器的情况下模拟 API 响应。通过创建 Mock 服务,你可以在开发阶段或测试中模拟 API 的行为,帮助团队成员进行前端开发、API 测试和集成测试等工作。 Mock 服…...
【NLP 57、LLM通用能力评价方式】
人生如题,放下,是最优雅的解法 —— 25.4.9 目前,我们通过一些特殊的“集合”来评价大语言模型效果 一、MMLU 集合 测量大规模多任务语言理解 评估模型在57个学科领域的综合知识理解能力,覆盖人文、社科、STEM&…...
centos7.9升级OpenSSL 1.1.1
centos7.9升级openssl 人工智能已经很准了: 问题: [rootcentos01 ~]# openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 [rootcentos01 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要升级OpenSSL,请给出具体…...
10A 大电流 DCDC 降流芯片 WD5030
10A 大电流 DCDC 降压芯片 WD5030 在电子设备的电源管理领域,高效稳定的 DCDC 芯片至关重要。今天我们来深入探讨一款性能卓越的 10A 大电流 DCDC 降流芯片 ——WD5030。它在众多电子应用场景中展现出了强大的优势,为各类设备的稳定供电提供了可靠保障。…...
# 基于BERT的文本分类
基于BERT的文本分类项目的实现 一、项目背景 该文本分类项目主要是情感分析,二分类问题,以下是大致流程及部分代码示例: 二、数据集介绍 2.1 数据集基本信息 数据集自定义类型二分类(正面/负面)样本量训练集 验证…...
Verilog学习-1.模块的结构
module aoi(a,b,c,d,f);/*模块名为aoi,端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…...
界面控件DevExpress WPF v25.1新功能预览 - 数据网格、报表性能增强
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...
【创新实训个人博客】prompt嵌入
通过对camel技术的理解,修改了项目内容 能够初步实现广告内容相关的文本 修改了typing.py中的定义 class RoleType(Enum): ASSISTANT "assistant" USER "user" CRITIC "critic" EMBODIMENT "embodiment" DEFAULT &q…...
Linux 进程的替换
进程程序替换 要讲好这个我为大家准备了五个步骤 1. 先用代码给大家展示一下现象 2.解释原理 3.将代码改成多进程版 4.使用所有的方法,并认识函数参数的含义。 5.其他 我们现在开始第一个 1. 先用代码给大家展示一下现象 关于进程的替换一共有七个函数&…...
netty启用websocket的压缩机制
netty启用websocket的压缩机制 package com.aerotop.connector.websocket.base;import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.compression.JZlibDec…...
【python】针对Selenium中弹框信息无法定位的问题,以下是综合解决方案及注意事项:
一、常见原因分析 1.1 弹窗类型不匹配 若弹窗为alert,需使用driver.switch_to.alert处理; 若为confirm或prompt,同样适用该方法。 1.2 窗口句柄切换问题 新窗口或弹窗可能开启新句柄,需先通过driver.window_handles切换到对应句…...
进程与信号
前言 接触计算机的时候我们就接触过信号。比如说当我们进程卡死的时候,windows系统会跳出来一个弹窗告诉我们是否等待进程响应,如果关闭进程那么系统就会发信号给进程然后终止掉它。再比如我们打开任务管理器的时候,想要关闭进程那也是在发送…...
SQL解析器:实现进阶功能
SQL解析器:实现进阶功能 在上一篇文章中,我们介绍了SQL解析器的基础架构和核心功能实现,包括基本的SELECT、INSERT、UPDATE语句解析。本文将深入探讨SQL解析器的进阶功能实现,重点关注我们新增的DROP、JOIN、DELETE语句解析以及嵌…...
字体从版权合规到技术适配,你好字库全场景解决方案解析
一、开发者字体使用的三大核心困境 在软件开发与设计过程中,字体选择往往成为「甜蜜的负担」: 版权风险高:商业项目误用未授权字体,可能面临数万元赔偿(某创业公司曾因使用「方正粗黑」被索赔 8 万元) …...
深入理解 Java ArrayList 扩缩容机制(含源码分析)
标签: Java, ArrayList, 集合框架, 源码分析, 扩容机制, 性能优化, CSDN 摘要: java.util.ArrayList 作为 Java 集合框架中最常用的类之一,其动态数组的特性深受开发者喜爱。然而,“动态”背后的扩容与缩容机制是怎样的ÿ…...