This commit is contained in:
parent
796c9a64fe
commit
c8003ee988
|
|
@ -0,0 +1 @@
|
||||||
|
淘宝闪购
|
||||||
159
短视频AI生成/main.py
159
短视频AI生成/main.py
|
|
@ -2,4 +2,163 @@
|
||||||
"""
|
"""
|
||||||
主模块
|
主模块
|
||||||
"""
|
"""
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
warnings.filterwarnings(
|
||||||
|
action="ignore", category=UserWarning, module="volcenginesdkarkruntime.*"
|
||||||
|
)
|
||||||
|
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any, Dict, List
|
||||||
|
from uuid import uuid4
|
||||||
|
|
||||||
|
from volcenginesdkarkruntime import Ark
|
||||||
|
from volcenginesdkarkruntime.types.responses import (
|
||||||
|
ResponseOutputMessage,
|
||||||
|
ResponseOutputText,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# 初始化火山引擎 AsyncArk 客户端
|
||||||
|
ark_client = Ark(
|
||||||
|
base_url="https://ark.cn-beijing.volces.com/api/v3",
|
||||||
|
api_key="2c28ab07-888c-45be-84a2-fc4b2cb5f3f2",
|
||||||
|
) # 本人火山引擎账密
|
||||||
|
|
||||||
|
|
||||||
|
def generate_task_id() -> str:
|
||||||
|
"""
|
||||||
|
生成任务标识
|
||||||
|
:return: 任务ID
|
||||||
|
"""
|
||||||
|
return uuid4().hex.upper().replace("-", "")
|
||||||
|
|
||||||
|
|
||||||
|
def get_brand_words() -> List[str]:
|
||||||
|
"""
|
||||||
|
获取品牌词
|
||||||
|
:return: 品牌词
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with open(
|
||||||
|
file=Path(__file__).parent / "brand_words.txt", mode="r", encoding="utf-8"
|
||||||
|
) as file: # Trae IDE 需要指定文件路径(和 PyCharm 不同)
|
||||||
|
brand_words = [line.strip() for line in file.readlines() if line.strip()]
|
||||||
|
assert brand_words, "品牌词为空"
|
||||||
|
return brand_words
|
||||||
|
except FileNotFoundError:
|
||||||
|
raise FileNotFoundError("未找到品牌词文件")
|
||||||
|
except Exception as exception:
|
||||||
|
raise exception
|
||||||
|
|
||||||
|
|
||||||
|
def refactor_storyboard_prompt(brand_word: str) -> str:
|
||||||
|
"""
|
||||||
|
重构分镜脚本的提示词
|
||||||
|
:param brand_word: 品牌词
|
||||||
|
:return: 重构后分镜脚本的提示词
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with open(
|
||||||
|
file=Path(__file__).parent / "storyboard_prompt_template.txt",
|
||||||
|
mode="r",
|
||||||
|
encoding="utf-8",
|
||||||
|
) as file:
|
||||||
|
storyboard_prompt = file.read()
|
||||||
|
return storyboard_prompt.replace("{{品牌词}}", brand_word)
|
||||||
|
except FileNotFoundError:
|
||||||
|
raise FileNotFoundError("未找到分镜脚本的提示词模板文件")
|
||||||
|
except Exception as exception:
|
||||||
|
raise exception
|
||||||
|
|
||||||
|
|
||||||
|
def get_storyboard(brand_word: str) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
获取分镜脚本
|
||||||
|
:param brand_word: 品牌词
|
||||||
|
:return: 分镜脚本
|
||||||
|
"""
|
||||||
|
# 重构分镜脚本的提示词
|
||||||
|
storyboard_prompt = refactor_storyboard_prompt(brand_word)
|
||||||
|
|
||||||
|
retries = 0 # 重试次数
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
# 调用豆包Seed语言大模型,基于分镜脚本的提示词生成分镜脚本
|
||||||
|
response = ark_client.responses.create(
|
||||||
|
model="doubao-seed-2-0-pro-260215",
|
||||||
|
input=[
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": [{"type": "input_text", "text": storyboard_prompt}],
|
||||||
|
}
|
||||||
|
],
|
||||||
|
)
|
||||||
|
# 解析响应并反序列化以此作为分镜脚本
|
||||||
|
storyboard = json.loads(
|
||||||
|
[item for item in [item for item in response.output if isinstance(item, ResponseOutputMessage)][0].content if isinstance(item, ResponseOutputText)][0].text # type: ignore
|
||||||
|
)
|
||||||
|
return storyboard
|
||||||
|
except Exception as exception:
|
||||||
|
retries += 1
|
||||||
|
if retries > 2:
|
||||||
|
raise Exception(f"获取分镜脚本发生异常,{str(exception)}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
storyboard = {
|
||||||
|
"核心营销要点": "淘宝闪购每日上新全品类正品好物,限时超低价开抢,购物省心又划算",
|
||||||
|
"分镜脚本": [
|
||||||
|
{
|
||||||
|
"阶段": "前段",
|
||||||
|
"口播": "买好物想省钱看这里!",
|
||||||
|
"TTS情绪": "energetic",
|
||||||
|
"首帧提示词": "橙色淘宝闪购logo 画面中央偏上 半透明小尺寸、特效未展开 浅橙色渐变背景 亮橙+米白 柔和光影 9:16竖屏 1080P 高清干净 无水印",
|
||||||
|
"尾帧提示词": "橙色立体淘宝闪购logo 画面正中央 清晰显示、周围带细碎金光闪效 浅橙色渐变背景 亮橙+暖白 明亮光影 9:16竖屏 1080P 高清干净 无水印",
|
||||||
|
"运镜提示词": "slight zoom in",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"阶段": "中段",
|
||||||
|
"口播": "淘宝闪购全是官方正品,服饰美妆数码家居全品类,每天限时开抢价格超划算",
|
||||||
|
"TTS情绪": "happy",
|
||||||
|
"首帧提示词": "服饰、美妆、数码、家居四类商品缩略图围绕淘宝闪购logo 画面中央 半透明小尺寸、特效未展开 暖白色背景 多彩明快 柔和光影 9:16竖屏 1080P 高清干净 无水印",
|
||||||
|
"尾帧提示词": "服饰、美妆、数码 、家居爆款商品清晰展示,旁附「直降50%」「限时抢」标签,淘宝闪购logo居上方中央 高亮饱满、爆闪优惠光效完全展开 暖白色背景 多彩明亮 充足光影 9:16竖屏 1080P 高清干净 无水印",
|
||||||
|
"运镜提示词": "slow push in",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"阶段": "后段",
|
||||||
|
"口播": "快点击下方链接抢!",
|
||||||
|
"TTS情绪": "cheer",
|
||||||
|
"首帧提示词": "黄色「点击下方链接」按钮+淘宝闪购logo 画面中央 半透明小尺寸、特效未展开 亮橙色背景 亮黄+橙红 柔和光影 9:16竖屏 1080P 高清干净 无水印",
|
||||||
|
"尾帧提示词": "高亮立体「点击下方链接」按钮+闪烁箭头指向屏幕下方,淘宝闪购logo居按钮上方 完全展示、高亮饱满、脉冲光效完整 亮橙色背景 亮黄+橙红 明亮耀眼光影 9:16竖屏 1080P 高清干净 无水印",
|
||||||
|
"运镜提示词": "slight zoom in",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def generate_frame(frame_prompt: str) -> str:
|
||||||
|
"""
|
||||||
|
生成视频帧
|
||||||
|
:param frame_prompt: 视频帧提示词
|
||||||
|
:return: 视频帧
|
||||||
|
"""
|
||||||
|
# 调用豆包Seed图像大模型,基于视频帧提示词生成视频帧
|
||||||
|
response = ark_client.responses.create(
|
||||||
|
model="doubao-seed-2-0-pro-260215",
|
||||||
|
input=[
|
||||||
|
{
|
||||||
|
"role": "user",
|
||||||
|
"content": [{"type": "input_text", "text": frame_prompt}],
|
||||||
|
}
|
||||||
|
],
|
||||||
|
)
|
||||||
|
# 解析响应并反序列化,以此作为视频帧
|
||||||
|
frame = json.loads(
|
||||||
|
[item for item in [item for item in response.output if isinstance(item, ResponseOutputMessage)][0].content if isinstance(item, ResponseOutputText)][0].text # type: ignore
|
||||||
|
)
|
||||||
|
return frame
|
||||||
|
|
||||||
|
|
||||||
|
print(storyboard)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
你作为一名专业、优秀的广告编导,请为品牌“{{品牌词}}”生成一条15秒营销广告分镜脚本。该脚本用于AI生成短视频,投放于快手、今日头条、视频号等短视频平台。
|
||||||
|
|
||||||
|
必须严格遵守以下所有规则,不可遗漏任何字段:
|
||||||
|
|
||||||
|
1. 内容要求
|
||||||
|
- 符合品牌真实经营范围与营销风格
|
||||||
|
- 符合短视频平台用户偏好
|
||||||
|
- 不得虚构、不得违规
|
||||||
|
|
||||||
|
2. 时长结构(总15秒)
|
||||||
|
- 前段:3秒,吸引注意力
|
||||||
|
- 中段:10秒,传递核心卖点
|
||||||
|
- 后段:2秒,引导点击下方链接
|
||||||
|
|
||||||
|
3. 口播要求(用于 EdgeTTS 语音合成)
|
||||||
|
- 前段口播:8~12个汉字
|
||||||
|
- 中段口播:25~35个汉字
|
||||||
|
- 后段口播:5~10个汉字
|
||||||
|
- 口语化、情绪饱满、适合短视频传播
|
||||||
|
|
||||||
|
4. TTS 情绪要求(必须返回英文单词)
|
||||||
|
- 从以下列表中选择:cheer, happy, energetic, warm, friendly, confident
|
||||||
|
- 字段名固定为:TTS情绪
|
||||||
|
|
||||||
|
5. 首帧 / 尾帧提示词(用于 Seedream 4.5 文生图)
|
||||||
|
- 格式:主体+位置+状态+环境+色彩+光影
|
||||||
|
- 9:16 竖屏,1080P,高清干净,无水印
|
||||||
|
- 首帧:元素刚出现,半透明,小尺寸,特效未展开
|
||||||
|
- 尾帧:元素完全展示,高亮饱满,特效完整
|
||||||
|
- 画面自然、有质感、适合电商营销
|
||||||
|
|
||||||
|
6. 运镜提示词(用于 Seedance 1.5 图生视频,必须英文)
|
||||||
|
- 运镜平稳、无抖动
|
||||||
|
- 主体居中不变形
|
||||||
|
- 可选:slow push in, slow pan, slight zoom in, slow circle
|
||||||
|
- 与本段时长匹配
|
||||||
|
|
||||||
|
7. 输出强制要求
|
||||||
|
- 只输出标准 JSON,无任何多余文字
|
||||||
|
- 不要解释、不要前言、不要后缀
|
||||||
|
- 不要 ```json 标记
|
||||||
|
- 严格按下面结构输出
|
||||||
|
|
||||||
|
{
|
||||||
|
"核心营销要点": "一句话总结品牌核心价值",
|
||||||
|
"分镜脚本": [
|
||||||
|
{
|
||||||
|
"阶段": "前段",
|
||||||
|
"口播": "...",
|
||||||
|
"TTS情绪": "...",
|
||||||
|
"首帧提示词": "...",
|
||||||
|
"尾帧提示词": "...",
|
||||||
|
"运镜提示词": "..."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"阶段": "中段",
|
||||||
|
"口播": "...",
|
||||||
|
"TTS情绪": "...",
|
||||||
|
"首帧提示词": "...",
|
||||||
|
"尾帧提示词": "...",
|
||||||
|
"运镜提示词": "..."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"阶段": "后段",
|
||||||
|
"口播": "...",
|
||||||
|
"TTS情绪": "...",
|
||||||
|
"首帧提示词": "...",
|
||||||
|
"尾帧提示词": "...",
|
||||||
|
"运镜提示词": "..."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue