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