233 lines
5.6 KiB
TypeScript
233 lines
5.6 KiB
TypeScript
|
|
/**
|
|||
|
|
* AI Prompt 組裝工具
|
|||
|
|
* 所有 Prompt 組裝邏輯只存在於此
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
export interface StoryboardInput {
|
|||
|
|
story: string
|
|||
|
|
style?: string
|
|||
|
|
pace?: string
|
|||
|
|
styleImage?: string // base64 圖片用於風格分析
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface StoryAnalysisInput {
|
|||
|
|
story: string
|
|||
|
|
style?: string
|
|||
|
|
styleImage?: string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface AssetGenerationInput {
|
|||
|
|
story: string
|
|||
|
|
analysis: string
|
|||
|
|
characterName?: string
|
|||
|
|
sceneName?: string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface CameraAnalysisInput {
|
|||
|
|
image?: string
|
|||
|
|
description?: string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface VideoPlanInput {
|
|||
|
|
prompt: string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface EditSuggestionInput {
|
|||
|
|
materials: string
|
|||
|
|
storyline: string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 分析故事 Prompt
|
|||
|
|
*/
|
|||
|
|
export function buildStoryAnalysisPrompt(input: StoryAnalysisInput): string {
|
|||
|
|
const { story, style, styleImage } = input
|
|||
|
|
|
|||
|
|
let prompt = `請分析以下故事,提取關鍵資訊。請以 JSON 格式回傳,結構如下:
|
|||
|
|
{
|
|||
|
|
"title": "故事標題",
|
|||
|
|
"summary": "故事摘要",
|
|||
|
|
"characters": [
|
|||
|
|
{
|
|||
|
|
"id": "character_1",
|
|||
|
|
"name": "角色名稱",
|
|||
|
|
"description": "角色描述",
|
|||
|
|
"role": "角色定位(主角、配角等)"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"scenes": [
|
|||
|
|
{
|
|||
|
|
"id": "scene_1",
|
|||
|
|
"name": "場景名稱",
|
|||
|
|
"description": "場景描述",
|
|||
|
|
"environment": "環境設定"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"suggestedStyle": "建議的視覺風格",
|
|||
|
|
"suggestedPace": "建議的節奏"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
故事內容:
|
|||
|
|
${story}`
|
|||
|
|
|
|||
|
|
if (style) {
|
|||
|
|
prompt += `\n\n風格要求:${style}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (styleImage) {
|
|||
|
|
prompt += `\n\n已提供風格參考圖片,請分析圖片中的視覺風格特徵並應用。`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
prompt += `\n\n請確保回傳的是有效的 JSON 格式,可以直接被解析。`
|
|||
|
|
|
|||
|
|
return prompt
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成人物三視圖 Prompt
|
|||
|
|
*/
|
|||
|
|
export function buildCharacterViewPrompt(input: AssetGenerationInput): string {
|
|||
|
|
return `請為角色「${input.characterName || '角色'}」生成白色背景的三視圖(正面、側面、背面)。
|
|||
|
|
角色描述:${input.analysis}
|
|||
|
|
|
|||
|
|
請以 JSON 格式回傳,包含三視圖的描述或生成指令:
|
|||
|
|
{
|
|||
|
|
"characterName": "角色名稱",
|
|||
|
|
"frontView": "正面視圖描述",
|
|||
|
|
"sideView": "側面視圖描述",
|
|||
|
|
"backView": "背面視圖描述",
|
|||
|
|
"description": "角色詳細描述"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
請確保回傳的是有效的 JSON 格式。`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成場景 Prompt
|
|||
|
|
*/
|
|||
|
|
export function buildScenePrompt(input: AssetGenerationInput): string {
|
|||
|
|
return `請為場景「${input.sceneName || '場景'}」生成白色背景的場景圖。
|
|||
|
|
場景描述:${input.analysis}
|
|||
|
|
|
|||
|
|
請以 JSON 格式回傳:
|
|||
|
|
{
|
|||
|
|
"sceneName": "場景名稱",
|
|||
|
|
"description": "場景詳細描述",
|
|||
|
|
"environment": "環境設定",
|
|||
|
|
"lighting": "光線建議",
|
|||
|
|
"props": ["道具1", "道具2"],
|
|||
|
|
"imageDescription": "場景圖片描述"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
請確保回傳的是有效的 JSON 格式。`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成分鏡表 Prompt
|
|||
|
|
*/
|
|||
|
|
export function buildStoryboardPrompt(input: StoryboardInput): string {
|
|||
|
|
const { story, style, pace, styleImage } = input
|
|||
|
|
|
|||
|
|
let prompt = `請為以下故事生成分鏡表。請以 JSON 格式回傳,結構如下:
|
|||
|
|
{
|
|||
|
|
"title": "標題",
|
|||
|
|
"style": "風格描述",
|
|||
|
|
"pace": "節奏描述",
|
|||
|
|
"shots": [
|
|||
|
|
{
|
|||
|
|
"shotNumber": 1,
|
|||
|
|
"camera": {
|
|||
|
|
"shot": "鏡頭類型(如:Extreme Long Shot, Long Shot, Medium Shot, Close-Up 等)",
|
|||
|
|
"movement": "運鏡方式(如:Pan, Tilt, Dolly In/Out, Truck, Crane, Handheld 等)",
|
|||
|
|
"composition": "構圖方式(如:Rule of Thirds, Leading Lines, Depth of Field 等)",
|
|||
|
|
"lighting": "光線設定(如:Three-Point Lighting, High Key, Low Key 等)",
|
|||
|
|
"description": "鏡頭詳細描述"
|
|||
|
|
},
|
|||
|
|
"scene": "場景描述",
|
|||
|
|
"dialogue": "對話或旁白(選填)",
|
|||
|
|
"duration": 時長秒數(選填)
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
故事內容:
|
|||
|
|
${story}`
|
|||
|
|
|
|||
|
|
if (style) {
|
|||
|
|
prompt += `\n\n風格要求:${style}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pace) {
|
|||
|
|
prompt += `\n\n節奏要求:${pace}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (styleImage) {
|
|||
|
|
prompt += `\n\n已提供風格參考圖片,請參考圖片中的視覺風格。`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
prompt += `\n\n請確保回傳的是有效的 JSON 格式,可以直接被解析。`
|
|||
|
|
|
|||
|
|
return prompt
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成攝影機分析 Prompt
|
|||
|
|
*/
|
|||
|
|
export function buildCameraAnalysisPrompt(input: CameraAnalysisInput): string {
|
|||
|
|
let prompt = `請分析以下影像的攝影機鏡位與運鏡建議。請以 JSON 格式回傳,結構如下:
|
|||
|
|
{
|
|||
|
|
"camera": {
|
|||
|
|
"shot": "建議的鏡頭類型",
|
|||
|
|
"movement": "建議的運鏡方式",
|
|||
|
|
"composition": "構圖分析",
|
|||
|
|
"lighting": "光線分析",
|
|||
|
|
"description": "詳細分析與建議"
|
|||
|
|
}
|
|||
|
|
}`
|
|||
|
|
|
|||
|
|
if (input.image) {
|
|||
|
|
prompt += `\n\n圖片已上傳(base64 或 URL)`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (input.description) {
|
|||
|
|
prompt += `\n\n影像描述:${input.description}`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
prompt += `\n\n請確保回傳的是有效的 JSON 格式,可以直接被解析。`
|
|||
|
|
|
|||
|
|
return prompt
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成影片規劃 Prompt
|
|||
|
|
*/
|
|||
|
|
export function buildVideoPlanPrompt(input: VideoPlanInput): string {
|
|||
|
|
return `請為以下 prompt 生成詳細的影片規劃。請以結構化的文字格式回傳,包含:
|
|||
|
|
- 影片主題與概念
|
|||
|
|
- 分鏡建議
|
|||
|
|
- 視覺風格
|
|||
|
|
- 節奏與剪輯建議
|
|||
|
|
|
|||
|
|
Prompt:${input.prompt}
|
|||
|
|
|
|||
|
|
請提供詳細且實用的規劃建議。`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 生成剪輯建議 Prompt
|
|||
|
|
*/
|
|||
|
|
export function buildEditSuggestionPrompt(input: EditSuggestionInput): string {
|
|||
|
|
return `請根據以下素材和劇情,提供剪輯建議。請以結構化的文字格式回傳,包含:
|
|||
|
|
- 剪輯順序建議
|
|||
|
|
- 轉場方式
|
|||
|
|
- 節奏控制
|
|||
|
|
- 重點鏡頭選擇
|
|||
|
|
|
|||
|
|
素材描述:${input.materials}
|
|||
|
|
|
|||
|
|
劇情:${input.storyline}
|
|||
|
|
|
|||
|
|
請提供詳細且實用的剪輯建議。`
|
|||
|
|
}
|
|||
|
|
|