diff --git a/app/services/video.py b/app/services/video.py index 5de1d0d..01cf376 100644 --- a/app/services/video.py +++ b/app/services/video.py @@ -287,6 +287,9 @@ def generate_video( bg_color=params.text_background_color, stroke_color=params.stroke_color, stroke_width=params.stroke_width, + size=(video_width, None), + method='caption', + text_align='center' ) duration = subtitle_item[0][1] - subtitle_item[0][0] _clip = _clip.with_start(subtitle_item[0][0]) @@ -320,6 +323,9 @@ def generate_video( text=text, font=font_path, font_size=params.font_size, + size=(video_width, None), + method='caption', + text_align='center' ) if subtitle_path and os.path.exists(subtitle_path): diff --git a/app/services/voice.py b/app/services/voice.py index 9c241d0..dfa1387 100644 --- a/app/services/voice.py +++ b/app/services/voice.py @@ -952,6 +952,9 @@ Gender: Male Name: zh-CN-YunxiaNeural Gender: Male +Name: zh-CN-YunzeNeural-V2 +Gender: Male + Name: zh-CN-YunyangNeural Gender: Male @@ -1012,6 +1015,7 @@ Gender: Female Name: zh-CN-XiaoxiaoMultilingualNeural-V2 Gender: Female + """.strip() voices = [] # 定义正则表达式模式,用于匹配 Name 和 Gender 行 @@ -1106,6 +1110,27 @@ def azure_tts_v2(text: str, voice_name: str, voice_file: str) -> Union[SubMaker, logger.error(f"invalid voice name: {voice_name}") raise ValueError(f"invalid voice name: {voice_name}") text = text.strip() + # 根据不同的声音使用不同的 SSML + if voice_name == "zh-CN-YunzeNeural": + print(f"DEBUG: Using SeniorMale role and calm style with styledegree=2 for voice {voice_name}") + ssml = f""" + + + + {text} + + + + """ + else: + print(f"DEBUG: Using standard SSML for voice {voice_name} (no special role or style)") + ssml = f""" + + + {text} + + + """ def _format_duration_to_offset(duration) -> int: if isinstance(duration, str): @@ -1172,7 +1197,9 @@ def azure_tts_v2(text: str, voice_name: str, voice_file: str) -> Union[SubMaker, speech_synthesizer_word_boundary_cb ) - result = speech_synthesizer.speak_text_async(text).get() + #result = speech_synthesizer.speak_text_async(text).get() + print(f"DEBUG: Final SSML being used:\n{ssml}") + result = speech_synthesizer.speak_ssml_async(ssml).get() # 修改这一行 if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted: logger.success(f"azure v2 speech synthesis succeeded: {voice_file}") return sub_maker diff --git a/webui/Main.py b/webui/Main.py index b94e8ec..bfc29b7 100644 --- a/webui/Main.py +++ b/webui/Main.py @@ -122,7 +122,8 @@ def scroll_to_bottom(): scroll(1); """ - st.components.v1.html(js, height=0, width=0) + # 使用st.markdown代替st.components.v1.html + st.markdown(js, unsafe_allow_html=True) def init_log(): @@ -763,7 +764,7 @@ with right_panel: with font_cols[1]: saved_font_size = config.ui.get("font_size", 60) - params.font_size = st.slider(tr("Font Size"), 30, 100, saved_font_size) + params.font_size = st.slider(tr("Font Size"), 30, 150, saved_font_size) config.ui["font_size"] = params.font_size stroke_cols = st.columns([0.3, 0.7]) diff --git a/测试.md b/测试.md new file mode 100644 index 0000000..0adcccd --- /dev/null +++ b/测试.md @@ -0,0 +1,59 @@ +# Role: AI Copy Variation Assistant + +# Context: +你是一位专业的AI文案裂变助手。你的核心任务是根据我提供的原始文案,生成50条**高质量、语义一致**的变体文案。目标是实现“微调”效果,即每条变体与原文案相比只有少量词语不同,但整体意思和结构保持高度一致。**此过程无人工审核,请严格遵守规则确保质量。** + +# Replacement Strategy & Keyword Categories: +请专注于替换以下类型的词语(你**需要智能识别**原文中属于这些类别的词语进行替换,**每次替换1-3个词语**即可,不必全部替换): +1. **形容词/副词**: 例如,描述效果、感觉、程度的词语 (如:"惊艳的", "快速地", "非常")。 +2. **核心动词**: 例如,引发动作、说明功能的词语 (如:"解决", "提升", "带来")。 +3. **呼吁行动语 (CTA)**: 例如,结尾引导用户行动的短语 (如:"立即体验", "马上行动", "不要错过")。 +4. **[可选添加其他类别]**: 例如,目标人群词 (如:"年轻人", "职场人") 或 场景词 (如:"通勤路上", "熬夜加班时")。 + +# Strict Rules (不可违背的规则): +1. **保持核心信息不变**: 绝对不能改变原文的核心含义、产品/服务特点或关键价值主张。 +2. **维持基本结构和长度**: 新文案的句子结构、段落划分和预估阅读/讲述时长应与原文高度相似。 +3. **语气风格一致**: 保持原文的语气。 +4. **自然流畅**: 生成的文案必须符合中文表达习惯,读起来自然、通顺,无语法错误或生硬拼接。 +5. **避免低质重复**: 生成的 **[50]** 条文案之间应有**可感知的差异**,避免仅仅是同义词的简单堆砌或生成高度雷同的文案。使用多样化的、同一类别下的不同词汇。 +6. **实现微调效果**: 强调!每条新生成的变体文案,相比原文,**仅替换1-3处**关键词或短语。 + +# Output Format: +请以编号列表的格式输出所有生成的 **[50]** 条变体文案。 + + +请基于以下框架,针对[目标用户]设计爆款短视频引流文案。每条文案请变换变量内容,保持神秘感、紧迫感与互动感。 + +要求: + +内容真实感强,悬念感强,情绪足够抓人。 +合理换用不同身份、时间点、互动动作等,提高多样性。 +引导至少一次行为(如点赞/关注/评论/去主页等)。 +禁止机械式堆砌,需有自然表达与情感链接。 +变量列表(用于分裂) +【用户标签】:(如生肖、星座、年龄、职业等) +【具体时间】:(如下周二上午十点十二分、今晚8点08分等) +【事件数量】:(1件/2件/三件重要的事) +【事件描述】:(人生会有转机、大事要发生、好消息降临、秘密曝光等) +【保密动作】:(别出声、切勿外传、小心留意、务必安静听好等) +【互动动作】:(点亮小红心、评论“收到”、关注我、转发给朋友等) +【身份关系】:(妈、闺蜜、老师、姐姐、兄弟等) +【稀缺警告】:(今天不做就错过、见一次少一次、这次没看到下次不来了等) +【引流目标】:(主页第一条视频、最新视频、私信了解、关注我看真相等) +【悬念补充】:(所有真相都藏在里面、背后有原因、你会感谢今天看到了等) +结构化分裂文案提示词 +请用下面结构填充变量,批量生成不同鲜活场景的文案: + +【用户标签】,在【具体时间】,你身边有【事件数量】【事件描述】。我特意来告诉你,【保密动作】,仔细听好了,这件事不能随便说出去。现在就【互动动作】,让【身份关系】知道你收到提醒了。【稀缺警告】。记得去【引流目标】,【悬念补充】。 + +示例填充1: +用户标签:属虎的 +具体时间:明天早上九点半 +事件数量:有两件 +事件描述:重要的决定要降临 +保密动作:不要声张 +互动动作:点亮小红心 +身份关系:哥哥 +稀缺警告:错过了今天就再也没有机会 +引流目标:主页置顶视频 +悬念补充:那才是真正的关键 \ No newline at end of file