Spaces:
Running
Running
import os | |
import json | |
import time | |
import asyncio | |
import traceback | |
import requests | |
import streamlit as st | |
from loguru import logger | |
from app.config import config | |
from webui.tools.base import chekc_video_config | |
def generate_script_short(tr, params, custom_clips=5): | |
""" | |
生成短视频脚本 | |
Args: | |
tr: 翻译函数 | |
params: 视频参数对象 | |
custom_clips: 自定义片段数量,默认为5 | |
""" | |
progress_bar = st.progress(0) | |
status_text = st.empty() | |
def update_progress(progress: float, message: str = ""): | |
progress_bar.progress(progress) | |
if message: | |
status_text.text(f"{progress}% - {message}") | |
else: | |
status_text.text(f"进度: {progress}%") | |
try: | |
with st.spinner("正在生成脚本..."): | |
text_provider = config.app.get('text_llm_provider', 'gemini').lower() | |
text_api_key = config.app.get(f'text_{text_provider}_api_key') | |
text_model = config.app.get(f'text_{text_provider}_model_name') | |
text_base_url = config.app.get(f'text_{text_provider}_base_url') | |
vision_llm_provider = st.session_state.get('vision_llm_providers').lower() | |
vision_api_key = st.session_state.get(f'vision_{vision_llm_provider}_api_key', "") | |
vision_model = st.session_state.get(f'vision_{vision_llm_provider}_model_name', "") | |
vision_base_url = st.session_state.get(f'vision_{vision_llm_provider}_base_url', "") | |
narrato_api_key = config.app.get('narrato_api_key') | |
update_progress(20, "开始准备生成脚本") | |
srt_path = params.video_origin_path.replace(".mp4", ".srt").replace("videos", "srt").replace("video", "subtitle") | |
if not os.path.exists(srt_path): | |
logger.error(f"{srt_path} 文件不存在请检查或重新转录") | |
st.error(f"{srt_path} 文件不存在请检查或重新转录") | |
st.stop() | |
api_params = { | |
"vision_provider": vision_llm_provider, | |
"vision_api_key": vision_api_key, | |
"vision_model_name": vision_model, | |
"vision_base_url": vision_base_url or "", | |
"text_provider": text_provider, | |
"text_api_key": text_api_key, | |
"text_model_name": text_model, | |
"text_base_url": text_base_url or "" | |
} | |
chekc_video_config(api_params) | |
from app.services.SDP.generate_script_short import generate_script | |
script = generate_script( | |
srt_path=srt_path, | |
output_path="resource/scripts/merged_subtitle.json", | |
api_key=text_api_key, | |
model_name=text_model, | |
base_url=text_base_url, | |
custom_clips=custom_clips, | |
) | |
if script is None: | |
st.error("生成脚本失败,请检查日志") | |
st.stop() | |
logger.info(f"脚本生成完成 {json.dumps(script, ensure_ascii=False, indent=4)}") | |
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(80, "脚本生成完成") | |
time.sleep(0.1) | |
progress_bar.progress(100) | |
status_text.text("脚本生成完成!") | |
st.success("视频脚本生成成功!") | |
except Exception as err: | |
progress_bar.progress(100) | |
st.error(f"生成过程中发生错误: {str(err)}") | |
logger.exception(f"生成脚本时发生错误\n{traceback.format_exc()}") | |