mirror of
https://github.com/linyqh/NarratoAI.git
synced 2025-12-12 11:22:51 +00:00
feat(test): 添加与通义千问AI模型对话的功能
- 新增 chat_with_qwen 函数,用于与通义千问AI模型进行对话 - 添加错误处理和资源管理,提高代码健壮性 - 优化视频剪辑功能,增加输出路径参数 -读取字幕文件并将其作为输入发送给AI模型 -处理API调用异常,并提供错误文档链接
This commit is contained in:
parent
f008804369
commit
c03a13db13
@ -4,6 +4,7 @@
|
||||
|
||||
from moviepy.editor import VideoFileClip
|
||||
from datetime import datetime
|
||||
import os
|
||||
|
||||
|
||||
def time_str_to_seconds(time_str: str) -> float:
|
||||
@ -38,7 +39,22 @@ def cut_video(video_path: str, start_time: str, end_time: str, output_path: str)
|
||||
video_path: 视频文件路径
|
||||
start_time: 开始时间 (格式: "MM:SS")
|
||||
end_time: 结束时间 (格式: "MM:SS")
|
||||
output_path: 输出文件路径
|
||||
"""
|
||||
try:
|
||||
# 确保输出目录存在
|
||||
output_dir = os.path.dirname(output_path)
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
|
||||
# 如果输出文件已存在,先尝试删除
|
||||
if os.path.exists(output_path):
|
||||
try:
|
||||
os.remove(output_path)
|
||||
except PermissionError:
|
||||
print(f"无法删除已存在的文件:{output_path},请确保文件未被其他程序占用")
|
||||
return
|
||||
|
||||
# 转换时间字符串为秒数
|
||||
start_seconds = time_str_to_seconds(start_time)
|
||||
end_seconds = time_str_to_seconds(end_time)
|
||||
@ -53,11 +69,27 @@ def cut_video(video_path: str, start_time: str, end_time: str, output_path: str)
|
||||
|
||||
# 剪辑视频
|
||||
video = video.subclip(start_seconds, end_seconds)
|
||||
video.write_videofile("../../resource/videos/cut_video3.mp4")
|
||||
|
||||
# 释放资源
|
||||
# 添加错误处理的写入过程
|
||||
try:
|
||||
video.write_videofile(
|
||||
output_path,
|
||||
codec='libx264',
|
||||
audio_codec='aac',
|
||||
temp_audiofile='temp-audio.m4a',
|
||||
remove_temp=True
|
||||
)
|
||||
except IOError as e:
|
||||
print(f"写入视频文件时发生错误:{str(e)}")
|
||||
raise
|
||||
finally:
|
||||
# 确保资源被释放
|
||||
video.close()
|
||||
|
||||
except Exception as e:
|
||||
print(f"视频剪辑过程中发生错误:{str(e)}")
|
||||
raise
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# cut_video("E:\\NarratoAI_v0.3.5_cuda\\NarratoAI\storage\\tasks\ca4fee22-350b-47f9-bb2f-802ad96774f7\\final-2.mp4", "00:00", "07:00", "E:\\NarratoAI_v0.3.5_cuda\\NarratoAI\storage\\tasks\\yyjx2-1")
|
||||
|
||||
93
app/test/test_qwen.py
Normal file
93
app/test/test_qwen.py
Normal file
@ -0,0 +1,93 @@
|
||||
import os
|
||||
import traceback
|
||||
import json
|
||||
from openai import OpenAI
|
||||
from test_moviepy import cut_video
|
||||
from app.utils import utils
|
||||
from app.services.subtitle import extract_audio_and_create_subtitle
|
||||
|
||||
|
||||
def chat_with_qwen(prompt: str, system_message: str, subtitle_path: str) -> str:
|
||||
"""
|
||||
与通义千问AI模型进行对话
|
||||
|
||||
Args:
|
||||
prompt (str): 用户输入的问题或提示
|
||||
system_message (str): 系统提示信息,用于设定AI助手的行为。默认为"You are a helpful assistant."
|
||||
subtitle_path (str): 字幕文件路径
|
||||
Returns:
|
||||
str: AI助手的回复内容
|
||||
|
||||
Raises:
|
||||
Exception: 当API调用失败时抛出异常
|
||||
"""
|
||||
try:
|
||||
client = OpenAI(
|
||||
api_key="sk-",
|
||||
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
|
||||
)
|
||||
|
||||
# 读取字幕文件
|
||||
with open(subtitle_path, "r", encoding="utf-8") as file:
|
||||
subtitle_content = file.read()
|
||||
|
||||
completion = client.chat.completions.create(
|
||||
model="qwen-turbo-2024-11-01",
|
||||
messages=[
|
||||
{'role': 'system', 'content': system_message},
|
||||
{'role': 'user', 'content': prompt + subtitle_content}
|
||||
]
|
||||
)
|
||||
return completion.choices[0].message.content
|
||||
|
||||
except Exception as e:
|
||||
error_message = f"调用千问API时发生错误:{str(e)}"
|
||||
print(error_message)
|
||||
print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
|
||||
raise Exception(error_message)
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
# video_path = utils.video_dir("duanju_yuansp.mp4")
|
||||
# # 判断视频是否存在
|
||||
# if not os.path.exists(video_path):
|
||||
# print(f"视频文件不存在:{video_path}")
|
||||
# exit(1)
|
||||
# 提取字幕
|
||||
subtitle_path = os.path.join(utils.video_dir(""), f"duanju_yuan.srt")
|
||||
# extract_audio_and_create_subtitle(video_file=video_path, subtitle_file=subtitle_path)
|
||||
# 分析字幕
|
||||
system_message = """
|
||||
你是一个视频srt字幕分析剪辑器, 输入视频的srt字幕, 分析其中的精彩且尽可能连续的片段并裁剪出来, 注意确保文字与时间戳的正确匹配。
|
||||
输出需严格按照如下 json 格式:
|
||||
[
|
||||
{
|
||||
"timestamp": "00:50-01:44",
|
||||
"picture": "画面1",
|
||||
"narration": "播放原声",
|
||||
"OST": 0,
|
||||
"new_timestamp": "00:00-00:54"
|
||||
},
|
||||
{
|
||||
"timestamp": "01:49-02:30",
|
||||
"picture": "画面2",
|
||||
"narration": "播放原声",
|
||||
"OST": 2,
|
||||
"new_timestamp": "00:54-01:35"
|
||||
},
|
||||
]
|
||||
"""
|
||||
prompt = "字幕如下:\n"
|
||||
response = chat_with_qwen(prompt, system_message, subtitle_path)
|
||||
print(response)
|
||||
# 保存json,注意json中是时间戳需要转换为 分:秒(现在的时间是 "timestamp": "00:00:00,020-00:00:01,660", 需要转换为 "timestamp": "00:00-01:66")
|
||||
# response = json.loads(response)
|
||||
# for item in response:
|
||||
# item["timestamp"] = item["timestamp"].replace(":", "-")
|
||||
# with open(os.path.join(utils.video_dir(""), "duanju_yuan.json"), "w", encoding="utf-8") as file:
|
||||
# json.dump(response, file, ensure_ascii=False)
|
||||
|
||||
except Exception as e:
|
||||
print(traceback.format_exc())
|
||||
Loading…
x
Reference in New Issue
Block a user