From 624889a32fec0fcfb574a63891f5085b4454b4bc Mon Sep 17 00:00:00 2001 From: linyqh Date: Sun, 10 Nov 2024 01:12:44 +0800 Subject: [PATCH] =?UTF-8?q?0.3.2=20=E5=8F=91=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/utils/script_generator.py | 6 +++--- config.example.toml | 2 +- webui/components/script_settings.py | 30 +++++++++++++++++++++++------ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/utils/script_generator.py b/app/utils/script_generator.py index 0c4d9c7..72e7408 100644 --- a/app/utils/script_generator.py +++ b/app/utils/script_generator.py @@ -263,7 +263,7 @@ class ScriptProcessor: else: self.generator = OpenAIGenerator(model_name, self.api_key, self.prompt) - def _get_default_prompt(self) -> str: + def _get_default_prompt(self, word_count=None) -> str: return f"""你是一位极具幽默感的短视频脚本创作大师,擅长用"温和的违反"制造笑点,让{self.video_theme}视频既有趣又富有传播力。你的任务是将视频画面描述转化为能在社交平台疯狂传播的爆款口播文案。 目标受众:热爱生活、追求独特体验的18-35岁年轻人 @@ -293,7 +293,7 @@ class ScriptProcessor: 3. 用接地气的表达方式拉近与观众距离 【节奏控制 Rhythm】 -1. 严格控制文案字数在{self.word_count}字左右,允许误差不超过5字 +1. 严格控制文案字数在{word_count}字左右,允许误差不超过5字 2. 像讲段子一样,注意铺垫和包袱的节奏 3. 确保每段都有笑点,但不强求 4. 段落结尾干净利落,不拖泥带水 @@ -306,7 +306,7 @@ class ScriptProcessor: 5. 确保情节和建造过程的逻辑连续性 【字数控制要求】 -1. 严格控制文案字数在{self.word_count}字左右,允许误差不超过5字 +1. 严格控制文案字数在{word_count}字左右,允许误差不超过5字 2. 如果内容过长,优先精简修饰性词语 3. 如果内容过短,可以适当增加细节描写 4. 保持文案结构完整,不因字数限制而牺牲内容质量 diff --git a/config.example.toml b/config.example.toml index e43a61e..808870d 100644 --- a/config.example.toml +++ b/config.example.toml @@ -1,5 +1,5 @@ [app] - project_version="0.3.0" + project_version="0.3.2" # 支持视频理解的大模型提供商 # gemini # NarratoAPI diff --git a/webui/components/script_settings.py b/webui/components/script_settings.py index 7a4b679..4e5bf66 100644 --- a/webui/components/script_settings.py +++ b/webui/components/script_settings.py @@ -11,7 +11,7 @@ from loguru import logger from app.config import config from app.models.schema import VideoClipParams -from app.services import llm +from app.utils.script_generator import ScriptProcessor from app.utils import utils, check_script, vision_analyzer, video_processor from webui.utils import file_utils @@ -421,8 +421,23 @@ def generate_script(tr, params): # ===================开始生成文案=================== update_progress(90, "正在生成文案...") - # 使用 ScriptProcessor 生成脚本 - from app.utils.script_generator import ScriptProcessor + # 校验配置 + api_params = { + 'batch_size': st.session_state.get('narrato_batch_size', 10), + 'use_ai': False, + 'start_offset': 0, + 'vision_model': vision_model, + 'vision_api_key': vision_api_key, + 'llm_model': text_model, + 'llm_api_key': text_api_key, + 'custom_prompt': st.session_state.get('custom_prompt', '') + } + logger.debug(f"Narrato API 请求参数: {api_params}") + requests.post( + f"{config.app.get('narrato_api_url')}/video/config", + params=api_params, + timeout=30 + ) custom_prompt = st.session_state.get('custom_prompt', '') processor = ScriptProcessor( model_name=text_model, @@ -430,10 +445,10 @@ def generate_script(tr, params): prompt=custom_prompt, video_theme=st.session_state.get('video_theme', '') ) - + # 处理帧内容生成脚本 script_result = processor.process_frames(frame_content_list) - + # 将结果转换为JSON字符串 script = json.dumps(script_result, ensure_ascii=False, indent=2) @@ -550,7 +565,10 @@ def generate_script(tr, params): st.error("生成脚本失败,请检查日志") st.stop() logger.info(f"脚本生成完成\n{script} \n{type(script)}") - st.session_state['video_clip_json'] = script + if isinstance(script, list): + st.session_state['video_clip_json'] = script + elif isinstance(script, str): + st.session_state['video_clip_json'] = json.loads(script) update_progress(90, "脚本生成完成") time.sleep(0.5)