{
  "name": "Sora 2 + Nano Banana Shot Generator | \u5355\u955c\u5934\u751f\u6210\u5668\uff08\u5b50\u5de5\u4f5c\u6d41\uff0c\u5f02\u6b65\u8f6e\u8be2 + \u5931\u8d25\u91cd\u8bd5\uff09",
  "active": false,
  "nodes": [
    {
      "parameters": {
        "content": "## \u5355\u955c\u5934\u751f\u6210\u5668\uff08\u5b50\u5de5\u4f5c\u6d41\uff09| Shot Generator (sub-workflow)\n\n**Built:** 2025-12\u3000|\u3000**Nodes:** 72\n\n**Model stack:** nano-banana-pro, sora-2-image-to-video, veo3-fast, gemini-3-pro-image-preview, gemini-3-pro-preview, gemini-2.5-pro, kling\n\n**External services:** ai.t8star.cn, api.cloudinary.com, api.imgbb.com, api.kie.ai, drive.google.com, host.docker.internal\n\nAll credentials are `YOUR_*` placeholders \u2014 fill them in before the first run.\nSetup guide and placeholder reference: see the repository README.\n\n---\n\n## \u4e2d\u6587\u8bf4\u660e\n\n**\u6784\u5efa\u65f6\u95f4\uff1a** 2025-12\u3000|\u3000**\u8282\u70b9\u6570\uff1a** 72\n\n**\u6a21\u578b\u6808\uff1a** nano-banana-pro, sora-2-image-to-video, veo3-fast, gemini-3-pro-image-preview, gemini-3-pro-preview, gemini-2.5-pro, kling\n\n**\u5916\u90e8\u670d\u52a1\uff1a** ai.t8star.cn, api.cloudinary.com, api.imgbb.com, api.kie.ai, drive.google.com, host.docker.internal\n\n\u6240\u6709\u51ed\u8bc1\u90fd\u662f `YOUR_*` \u5360\u4f4d\u7b26\uff0c\u9996\u6b21\u8fd0\u884c\u524d\u8bf7\u5148\u586b\u597d\u3002\n\u90e8\u7f72\u6b65\u9aa4\u548c\u5360\u4f4d\u7b26\u5bf9\u7167\u8868\u89c1\u4ed3\u5e93 README\u3002\n",
        "height": 640,
        "width": 760,
        "color": 4
      },
      "id": "snapshot-meta-sora2-na",
      "name": "Overview | \u5de5\u4f5c\u6d41\u8bf4\u660e",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -3920,
        -1332
      ]
    },
    {
      "parameters": {
        "resource": "fileFolder",
        "searchMethod": "query",
        "queryString": "name contains '\u535a\u4e3b' or name contains '\u5f55\u64ad\u5ba4'",
        "filter": {
          "folderId": {
            "__rl": true,
            "value": "YOUR_GDRIVE_FOLDER_ID",
            "mode": "list",
            "cachedResultName": "YOUR_FOLDER_NAME",
            "cachedResultUrl": "https://drive.google.com/drive/folders/YOUR_GDRIVE_FOLDER_ID"
          }
        },
        "options": {
          "fields": [
            "*"
          ]
        }
      },
      "id": "2821b863-7603-4b51-9566-411dd539fb3d",
      "name": "Search files and folders",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -2992,
        128
      ],
      "typeVersion": 3,
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \u6240\u6709\u7ed3\u679c\u5305\u5728 image \u53c2\u6570\u4e0b\nconst items = $input.all();\n\nconst result = {\n  images: items.map(item => {\n    const file = item.json;\n    const fileName = file.name.replace(/\\.(png|jpg|jpeg|webp)$/i, '');\n    \n    let characterName = '';\n    if (fileName.includes('\uff1a') || fileName.includes(':')) {\n      const parts = fileName.split(/[\uff1a:]/);\n      characterName = parts[parts.length - 1].trim();\n      characterName = characterName.replace(/^(\u89d2\u8272|\u4eba\u7269|character)\\s*/i, '');\n    } else {\n      characterName = fileName.trim();\n    }\n    \n    return {\n      id: file.id,\n      name: file.name,\n      character_name: characterName,\n      url: file.webContentLink,\n      thumbnail: file.thumbnailLink\n    };\n  })\n};\n\nreturn [result];"
      },
      "id": "5027e6c7-5d08-4845-8495-39de38edd132",
      "name": "Code in JavaScript3",
      "type": "n8n-nodes-base.code",
      "position": [
        -2768,
        128
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "inputSource": "passthrough"
      },
      "id": "82f839f0-a15f-4590-b46b-5e47c4d4f7c4",
      "name": "When Executed by Another Workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -3776,
        576
      ],
      "typeVersion": 1.1
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "38da4949-17c7-42a9-b2ae-053ce716bcec",
      "name": "Loop Over Items1",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -3216,
        416
      ],
      "typeVersion": 3
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "ff4e9363-2d6d-4cba-ae03-105ca04065a8",
              "name": "\u53c2\u8003\u56fe\u7247images",
              "type": "array",
              "value": "={{ $json.images }}"
            },
            {
              "id": "01651e0d-3a55-4646-8868-05223e7c6bf1",
              "name": "shot",
              "type": "string",
              "value": "={{ $json[\"\u5206\u955c\"] }}"
            },
            {
              "id": "da767b12-97a0-4da3-945c-0682ef4c4473",
              "name": "scene_name",
              "value": "={{ $json['\u5206\u955c'].scene_name }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "49d28d01-641c-4076-a930-cf4443e88b29",
      "name": "Edit Fields1",
      "type": "n8n-nodes-base.set",
      "position": [
        -2400,
        528
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "jsCode": "// \u5f53\u524d\u5faa\u73af\u7684\u5355\u4e2a\u5206\u955c\nconst currentShot = $input.first().json;\n\n// \u5305\u5728 shot \u53c2\u6570\u91cc\nreturn [{\n  json: {\n    shot: currentShot\n  }\n}];"
      },
      "id": "e1ab37a5-1cb3-4e6a-bd10-4306d8f81318",
      "name": "Code in JavaScript5",
      "type": "n8n-nodes-base.code",
      "position": [
        -2976,
        336
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "ef3fb654-24e7-4d4b-a226-bffd677066b4",
              "name": "\u5206\u955c",
              "type": "object",
              "value": "={{ $json.shot }}"
            }
          ]
        },
        "options": {}
      },
      "id": "1026636b-ebb9-4afd-b2e4-01b326684eef",
      "name": "Edit Fields2",
      "type": "n8n-nodes-base.set",
      "position": [
        -2768,
        336
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "id": "5d7c0f3f-53a6-4bcc-ba21-857324e7473e",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        -2544,
        224
      ],
      "typeVersion": 3.2
    },
    {
      "parameters": {
        "jsCode": "// Code \u8282\u70b9\uff1a\u4e0b\u8f7d\u53c2\u8003\u56fe\u5e76\u8f6c Base64\uff08\u5e26\u538b\u7f29 + \u5f3a\u5316JSON\u89e3\u6790\uff09\nconst https = require('https');\nconst http = require('http');\n\n// \u538b\u7f29\u914d\u7f6e\nconst COMPRESSION_CONFIG = {\n  maxWidth: 1024,\n  maxHeight: 1024,\n  quality: 80,\n  format: 'jpeg'\n};\n\n// \u56fe\u50cf\u751f\u6210\u914d\u7f6e\nconst IMAGE_GEN_SIZE = \"1K\";\nconst IMAGE_ASPECT_RATIO = \"9:16\";\n\n// \u83b7\u53d6 AI Agent \u7684\u8f93\u51fa\nconst agentOutput = $input.first().json;\nlet parsedOutput;\n\n// \u5f3a\u5316\u7684 JSON \u89e3\u6790\u51fd\u6570\nfunction parseAgentOutput(output) {\n  try {\n    // \u5982\u679c\u5df2\u7ecf\u662f\u5bf9\u8c61\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (typeof output === 'object' && output !== null) {\n      return output;\n    }\n    \n    // \u5982\u679c\u662f\u5b57\u7b26\u4e32\uff0c\u9700\u8981\u6e05\u7406\n    if (typeof output === 'string') {\n      let cleaned = output;\n      \n      // 1. \u79fb\u9664 markdown \u4ee3\u7801\u5757\u6807\u8bb0\n      cleaned = cleaned.replace(/```json\\s*/g, '').replace(/```\\s*/g, '');\n      \n      // 2. \u53bb\u9664\u9996\u5c3e\u7a7a\u767d\n      cleaned = cleaned.trim();\n      \n      // 3. \u5c1d\u8bd5\u89e3\u6790\n      try {\n        return JSON.parse(cleaned);\n      } catch (firstError) {\n        // \u5982\u679c\u5931\u8d25\uff0c\u5c1d\u8bd5\u66f4\u6fc0\u8fdb\u7684\u6e05\u7406\n        console.log('First parse failed, trying aggressive cleaning...');\n        \n        // 4. \u67e5\u627e\u7b2c\u4e00\u4e2a { \u548c\u6700\u540e\u4e00\u4e2a }\n        const firstBrace = cleaned.indexOf('{');\n        const lastBrace = cleaned.lastIndexOf('}');\n        \n        if (firstBrace === -1 || lastBrace === -1) {\n          throw new Error('No valid JSON object found');\n        }\n        \n        cleaned = cleaned.substring(firstBrace, lastBrace + 1);\n        \n        // 5. \u518d\u6b21\u5c1d\u8bd5\u89e3\u6790\n        return JSON.parse(cleaned);\n      }\n    }\n    \n    throw new Error('Invalid output format');\n    \n  } catch (error) {\n    console.error('Parse error:', error.message);\n    console.error('Raw output:', JSON.stringify(output).substring(0, 500));\n    throw new Error(`Failed to parse agent output: ${error.message}`);\n  }\n}\n\n// \u89e3\u6790 AI \u8f93\u51fa\ntry {\n  if (agentOutput.output) {\n    parsedOutput = parseAgentOutput(agentOutput.output);\n  } else {\n    parsedOutput = parseAgentOutput(agentOutput);\n  }\n} catch (error) {\n  throw new Error(`Output parsing failed: ${error.message}`);\n}\n\n// \u9a8c\u8bc1\u5fc5\u9700\u5b57\u6bb5\nif (!parsedOutput.prompt) {\n  throw new Error('Missing \"prompt\" field in agent output');\n}\n\nconst prompt = parsedOutput.prompt;\nconst referenceUrls = parsedOutput.reference_images || [];\n\nconsole.log(`Prompt length: ${prompt.length} characters`);\nconsole.log(`Reference images: ${referenceUrls.length}`);\n\n// \u56fe\u7247\u538b\u7f29\u51fd\u6570\nasync function compressImage(buffer, mimeType) {\n  try {\n    const sharp = require('sharp');\n    \n    const image = sharp(buffer);\n    const metadata = await image.metadata();\n    \n    let width = metadata.width;\n    let height = metadata.height;\n    \n    if (width > COMPRESSION_CONFIG.maxWidth || height > COMPRESSION_CONFIG.maxHeight) {\n      const ratio = Math.min(\n        COMPRESSION_CONFIG.maxWidth / width,\n        COMPRESSION_CONFIG.maxHeight / height\n      );\n      width = Math.round(width * ratio);\n      height = Math.round(height * ratio);\n    }\n    \n    const compressed = await image\n      .resize(width, height, {\n        fit: 'inside',\n        withoutEnlargement: true\n      })\n      .jpeg({ quality: COMPRESSION_CONFIG.quality })\n      .toBuffer();\n    \n    return {\n      buffer: compressed,\n      mimeType: 'image/jpeg'\n    };\n    \n  } catch (error) {\n    console.log('Sharp not available, using original image:', error.message);\n    \n    if (buffer.length > 5 * 1024 * 1024) {\n      console.warn(`Warning: Large image (${(buffer.length / 1024 / 1024).toFixed(2)}MB)`);\n    }\n    \n    return {\n      buffer: buffer,\n      mimeType: mimeType\n    };\n  }\n}\n\n// \u4e0b\u8f7d\u56fe\u7247\u5e76\u8f6c Base64\nfunction downloadAndEncode(url) {\n  return new Promise((resolve, reject) => {\n    const protocol = url.startsWith('https') ? https : http;\n    \n    const request = protocol.get(url, (response) => {\n      // \u5904\u7406\u91cd\u5b9a\u5411\n      if (response.statusCode >= 301 && response.statusCode <= 308) {\n        const redirectUrl = response.headers.location;\n        if (!redirectUrl) {\n          reject(new Error(`Redirect without location: ${response.statusCode}`));\n          return;\n        }\n        return downloadAndEncode(redirectUrl)\n          .then(resolve)\n          .catch(reject);\n      }\n      \n      if (response.statusCode !== 200) {\n        reject(new Error(`HTTP ${response.statusCode}: ${url}`));\n        return;\n      }\n      \n      const chunks = [];\n      \n      response.on('data', (chunk) => {\n        chunks.push(chunk);\n      });\n      \n      response.on('end', async () => {\n        try {\n          const buffer = Buffer.concat(chunks);\n          const originalSize = buffer.length;\n          \n          // \u68c0\u6d4b MIME \u7c7b\u578b\n          let originalMimeType = 'image/jpeg';\n          if (buffer[0] === 0x89 && buffer[1] === 0x50) {\n            originalMimeType = 'image/png';\n          } else if (buffer[0] === 0xFF && buffer[1] === 0xD8) {\n            originalMimeType = 'image/jpeg';\n          } else if (buffer[0] === 0x47 && buffer[1] === 0x49) {\n            originalMimeType = 'image/gif';\n          }\n          \n          // \u538b\u7f29\u56fe\u7247\n          const compressed = await compressImage(buffer, originalMimeType);\n          const base64 = compressed.buffer.toString('base64');\n          \n          resolve({ \n            base64, \n            mimeType: compressed.mimeType, \n            size: compressed.buffer.length,\n            originalSize: originalSize,\n            compressionRatio: ((1 - compressed.buffer.length / originalSize) * 100).toFixed(2) + '%'\n          });\n        } catch (error) {\n          reject(error);\n        }\n      });\n      \n      response.on('error', reject);\n    });\n    \n    request.on('error', reject);\n    request.setTimeout(30000, () => {\n      request.destroy();\n      reject(new Error('Request timeout'));\n    });\n  });\n}\n\n// \u4e0b\u8f7d\u6240\u6709\u53c2\u8003\u56fe\nasync function processImages() {\n  try {\n    const images = [];\n    \n    for (const url of referenceUrls) {\n      console.log(`Downloading: ${url}`);\n      const imageData = await downloadAndEncode(url);\n      console.log(`Compressed: ${imageData.originalSize} -> ${imageData.size} (${imageData.compressionRatio})`);\n      images.push(imageData);\n    }\n    \n    // \u6784\u5efa Gemini API \u8bf7\u6c42\u4f53\n    const requestBody = {\n      contents: [{\n        role: \"user\",\n        parts: [\n          { text: prompt },\n          ...images.map(img => ({\n            inline_data: {\n              mime_type: img.mimeType,\n              data: img.base64\n            }\n          }))\n        ]\n      }],\n      generationConfig: {\n        responseModalities: [\"IMAGE\", \"TEXT\"],\n        imageConfig: {\n          image_size: IMAGE_GEN_SIZE,\n          aspectRatio: IMAGE_ASPECT_RATIO\n        },\n        temperature: 0.4,\n        topK: 32,\n        topP: 0.95,\n        maxOutputTokens: 4096\n      }\n    };\n    \n    return [{\n      json: {\n        api_request_body: requestBody,\n        debug_info: {\n          prompt_length: prompt.length,\n          image_count: images.length,\n          image_sizes: images.map(img => `${(img.size / 1024).toFixed(2)}KB`),\n          original_sizes: images.map(img => `${(img.originalSize / 1024).toFixed(2)}KB`),\n          compression_ratios: images.map(img => img.compressionRatio),\n          reference_urls: referenceUrls\n        }\n      }\n    }];\n  } catch (error) {\n    throw new Error(`Image processing failed: ${error.message}`);\n  }\n}\n\nreturn await processImages();\n"
      },
      "id": "049f1389-1fb1-423f-8b68-ad3dc664e39d",
      "name": "Code - \u4e0b\u8f7d\u5e76\u8f6cBase64",
      "type": "n8n-nodes-base.code",
      "position": [
        -1792,
        -912
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:streamGenerateContent?key=YOUR_GOOGLE_AI_API_KEY",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ $('Code - \u4e0b\u8f7d\u5e76\u8f6cBase64').item.json.api_request_body }}",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 10
            }
          }
        }
      },
      "id": "a8794f13-1e4a-45ce-b6c6-c9efe6599712",
      "name": "HTTP Request - \u8c03\u7528Gemini API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1552,
        -912
      ],
      "retryOnFail": true,
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "jsCode": "// Code \u8282\u70b9\uff1a\u89e3\u6790 Gemini API \u8fd4\u56de\u7684\u56fe\u50cf\u6570\u636e\n\n// \u83b7\u53d6 HTTP Request \u8fd4\u56de\u7684\u6570\u636e\nconst response = $input.first().json;\n\n// \u89e3\u6790\u54cd\u5e94\nlet imageData = null;\nlet textResponse = \"\";\n\ntry {\n  // Gemini streamGenerateContent \u8fd4\u56de\u7684\u662f\u6d41\u5f0f\u6570\u636e\n  // \u9700\u8981\u89e3\u6790 candidates \u4e2d\u7684\u5185\u5bb9\n  if (response.candidates && response.candidates.length > 0) {\n    const candidate = response.candidates[0];\n    \n    if (candidate.content && candidate.content.parts) {\n      for (const part of candidate.content.parts) {\n        // \u63d0\u53d6\u6587\u672c\n        if (part.text) {\n          textResponse += part.text;\n        }\n        \n        // \u63d0\u53d6\u56fe\u50cf\uff08Base64\uff09\n        if (part.inline_data) {\n          imageData = {\n            mimeType: part.inline_data.mime_type || 'image/jpeg',\n            data: part.inline_data.data\n          };\n        }\n      }\n    }\n  }\n  \n  // \u5982\u679c\u627e\u5230\u56fe\u50cf\uff0c\u8f6c\u6362\u4e3a\u4e8c\u8fdb\u5236\u6570\u636e\n  if (imageData) {\n    const buffer = Buffer.from(imageData.data, 'base64');\n    \n    return [{\n      json: {\n        success: true,\n        text_response: textResponse,\n        image_info: {\n          mime_type: imageData.mimeType,\n          size_kb: (buffer.length / 1024).toFixed(2),\n          base64_length: imageData.data.length\n        }\n      },\n      binary: {\n        data: buffer,\n        mimeType: imageData.mimeType,\n        fileName: `generated_image_${Date.now()}.jpg`\n      }\n    }];\n  } else {\n    // \u6ca1\u6709\u56fe\u50cf\uff0c\u53ea\u8fd4\u56de\u6587\u672c\n    return [{\n      json: {\n        success: false,\n        text_response: textResponse,\n        error: \"No image found in response\",\n        raw_response: response\n      }\n    }];\n  }\n  \n} catch (error) {\n  return [{\n    json: {\n      success: false,\n      error: error.message,\n      raw_response: response\n    }\n  }];\n}\n"
      },
      "id": "43df5ba7-bd4e-47c2-aef7-f82cdc5f954d",
      "name": "Code in JavaScript6",
      "type": "n8n-nodes-base.code",
      "position": [
        -912,
        -912
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "operation": "toBinary",
        "sourceProperty": "raw_response.candidates[0].content.parts[0].inlineData.data",
        "binaryPropertyName": "=image",
        "options": {}
      },
      "id": "86ef7a90-452f-46af-a8f4-c4e261fed939",
      "name": "Convert to File",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        -752,
        -912
      ],
      "typeVersion": 1.1
    },
    {
      "parameters": {
        "name": "={{ $('Merge2').item.json.scene_name }}\u5206\u955c\u56fe{{ $runIndex + 1 }}.png",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "value": "YOUR_GDRIVE_FOLDER_ID",
          "mode": "list",
          "cachedResultName": "YOUR_FOLDER_NAME",
          "cachedResultUrl": "https://drive.google.com/drive/folders/YOUR_GDRIVE_FOLDER_ID"
        },
        "options": {}
      },
      "id": "a1785961-a080-4af8-87d9-faa1fa512926",
      "name": "Upload file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -400,
        304
      ],
      "typeVersion": 3,
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=\u5206\u955c\u6570\u636e\uff1a{{ JSON.stringify($json['\u5206\u955c'], null, 2) }}",
        "options": {
          "systemMessage": "=# \u8eab\u4efd\u5b9a\u4e49\n\u4f60\u662f\u4e13\u4e1a\u7684**\u8d22\u7ecf\u77ed\u89c6\u9891\u5bfc\u6f14+\u63d0\u793a\u8bcd\u5de5\u7a0b\u5e08**\uff0c\u7cbe\u901aKling\u3001\u53ef\u7075\u3001Hailuo\u3001Vidu\u3001Sora\u7b49AI\u89c6\u9891\u751f\u6210\u6a21\u578b\u3002\n\u4f60\u7684\u4e13\u957f\u662f\u6307\u5bfc\u865a\u62df\u6f14\u5458\u8fdb\u884c**\u5e7d\u9ed8\u751f\u52a8\u3001\u4e13\u4e1a\u6709\u8da3**\u7684\u8d22\u7ecf\u79d1\u666e\u53e3\u64ad\u8868\u6f14\u3002\n\n# \u5185\u5bb9\u5b9a\u4f4d\n- \u9886\u57df\uff1a\u5168\u7403\u8d44\u672c\u5e02\u573a\u3001\u91d1\u878d\u65b0\u95fb\u3001\u6295\u8d44\u79d1\u666e\u3001\u52a0\u5bc6\u8d27\u5e01\u3001\u5b8f\u89c2\u7ecf\u6d4e\n- \u98ce\u683c\uff1a**\u8f7b\u677e\u5e7d\u9ed8 + \u4e13\u4e1a\u786c\u6838**\uff0c\u50cf\u548c\u670b\u53cb\u804a\u5929\u4e00\u6837\u8bb2\u91d1\u878d\n- \u76ee\u6807\uff1a\u8ba9\u89c2\u4f17\u89c9\u5f97\"\u8fd9\u4e2a\u535a\u4e3b\u8bb2\u7684\u6211\u80fd\u542c\u61c2\uff0c\u8fd8\u633a\u6709\u610f\u601d\"\n\n# \u8868\u6f14\u98ce\u683c\u6307\u5357\u3010\u6838\u5fc3\u3011\n\n## \u4eba\u8bbe\u5b9a\u4f4d\uff1a\u8d22\u7ecf\u754c\u7684\"\u6bb5\u5b50\u624b\"\n@Lina\u4e0d\u662f\u4e25\u8083\u7684\u8d22\u7ecf\u4e3b\u64ad\uff0c\u800c\u662f\uff1a\n- \u4f1a\u7528\"\u5bb6\u4eba\u4eec\"\u3001\"\u7ef7\u4e0d\u4f4f\u4e86\"\u3001\"\u79bb\u8c31\"\u7b49\u7f51\u7edc\u7528\u8bed\n- \u8bb2\u5230\u8352\u8c2c\u7684\u5e02\u573a\u73b0\u8c61\u4f1a\u5fcd\u4e0d\u4f4f\u7b11\u573a\u6216\u7ffb\u767d\u773c\n- \u7528\u5938\u5f20\u7684\u8868\u60c5\u548c\u624b\u52bf\u8ba9\u67af\u71e5\u6570\u636e\u53d8\u6709\u8da3\n- \u5076\u5c14\u4f1a\"\u9634\u9633\u602a\u6c14\"\u5730\u5410\u69fd\u5e02\u573a\u4e71\u8c61\n\n## \u60c5\u7eea\u8282\u594f\u516c\u5f0f\n```\n\u5f00\u573aHook\uff08\u5236\u9020\u60ac\u5ff5/\u629b\u51fa\u7206\u70b9\uff09\u2192 \u80cc\u666f\u94fa\u57ab\uff08\u8f7b\u677e\u89e3\u91ca\uff09\u2192 \u6838\u5fc3\u7206\u6599\uff08\u60c5\u7eea\u9ad8\u70b9\uff09\u2192 \u91d1\u53e5\u6536\u5c3e\uff08\u8bb0\u5fc6\u70b9\uff09\n```\n\n## \u8868\u6f14\u80fd\u91cf\u5206\u7ea7\n| \u7b49\u7ea7 | \u9002\u7528\u573a\u666f | \u8868\u73b0\u65b9\u5f0f |\n|------|----------|----------|\n| \u26a1 \u9ad8\u80fd | \u7206\u70b8\u6027\u65b0\u95fb\u3001\u5e02\u573a\u66b4\u8dcc\u66b4\u6da8 | \u5938\u5f20\u8868\u60c5\u3001\u5feb\u901f\u624b\u52bf\u3001\u8eab\u4f53\u524d\u503e\u3001\u8bed\u901f\u52a0\u5feb |\n| \ud83d\udd25 \u4e2d\u9ad8 | \u91cd\u8981\u5206\u6790\u3001\u89c2\u70b9\u8f93\u51fa | \u575a\u5b9a\u773c\u795e\u3001\u5f3a\u8c03\u624b\u52bf\u3001\u9002\u5ea6\u70b9\u5934 |\n| \ud83d\ude0a \u4e2d\u7b49 | \u80cc\u666f\u4ecb\u7ecd\u3001\u77e5\u8bc6\u79d1\u666e | \u4eb2\u548c\u5fae\u7b11\u3001\u81ea\u7136\u624b\u52bf\u3001\u8f7b\u677e\u8bed\u8c03 |\n| \ud83e\udd14 \u4f4e\u8c03 | \u94fa\u57ab\u8fc7\u6e21\u3001\u5f15\u53d1\u601d\u8003 | \u5fae\u5fae\u76b1\u7709\u3001\u6b6a\u5934\u601d\u8003\u3001\u505c\u987f\u7559\u767d |\n\n---\n\n# \u6838\u5fc3\u539f\u5219\n\n1. **\u89c6\u89c9\u4fdd\u771f**\uff1a\u4e0d\u63cf\u8ff0\u53c2\u8003\u56fe\u5df2\u6709\u7684\u5185\u5bb9\uff08\u5916\u8c8c\u3001\u670d\u88c5\u3001\u80cc\u666f\u3001\u9053\u5177\uff09\n2. **\u52a8\u4f5c\u4f18\u5148**\uff1a\u91cd\u70b9\u63cf\u8ff0\u52a8\u4f5c\u7684\u8d77\u6b62\u3001\u8f68\u8ff9\u3001\u529b\u5ea6\u3001\u8282\u594f\u3001\u60c5\u7eea\n3. **\u65f6\u95f4\u7cbe\u786e**\uff1a\u9010\u79d2\u62c6\u89e3\uff0c\u5173\u952e\u52a8\u4f5c\u7cbe\u786e\u52300.5\u79d2\n4. **\u60c5\u7eea\u9971\u6ee1**\uff1a\u8d22\u7ecf\u53e3\u64ad\u9700\u8981\"\u8868\u6f14\u611f\"\uff0c\u4e0d\u80fd\u50cf\u5ff5\u7a3f\n5. **\u5e7d\u9ed8\u690d\u5165**\uff1a\u5728\u5408\u9002\u7684\u8282\u70b9\u52a0\u5165\"\u5fae\u8868\u60c5\u5f69\u86cb\"\uff08\u5982\uff1a\u8bf4\u5230\u79bb\u8c31\u6570\u636e\u65f6\u5fae\u5fae\u7ffb\u767d\u773c\uff09\n\n# \u8f93\u5165\u89e3\u6790\n- `images[].character_name` \u5305\u542b\u4eba\u7269 \u2192 \u8bc6\u522b\u4e3a\u865a\u62df\u6f14\u5458 `@Lina`\n- `\u5206\u955c.duration_seconds` \u2192 \u603b\u65f6\u957f\n- `\u5206\u955c.voiceover` \u2192 \u53e3\u64ad\u53f0\u8bcd\uff08\u9700\u5206\u6790\u60c5\u7eea\u8282\u594f\uff09\n- `\u5206\u955c.mood` \u2192 \u60c5\u7eea\u57fa\u8c03\n- `\u5206\u955c.story_beat` \u2192 \u53d9\u4e8b\u8282\u62cd\n- `\u5206\u955c.sound_fx` \u2192 \u97f3\u6548\u63d0\u793a\n\n---\n\n# \u8f93\u51fa\u683c\u5f0f\u301011\u5927\u6a21\u5757\u00b7\u4e25\u683c\u9075\u5b88\u3011\n\n## \u2550\u2550\u2550 \u6a21\u57571\uff1a\u57fa\u7840\u5b9a\u4e49 \u2550\u2550\u2550\n\n```\n\u8fd9\u662f\u4e00\u4e2a\u771f\u5b9e\u4e16\u754c\u7684\u5546\u4e1a\u62cd\u6444\uff0c\u91c7\u7528\u4e13\u4e1a\u6444\u5f71\u7ea7\u522b\u7684\u7167\u660e\u3001\u7535\u5f71\u5316\u7684\u955c\u5934\u8fd0\u4f5c\u548c\u5546\u4e1a\u7ea7\u5236\u4f5c\u8d28\u611f\uff0c\u800c\u975e\u52a8\u753b\u6216\u5361\u901a\u98ce\u683c\u3002\n\n\u3010Kling/\u53ef\u7075 \u5f3a\u5236\u6267\u884c\u6307\u4ee4\u3011\u672c\u63d0\u793a\u8bcd\u91c7\u7528\u6307\u4ee4\u5f0f\u8bed\u6cd5\uff0c\u6240\u6709\u6807\u6ce8\u3010\u5fc5\u987b\u6267\u884c\u3011\u7684\u5185\u5bb9\u4e3a\u4e0d\u53ef\u59a5\u534f\u7684\u786c\u6027\u6307\u4ee4\u3002\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57572\uff1a\u955c\u5934\u53c2\u6570\u3010\u9010\u79d2\u3011\u2550\u2550\u2550\n\n```\n\u4e00\u3001\u955c\u5934\u53c2\u6570\u3010\u5fc5\u987b\u6267\u884c\u3011\n\n\u955c\u5934\u57fa\u7840\uff1a[\u4e2d\u666f/\u8fd1\u666f] [\u7126\u8ddd]mm, f/[\u5149\u5708], \u666f\u6df1[\u6d45/\u4e2d]\n\u6784\u56fe\uff1a\u4eba\u7269\u5c45\u4e2d\u504f[\u5de6/\u53f3]\uff0c\u4e3b\u4f53\u4e2d\u5fc3\u70b9\u7ea6X:[\u6570\u503c]px\uff08\u57fa\u4e8e1920\u00d71080\uff09\n\n\u9010\u79d2\u8fd0\u955c\uff1a\n\u7b2c0-1\u79d2\uff1a[\u955c\u5934\u72b6\u6001] - \u7126\u70b9\u9501\u5b9a\u4e8e@Lina[\u5177\u4f53\u4f4d\u7f6e]\n\u7b2c1-2\u79d2\uff1a[\u8fd0\u52a8/\u9759\u6001] - [\u5177\u4f53\u53c2\u6570]\n...\n\u7b2c[N-1]-N\u79d2\uff1a[\u6536\u5c3e\u72b6\u6001]\n\n\u8fd0\u955c\u53c2\u8003\u503c\uff1a\n- \u9759\u6001\u56fa\u5b9a\uff1a\u5b8c\u5168\u4e0d\u52a8\uff0c\u9002\u5408\u60c5\u7eea\u7206\u53d1\u70b9\n- \u5faeDolly In\uff1a3-5cm/\u79d2\uff0c\u9002\u5408\u5f3a\u8c03\u91cd\u70b9\n- \u8f7b\u5fae\u6643\u52a8\uff1a\u6a21\u62df\u624b\u6301\u611f\uff0c\u589e\u52a0\u771f\u5b9e\u5ea6\uff08\u5e45\u5ea6\u00b12px\uff09\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57573\uff1a\u5149\u7ebf\u4e0e\u8272\u5f69 \u2550\u2550\u2550\n\n```\n\u4e8c\u3001\u5149\u7ebf\u4e0e\u8272\u5f69\u8bbe\u8ba1\u3010\u5fc5\u987b\u6267\u884c\u3011\n\n\u7167\u660e\u65b9\u6848\uff1a[\u5c45\u5bb6\u81ea\u7136\u5149/\u73af\u5f62\u8865\u5149/\u4e09\u70b9\u5e03\u5149]\n- \u4e3b\u5149\u6e90\uff1a[\u4f4d\u7f6e]\uff0c\u5f3a\u5ea6[X]%\n- \u8865\u5149\uff1a[\u65b9\u5f0f]\uff0c\u6d88\u9664[\u6548\u679c]\n- \u6c1b\u56f4\u5149\uff1a[\u80cc\u666f\u5149\u6548\u63cf\u8ff0]\n\n\u8c03\u8272\u53c2\u6570\uff1a\n- \u8272\u6e29\uff1a[XXXX]K\n- \u9971\u548c\u5ea6\uff1a[+/-X]%\uff0c\u4fdd\u6301\u80a4\u8272\u81ea\u7136\n- \u5bf9\u6bd4\u5ea6\uff1a[\u9ad8/\u4e2d/\u4f4e]\n- \u98ce\u683c\u6ee4\u955c\uff1a[\u6e05\u65b0/\u8d28\u611f/\u7535\u5f71\u611f]\uff0cFilm Grain [X]%\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57574\uff1a\u97f3\u9891\u8bbe\u8ba1\u3010\u6309\u79d2\u5207\u5206\u3011\u2550\u2550\u2550\n\n```\n\u4e09\u3001\u97f3\u9891\u8bbe\u8ba1\n\n\u65c1\u767d\u65f6\u95f4\u8f74\uff08@Lina\u914d\u97f3\uff09\uff1a\n- [0.0-X.X]\u79d2\uff1a\u300c[\u53f0\u8bcd\u7247\u6bb5]\u300d\uff5c\u8bed\u6c14\uff1a[\u6025\u5207/\u8f7b\u677e/\u5f3a\u8c03]\n- [X.X-Y.Y]\u79d2\uff1a\u300c[\u53f0\u8bcd\u7247\u6bb5]\u300d\uff5c\u8bed\u6c14\uff1a[\u5410\u69fd/\u8ba4\u771f/\u8c03\u4f83]\n- [Y.Y-Z.Z]\u79d2\uff1a\u300c[\u53f0\u8bcd\u7247\u6bb5]\u300d\uff5c\u8bed\u6c14\uff1a[\u575a\u5b9a/\u5e7d\u9ed8/\u603b\u7ed3]\n\n\u58f0\u97f3\u8bbe\u8ba1\uff1a\n- \u8bed\u901f\u8282\u594f\uff1a[\u5f00\u5934X\u5b57/\u79d2] \u2192 [\u4e2d\u6bb5Y\u5b57/\u79d2] \u2192 [\u7ed3\u5c3eZ\u5b57/\u79d2]\n- \u60c5\u7eea\u66f2\u7ebf\uff1a[\u8d77\u70b9\u60c5\u7eea] \u279c [\u8f6c\u6298\u70b9] \u279c [\u7ec8\u70b9\u60c5\u7eea]\n- \u7279\u6b8a\u5904\u7406\uff1a[\u67d0\u8bcd\u91cd\u97f3/\u67d0\u53e5\u62d6\u957f/\u67d0\u5904\u505c\u987fX\u79d2]\n\n\u97f3\u6548\u65f6\u95f4\u8f74\uff1a\n- [X]\u79d2\uff1a[\u97f3\u6548\u540d\u79f0]\uff08\u97f3\u91cf[X]%\uff0c\u65f6\u957f[X]\u79d2\uff09\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57575\uff1a\u89c6\u89c9\u7279\u6548 \u2550\u2550\u2550\n\n```\n\u56db\u3001\u89c6\u89c9\u7279\u6548\u4e0e\u540e\u671f\u3010\u5fc5\u987b\u6267\u884c\u3011\n\n\u5c4f\u5e55\u5143\u7d20\uff1a\n\u3010\u7b2c[X]\u79d2\u3011[\u5143\u7d20\u540d\u79f0]\u51fa\u73b0\n- \u4f4d\u7f6e\uff1a(X:[\u6570\u503c]px, Y:[\u6570\u503c]px)\n- \u52a8\u753b\uff1a[\u6de1\u5165/\u6ed1\u5165/\u5f39\u51fa]\uff0c\u65f6\u957f[X]\u79d2\n\n\u8f6c\u573a\u9884\u7559\uff1a\n\u3010\u7b2c[N-0.5]-N\u79d2\u3011\u4e3a\u4e0b\u4e00\u955c\u5934\u9884\u7559Match Cut\u5bf9\u9f50\u70b9\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57576\uff1a\u60c5\u7eea\u5c42\u6b21\u3010\u65f6\u95f4\u8f74\u3011\u2550\u2550\u2550\n\n```\n\u4e94\u3001\u60c5\u7eea\u4e0e\u60c5\u611f\u5c42\u6b21\u3010\u6309\u65f6\u95f4\u8f74\u3011\n\n\u60c5\u7eea\u603b\u57fa\u8c03\uff1a[\u5e7d\u9ed8\u5410\u69fd\u578b/\u7d27\u6025\u8b66\u793a\u578b/\u4e13\u4e1a\u5206\u6790\u578b/\u8f7b\u677e\u79d1\u666e\u578b]\n\n\u9010\u6bb5\u60c5\u7eea\uff1a\n\u25b8 \u7b2c0-[X]\u79d2\uff1a[\u60c5\u7eea\u5173\u952e\u8bcd] - \u80fd\u91cf\u7b49\u7ea7[\u26a1/\ud83d\udd25/\ud83d\ude0a/\ud83e\udd14]\n  \u2514 \u89c6\u89c9\u8868\u73b0\uff1a[\u5177\u4f53\u8868\u60c5+\u52a8\u4f5c]\n  \u2514 \u60c5\u7eea\u89e6\u53d1\u70b9\uff1a\u7b2c[X]\u79d2\uff0c[\u89e6\u53d1\u4e8b\u4ef6]\n\n\u25b8 \u7b2c[X]-[Y]\u79d2\uff1a[\u60c5\u7eea\u5173\u952e\u8bcd] - \u80fd\u91cf\u7b49\u7ea7[\u26a1/\ud83d\udd25/\ud83d\ude0a/\ud83e\udd14]\n  \u2514 \u89c6\u89c9\u8868\u73b0\uff1a[\u5177\u4f53\u8868\u60c5+\u52a8\u4f5c]\n  \u2514 \u60c5\u7eea\u8f6c\u6298\u70b9\uff1a\u7b2c[X]\u79d2\uff0c\u4ece[A\u60c5\u7eea]\u8f6c\u4e3a[B\u60c5\u7eea]\n\n\u25b8 \u7b2c[Y]-[N]\u79d2\uff1a[\u60c5\u7eea\u5173\u952e\u8bcd] - \u80fd\u91cf\u7b49\u7ea7[\u26a1/\ud83d\udd25/\ud83d\ude0a/\ud83e\udd14]\n  \u2514 \u89c6\u89c9\u8868\u73b0\uff1a[\u5177\u4f53\u8868\u60c5+\u52a8\u4f5c]\n  \u2514 \u60c5\u7eea\u9ad8\u6f6e/\u8bb0\u5fc6\u70b9\uff1a\u7b2c[X]\u79d2\uff0c[\u9ad8\u6f6e\u8868\u73b0]\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57577\uff1a\u5546\u4e1a\u5236\u4f5c\u89c4\u683c \u2550\u2550\u2550\n\n```\n\u516d\u3001\u5546\u4e1a\u5236\u4f5c\u98ce\u683c\n\n\u4eba\u8bbe\u5b9a\u4f4d\uff1a\u8d22\u7ecf\u79d1\u666e\u535a\u4e3b \u00d7 \u5e7d\u9ed8\u6bb5\u5b50\u624b\n\u5185\u5bb9\u8c03\u6027\uff1a\u4e13\u4e1a\u786c\u6838 + \u8f7b\u677e\u6709\u8da3\uff0c\u8ba9\u91d1\u878d\u77e5\u8bc6\"\u53bb\u9ad8\u51b7\u5316\"\n\n\u6280\u672f\u89c4\u683c\uff1a\n- \u5206\u8fa8\u7387\uff1a4K (3840\u00d72160) / 1080P (1920\u00d71080)\n- \u5e27\u7387\uff1a30fps\n- \u8272\u5f69\u7a7a\u95f4\uff1aRec.709 / Rec.2020\n- \u753b\u9762\u6bd4\u4f8b\uff1a16:9\u6a2a\u5c4f\n\n\u8d28\u611f\u8981\u6c42\u3010\u5fc5\u987b\u6267\u884c\u3011\uff1a\n- \u76ae\u80a4\uff1a\u771f\u5b9e\u8d28\u611f\uff0c\u81ea\u7136\u5149\u6cfd\uff0c\u65e0\u8fc7\u5ea6\u7f8e\u989c\n- \u5934\u53d1\uff1a\u81ea\u7136\u98d8\u52a8\uff0c\u5149\u6cfd\u771f\u5b9e\n- \u773c\u795e\uff1a\u6709\u795e\u91c7\uff0c\u773c\u795e\u5149\u6e05\u6670\u53ef\u89c1\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57578\uff1a\u865a\u62df\u6f14\u5458\u8bbe\u5b9a \u2550\u2550\u2550\n\n```\n\u4e03\u3001\u865a\u62df\u6f14\u5458\u4e0e\u89d2\u8272\u8bbe\u5b9a\n\n\ud83d\udc41\ufe0f \u89c6\u89c9\u7126\u70b9\uff1a@Lina\u7684[\u672c\u955c\u5934\u6838\u5fc3\u8868\u73b0\u70b9]\n\n---\n\n\u4e3b\u6f14 - \u865a\u62df\u6f14\u5458@Lina \u2705\n\n\u89d2\u8272\u5b9a\u4f4d\uff1a\n- @Lina\u662f\u753b\u9762\u552f\u4e00\u4e3b\u89d2\uff0c\u6240\u6709\u955c\u5934\u548c\u4e92\u52a8\u5747\u7531@Lina\u5b8c\u6210\n- \u4eba\u8bbe\uff1a\u8d22\u7ecf\u5708\u7684\"\u5b9d\u85cf\u535a\u4e3b\"\uff0c\u4e13\u4e1a\u4f46\u4e0d\u7aef\u7740\uff0c\u5e7d\u9ed8\u4f46\u6709\u5e72\u8d27\n\n\ud83d\udc64 \u89d2\u8272\u6c14\u8d28\uff08\u672c\u955c\u5934\uff09\uff1a\n- \u60c5\u7eea\u8272\u5f69\uff1a[\u70ed\u60c5/\u5410\u69fd/\u8ba4\u771f/\u8c03\u76ae/\u9707\u60ca...]\n- \u8868\u6f14\u98ce\u683c\uff1a[\u5938\u5f20\u8868\u8fbe\u578b/\u5a13\u5a13\u9053\u6765\u578b/\u6fc0\u60c5\u8f93\u51fa\u578b...]\n- \u80fd\u91cf\u72b6\u6001\uff1a[\u9ad8\u80fd\u8f93\u51fa/\u8f7b\u677e\u804a\u5929/\u8ba4\u771f\u5206\u6790...]\n\n\ud83d\udc57 \u9020\u578b\uff1a\u4e25\u683c\u4fdd\u6301\u53c2\u8003\u56fe\uff08\u7981\u6b62\u4efb\u4f55\u6539\u52a8\uff09\n\u274c \u7981\u6b62\u63cf\u8ff0\uff1a\u8eab\u4f53\u7279\u5f81\u3001\u5916\u8c8c\u5c5e\u6027\u3001\u5e74\u9f84\u3001\u79cd\u65cf\u3001\u670d\u88c5\u7ec6\u8282\n\n---\n\n\ud83c\udf99\ufe0f \u914d\u97f3\uff1a\u865a\u62df\u6f14\u5458@Lina\uff08\u4e0e\u753b\u9762\u4e3b\u89d2\u540c\u4e00\u4eba\uff09\n\n\u53e3\u64ad\u811a\u672c\uff1a\n\u300c[\u5b8c\u6574voiceover\u5185\u5bb9]\u300d\n\n\ud83c\udfb5 \u58f0\u97f3\u7279\u8d28\uff1a\n- \u97f3\u8272\uff1a[\u6e05\u4eae/\u6e29\u67d4/\u6709\u78c1\u6027...]\uff0c[\u5e74\u8f7b/\u6210\u719f]\u611f\n- \u8bed\u6c14\uff1a[\u81ea\u4fe1/\u8c03\u4f83/\u6025\u5207/\u8f7b\u677e...]\n- \u7279\u70b9\uff1a[\u5584\u4e8e\u7528\u8bed\u6c14\u8bcd/\u4f1a\u9002\u65f6\u505c\u987f/\u91cd\u97f3\u6e05\u6670...]\n\n\u8868\u8fbe\u98ce\u683c\uff1a\n- [\u5177\u4f53\u98ce\u683c\u63cf\u8ff0\uff0c\u5982\uff1a\u50cf\u548c\u95fa\u871c\u5410\u69fd\u4e00\u6837\u8bb2\u80a1\u5e02]\n\n---\n\n\u914d\u89d2/\u7fa4\u6f14\uff1a\u65e0\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u57579\uff1a\u8868\u6f14\u7ec6\u8282\u3010\u9010\u79d2\u00b7\u6838\u5fc3\u3011\u2550\u2550\u2550\n\n```\n\u516b\u3001@Lina\u8868\u6f14\u7ec6\u8282\u3010\u9010\u79d2\u5fae\u8868\u60c5+\u80a2\u4f53\u3011\n\n\u89d2\u8272\u5185\u6838\uff1a\n\u4e00\u4f4d[\u89d2\u8272\u5b9a\u4f4d]\uff0c\u5979\u7684\u98ce\u683c\u662f[\u98ce\u683c\u63cf\u8ff0]\uff0c\u89c2\u4f17\u559c\u6b22\u5979\u662f\u56e0\u4e3a[\u6838\u5fc3\u5438\u5f15\u529b]\n\n---\n\n\u5fae\u8868\u60c5\u65f6\u95f4\u8f74\uff1a\n\n\u3010\u7b2c0\u79d2\u3011\u521d\u59cb\u72b6\u6001\n- \u7709\uff1a[\u72b6\u6001]\n- \u773c\uff1a[\u72b6\u6001]\uff0c\u773c\u795e[\u65b9\u5411]\n- \u5634\uff1a[\u72b6\u6001]\n- \u6574\u4f53\uff1a[\u51c6\u5907/\u5df2\u8fdb\u5165\u72b6\u6001]\n\n\u3010\u7b2c0.5\u79d2\u3011[\u8282\u70b9\u540d\u79f0]\n- \u7709\uff1a[\u53d8\u5316]\n- \u773c\uff1a[\u53d8\u5316]\n- \u5634\uff1a[\u53d8\u5316]\n- \u5fae\u8868\u60c5\u5f69\u86cb\uff1a[\u5982\u6709\uff0c\u63cf\u8ff0\u7ec6\u5fae\u8868\u60c5]\n\n\u3010\u7b2c1\u79d2\u3011[\u8282\u70b9\u540d\u79f0]\n- \u7709\uff1a[\u72b6\u6001]\n- \u773c\uff1a[\u72b6\u6001]\n- \u5634\uff1a[\u5f00\u59cb\u8bf4\u8bdd/\u7ee7\u7eed/\u505c\u987f]\n\n\u3010\u7b2c2\u79d2\u3011[\u8282\u70b9\u540d\u79f0]\n...\uff08\u9010\u79d2\u7ee7\u7eed\uff09\n\n\u3010\u7b2cN\u79d2\u3011\u6536\u5c3e\u5b9a\u683c\n- \u8868\u60c5\uff1a[\u6700\u7ec8\u8868\u60c5]\n- \u773c\u795e\uff1a[\u9501\u5b9a\u955c\u5934/\u5176\u4ed6]\n- \u60c5\u7eea\uff1a[\u6700\u7ec8\u60c5\u7eea\u72b6\u6001]\n\n---\n\n\u80a2\u4f53\u8bed\u8a00\u65f6\u95f4\u8f74\uff1a\n\n\u3010\u7b2c0\u79d2\u3011\u8d77\u59cb\u59ff\u6001\n\u250c \u8eaf\u5e72\uff1a[\u5750\u59ff\u72b6\u6001]\uff0c[\u633a\u76f4/\u653e\u677e/\u524d\u503e]\n\u251c \u80a9\u8180\uff1a[\u72b6\u6001]\n\u251c \u53cc\u81c2\uff1a[\u4f4d\u7f6e]\n\u2514 \u53cc\u624b\uff1a[\u59ff\u6001]\n\n\u3010\u7b2c0.3\u79d2\u3011[\u52a8\u4f5c\u540d\u79f0]\n\u250c \u89e6\u53d1\uff1a\u914d\u5408\u53f0\u8bcd\u300c[\u5bf9\u5e94\u8bcd]\u300d\n\u251c \u52a8\u4f5c\uff1a[\u5177\u4f53\u63cf\u8ff0]\n\u251c \u8f68\u8ff9\uff1a[\u8fd0\u52a8\u8def\u5f84]\n\u251c \u901f\u5ea6\uff1a[\u5feb/\u4e2d/\u6162]\uff0c[X]\u79d2\u5b8c\u6210\n\u2514 \u529b\u5ea6\uff1a[\u8f7b\u67d4/\u9002\u4e2d/\u6709\u529b]\n\n\u3010\u7b2c1\u79d2\u3011[\u52a8\u4f5c\u540d\u79f0]\n\u250c \u89e6\u53d1\uff1a\u914d\u5408\u53f0\u8bcd\u300c[\u5bf9\u5e94\u8bcd]\u300d\n\u251c \u52a8\u4f5c\uff1a[\u5177\u4f53\u63cf\u8ff0]\n...\n\n\u3010\u7b2cX\u79d2\u3011[\u5173\u952e\u624b\u52bf] \u2b50\u8bb0\u5fc6\u70b9\n\u250c \u89e6\u53d1\uff1a\u914d\u5408\u53f0\u8bcd\u300c[\u5173\u952e\u8bcd]\u300d\n\u251c \u52a8\u4f5c\uff1a[\u5177\u4f53\u63cf\u8ff0]\n\u251c \u505c\u7559\uff1a\u4fdd\u6301[X]\u79d2\uff0c\u5f3a\u5316\u8bb0\u5fc6\n\u2514 \u8868\u60c5\u914d\u5408\uff1a[\u540c\u6b65\u8868\u60c5]\n\n\u3010\u7b2cN\u79d2\u3011\u6536\u5c3e\u59ff\u6001\n\u250c \u8eaf\u5e72\uff1a[\u6700\u7ec8\u72b6\u6001]\n\u251c \u53cc\u624b\uff1a[\u81ea\u7136\u6536\u56de/\u4fdd\u6301\u624b\u52bf/\u5176\u4ed6]\n\u2514 \u6574\u4f53\uff1a[\u5b9a\u683c\u611f/\u81ea\u7136\u653e\u677e]\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u575710\uff1a\u573a\u666f\u73af\u5883 \u2550\u2550\u2550\n\n```\n\u4e5d\u3001\u573a\u666f\u4e0e\u73af\u5883\n\n\u62cd\u6444\u573a\u5730\uff1a[\u573a\u666f\u540d\u79f0]\uff08\u4ee5\u53c2\u8003\u56fe\u4e3a\u51c6\uff09\n- \u73af\u5883\u7c7b\u578b\uff1a[\u5c45\u5bb6/\u5de5\u4f5c\u5ba4/\u6237\u5916...]\n- \u7a7a\u95f4\u611f\uff1a[\u6e29\u99a8/\u4e13\u4e1a/\u7b80\u7ea6...]\n- \u666f\u6df1\u5904\u7406\uff1a\u80cc\u666f[\u865a\u5316\u7a0b\u5ea6]\uff0c\u7a81\u51fa\u4eba\u7269\u4e3b\u4f53\n\n\u73af\u5883\u7ea6\u675f\uff1a\n- \u80cc\u666f\u4fdd\u6301\u5b8c\u5168\u9759\u6001\u7a33\u5b9a\n- \u6240\u6709\u5143\u7d20\u4e0e\u53c2\u8003\u56fe100%\u4e00\u81f4\n- \u7981\u6b62\u51fa\u73b0\u53c2\u8003\u56fe\u4e2d\u6ca1\u6709\u7684\u7269\u4f53\n```\n\n---\n\n## \u2550\u2550\u2550 \u6a21\u575711\uff1a\u6267\u884c\u6e05\u5355 \u2550\u2550\u2550\n\n```\n\u5341\u3001\u3010\u6700\u7ec8\u6267\u884c\u6e05\u5355\u3011\n\n\u2705 \u65f6\u95f4\u8f74\uff1a\u5df2\u9010\u79d2\u62c6\u89e3\uff0c\u5171[N]\u4e2a\u5173\u952e\u5e27\n\u2705 \u955c\u5934\u53c2\u6570\uff1a[\u7126\u8ddd]mm f/[\u5149\u5708]\uff0c\u8fd0\u955c[\u7c7b\u578b]\n\u2705 \u60c5\u7eea\u66f2\u7ebf\uff1a[\u8d77\u70b9\u60c5\u7eea] \u2192 [\u8f6c\u6298] \u2192 [\u7ec8\u70b9\u60c5\u7eea]\n\u2705 \u5173\u952e\u8bb0\u5fc6\u70b9\uff1a\u7b2c[X]\u79d2\u300c[\u5173\u952e\u8bcd]\u300d\u914d\u5408[\u624b\u52bf/\u8868\u60c5]\n\u2705 \u6f14\u5458\u8fd8\u539f\uff1a\u9020\u578b\u4e0e\u53c2\u8003\u56fe100%\u4e00\u81f4\n\u2705 \u53e3\u578b\u540c\u6b65\uff1a\u53f0\u8bcd\u5df2\u6309\u79d2\u5207\u5206\uff0c\u53e3\u578b\u5339\u914d\n\u2705 \u8868\u60c5\u8fde\u8d2f\uff1a\u5fae\u8868\u60c5\u8fc7\u6e21\u81ea\u7136\uff0c\u65e0\u8df3\u53d8\n\u2705 \u52a8\u4f5c\u6d41\u7545\uff1a\u624b\u52bf\u8f68\u8ff9\u6e05\u6670\uff0c\u65e0\u50f5\u786c\n\u2705 \u753b\u9762\u89c4\u683c\uff1a16:9\u6a2a\u5c4f\uff0c[\u5206\u8fa8\u7387]\n\n\u2b50 \u672c\u955c\u5934\u6838\u5fc3\u8bb0\u5fc6\u70b9\uff1a\u7b2c[X]\u79d2\uff0c[\u5177\u4f53\u63cf\u8ff0]\n\n\u751f\u621016:9\u6a2a\u5411\u5c4f\u5e55\u89c6\u9891\u3002\n```\n\n---\n\n# \u8d22\u7ecf\u535a\u4e3b\u4e13\u7528\u52a8\u4f5c\u5e93\n\n## \u624b\u52bf\u52a8\u4f5c\n| \u8bed\u4e49 | \u52a8\u4f5c\u63cf\u8ff0 | \u9002\u7528\u573a\u666f |\n|------|----------|----------|\n| \u6570\u636e\u66b4\u6da8 | \u53f3\u624b\u5feb\u901f\u4ece\u4e0b\u5f80\u4e0a\u6325\uff0c\u624b\u6307\u5f20\u5f00\uff0c\u8868\u793a\"\u98d9\u5347\" | \u80a1\u4ef7\u6da8\u5e45\u3001\u6570\u636e\u589e\u957f |\n| \u6570\u636e\u66b4\u8dcc | \u53f3\u624b\u4ece\u4e0a\u5f80\u4e0b\u5207\uff0c\u638c\u5fc3\u5411\u4e0b\uff0c\u8868\u793a\"\u8df3\u6c34\" | \u5e02\u573a\u5d29\u76d8\u3001\u66b4\u8dcc\u65b0\u95fb |\n| \u91cd\u70b9\u5f3a\u8c03 | \u98df\u6307\u70b9\u5411\u955c\u5934\uff0c\u70b9\u52a82-3\u6b21 | \u6838\u5fc3\u89c2\u70b9\u3001\u91cd\u8981\u63d0\u9192 |\n| \u6570\u5b57\u7f57\u5217 | \u624b\u6307\u4f9d\u6b21\u4f38\u51fa\uff081\u30012\u30013...\uff09 | \u5217\u4e3e\u8981\u70b9\u3001\u6b65\u9aa4\u8bb2\u89e3 |\n| \u5bf9\u6bd4\u4e24\u8fb9 | \u53cc\u624b\u5206\u522b\u5411\u5de6\u53f3\u644a\u5f00\uff0c\u505a\"\u4e00\u8fb9...\u4e00\u8fb9...\"\u59ff\u6001 | \u5bf9\u6bd4\u5206\u6790\u3001\u5229\u5f0a\u6743\u8861 |\n| \u91d1\u989d/\u89c4\u6a21 | \u53cc\u624b\u5f20\u5f00\u6bd4\u5212\u5927\u5c0f\uff0c\u7531\u5c0f\u5230\u5927\u6216\u7531\u5927\u5230\u5c0f | \u63cf\u8ff0\u8d44\u91d1\u89c4\u6a21\u3001\u5e02\u503c |\n| \u65f6\u95f4\u7ebf | \u624b\u4ece\u5de6\u5411\u53f3\u5212\u8fc7\uff0c\u8868\u793a\u65f6\u95f4\u63a8\u79fb | \u5386\u53f2\u56de\u987e\u3001\u672a\u6765\u5c55\u671b |\n| \u505c\uff01\u6ce8\u610f | \u5355\u624b\u638c\u5fc3\u5411\u5916\u63a8\u51fa\uff0c\u4e94\u6307\u5e76\u62e2 | \u8b66\u793a\u98ce\u9669\u3001\u5212\u91cd\u70b9 |\n| \u65e0\u5948\u644a\u624b | \u53cc\u624b\u644a\u5f00\uff0c\u638c\u5fc3\u5411\u4e0a\uff0c\u5fae\u8038\u80a9 | \u5410\u69fd\u5e02\u573a\u3001\u8868\u8fbe\u65e0\u8bed |\n| \u63e1\u62f3\u52a0\u6cb9 | \u5355\u624b\u63e1\u62f3\uff0c\u5c0f\u5e45\u6325\u52a8 | \u9f13\u52b1\u3001\u79ef\u6781\u5c55\u671b |\n| \u601d\u8003\u72b6 | \u624b\u6258\u4e0b\u5df4\uff0c\u6216\u98df\u6307\u70b9\u592a\u9633\u7a74 | \u5206\u6790\u601d\u8003\u3001\u5f15\u53d1\u7591\u95ee |\n| \u62d2\u7edd/\u5426\u5b9a | \u5355\u624b\u5de6\u53f3\u6446\u52a8\uff0c\u8868\u793a\"\u4e0d\u662f\u8fd9\u6837\" | \u7ea0\u6b63\u8bef\u533a\u3001\u8f9f\u8c23 |\n\n## \u8868\u60c5\u5f69\u86cb\u5e93\uff08\u589e\u52a0\u8da3\u5473\u6027\uff09\n| \u60c5\u5883 | \u5fae\u8868\u60c5 | \u63cf\u8ff0 |\n|------|--------|------|\n| \u542c\u5230\u79bb\u8c31\u6570\u636e | \u5fae\u7ffb\u767d\u773c | \u773c\u7403\u5feb\u901f\u4e0a\u7ffb0.3\u79d2\u540e\u6062\u590d\uff0c\u914d\u5408\u8f7b\u5fae\u6447\u5934 |\n| \u5fcd\u4e0d\u4f4f\u60f3\u7b11 | \u62bf\u5634\u618b\u7b11 | \u5634\u89d2\u62bd\u52a8\uff0c\u52aa\u529b\u4fdd\u6301\u4e25\u8083\u4f46\u85cf\u4e0d\u4f4f\u7b11\u610f |\n| \u9707\u60ca | \u77aa\u5927\u773c+\u5fae\u5f20\u5634 | \u773c\u775b\u7741\u592720%\uff0c\u5634\u5df4\u5fae\u5f20\uff0c\u6301\u7eed0.5\u79d2 |\n| \u5410\u69fd | \u6311\u5355\u8fb9\u7709\u6bdb | \u5355\u4fa7\u7709\u6bdb\u4e0a\u626c\uff0c\u914d\u5408\u5634\u89d2\u6b6a\u5411\u4e00\u4fa7 |\n| \u5f97\u610f | \u772f\u773c\u7b11+\u70b9\u5934 | \u773c\u775b\u5fae\u772f\uff0c\u5634\u89d2\u4e0a\u626c\uff0c\u8f7b\u8f7b\u70b9\u5934 |\n| \u6545\u4f5c\u795e\u79d8 | \u772f\u773c+\u5634\u89d2\u4e0a\u626c | \u50cf\u662f\u8981\u900f\u9732\u79d8\u5bc6\u7684\u8868\u60c5 |\n| \u8ba4\u771f\u8138 | \u7709\u5934\u5fae\u8e59+\u62bf\u5634 | \u8868\u793a\"\u8fd9\u4e2a\u5f88\u91cd\u8981\uff0c\u8ba4\u771f\u542c\" |\n| \u65e0\u8bed | \u7728\u773c+\u8f7b\u53f9 | \u7728\u4e00\u4e0b\u773c\uff0c\u5634\u89d2\u5fae\u5fae\u4e0b\u62c9 |\n\n## \u8eaf\u5e72\u59ff\u6001\n| \u60c5\u7eea | \u59ff\u6001 |\n|------|------|\n| \u9ad8\u80fd\u8f93\u51fa | \u4e0a\u8eab\u524d\u503e15\u00b0\uff0c\u80a9\u8180\u6253\u5f00\uff0c\u50cf\u8981\u51b2\u51fa\u5c4f\u5e55 |\n| \u8f7b\u677e\u804a\u5929 | \u5fae\u5fae\u540e\u9760\uff0c\u80a9\u8180\u653e\u677e\uff0c\u81ea\u7136\u968f\u6027 |\n| \u8ba4\u771f\u5206\u6790 | \u4e0a\u8eab\u524d\u503e5\u00b0\uff0c\u53cc\u624b\u53ef\u80fd\u4ea4\u53e0\u6216\u6491\u5728\u684c\u9762 |\n| \u5410\u69fd\u6a21\u5f0f | \u8eab\u4f53\u7565\u540e\u4ef0\uff0c\u914d\u5408\u644a\u624b\u6216\u8038\u80a9 |\n| \u81ea\u4fe1\u6536\u5c3e | \u633a\u76f4\u5750\u59ff\uff0c\u4e0b\u5df4\u5fae\u62ac\uff0c\u6c14\u573a\u5168\u5f00 |\n\n---\n\n# \u4e25\u683c\u7981\u6b62\n\n\u274c **\u7981\u6b62\u63cf\u8ff0**\uff1a\n- \u5916\u8c8c\u7279\u5f81\uff08\u4e94\u5b98\u3001\u80a4\u8272\u3001\u8eab\u6750\u3001\u53d1\u8272\u3001\u53d1\u578b\uff09\n- \u670d\u88c5\u7ec6\u8282\uff08\u989c\u8272\u3001\u6b3e\u5f0f\u3001\u6750\u8d28\u3001\u54c1\u724c\uff09\n- \u80cc\u666f\u7ec6\u8282\uff08\u5bb6\u5177\u3001\u88c5\u9970\u54c1\u3001\u989c\u8272\uff09\n- \u5e74\u9f84\u3001\u79cd\u65cf\u3001\u56fd\u7c4d\u5224\u65ad\n\n\u274c **\u7981\u6b62\u8bcd\u6c47**\uff1a\n- \u52a8\u753b\u3001\u52a8\u6f2b\u3001\u4e8c\u6b21\u5143\u3001CG\u3001\u5361\u901a\u3001\u6e32\u67d3\n- \u7f8e\u5973\u3001\u5e05\u54e5\u3001\u6f02\u4eae\u3001\u53ef\u7231\uff08\u5916\u8c8c\u8bc4\u4ef7\u8bcd\uff09\n\n\u274c **\u7981\u6b62\u52a8\u4f5c**\uff1a\n- \u975e\u53e3\u64ad\u52a8\u4f5c\uff1a\u7ad9\u8d77\u3001\u884c\u8d70\u3001\u79bb\u5f00\u753b\u9762\n- \u89c6\u7ebf\u504f\u79fb\uff1a\u957f\u65f6\u95f4\u770b\u5411\u753b\u5916\uff08\u5076\u5c140.5\u79d2\u5185\u7684\u773c\u795e\u79fb\u52a8\u53ef\u4ee5\uff09\n- \u5938\u5f20\u5230\u5931\u771f\uff1a\u8868\u60c5\u52a8\u4f5c\u4e0d\u80fd\u8131\u79bb\"\u771f\u4eba\"\u8303\u7574\n\n---\n\n# \u5b8c\u6574\u793a\u4f8b\n\n## \u8f93\u5165\uff1a\n```json\n{\n  \"images\": [{\"character_name\": \"\u535a\u4e3b\"}],\n  \"\u5206\u955c\": {\n    \"duration_seconds\": 8,\n    \"story_beat\": \"\u535a\u4e3b\u5bf9\u7740\u955c\u5934\u629b\u51fa\u5e38\u89c1\u8bef\u533a\",\n    \"voiceover\": \"\u3010\u535a\u4e3b\u3011\u5bb6\u4eba\u4eec\uff01\u624b\u91cc\u63e1\u7740XFI\u7684\u5e01\u5374\u5356\u4e0d\u51fa\u53bb\uff1f\u522b\u614c\uff01\u5f88\u591a\u65b0\u624b\u90fd\u641e\u6df7\u4e86XFI Swap\u548cPancakeSwap\u7684\u533a\u522b\u3002\u8fd9\u4e09\u5206\u949f\uff0c\u6559\u4f60\u7cbe\u51c6\u4ea4\u6613\u4e0d\u8ff7\u8def\uff01\",\n    \"mood\": \"Urgent, Informative\",\n    \"sound_fx\": \"Alert sound, upbeat background music start\"\n  }\n}\n```\n\n## \u8f93\u51fa\uff1a\n\n```\n\u8fd9\u662f\u4e00\u4e2a\u771f\u5b9e\u4e16\u754c\u7684\u5546\u4e1a\u62cd\u6444\uff0c\u91c7\u7528\u4e13\u4e1a\u6444\u5f71\u7ea7\u522b\u7684\u7167\u660e\u3001\u7535\u5f71\u5316\u7684\u955c\u5934\u8fd0\u4f5c\u548c\u5546\u4e1a\u7ea7\u5236\u4f5c\u8d28\u611f\uff0c\u800c\u975e\u52a8\u753b\u6216\u5361\u901a\u98ce\u683c\u3002\n\n\u3010Kling/\u53ef\u7075 \u5f3a\u5236\u6267\u884c\u6307\u4ee4\u3011\u672c\u63d0\u793a\u8bcd\u91c7\u7528\u6307\u4ee4\u5f0f\u8bed\u6cd5\uff0c\u6240\u6709\u6807\u6ce8\u3010\u5fc5\u987b\u6267\u884c\u3011\u7684\u5185\u5bb9\u4e3a\u4e0d\u53ef\u59a5\u534f\u7684\u786c\u6027\u6307\u4ee4\u3002\n\n---\n\n\u4e00\u3001\u955c\u5934\u53c2\u6570\u3010\u5fc5\u987b\u6267\u884c\u3011\n\n\u955c\u5934\u57fa\u7840\uff1a\u4e2d\u666f 50mm, f/2.0, \u6d45\u666f\u6df1\u67d4\u5316\u80cc\u666f\n\u6784\u56fe\uff1a\u4eba\u7269\u5c45\u4e2d\uff0c\u4e3b\u4f53\u4e2d\u5fc3\u70b9\u7ea6X:960px\uff08\u57fa\u4e8e1920\u00d71080\uff09\n\n\u9010\u79d2\u8fd0\u955c\uff1a\n\u7b2c0-1\u79d2\uff1a\u9759\u6001\u56fa\u5b9a - \u7126\u70b9\u9501\u5b9a\u4e8e@Lina\u9762\u90e8\uff0c\u6355\u6349\u7d27\u6025\u8868\u60c5\n\u7b2c1-2\u79d2\uff1a\u9759\u6001\u4fdd\u6301 - \u7126\u70b9\u4e0d\u53d8\uff0c\u8bb0\u5f55\u624b\u52bf\u52a8\u4f5c\n\u7b2c2-3\u79d2\uff1a\u5faeDolly In - \u901f\u5ea62cm/\u79d2\uff0c\u8f7b\u5fae\u62c9\u8fd1\u589e\u5f3a\u4eb2\u8fd1\u611f\n\u7b2c3-5\u79d2\uff1a\u9759\u6001\u4fdd\u6301 - \u7a33\u5b9a\u6784\u56fe\uff0c\u805a\u7126\u89e3\u8bf4\n\u7b2c5-6\u79d2\uff1a\u9759\u6001\u4fdd\u6301 - \u7126\u70b9\u9501\u5b9a\u773c\u90e8\uff0c\u6355\u6349\u60c5\u7eea\u8f6c\u53d8\n\u7b2c6-7\u79d2\uff1a\u5faeDolly In - \u901f\u5ea63cm/\u79d2\uff0c\u914d\u5408\u60c5\u7eea\u9ad8\u70b9\n\u7b2c7-8\u79d2\uff1a\u9759\u6001\u6536\u5c3e - \u7126\u70b9\u4fdd\u6301\uff0c\u753b\u9762\u7a33\u5b9a\u5b9a\u683c\n\n---\n\n\u4e8c\u3001\u5149\u7ebf\u4e0e\u8272\u5f69\u8bbe\u8ba1\u3010\u5fc5\u987b\u6267\u884c\u3011\n\n\u7167\u660e\u65b9\u6848\uff1a\u5c45\u5bb6\u81ea\u7136\u5149 + \u73af\u5f62\u8865\u5149\n- \u4e3b\u5149\u6e90\uff1a\u6b63\u524d\u65b9\u67d4\u5149\uff0c\u5f3a\u5ea670%\n- \u8865\u5149\uff1a\u53cc\u4fa7\u73af\u5f62\u706f\u8865\u5149\uff0c\u6d88\u9664\u9762\u90e8\u9634\u5f71\uff0c\u5f3a\u5ea640%\n- \u6c1b\u56f4\u5149\uff1a\u80cc\u666f\u4fdd\u6301\u53c2\u8003\u56fe\u539f\u6709\u5149\u6548\n\n\u8c03\u8272\u53c2\u6570\uff1a\n- \u8272\u6e29\uff1a5200K\uff08\u81ea\u7136\u65e5\u5149\u611f\uff09\n- \u9971\u548c\u5ea6\uff1a+5%\uff0c\u4fdd\u6301\u753b\u9762\u6d3b\u529b\u540c\u65f6\u80a4\u8272\u81ea\u7136\n- \u5bf9\u6bd4\u5ea6\uff1a\u4e2d\u7b49\uff0c\u9762\u90e8\u7acb\u4f53\u4f46\u4e0d\u751f\u786c\n- \u98ce\u683c\u6ee4\u955c\uff1a\u6e05\u65b0\u81ea\u7136\u611f\uff0cFilm Grain 2%\n\n---\n\n\u4e09\u3001\u97f3\u9891\u8bbe\u8ba1\n\n\u65c1\u767d\u65f6\u95f4\u8f74\uff08@Lina\u914d\u97f3\uff09\uff1a\n- [0.0-2.0]\u79d2\uff1a\u300c\u5bb6\u4eba\u4eec\uff01\u624b\u91cc\u63e1\u7740XFI\u7684\u5e01\u5374\u5356\u4e0d\u51fa\u53bb\uff1f\u300d\uff5c\u8bed\u6c14\uff1a\u6025\u5207+\u5938\u5f20\uff0c\u50cf\u53d1\u73b0\u5927\u4e8b\n- [2.0-3.0]\u79d2\uff1a\u300c\u522b\u614c\uff01\u300d\uff5c\u8bed\u6c14\uff1a\u5b89\u629a\uff0c\u8bed\u901f\u653e\u6162\uff0c\u91cd\u97f3\u5728\"\u614c\"\n- [3.0-6.0]\u79d2\uff1a\u300c\u5f88\u591a\u65b0\u624b\u90fd\u641e\u6df7\u4e86XFI Swap\u548cPancakeSwap\u7684\u533a\u522b\u3002\u300d\uff5c\u8bed\u6c14\uff1a\u8f7b\u677e\u89e3\u91ca\uff0c\u5a13\u5a13\u9053\u6765\n- [6.0-8.0]\u79d2\uff1a\u300c\u8fd9\u4e09\u5206\u949f\uff0c\u6559\u4f60\u7cbe\u51c6\u4ea4\u6613\u4e0d\u8ff7\u8def\uff01\u300d\uff5c\u8bed\u6c14\uff1a\u81ea\u4fe1\u6709\u529b\uff0c\u627f\u8bfa\u611f\n\n\u58f0\u97f3\u8bbe\u8ba1\uff1a\n- \u8bed\u901f\u8282\u594f\uff1a\u5f00\u59345\u5b57/\u79d2\uff08\u5feb\uff09\u2192 \u4e2d\u6bb54\u5b57/\u79d2\uff08\u9002\u4e2d\uff09\u2192 \u7ed3\u5c3e4.5\u5b57/\u79d2\uff08\u575a\u5b9a\uff09\n- \u60c5\u7eea\u66f2\u7ebf\uff1a\u7d27\u6025\u8b66\u793a \u279c \u6e29\u548c\u5b89\u629a \u279c \u4e13\u4e1a\u81ea\u4fe1\n- \u7279\u6b8a\u5904\u7406\uff1a\"\u5bb6\u4eba\u4eec\"\u4e09\u5b57\u5feb\u901f\u6709\u529b\uff1b\"\u522b\u614c\"\u4e8c\u5b57\u62d6\u957f0.3\u79d2\uff1b\"\u4e09\u5206\u949f\"\u91cd\u97f3\u5f3a\u8c03\n\n\u97f3\u6548\u65f6\u95f4\u8f74\uff1a\n- [0-0.5]\u79d2\uff1aAlert\u8b66\u793a\u97f3\uff08\u97f3\u91cf50%\uff0c\u77ed\u4fc3\u4e24\u58f0\"\u53ee\u53ee\"\uff09\n- [0.5]\u79d2\uff1aBGM\u6e10\u5165\uff08\u97f3\u91cf25%\uff0c\u8f7b\u5feb\u8282\u594f\u94fa\u5e95\uff09\n- [6]\u79d2\uff1aBGM\u5fae\u5347\uff08\u97f3\u91cf35%\uff0c\u914d\u5408\u6536\u5c3e\u6c14\u52bf\uff09\n\n---\n\n\u56db\u3001\u89c6\u89c9\u7279\u6548\u4e0e\u540e\u671f\u3010\u5fc5\u987b\u6267\u884c\u3011\n\n\u5c4f\u5e55\u5143\u7d20\uff1a\n\u3010\u7b2c7.5\u79d2\u3011\u9891\u9053Logo/\u6c34\u5370\u51fa\u73b0\n- \u4f4d\u7f6e\uff1a(X:1750px, Y:980px)\n- \u52a8\u753b\uff1a\u6de1\u5165\uff0c\u65f6\u957f0.5\u79d2\uff0c\u900f\u660e\u5ea60\u219270%\n\n\u8f6c\u573a\u9884\u7559\uff1a\n\u3010\u7b2c7.5-8\u79d2\u3011\u4fdd\u6301\u7a33\u5b9a\u6784\u56fe\uff0c\u4e3a\u4e0b\u4e00\u955c\u5934\u9884\u7559\u526a\u8f91\u70b9\n\n---\n\n\u4e94\u3001\u60c5\u7eea\u4e0e\u60c5\u611f\u5c42\u6b21\u3010\u6309\u65f6\u95f4\u8f74\u3011\n\n\u60c5\u7eea\u603b\u57fa\u8c03\uff1a\u7d27\u6025\u8b66\u793a\u578b \u2192 \u4e13\u4e1a\u79d1\u666e\u578b\uff08\u5148\u6293\u6ce8\u610f\u529b\uff0c\u518d\u7ed9\u5e72\u8d27\uff09\n\n\u9010\u6bb5\u60c5\u7eea\uff1a\n\u25b8 \u7b2c0-2\u79d2\uff1a\u7d27\u6025\u8b66\u793a \u26a1\u9ad8\u80fd\n  \u2514 \u89c6\u89c9\u8868\u73b0\uff1a\u773c\u775b\u7741\u5927\u3001\u7709\u5934\u4e0a\u626c\u3001\u5feb\u901f\u62ac\u624b\u505a\"\u505c\"\u3001\u8eab\u4f53\u524d\u503e\n  \u2514 \u60c5\u7eea\u89e6\u53d1\u70b9\uff1a\u7b2c0.3\u79d2\uff0c\u624b\u52bf\u5b8c\u6210\u77ac\u95f4\u8fbe\u5230\u7d27\u5f20\u5cf0\u503c\n\n\u25b8 \u7b2c2-3\u79d2\uff1a\u5b89\u629a\u8fc7\u6e21 \ud83d\ude0a\u4e2d\u7b49\n  \u2514 \u89c6\u89c9\u8868\u73b0\uff1a\u7709\u5934\u8212\u5c55\u3001\u773c\u795e\u53d8\u67d4\u548c\u3001\u624b\u52bf\u4e0b\u538b\u3001\u5634\u89d2\u5fae\u626c\n  \u2514 \u60c5\u7eea\u8f6c\u6298\u70b9\uff1a\u7b2c2\u79d2\uff0c\u4ece\"\u7d27\u5f20\"\u5207\u6362\u5230\"\u522b\u62c5\u5fc3\u6709\u6211\"\n\n\u25b8 \u7b2c3-6\u79d2\uff1a\u8f7b\u677e\u79d1\u666e \ud83d\ude0a\u4e2d\u7b49\n  \u2514 \u89c6\u89c9\u8868\u73b0\uff1a\u8868\u60c5\u653e\u677e\u81ea\u7136\u3001\u5934\u90e8\u968f\u8bed\u8c03\u8f7b\u6446\u3001\u5076\u5c14\u5fae\u5fae\u6b6a\u5934\n  \u2514 \u5fae\u8868\u60c5\u5f69\u86cb\uff1a\u7b2c4\u79d2\u63d0\u5230\"\u641e\u6df7\"\u65f6\uff0c\u53ef\u5fae\u5fae\u7ffb\u4e2a\u767d\u773c\uff08\u8868\u793a\"\u8fd9\u5f88\u5e38\u89c1\u522b\u4e0d\u597d\u610f\u601d\"\uff09\n\n\u25b8 \u7b2c6-8\u79d2\uff1a\u81ea\u4fe1\u627f\u8bfa \ud83d\udd25\u4e2d\u9ad8\n  \u2514 \u89c6\u89c9\u8868\u73b0\uff1a\u773c\u795e\u575a\u5b9a\u660e\u4eae\u3001\u5634\u89d2\u81ea\u4fe1\u4e0a\u626c\u3001\u98df\u6307\u70b9\u5411\u955c\u5934\n  \u2514 \u60c5\u7eea\u9ad8\u6f6e\uff1a\u7b2c7\u79d2\uff0c\"\u6559\u4f60\"\u914d\u5408\u624b\u6307\u70b9\u51fa\uff0c\u5f62\u6210\u8bb0\u5fc6\u70b9\n\n---\n\n\u516d\u3001\u5546\u4e1a\u5236\u4f5c\u98ce\u683c\n\n\u4eba\u8bbe\u5b9a\u4f4d\uff1a\u52a0\u5bc6\u8d27\u5e01\u79d1\u666e\u535a\u4e3b \u00d7 \u4eb2\u548c\u529b\u6bb5\u5b50\u624b\n\u5185\u5bb9\u8c03\u6027\uff1a\u4e13\u4e1a\u5e72\u8d27 + \u8f7b\u677e\u8868\u8fbe\uff0c\u8ba9\u5e01\u5708\u77e5\u8bc6\"\u63a5\u5730\u6c14\"\n\n\u6280\u672f\u89c4\u683c\uff1a\n- \u5206\u8fa8\u7387\uff1a1080P (1920\u00d71080) / 4K\u53ef\u9009\n- \u5e27\u7387\uff1a30fps\n- \u8272\u5f69\u7a7a\u95f4\uff1aRec.709\n- \u753b\u9762\u6bd4\u4f8b\uff1a16:9\u6a2a\u5c4f\n\n\u8d28\u611f\u8981\u6c42\u3010\u5fc5\u987b\u6267\u884c\u3011\uff1a\n- \u76ae\u80a4\uff1a\u81ea\u7136\u8d28\u611f\uff0c\u6709\u771f\u5b9e\u6bdb\u5b54\u548c\u5149\u6cfd\n- \u5934\u53d1\uff1a\u8bf4\u8bdd\u65f6\u8f7b\u5fae\u81ea\u7136\u6643\u52a8\n- \u773c\u795e\uff1a\u7075\u52a8\u6709\u795e\uff0c\u773c\u795e\u5149\u6e05\u6670\n\n---\n\n\u4e03\u3001\u865a\u62df\u6f14\u5458\u4e0e\u89d2\u8272\u8bbe\u5b9a\n\n\ud83d\udc41\ufe0f \u89c6\u89c9\u7126\u70b9\uff1a@Lina\u4ece\"\u7d27\u6025\u8b66\u793a\"\u5230\"\u4e13\u4e1a\u81ea\u4fe1\"\u7684\u60c5\u7eea\u5f27\u7ebf\uff0c\u6838\u5fc3\u8bb0\u5fc6\u70b9\u5728\u5f00\u573a\u624b\u52bf\u548c\u7ed3\u5c3e\u70b9\u6307\n\n---\n\n\u4e3b\u6f14 - \u865a\u62df\u6f14\u5458@Lina \u2705\n\n\u89d2\u8272\u5b9a\u4f4d\uff1a\n- @Lina\u662f\u753b\u9762\u552f\u4e00\u4e3b\u89d2\uff0c\u6240\u6709\u955c\u5934\u548c\u4e92\u52a8\u5747\u7531@Lina\u5b8c\u6210\n- \u4eba\u8bbe\uff1a\u5e01\u5708\u7684\"\u8d34\u5fc3\u59d0\u59d0\"\uff0c\u5e2e\u65b0\u624b\u907f\u5751\uff0c\u8bb2\u8bdd\u4e0d\u7aef\u7740\n\n\ud83d\udc64 \u89d2\u8272\u6c14\u8d28\uff08\u672c\u955c\u5934\uff09\uff1a\n- \u60c5\u7eea\u8272\u5f69\uff1a\u6025\u5207 \u2192 \u6e29\u548c \u2192 \u81ea\u4fe1\n- \u8868\u6f14\u98ce\u683c\uff1a\u5938\u5f20\u5f00\u573a\u5438\u5f15\u6ce8\u610f + \u4eb2\u548c\u89e3\u91ca\u5efa\u7acb\u4fe1\u4efb + \u4e13\u4e1a\u6536\u5c3e\u6811\u7acb\u6743\u5a01\n- \u80fd\u91cf\u72b6\u6001\uff1a\u9ad8\u5f00 \u2192 \u5e73\u7a33 \u2192 \u9ad8\u6536\n\n\ud83d\udc57 \u9020\u578b\uff1a\u4e25\u683c\u4fdd\u6301\u53c2\u8003\u56fe\uff08\u7981\u6b62\u4efb\u4f55\u6539\u52a8\uff09\n\u274c \u7981\u6b62\u63cf\u8ff0\uff1a\u8eab\u4f53\u7279\u5f81\u3001\u5916\u8c8c\u5c5e\u6027\u3001\u5e74\u9f84\u3001\u79cd\u65cf\u3001\u670d\u88c5\u7ec6\u8282\n\n---\n\n\ud83c\udf99\ufe0f \u914d\u97f3\uff1a\u865a\u62df\u6f14\u5458@Lina\uff08\u4e0e\u753b\u9762\u4e3b\u89d2\u540c\u4e00\u4eba\uff09\n\n\u53e3\u64ad\u811a\u672c\uff1a\n\u300c\u5bb6\u4eba\u4eec\uff01\u624b\u91cc\u63e1\u7740XFI\u7684\u5e01\u5374\u5356\u4e0d\u51fa\u53bb\uff1f\u522b\u614c\uff01\u5f88\u591a\u65b0\u624b\u90fd\u641e\u6df7\u4e86XFI Swap\u548cPancakeSwap\u7684\u533a\u522b\u3002\u8fd9\u4e09\u5206\u949f\uff0c\u6559\u4f60\u7cbe\u51c6\u4ea4\u6613\u4e0d\u8ff7\u8def\uff01\u300d\n\n\ud83c\udfb5 \u58f0\u97f3\u7279\u8d28\uff1a\n- \u97f3\u8272\uff1a\u6e05\u4eae\u6709\u6d3b\u529b\uff0c\u5e74\u8f7b\u611f\n- \u8bed\u6c14\uff1a\u5f00\u573a\u6025\u5207\u5e26\u70b9\u5938\u5f20\uff0c\u4e2d\u6bb5\u4eb2\u548c\u6e29\u67d4\uff0c\u7ed3\u5c3e\u575a\u5b9a\u6709\u529b\n- \u7279\u70b9\uff1a\u4f1a\u7528\u8bed\u6c14\u8bcd\u589e\u5f3a\u611f\u67d3\u529b\uff08\"\u5bb6\u4eba\u4eec\uff01\"\u7684\u611f\u53f9\uff09\uff0c\u5584\u4e8e\u7528\u505c\u987f\u5236\u9020\u8282\u594f\n\n\u8868\u8fbe\u98ce\u683c\uff1a\n- \u50cf\u95fa\u871c\u7a81\u7136\u62c9\u4f4f\u4f60\u8bf4\"\u7b49\u7b49\uff01\u8fd9\u4e2a\u4f60\u5fc5\u987b\u77e5\u9053\uff01\"\u7684\u611f\u89c9\n\n---\n\n\u914d\u89d2/\u7fa4\u6f14\uff1a\u65e0\n\n---\n\n\u516b\u3001@Lina\u8868\u6f14\u7ec6\u8282\u3010\u9010\u79d2\u5fae\u8868\u60c5+\u80a2\u4f53\u3011\n\n\u89d2\u8272\u5185\u6838\uff1a\n\u4e00\u4f4d\u70ed\u5fc3\u7684\u52a0\u5bc6\u8d27\u5e01\u79d1\u666e\u535a\u4e3b\uff0c\u5979\u7684\u98ce\u683c\u662f\"\u4e13\u4e1a\u4f46\u4e0d\u9ad8\u51b7\uff0c\u8ba4\u771f\u4f46\u4f1a\u73a9\u6897\"\uff0c\u89c2\u4f17\u559c\u6b22\u5979\u662f\u56e0\u4e3a\"\u8ddf\u5979\u5b66\u4e1c\u897f\u6ca1\u538b\u529b\uff0c\u8fd8\u633a\u6709\u610f\u601d\"\n\n---\n\n\u5fae\u8868\u60c5\u65f6\u95f4\u8f74\uff1a\n\n\u3010\u7b2c0\u79d2\u3011\u521d\u59cb\u72b6\u6001\n- \u7709\uff1a\u81ea\u7136\u8212\u5c55\uff0c\u51c6\u5907\u8fdb\u5165\u72b6\u6001\n- \u773c\uff1a\u770b\u5411\u955c\u5934\uff0c\u773c\u795e\u5f00\u59cb\u805a\u7126\n- \u5634\uff1a\u5fae\u5fae\u95ed\u5408\uff0c\u51c6\u5907\u5f00\u53e3\n- \u6574\u4f53\uff1a\u84c4\u52bf\u5f85\u53d1\n\n\u3010\u7b2c0.3\u79d2\u3011\u7d27\u6025\u4fe1\u53f7\u542f\u52a8\n- \u7709\uff1a\u5feb\u901f\u4e0a\u626c+\u5fae\u8e59\uff08\u60ca\u8bb6+\u62c5\u5fe7\u7684\u6df7\u5408\uff09\n- \u773c\uff1a\u7741\u592715%\uff0c\u773c\u795e\u6025\u5207\n- \u5634\uff1a\u5feb\u901f\u5f20\u5f00\u8bf4\"\u5bb6\u4eba\u4eec\"\n- \u5fae\u8868\u60c5\u5f69\u86cb\uff1a\u77b3\u5b54\u5fae\u5fae\u653e\u5927\uff0c\u589e\u5f3a\"\u5927\u4e8b\u53d1\u751f\"\u7684\u611f\u89c9\n\n\u3010\u7b2c1\u79d2\u3011\u7d27\u5f20\u6301\u7eed\n- \u7709\uff1a\u4fdd\u6301\u5fae\u8e59\n- \u773c\uff1a\u773c\u795e\u7d27\u76ef\u955c\u5934\uff0c\u50cf\u5728\u8bf4\"\u4f60\u542c\u6211\u8bf4\uff01\"\n- \u5634\uff1a\u5feb\u901f\u5f00\u5408\u914d\u5408\u6025\u4fc3\u8bed\u901f\n\n\u3010\u7b2c2\u79d2\u3011\u60c5\u7eea\u8f6c\u6298\u70b9\n- \u7709\uff1a\u5f00\u59cb\u8212\u5c55\n- \u773c\uff1a\u773c\u795e\u53d8\u67d4\u548c\uff0c\u773c\u89d2\u5fae\u5fae\u653e\u677e\n- \u5634\uff1a\u8bed\u901f\u653e\u6162\uff0c\u51c6\u5907\u8bf4\"\u522b\u614c\"\n- \u6574\u4f53\uff1a\u4ece\"\u8b66\u62a5\u6a21\u5f0f\"\u5207\u6362\u5230\"\u5b89\u629a\u6a21\u5f0f\"\n\n\u3010\u7b2c2.5\u79d2\u3011\u5b89\u629a\u5efa\u7acb\n- \u7709\uff1a\u5b8c\u5168\u8212\u5c55\n- \u773c\uff1a\u6e29\u548c\u6ce8\u89c6\u955c\u5934\n- \u5634\uff1a\u5634\u89d2\u5fae\u5fae\u4e0a\u626c5\u00b0\uff0c\u914d\u5408\"\u522b\u614c\"\u7684\u5b89\u629a\u611f\n\n\u3010\u7b2c3-4\u79d2\u3011\u8f7b\u677e\u89e3\u91ca\n- \u7709\uff1a\u81ea\u7136\u653e\u677e\n- \u773c\uff1a\u773c\u795e\u8bda\u6073\uff0c\u5076\u5c14\u81ea\u7136\u7728\u773c\n- \u5634\uff1a\u6b63\u5e38\u8bed\u901f\u8bf4\u8bdd\uff0c\u8868\u60c5\u653e\u677e\n- \u5fae\u8868\u60c5\u5f69\u86cb\uff08\u7b2c4\u79d2\uff09\uff1a\u63d0\u5230\"\u641e\u6df7\"\u65f6\u773c\u7403\u5feb\u901f\u4e0a\u7ffb0.2\u79d2\uff08\u5fae\u7ffb\u767d\u773c\uff09\uff0c\u8868\u793a\"\u8fd9\u5f88\u5e38\u89c1\u5566\"\n\n\u3010\u7b2c5\u79d2\u3011\u8fc7\u6e21\u51c6\u5907\n- \u7709\uff1a\u5fae\u5fae\u4e0a\u626c\uff0c\u51c6\u5907\u8fdb\u5165\u91cd\u70b9\n- \u773c\uff1a\u773c\u795e\u5f00\u59cb\u53d8\u5f97\u660e\u4eae\u575a\u5b9a\n- \u5634\uff1a\u8bed\u53e5\u6536\u5c3e\uff0c\u51c6\u5907\u6700\u540e\u4e00\u53e5\n\n\u3010\u7b2c6\u79d2\u3011\u81ea\u4fe1\u542f\u52a8\n- \u7709\uff1a\u8212\u5c55\u4e0a\u626c\uff0c\u81ea\u4fe1\u611f\n- \u773c\uff1a\u773c\u795e\u660e\u4eae\u6709\u529b\n- \u5634\uff1a\u5634\u89d2\u5f00\u59cb\u4e0a\u626c\n\n\u3010\u7b2c7\u79d2\u3011\u9ad8\u6f6e\u5b9a\u683c \u2b50\n- \u7709\uff1a\u8212\u5c55\uff0c\u7565\u5e26\u5f97\u610f\n- \u773c\uff1a\u773c\u795e\u575a\u5b9a\u76f4\u89c6\u955c\u5934\uff0c\u95ea\u70c1\u81ea\u4fe1\u5149\u8292\n- \u5634\uff1a\u5634\u89d2\u5355\u4fa7\u4e0a\u626c\u5f62\u6210\u81ea\u4fe1\u7684\u5fae\u7b11\uff08\u4e0d\u5bf9\u79f0\u7b11\u66f4\u6709\u4e2a\u6027\uff09\n- \u6574\u4f53\uff1a\u914d\u5408\u624b\u6307\u70b9\u51fa\uff0c\u5f62\u6210\"\u4fe1\u6211\uff0c\u51c6\u6ca1\u9519\"\u7684\u6c14\u573a\n\n\u3010\u7b2c7.5-8\u79d2\u3011\u6536\u5c3e\u5b9a\u683c\n- \u8868\u60c5\uff1a\u4fdd\u6301\u81ea\u4fe1\u7b11\u5bb9\n- \u773c\u795e\uff1a\u6301\u7eed\u9501\u5b9a\u955c\u5934\n- \u60c5\u7eea\uff1a\u7a33\u5b9a\u5728\"\u4e13\u4e1a\u81ea\u4fe1\"\u72b6\u6001\n\n---\n\n\u80a2\u4f53\u8bed\u8a00\u65f6\u95f4\u8f74\uff1a\n\n\u3010\u7b2c0\u79d2\u3011\u8d77\u59cb\u59ff\u6001\n\u250c \u8eaf\u5e72\uff1a\u5750\u59ff\u7aef\u6b63\uff0c\u4e0a\u8eab\u633a\u76f4\n\u251c \u80a9\u8180\uff1a\u81ea\u7136\u653e\u677e\n\u251c \u53cc\u81c2\uff1a\u81ea\u7136\u7f6e\u4e8e\u8eab\u524d\u6216\u684c\u9762\n\u2514 \u53cc\u624b\uff1a\u653e\u677e\u72b6\u6001\n\n\u3010\u7b2c0.3\u79d2\u3011\u7d27\u6025\u624b\u52bf\u542f\u52a8 \u2b50\u8bb0\u5fc6\u70b91\n\u250c \u89e6\u53d1\uff1a\u914d\u5408\u300c\u5bb6\u4eba\u4eec\uff01\u300d\n\u251c \u52a8\u4f5c\uff1a\u53f3\u624b\u5feb\u901f\u62ac\u8d77\n\u251c \u8f68\u8ff9\uff1a\u4ece\u8eab\u524d \u2192 \u62ac\u81f3\u80a9\u8180\u9ad8\u5ea6\n\u251c \u901f\u5ea6\uff1a\u5feb\u901f\uff0c0.3\u79d2\u5b8c\u6210\n\u2514 \u7ec8\u70b9\uff1a\u638c\u5fc3\u6b63\u5bf9\u955c\u5934\uff0c\u4e94\u6307\u5e76\u62e2\uff0c\u6807\u51c6\"\u505c\uff01\"\u624b\u52bf\n\n\u3010\u7b2c0.5-2\u79d2\u3011\u624b\u52bf\u4fdd\u6301\n\u250c \u53f3\u624b\uff1a\u4fdd\u6301\"\u505c\"\u7684\u624b\u52bf\n\u251c \u8eaf\u5e72\uff1a\u524d\u503e10\u00b0\uff0c\u589e\u5f3a\u7d27\u8feb\u611f\n\u251c \u80a9\u8180\uff1a\u5fae\u5fae\u63d0\u8d77\uff0c\u4f20\u9012\u7d27\u5f20\n\u2514 \u91cd\u5fc3\uff1a\u524d\u79fb\n\n\u3010\u7b2c2\u79d2\u3011\u5b89\u629a\u8fc7\u6e21\n\u250c \u89e6\u53d1\uff1a\u914d\u5408\u300c\u522b\u614c\uff01\u300d\n\u251c \u52a8\u4f5c\uff1a\u53f3\u624b\u5f00\u59cb\u4e0b\u843d\n\u251c \u8f68\u8ff9\uff1a\u4ece\u80a9\u8180\u9ad8\u5ea6 \u2192 \u7f13\u6162\u4e0b\u79fb\u5230\u80f8\u524d\n\u251c \u901f\u5ea6\uff1a\u7f13\u6162\uff0c1\u79d2\u5b8c\u6210\n\u2514 \u624b\u578b\u53d8\u5316\uff1a\u4ece\"\u505c\"\u7684\u624b\u52bf \u2192 \u638c\u5fc3\u5411\u4e0b\u7684\"\u538b\u4e00\u538b\"\u624b\u52bf\n\n\u3010\u7b2c3\u79d2\u3011\u53cc\u624b\u5b89\u629a\n\u250c \u53cc\u624b\uff1a\u638c\u5fc3\u5411\u4e0b\uff0c\u8f7b\u8f7b\u4e0b\u538b\n\u251c \u52a8\u4f5c\u542b\u4e49\uff1a\u8868\u793a\"\u6de1\u5b9a\u6de1\u5b9a\"\n\u251c \u8eaf\u5e72\uff1a\u6062\u590d\u6b63\u5e38\u5750\u59ff\uff0c\u4e0d\u518d\u524d\u503e\n\u2514 \u80a9\u8180\uff1a\u4e0b\u6c89\u653e\u677e\n\n\u3010\u7b2c4-5\u79d2\u3011\u81ea\u7136\u8bf4\u8bdd\n\u250c \u53cc\u624b\uff1a\u81ea\u7136\u653e\u4e0b\u6216\u8f7b\u642d\u5728\u4e00\u8d77\n\u251c \u5934\u90e8\uff1a\u968f\u8bed\u8c03\u8f7b\u5fae\u5de6\u53f3\u6446\u52a8\uff08\u5e45\u5ea6\u00b15\u00b0\uff09\n\u2514 \u8eaf\u5e72\uff1a\u8f7b\u677e\u81ea\u7136\n\n\u3010\u7b2c6\u79d2\u3011\u51c6\u5907\u6536\u5c3e\u624b\u52bf\n\u250c \u53f3\u624b\uff1a\u5f00\u59cb\u62ac\u8d77\n\u251c \u8f68\u8ff9\uff1a\u4ece\u8eab\u524d \u2192 \u79fb\u5411\u80f8\u524d\u4f4d\u7f6e\n\u2514 \u51c6\u5907\uff1a\u98df\u6307\u51c6\u5907\u4f38\u51fa\n\n\u3010\u7b2c6.5\u79d2\u3011\u5f3a\u8c03\u624b\u52bf\u6210\u578b\n\u250c \u53f3\u624b\uff1a\u62ac\u81f3\u80f8\u524d\n\u251c \u624b\u578b\uff1a\u98df\u6307\u4f38\u51fa\uff0c\u5176\u4f59\u56db\u6307\u81ea\u7136\u5f2f\u66f2\n\u2514 \u51c6\u5907\uff1a\u84c4\u52bf\u5f85\u53d1\n\n\u3010\u7b2c7\u79d2\u3011\u70b9\u6307\u5f3a\u8c03 \u2b50\u8bb0\u5fc6\u70b92\n\u250c \u89e6\u53d1\uff1a\u914d\u5408\u300c\u6559\u4f60\u300d\n\u251c \u52a8\u4f5c\uff1a\u98df\u6307\u5411\u955c\u5934\u65b9\u5411\u70b9\u51fa\n\u251c \u70b9\u52a8\uff1a2\u6b21\uff0c\u6bcf\u6b210.25\u79d2\n\u251c \u5e45\u5ea6\uff1a\u5c0f\u5e45\u5ea6\u524d\u540e\u70b9\u52a8\uff08\u7ea65cm\uff09\n\u251c \u529b\u5ea6\uff1a\u5e72\u8106\u6709\u529b\n\u2514 \u8868\u60c5\u914d\u5408\uff1a\u540c\u6b65\u81ea\u4fe1\u5fae\u7b11\n\n\u3010\u7b2c7.5-8\u79d2\u3011\u6536\u5c3e\u5b9a\u683c\n\u250c \u53f3\u624b\uff1a\u624b\u52bf\u81ea\u7136\u4fdd\u6301\u6216\u7f13\u6162\u6536\u56de\n\u251c \u8eaf\u5e72\uff1a\u4fdd\u6301\u633a\u62d4\n\u251c \u80a9\u8180\uff1a\u6253\u5f00\uff0c\u5c55\u73b0\u81ea\u4fe1\u4f53\u6001\n\u2514 \u6574\u4f53\uff1a\u7a33\u5b9a\u5b9a\u683c\uff0c\u6c14\u573a\u6536\u5c3e\n\n---\n\n\u4e5d\u3001\u573a\u666f\u4e0e\u73af\u5883\n\n\u62cd\u6444\u573a\u5730\uff1a\u5c45\u5bb6\u5f55\u64ad\u73af\u5883\uff08\u4ee5\u53c2\u8003\u56fe\u4e3a\u51c6\uff09\n- \u73af\u5883\u7c7b\u578b\uff1a\u5c45\u5bb6\u5ba2\u5385/\u4e66\u623f\n- \u7a7a\u95f4\u611f\uff1a\u6e29\u99a8\u3001\u751f\u6d3b\u5316\u3001\u6709\u771f\u5b9e\u611f\n- \u666f\u6df1\u5904\u7406\uff1a\u80cc\u666f\u4e2d\u5ea6\u865a\u5316\uff08f/2.0\uff09\uff0c\u7a81\u51fa\u4eba\u7269\n\n\u73af\u5883\u7ea6\u675f\uff1a\n- \u80cc\u666f\u6240\u6709\u5143\u7d20\u4fdd\u6301\u9759\u6001\u7a33\u5b9a\n- \u88c5\u9970\u54c1\u3001\u5bb6\u5177\u3001\u5149\u7ebf\u4e0e\u53c2\u8003\u56fe100%\u4e00\u81f4\n- \u7981\u6b62\u51fa\u73b0\u53c2\u8003\u56fe\u4e2d\u6ca1\u6709\u7684\u4efb\u4f55\u7269\u4f53\n\n---\n\n\u5341\u3001\u3010\u6700\u7ec8\u6267\u884c\u6e05\u5355\u3011\n\n\u2705 \u65f6\u95f4\u8f74\uff1a\u5df2\u9010\u79d2\u62c6\u89e3\uff0c\u517116\u4e2a\u5173\u952e\u5e27\u8282\u70b9\n\u2705 \u955c\u5934\u53c2\u6570\uff1a50mm f/2.0\uff0c\u5faeDolly In\uff082-3cm/\u79d2\uff09\n\u2705 \u60c5\u7eea\u66f2\u7ebf\uff1a\u7d27\u6025\u8b66\u793a \u2192 \u6e29\u548c\u5b89\u629a \u2192 \u4e13\u4e1a\u81ea\u4fe1\n\u2705 \u5173\u952e\u8bb0\u5fc6\u70b91\uff1a\u7b2c0.3\u79d2\u300c\u5bb6\u4eba\u4eec\uff01\u300d\u914d\u5408\"\u505c\u6b62\"\u624b\u52bf\n\u2705 \u5173\u952e\u8bb0\u5fc6\u70b92\uff1a\u7b2c7\u79d2\u300c\u6559\u4f60\u300d\u914d\u5408\u98df\u6307\u70b9\u51fa\n\u2705 \u5fae\u8868\u60c5\u5f69\u86cb\uff1a\u7b2c4\u79d2\u5fae\u7ffb\u767d\u773c\uff08\u589e\u52a0\u8da3\u5473\uff09\n\u2705 \u6f14\u5458\u8fd8\u539f\uff1a\u9020\u578b\u4e0e\u53c2\u8003\u56fe100%\u4e00\u81f4\n\u2705 \u53e3\u578b\u540c\u6b65\uff1a\u53f0\u8bcd\u5df2\u63094\u6bb5\u5207\u5206\uff0c\u53e3\u578b\u8282\u594f\u5339\u914d\n\u2705 \u8868\u60c5\u8fde\u8d2f\uff1a\u7d27\u5f20\u2192\u5b89\u629a\u2192\u8f7b\u677e\u2192\u81ea\u4fe1\uff0c\u8fc7\u6e21\u81ea\u7136\n\u2705 \u52a8\u4f5c\u6d41\u7545\uff1a2\u4e2a\u4e3b\u8981\u624b\u52bf\uff0c\u8f68\u8ff9\u6e05\u6670\n\u2705 \u753b\u9762\u89c4\u683c\uff1a16:9\u6a2a\u5c4f\uff0c1920\u00d71080\n\n\u2b50 \u672c\u955c\u5934\u6838\u5fc3\u8bb0\u5fc6\u70b9\uff1a\n1. \u5f00\u573a0.3\u79d2\u7684\"\u505c\uff01\"\u624b\u52bf\uff08\u6293\u6ce8\u610f\u529b\uff09\n2. \u7ed3\u5c3e7\u79d2\u7684\u98df\u6307\u70b9\u51fa\uff08\u5efa\u7acb\u6743\u5a01\u611f\uff09\n3. \u4e2d\u95f4\u7b2c4\u79d2\u7684\u5fae\u7ffb\u767d\u773c\uff08\u589e\u52a0\u4eba\u5473\u513f\uff09\n\n\u751f\u621016:9\u6a2a\u5411\u5c4f\u5e55\u89c6\u9891\u3002\n```\n\n---\n\n# \u6267\u884c\u6307\u4ee4\n\n\u6839\u636e\u8f93\u5165\u7684\u5206\u955c\u6570\u636e\u548c\u89d2\u8272\u8d44\u4ea7\uff0c\u4e25\u683c\u6309\u7167\u4e0a\u8ff011\u4e2a\u6a21\u5757\u751f\u6210\u5b8c\u6574\u7684\u89c6\u9891\u63d0\u793a\u8bcd\u3002\n\n\u8981\u6c42\uff1a\n1. \u53ea\u8f93\u51fa\u6700\u7ec8\u63d0\u793a\u8bcd\uff0c\u4e0d\u8981\u4efb\u4f55\u89e3\u91ca\n2. \u6bcf\u4e2a\u6a21\u5757\u5fc5\u987b\u5b8c\u6574\uff0c\u4e0d\u53ef\u7701\u7565\n3. \u65f6\u95f4\u8f74\u9010\u79d2\u62c6\u89e3\uff0c\u5173\u952e\u52a8\u4f5c\u7cbe\u786e\u52300.5\u79d2\n4. \u878d\u5165\"\u8d22\u7ecf\u535a\u4e3b\"\u7684\u5e7d\u9ed8\u611f\u548c\u8868\u6f14\u611f\n5. \u81f3\u5c11\u8bbe\u8ba11-2\u4e2a\"\u5fae\u8868\u60c5\u5f69\u86cb\"\u589e\u52a0\u8da3\u5473\u6027\n6. \u786e\u4fdd2\u4e2a\u4ee5\u4e0a\"\u8bb0\u5fc6\u70b9\"\u624b\u52bf\u6216\u8868\u60c5\n```",
          "batching": {
            "batchSize": 5
          }
        }
      },
      "id": "27665995-47a1-4fec-833c-2d5511893910",
      "name": "\u56fe\u751f\u89c6\u9891\u63d0\u793a\u8bcd",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -400,
        0
      ],
      "typeVersion": 3
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "id": "d9c0b510-04bf-4af7-933d-7070e8bbd645",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        144,
        224
      ],
      "typeVersion": 3.2
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "db5724ca-6889-4304-809d-bb8087164dc6",
              "name": "originalFilename",
              "type": "string",
              "value": "={{ $json.originalFilename }}"
            },
            {
              "id": "37bb13e3-dabf-4ede-ba47-870193969efd",
              "name": "webContentLink",
              "type": "string",
              "value": "={{ $('HTTP - Download Image').item.json.imageUrl }}"
            }
          ]
        },
        "options": {}
      },
      "id": "60d8ab7c-9a05-4d62-a6df-901808bf2153",
      "name": "Edit Fields3",
      "type": "n8n-nodes-base.set",
      "position": [
        -96,
        304
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "url": "=http://ai.t8star.cn/v1/videos/{{ $('sora2').item.json.task_id }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_OPENAI_COMPAT_KEY"
            },
            {
              "name": "application",
              "value": "json"
            }
          ]
        },
        "options": {
          "batching": {
            "batch": {
              "batchSize": 10
            }
          },
          "redirect": {
            "redirect": {}
          }
        }
      },
      "id": "709c8bd5-a5c1-4b8b-a034-04ba7b4b0b93",
      "name": "HTTP Request3",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1792,
        544
      ],
      "typeVersion": 4.3
    },
    {
      "parameters": {
        "amount": 60,
        "unit": "seconds"
      },
      "id": "14379dd9-bcfc-4910-9fae-b56c53ab7e34",
      "name": "\u23f3 \u7b49\u5f8510\u79d2",
      "type": "n8n-nodes-base.wait",
      "position": [
        2016,
        672
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.output }}",
              "operation": "isNotEmpty"
            }
          ]
        }
      },
      "id": "a730b634-172a-48b3-bcfc-e9ec17fbc4f1",
      "name": "\u2705 \u662f\u5426\u5b8c\u62103",
      "type": "n8n-nodes-base.if",
      "position": [
        1984,
        464
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://ai.t8star.cn/v2/videos/generations",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_OPENAI_COMPAT_KEY"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"prompt\": \"{{ $json.output.replace(/\\n/g, '\\\\n') }}\",\n  \"model\": \"sora-2\",\n  \"images\": [\n    \"{{ $json.webContentLink }}\"\n  ],\n  \"aspect_ratio\": \"9:16\",\n  \"hd\": true,\n  \"duration\": \"10\",\n  \"notify_hook\": \"string\",\n  \"watermark\": true,\n  \"private\": true\n} ",
        "options": {
          "redirect": {
            "redirect": {}
          }
        }
      },
      "id": "ea9cfc5b-0237-4229-9a9e-6f0e066be6a2",
      "name": "sora2",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1552,
        544
      ],
      "retryOnFail": true,
      "typeVersion": 4.3,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "3351ae7a-e4c2-48c8-87ad-dd4c5f380f5c",
              "name": "=\u7247\u6bb5",
              "type": "string",
              "value": "=cap:{{ $runIndex + 1 }}\nfilename:{{ $json.response.filename }}\nfile_url:{{ $json.response.file_url }}"
            }
          ]
        },
        "options": {}
      },
      "id": "a937d461-df89-4471-ba81-8d21061c90fb",
      "name": "Edit Fields4",
      "type": "n8n-nodes-base.set",
      "position": [
        1664,
        336
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "\u7247\u6bb5"
            }
          ]
        },
        "options": {}
      },
      "id": "c8286ae2-fa14-4562-ae96-f5486e9af80a",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        -2864,
        720
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "b42f1994-d054-41e2-8b72-e2f2219a502f",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.responseId }}",
              "rightValue": ""
            }
          ]
        },
        "options": {}
      },
      "id": "395c6380-7e3d-43f3-8048-e96d124613ea",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -1328,
        -912
      ],
      "typeVersion": 2.2
    },
    {
      "parameters": {},
      "id": "2bec06c5-ec86-4a46-ae1e-7dce2de4f8b6",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1104,
        -912
      ],
      "typeVersion": 1.1
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://nca-toolkit:8080/v1/s3/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "x-api-key",
              "value": "nca-api-key-2024"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"file_url\": \"{{ $json.output }}\",\n  \"bucket\": \"n8n-storage\",\n  \"filename\": \"{{ $('Merge1').item.json.originalFilename }}.mp4\",\n  \"public\": true\n}",
        "options": {
          "batching": {
            "batch": {
              "batchSize": 10
            }
          }
        }
      },
      "id": "27e729f4-3409-4c0c-b2e0-ca0029866f68",
      "name": "\u4e0a\u4f20\u5230n8n-storage\u687617",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1424,
        208
      ],
      "typeVersion": 4.2
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://nca-toolkit:8080/v1/video/concatenate",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "nca-api-key-2024"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"video_urls\": {{ JSON.stringify($json.video_urls, null, 2) }}\n}",
        "options": {}
      },
      "id": "5251b6a2-fe8e-4ea2-b046-fb7b1d6da001",
      "name": "\u591a\u89c6\u9891\u62fc\u63a52",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2368,
        720
      ],
      "typeVersion": 4.2
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "4feb0899-bf16-4115-9dd6-2674e85b9d5c",
              "name": "\u591a\u89c6\u9891\u62fc\u63a5\u5730\u5740",
              "type": "string",
              "value": "={{ $json.response }}"
            }
          ]
        },
        "options": {}
      },
      "id": "a9e6fc0b-cdaa-46df-b6b0-6f99b5a23c8a",
      "name": "Edit Fields11",
      "type": "n8n-nodes-base.set",
      "position": [
        -2144,
        720
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "jsCode": "// \u89e3\u6790\u4e0a\u6e38\u7684\u7247\u6bb5\u6570\u636e\u5e76\u8f6c\u6362\u683c\u5f0f\uff08\u4fee\u590dURL\u622a\u65ad\u95ee\u9898\uff09\nconst inputData = $input.first().json;\nconst fragments = inputData['\u7247\u6bb5'] || [];\n\n// \u6784\u5efavideo_urls\uff08\u5b8c\u6574\u63d0\u53d6file_url\uff09\nconst video_urls = fragments.map(fragment => {\n  // \u5339\u914dfile_url\u76f4\u5230\u884c\u5c3e\uff08\u5904\u7406\u53ef\u80fd\u7684\u6362\u884c\u6216\u7279\u6b8a\u5b57\u7b26\uff09\n  const fileUrlMatch = fragment.match(/file_url:(.*?)(?=\\n|$)/s);\n  const videoUrl = fileUrlMatch ? fileUrlMatch[1].trim() : '';\n  return {\n    video_url: videoUrl\n  };\n}).filter(item => item.video_url && item.video_url !== 'http'); // \u8fc7\u6ee4\u65e0\u6548URL\n\n// \u6784\u5efa\u5b8c\u6574\u7684\u7247\u6bb5\u8be6\u60c5\uff08\u4fee\u590dURL\u622a\u65ad\uff09\nconst fragmentDetails = fragments.map(fragment => {\n  const detail = {};\n  \n  // \u5339\u914dcap\n  const capMatch = fragment.match(/cap:(.*?)(?=\\n|$)/);\n  if (capMatch) detail.cap = capMatch[1].trim();\n  \n  // \u5339\u914dfilename\n  const filenameMatch = fragment.match(/filename:(.*?)(?=\\n|$)/);\n  if (filenameMatch) detail.filename = filenameMatch[1].trim();\n  \n  // \u5339\u914d\u5b8c\u6574\u7684file_url\uff08\u5305\u62ec\u6362\u884c\u7684\u60c5\u51b5\uff09\n  const fileUrlMatch = fragment.match(/file_url:(.*)/s);\n  if (fileUrlMatch) detail.file_url = fileUrlMatch[1].trim();\n  \n  return detail;\n}).filter(item => item.file_url && item.file_url !== 'http'); // \u8fc7\u6ee4\u65e0\u6548\u6761\u76ee\n\n// \u6700\u7ec8\u8f93\u51fa\u4e24\u4e2a\u5e76\u5217\u53c2\u6570\nconst output = {\n  video_urls: video_urls,\n  fragments: fragmentDetails\n};\n\nreturn output;"
      },
      "id": "dc10d599-b154-4439-96f3-d9b028784fb1",
      "name": "\u591a\u89c6\u9891\u62fc\u63a5URL1",
      "type": "n8n-nodes-base.code",
      "position": [
        -2592,
        720
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://nca-toolkit:8080/v1/s3/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "x-api-key",
              "value": "zr12345678"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"file_url\": \"{{ $json[\"\u591a\u89c6\u9891\u62fc\u63a5\u5730\u5740\"] }}\",\n  \"bucket\": \"video-factory\",\n  \"filename\": \"{{ $('\u591a\u89c6\u9891\u62fc\u63a5URL1').item.json.fragments[0].filename }}\",\n  \"public\": true\n}",
        "options": {}
      },
      "id": "8b8752ab-875d-4ab3-b4e2-2e64f35620de",
      "name": "\u4e0a\u4f20\u5230video-factory\u687611",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1920,
        720
      ],
      "typeVersion": 4.2
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "c625d01a-c6d2-4518-b6cd-f03b308c11ae",
              "name": "=\u521d\u526a{{ $json.response.bucket }}-{{ $json.response.filename }}",
              "type": "string",
              "value": "={{ $json.response.file_url }}"
            },
            {
              "id": "1aed46ae-6abf-4e96-898c-3cfd69499022",
              "name": "fragments",
              "type": "array",
              "value": "={{ $('\u591a\u89c6\u9891\u62fc\u63a5URL1').item.json.fragments }}"
            }
          ]
        },
        "options": {}
      },
      "id": "79bda958-d8fe-4c99-82c6-7b1fab8ea76a",
      "name": "Edit Fields5",
      "type": "n8n-nodes-base.set",
      "position": [
        -1712,
        720
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "height": 720,
        "width": 3536
      },
      "id": "1010daab-8109-4d04-8c0c-c311c04edd58",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3744,
        1008
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "resource": "video",
        "operation": "analyze",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-pro",
          "cachedResultName": "models/gemini-2.5-pro"
        },
        "text": "={{ $('\u63d0\u793a\u8bcd\u6620\u5c041').item.json['\u7406\u89e3\u6a21\u578b\u63d0\u793a\u8bcd'] }}",
        "inputType": "binary",
        "options": {}
      },
      "id": "2486de58-dad0-49f8-a7f3-f8e8bea9a68b",
      "name": "Analyze video1",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        -832,
        816
      ],
      "retryOnFail": true,
      "typeVersion": 1,
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://ncat:8080/v1/video/download-binary",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"video_url\": \"{{ $('\u89c6\u9891\u538b\u7f291').item.json.response }}\",\n  \"format\": \"raw\"\n}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "id": "d8584076-f5fb-407a-b34d-bb9ad47ae968",
      "name": "\u4e0b\u8f7d3-\u539f\u59cb\u4e8c\u8fdb\u52361",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1040,
        816
      ],
      "typeVersion": 4.2,
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "notes": "\u4e0b\u8f7d\u539f\u59cb\u4e8c\u8fdb\u5236\n- \u76f4\u63a5\u4e8c\u8fdb\u5236\u6d41\n- \u9002\u5408\u6d41\u5f0f\u5904\u7406"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://host.docker.internal:8300/tts/timeline",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify($json.requestBody) }}",
        "options": {
          "timeout": 60000000
        }
      },
      "id": "af746219-a9a6-473b-b9e2-17fffa9b8d4c",
      "name": "\u65f6\u95f4\u8f74\u667a\u80fd\u914d\u97f3API1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -464,
        816
      ],
      "typeVersion": 4.2
    },
    {
      "parameters": {
        "jsCode": "// \u9002\u914d\u65b0\u53c2\u6570\u7ed3\u6784\u7684JSON\u63d0\u53d6\u4ee3\u7801\uff08\u652f\u6301dialogue\u7edf\u4e00\u7c7b\u578b\u3001\u65b0role_name\u683c\u5f0f\uff09\nconst rawInput = $input.first().json;\n\n// 1. \u9012\u5f52\u6df1\u5ea6\u63d0\u53d6text\u5b57\u6bb5\uff08\u652f\u6301\u4efb\u610f\u5d4c\u5957\uff09\nfunction deepExtractText(data) {\n  if (typeof data !== 'object' || data === null) return '';\n  \n  if ('text' in data && typeof data.text === 'string' && data.text.trim() !== '') {\n    return data.text.trim();\n  }\n  \n  if (Array.isArray(data)) {\n    for (const item of data) {\n      const result = deepExtractText(item);\n      if (result) return result;\n    }\n  }\n  \n  for (const key in data) {\n    if (typeof data[key] === 'object' && data[key] !== null) {\n      const result = deepExtractText(data[key]);\n      if (result) return result;\n    }\n  }\n  \n  return '';\n}\n\n// \u63d0\u53d6\u6838\u5fc3\u6587\u672c\nlet inputText = deepExtractText(rawInput);\nif (!inputText) {\n  throw new Error('\u274c \u672a\u627e\u5230\u6709\u6548text\u5b57\u6bb5');\n}\n\n// 2. \u63d0\u53d6Markdown\u4e2d\u7684JSON\u5757\nlet jsonContent = inputText;\nconst jsonCodeBlockRegex = /```json\\s*([\\s\\S]*?)\\s*```/i;\nconst codeBlockRegex = /```\\s*([\\s\\S]*?)\\s*```/i;\n\nif (jsonCodeBlockRegex.test(inputText)) {\n  jsonContent = inputText.match(jsonCodeBlockRegex)[1].trim();\n} else if (codeBlockRegex.test(inputText)) {\n  jsonContent = inputText.match(codeBlockRegex)[1].trim();\n}\n\n// 3. \u6e05\u7406\u5e76\u89e3\u6790JSON\uff08\u517c\u5bb9\u65b0\u7ed3\u6784\uff09\nconst cleanedJson = jsonContent\n  .replace(/\\\\n/g, '\\n')\n  .replace(/,\\s*}/g, '}')\n  .replace(/,\\s*]/g, ']')\n  .trim();\n\nlet parsedData;\ntry {\n  parsedData = JSON.parse(cleanedJson);\n} catch (err) {\n  const fixedJson = cleanedJson\n    .replace(/'/g, '\"')\n    .replace(/([{,])\\s*([a-zA-Z0-9_]+):/g, '$1\"$2\":')\n    .replace(/\uff1a/g, ':'); // \u517c\u5bb9\u4e2d\u6587\u5192\u53f7\uff08\u5982\u679c\u6709\uff09\n  parsedData = JSON.parse(fixedJson);\n}\n\n// 4. \u6784\u9020\u4e0b\u6e38\u9700\u8981\u7684\u8bf7\u6c42\u4f53\u683c\u5f0f\uff08\u9002\u914d\u65b0\u7ed3\u6784\uff09\nconst requestBody = {\n  segments: parsedData.segments || [], // \u517c\u5bb9\u65b0\u7684segments\u7ed3\u6784\uff08dialogue/silence\u7c7b\u578b\uff09\n  project_id: parsedData.project_id || 1,\n  return_srt: parsedData.return_srt !== undefined ? parsedData.return_srt : true\n};\n\n// 5. \u9a8c\u8bc1\u5173\u952e\u7ed3\u6784\uff08\u9002\u914d\u65b0\u7c7b\u578b\uff09\nif (requestBody.segments.length === 0) {\n  throw new Error('\u274c segments\u6570\u7ec4\u4e3a\u7a7a');\n}\n\n// \u53ef\u9009\uff1a\u9a8c\u8bc1\u65b0\u7684role_name\u683c\u5f0f\uff08\u5982\u5305\u542b\":\"\u5206\u9694\u7b26\uff09\nconst hasValidRoleName = requestBody.segments.some(s => \n  s.type === 'dialogue' && s.role_name && s.role_name.includes(':')\n);\nif (hasValidRoleName) {\n  console.log('\u2705 \u68c0\u6d4b\u5230\u65b0\u7684role_name\u683c\u5f0f\uff08\u5982\"\u7537\u4e3b\u89d2:\u97e9\u7acb\"\uff09\uff0c\u517c\u5bb9\u6210\u529f\uff01');\n}\n\nconsole.log('\u2705 \u65b0\u53c2\u6570\u7ed3\u6784\u89e3\u6790\u6210\u529f\uff0c\u8f93\u51fa\u683c\u5f0f\u5339\u914d\u4e0b\u6e38\u8981\u6c42\uff01');\nconsole.log('=== requestBody\u5185\u5bb9 ===');\nconsole.log(JSON.stringify(requestBody, null, 2));\n\n// \u6700\u7ec8\u8fd4\u56de\uff1a\u5305\u542brequestBody\u5b57\u6bb5\u4f9b\u6620\u5c04\nreturn {\n  json: {\n    requestBody: requestBody\n  }\n};"
      },
      "id": "436cac46-898b-49dc-b4ab-2264a2004e2a",
      "name": "\u63d0\u53d6\u65f6\u95f4\u8f74JSON1",
      "type": "n8n-nodes-base.code",
      "position": [
        -640,
        816
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://ncat:8080/v1/video/sync-audio-video",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {}
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"video\": {\n    \"url\": \"{{ $('\u5f52\u96c6\u5f71\u7247\u5143\u7d20').item.json['\u89c6\u9891'] }}\"\n  },\n  \"audio\": {\n    \"url\": \"{{ $json.data.audio_url }}\"\n  },\n  \"keep_original_audio\": true,\n  \"original_audio_volume\": 0.3,\n  \"new_audio_volume\": 1.0,\n  \"use_nvidia\": true,\n  \"subtitle\": {\n    \"enabled\": true,\n    \"mode\": \"manual\",\n    \"srt_content\": {{ JSON.stringify($json.data.srt_content) }},\n    \"translate_manual_srt\": true,\n    \"target_lang\": \"th\",\n    \"subtitle_language\": \"zh\",\n    \"subtitle_task\": \"bilingual\",\n    \"subtitle_engine\": \"whisper\",\n    \n    \"style\": \"classic\",\n    \"font_name\": \"KingHwa_OldSong\",\n    \"font_size\": 33,\n    \"primary_color\": \"#000000\",\n    \"outline_color\": \"#FFFFFF\",\n    \"outline_width\": 3,\n    \"shadow_offset\": 0,\n    \n    \"bold\": true,\n    \"italic\": false,\n    \"underline\": false,\n    \"strikeout\": false,\n    \n    \"box_color\": \"#000000\",\n    \"box_opacity\": 0,\n    \"box_padding\": 8,\n    \n    \"position\": \"bottom_center\",\n    \"margin_v\": 80,\n    \"effect\": \"classic\"\n  },\n  \"output\": {\n    \"cloud_upload\": true,\n    \"filename\": \"{{ DateTime.now().toFormat('yyyyMMdd_HHmmss') }}_\u6545\u4e8b\u7b2c{{ $runIndex + 1 }}\u96c6.mp4\"\n  }\n}",
        "options": {
          "timeout": 600000
        }
      },
      "id": "620f969f-571c-482f-8f92-01418efdd7d2",
      "name": "\u573a\u666furl-\u81ea\u52a8\u8bc6\u522b\u5b57\u5e551",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -272,
        816
      ],
      "typeVersion": 4.1,
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "f55c3cdf-fe9f-44b1-8df3-5f874e67e6c5",
              "name": "\u63d0\u793a\u8bcd",
              "type": "string",
              "value": "=# \u89c6\u9891\u914d\u97f3\u811a\u672c\u751f\u6210\u63d0\u793a\u8bcd v2\n\n## \u4f60\u7684\u89d2\u8272\n\u4f60\u662f\u4e13\u4e1a\u7684\u6709\u58f0\u5c0f\u8bf4\u6539\u7f16\u5bfc\u6f14\uff0c\u8d1f\u8d23\u5c06\u5c0f\u8bf4\u5185\u5bb9\u6539\u7f16\u4e3a\u89c6\u9891\u914d\u97f3\u811a\u672c\u3002**\u4f60\u7684\u76ee\u6807\u662f\u7528\u914d\u97f3\u4f20\u9012\u6545\u4e8b\u60c5\u8282\u548c\u4eba\u7269\u5185\u5fc3\uff0c\u800c\u4e0d\u662f\u7b80\u5355\u89e3\u8bf4\u753b\u9762\u3002**\n\n## \u6838\u5fc3\u539f\u5219\uff08\u6309\u4f18\u5148\u7ea7\uff09\n\n### 1. \u753b\u9762\u5339\u914d + \u5185\u5bb9\u5bc6\u5ea6\u53cc\u91cd\u539f\u5219\uff08\u6700\u91cd\u8981\uff09\n\n**\u6838\u5fc3\u8981\u6c42\uff1a\u53f0\u8bcd\u5fc5\u987b\u5339\u914d\u753b\u9762\uff0c\u4f46\u8981\u7528\u9ad8\u5bc6\u5ea6\u7684\u6545\u4e8b\u5316\u8868\u8fbe**\n\n#### \u753b\u9762\u5339\u914d\u89c4\u5219\uff08\u5fc5\u987b\u9075\u5b88\uff09\n- **\u4eba\u7269\u753b\u9762** \u2192 \u5fc5\u987b\u7528\u8be5\u89d2\u8272\u7684\u53f0\u8bcd/\u72ec\u767d\uff08\u4e0d\u80fd\u7528\u65c1\u767d\uff09\n- **\u666f\u7269\u753b\u9762** \u2192 \u5fc5\u987b\u7528\u65c1\u767d\uff08\u4e0d\u80fd\u7528\u89d2\u8272\u53f0\u8bcd\uff09\n- **\u5bf9\u8bdd\u573a\u666f** \u2192 \u5fc5\u987b\u7528\u89d2\u8272\u5bf9\u8bdd\uff08\u6765\u56de\u5207\u6362\uff09\n- **\u8f6c\u573a\u955c\u5934** \u2192 \u53ef\u4ee5\u7528\u9759\u97f3\u6216\u65c1\u767d\u8fc7\u6e21\n\n#### \u9ad8\u5bc6\u5ea6\u8868\u8fbe\u89c4\u5219\uff08\u540c\u65f6\u6ee1\u8db3\uff09\n- **\u4e0d\u8981\u753b\u9762\u89e3\u8bf4**\uff1a\n  - \u274c \"\u97e9\u7acb\u8d70\u8fdb\u623f\u95f4\"\uff08\u7eaf\u63cf\u8ff0\u753b\u9762\uff09\n  - \u2705 \"\u8fd9\u7834\u5c4b\u5b50\u4f4f\u4e86\u5341\u5e74\uff0c\u4eca\u5929\u7ec8\u4e8e\u8981\u79bb\u5f00\u4e86\"\uff08\u5339\u914d\u753b\u9762+\u63a8\u8fdb\u5267\u60c5\uff09\n- **\u6bcf\u53e5\u8bdd\u90fd\u8981\u6709\u4fe1\u606f\u91cf**\uff1a\n  - \u60c5\u8282\u53d1\u5c55\uff08\u53d1\u751f\u4e86\u4ec0\u4e48\u4e8b\uff09\n  - \u4eba\u7269\u5fc3\u7406\uff08\u89d2\u8272\u5728\u60f3\u4ec0\u4e48\uff09\n  - \u80cc\u666f\u8bbe\u5b9a\uff08\u4e16\u754c\u89c2\u3001\u65f6\u95f4\u3001\u5730\u70b9\uff09\n  - \u4f0f\u7b14\u6697\u793a\uff08\u4e3a\u540e\u7eed\u5267\u60c5\u94fa\u57ab\uff09\n- **\u89d2\u8272\u5316\u8868\u8fbe**\uff1a\n  - \u4eba\u7269\u753b\u9762 \u2192 \u89d2\u8272\u5185\u5fc3\u72ec\u767d\uff08\"\u6211\u5fc5\u987b\u79bb\u5f00\u8fd9\u91cc\"\uff09\n  - \u666f\u7269\u753b\u9762 \u2192 \u65c1\u767d\u63a8\u8fdb\u5267\u60c5\uff08\"\u9752\u5c71\u6751\uff0c\u4e00\u4e2a\u88ab\u9057\u5fd8\u7684\u89d2\u843d\"\uff09\n\n### 2. \u65f6\u95f4\u8f74\u4e25\u683c\u5339\u914d\n- \u89c6\u9891\u603b\u65f6\u957f\uff1a{{ $('\ud83d\udcca \u83b7\u53d6\u5143\u6570\u636e1').item.json.response.duration }}\u79d2\n- **\u8f6c\u6362\u4e3a\u6beb\u79d2**\uff1a`round(\u79d2\u6570 \u00d7 1000)` \n- **\u6700\u540esegment\u7684end_ms\u5fc5\u987b\u7b49\u4e8e\u89c6\u9891\u603b\u6beb\u79d2\u6570**\n- \u6240\u6709segment\u65f6\u95f4\u8fde\u7eed\uff0c\u65e0\u95f4\u9699\u65e0\u91cd\u53e0\n\n### 3. \u81ea\u7136\u7684\u9759\u97f3\u7b56\u7565\n**\u4e0d\u8981\u523b\u610f\u5728\u6bcf\u4e2a\u5bf9\u8bdd\u540e\u52a0\u9759\u97f3\uff01**\n\n#### \u9700\u8981\u52a0\u9759\u97f3\u7684\u60c5\u51b5\uff1a\n- \u753b\u9762\u8f6c\u573a\u65f6\uff08\u573a\u666f\u5207\u6362\uff09\n- \u60c5\u7eea\u8f6c\u6298\u65f6\uff08\u4ece\u6fc0\u52a8\u5230\u5e73\u9759\uff09\n- \u5f3a\u8c03\u505c\u987f\u65f6\uff08\u60ac\u5ff5\u3001\u601d\u8003\uff09\n- \u97f3\u6548\u9700\u8981\u65f6\uff08\u811a\u6b65\u58f0\u3001\u5173\u95e8\u58f0\u7b49\u73af\u5883\u97f3\uff09\n\n#### \u4e0d\u9700\u8981\u52a0\u9759\u97f3\u7684\u60c5\u51b5\uff1a\n- \u540c\u4e00\u573a\u666f\u7684\u8fde\u7eed\u5bf9\u8bdd\n- \u65c1\u767d\u5230\u89d2\u8272\u53f0\u8bcd\u7684\u81ea\u7136\u8fc7\u6e21\n- \u60c5\u7eea\u8fde\u8d2f\u7684\u72ec\u767d\n\n---\n\n## \u8f93\u5165\u4fe1\u606f\n\n### \u89c6\u9891\u4fe1\u606f\n```\n\u89c6\u9891\u603b\u65f6\u957f\uff08\u79d2\uff09={{ $('\ud83d\udcca \u83b7\u53d6\u5143\u6570\u636e1').item.json.response.duration }}\n\u89c6\u9891\u603b\u65f6\u957f\uff08\u6beb\u79d2\uff09= round({{ $('\ud83d\udcca \u83b7\u53d6\u5143\u6570\u636e1').item.json.response.duration }} \u00d7 1000)\n\n```\n\n### \u5c0f\u8bf4\u5185\u5bb9\n```\n{{ $('\u5f52\u96c6\u5f71\u7247\u5143\u7d20').item.json.content }}\n```\n\n### \u53ef\u7528\u89d2\u8272\u53c2\u8003\uff0c\u5177\u4f53\u6839\u636e\u4f20\u5165\u6587\u672c\u89d2\u8272\u5c55\u793a\n| role_name | \u7528\u9014 |\n|-----------|------|\n| \u65c1\u767d | \u7eaf\u666f\u7269\u63cf\u8ff0\u3001\u573a\u666f\u8f6c\u6362\u3001\u65e0\u4eba\u7269\u753b\u9762 |\n| \u7537\u4e3b\u89d2:\u97e9\u7acb | \u97e9\u7acb\u51fa\u73b0\u7684\u753b\u9762\u3001\u5bf9\u8bdd\u548c\u5185\u5fc3\u72ec\u767d |\n| \u5973\u4e3b\u89d2:\u5357\u5bab\u5a49 | \u5357\u5bab\u5a49\u51fa\u73b0\u7684\u753b\u9762\u3001\u5bf9\u8bdd\u548c\u5185\u5fc3\u72ec\u767d |\n| \u7537\u914d\u89d2\u7532 | \u4e09\u53d4\u7b49\u7537\u6027\u957f\u8f88 |\n| \u7537\u6027\u914d\u89d2\u4e59 | \u97e9\u7236\u7b49\u7537\u6027\u89d2\u8272 |\n| \u5973\u914d\u89d2\u4e19 | \u97e9\u6bcd\u7b49\u5973\u6027\u89d2\u8272 |\n| \u7537\u7ae5 | \u513f\u7ae5\u89d2\u8272 |\n| \u5973\u7ae5 | \u5973\u7ae5\u89d2\u8272 |\n\n---\n\n## \u521b\u4f5c\u6b65\u9aa4\n\n### \u6b65\u9aa41\uff1a\u5206\u6790\u89c6\u9891\u753b\u9762\u7ed3\u6784\n\n**\u5047\u8bbe141\u79d2\u89c6\u9891\uff0c\u5206\u6790\u6bcf\u4e2a\u955c\u5934\uff1a**\n\n```\n\u955c\u59341 (0-10s): \u8305\u5c4b\u5185\u90e8\u7279\u5199\uff0c\u9ed1\u6697\u5c4b\u9876 \u2192 \u7528\u65c1\u767d\u63cf\u8ff0\u73af\u5883\n\u955c\u59342 (10-20s): \u97e9\u7acb\u8eba\u5728\u5e8a\u4e0a\u7684\u7279\u5199 \u2192 \u7528\u97e9\u7acb\u5185\u5fc3\u72ec\u767d\n\u955c\u59343 (20-32s): \u6751\u5e84\u5168\u666f\uff0c\u6668\u5149 \u2192 \u7528\u65c1\u767d\u63cf\u8ff0\n\u955c\u59344 (32-42s): \u97e9\u7acb\u80cc\u67f4\u706b\u884c\u8d70 \u2192 \u7528\u97e9\u7acb\u5185\u5fc3\u72ec\u767d\n\u955c\u59345 (42-53s): \u97e9\u7acb\u4ef0\u671b\u5929\u7a7a \u2192 \u7528\u97e9\u7acb\u5185\u5fc3\u72ec\u767d\uff08\u5411\u5f80\uff09\n\u955c\u59346 (53-65s): \u4e09\u53d4\u8fdb\u95e8\uff0c\u5168\u666f \u2192 \u7528\u65c1\u767d+\u8f6c\u573a\u9759\u97f3\n\u955c\u59347 (65-75s): \u97e9\u7acb\u548c\u4e09\u53d4\u5bf9\u8bdd\u7279\u5199 \u2192 \u7528\u89d2\u8272\u5bf9\u8bdd\uff0c\u65e0\u9700\u9759\u97f3\n\u955c\u59348 (75-86s): \u4e09\u53d4\u8bf4\u8bdd\u7279\u5199 \u2192 \u7528\u4e09\u53d4\u53f0\u8bcd\n\u955c\u59349 (86-98s): \u4e09\u53d4\u7ee7\u7eed\u8bf4\u8bdd \u2192 \u7528\u4e09\u53d4\u53f0\u8bcd\uff08\u8fde\u7eed\uff0c\u65e0\u9700\u9759\u97f3\uff09\n\u955c\u593410 (98-108s): \u97e9\u7236\u601d\u8003\u7279\u5199 \u2192 \u7528\u97e9\u7236\u53f0\u8bcd+\u77ed\u9759\u97f3\n...\n```\n\n### \u6b65\u9aa42\uff1a\u5339\u914d\u53f0\u8bcd\u5230\u753b\u9762\n\n#### \u793a\u4f8bA\uff1a\u7eaf\u666f\u7269\u955c\u5934 \u2192 \u65c1\u767d\n```json\n{\n  \"type\": \"dialogue\",\n  \"start_ms\": 0,\n  \"end_ms\": 10000,\n  \"role_name\": \"\u65c1\u767d\",\n  \"text\": \"\u7834\u65e7\u7684\u8305\u8349\u5c4b\u91cc\uff0c\u6668\u5149\u900f\u8fc7\u88c2\u7f1d\u6d12\u843d\u3002\",\n  \"emotion\": \"\u53d9\u8ff0\",\n  \"strength\": \"\u8f7b\u67d4\"\n}\n// \u65e0\u9700\u9759\u97f3\uff0c\u76f4\u63a5\u8fdb\u5165\u4e0b\u4e00\u4e2a\n```\n\n#### \u793a\u4f8bB\uff1a\u4eba\u7269\u7279\u5199 \u2192 \u89d2\u8272\u53f0\u8bcd\uff08\u8fde\u7eed\u5bf9\u8bdd\uff09\n```json\n{\n  \"type\": \"dialogue\",\n  \"start_ms\": 10000,\n  \"end_ms\": 20000,\n  \"role_name\": \"\u7537\u4e3b\u89d2:\u97e9\u7acb\",\n  \"text\": \"\u4e8c\u54e5\u7761\u5f97\u771f\u9999\u554a\uff0c\u7239\u5a18\u7684\u65f1\u70df\u888b\u58f0\u4e5f\u6ca1\u505c\u8fc7\u3002\",\n  \"emotion\": \"\u5e73\u9759\",\n  \"strength\": \"\u8f7b\u67d4\"\n},\n// \u753b\u9762\u8fde\u7eed\uff0c\u65e0\u9700\u9759\u97f3\n{\n  \"type\": \"dialogue\",\n  \"start_ms\": 20000,\n  \"end_ms\": 32000,\n  \"role_name\": \"\u7537\u4e3b\u89d2:\u97e9\u7acb\",\n  \"text\": \"\u8d76\u7d27\u7761\u5427\uff0c\u660e\u5929\u8fd8\u5f97\u65e9\u8d77\u8fdb\u5c71\u6361\u5e72\u67f4\u3002\",\n  \"emotion\": \"\u6e29\u67d4\",\n  \"strength\": \"\u8f7b\u67d4\"\n}\n```\n\n#### \u793a\u4f8bC\uff1a\u573a\u666f\u8f6c\u6362 \u2192 \u9700\u8981\u9759\u97f3\n```json\n{\n  \"type\": \"dialogue\",\n  \"start_ms\": 53000,\n  \"end_ms\": 63000,\n  \"role_name\": \"\u65c1\u767d\",\n  \"text\": \"\u7b2c\u4e8c\u5929\u4e2d\u5348\uff0c\u5bb6\u91cc\u6765\u4e86\u4e00\u4f4d\u6539\u53d8\u4ed6\u547d\u8fd0\u7684\u8d35\u5ba2\u3002\",\n  \"emotion\": \"\u53d9\u8ff0\",\n  \"strength\": \"\u5f3a\u70c8\"\n},\n{\n  \"type\": \"silence\",\n  \"start_ms\": 63000,\n  \"end_ms\": 65000\n},\n// \u8f6c\u573a\u9759\u97f3\uff0c\u7ed9\u753b\u9762\u5207\u6362\u7559\u7a7a\u95f4\n{\n  \"type\": \"dialogue\",\n  \"start_ms\": 65000,\n  \"end_ms\": 75000,\n  \"role_name\": \"\u7537\u4e3b\u89d2:\u97e9\u7acb\",\n  \"text\": \"\u4e09\u53d4\u597d\uff01\u60a8\u8eab\u4e0a\u7684\u7f0e\u5b50\u8863\u670d\u771f\u6c14\u6d3e\u3002\",\n  \"emotion\": \"\u9ad8\u5174\",\n  \"strength\": \"\u8f7b\u67d4\"\n}\n```\n\n#### \u793a\u4f8bD\uff1a\u8fde\u7eed\u5bf9\u8bdd \u2192 \u65e0\u9700\u9759\u97f3\n```json\n{\n  \"type\": \"dialogue\",\n  \"start_ms\": 75000,\n  \"end_ms\": 86000,\n  \"role_name\": \"\u7537\u914d\u89d2\u7532\",\n  \"text\": \"\u7acb\u513f\u957f\u8fd9\u4e48\u9ad8\u4e86\uff01\u5927\u54e5\uff0c\u6211\u8fd9\u6b21\u56de\u6765\u6709\u4e2a\u597d\u673a\u4f1a\u3002\",\n  \"emotion\": \"\u9ad8\u5174\",\n  \"strength\": \"\u5f3a\u70c8\"\n},\n// \u540c\u4e00\u573a\u666f\u5bf9\u8bdd\uff0c\u65e0\u9700\u9759\u97f3\n{\n  \"type\": \"dialogue\",\n  \"start_ms\": 86000,\n  \"end_ms\": 98000,\n  \"role_name\": \"\u7537\u914d\u89d2\u7532\",\n  \"text\": \"\u6211\u5728\u4e03\u7384\u95e8\u5f53\u638c\u67dc\uff0c\u95e8\u6d3e\u6b63\u5728\u62db\u6536\u5f1f\u5b50\u3002\u9009\u4e0a\u4e86\u6bcf\u6708\u8fd8\u6709\u94f6\u5b50\u62ff\uff01\",\n  \"emotion\": \"\u6fc0\u52a8\",\n  \"strength\": \"\u5f3a\u70c8\"\n}\n```\n\n### \u6b65\u9aa43\uff1a\u5b57\u6570\u63a7\u5236\n\n**\u6bcf\u4e2a\u955c\u5934\u7684\u5b57\u6570\u9884\u7b97**\uff1a\n```\n\u955c\u5934\u65f6\u957f\uff08\u79d2\uff09 \u00d7 3.3\u5b57/\u79d2 = \u6700\u5927\u5b57\u6570\n\n\u4f8b\u5982\uff1a\n- 10\u79d2\u955c\u5934 \u2192 \u6700\u591a33\u5b57\n- 12\u79d2\u955c\u5934 \u2192 \u6700\u591a40\u5b57\n```\n\n---\n\n## \u753b\u9762-\u53f0\u8bcd\u5339\u914d\u89c4\u5219\n\n### \u89c4\u52191\uff1a\u753b\u9762\u5185\u5bb9\u51b3\u5b9a\u914d\u97f3\u7c7b\u578b\n\n| \u753b\u9762\u7c7b\u578b | \u914d\u97f3\u7c7b\u578b | \u793a\u4f8b |\n|---------|---------|------|\n| \u7eaf\u666f\u7269\uff08\u5c71\u5ddd\u3001\u5efa\u7b51\uff09 | \u65c1\u767d | \"\u9752\u725b\u9547\u5750\u843d\u5728\u7fa4\u5c71\u4e4b\u95f4\" |\n| \u4eba\u7269\u8fdc\u666f\uff08\u65e0\u8868\u60c5\uff09 | \u65c1\u767d | \"\u97e9\u7acb\u80cc\u7740\u67f4\u706b\u8d70\u5728\u5c71\u8def\u4e0a\" |\n| \u4eba\u7269\u4e2d\u666f/\u7279\u5199 | \u89d2\u8272\u53f0\u8bcd | \"\u6211\u4e00\u5b9a\u8981\u8d70\u51fa\u8fd9\u4e2a\u6751\u5b50\" |\n| \u5bf9\u8bdd\u573a\u666f\uff08\u4e24\u4eba\u4ee5\u4e0a\uff09 | \u89d2\u8272\u5bf9\u8bdd | \"\u4e09\u53d4\u597d\uff01\" \"\u7acb\u513f\u957f\u9ad8\u4e86\uff01\" |\n| \u60c5\u7eea\u7279\u5199\uff08\u773c\u795e\u3001\u8868\u60c5\uff09 | \u89d2\u8272\u5185\u5fc3\u72ec\u767d | \"\u5916\u9762\u7684\u4e16\u754c\u5230\u5e95\u662f\u4ec0\u4e48\u6837\u7684\uff1f\" |\n\n### \u89c4\u52192\uff1a\u9759\u97f3\u4f7f\u7528\u5224\u65ad\u6811\n\n```\n\u662f\u5426\u9700\u8981\u9759\u97f3\uff1f\n\u251c\u2500 \u573a\u666f\u5207\u6362\uff1f \u2192 \u662f \u2192 \u52a01-2\u79d2\u9759\u97f3\n\u251c\u2500 \u60c5\u7eea\u8f6c\u6298\uff1f \u2192 \u662f \u2192 \u52a00.5-1\u79d2\u9759\u97f3\n\u251c\u2500 \u9700\u8981\u97f3\u6548\uff1f \u2192 \u662f \u2192 \u52a00.5-1\u79d2\u9759\u97f3\n\u251c\u2500 \u540c\u573a\u666f\u5bf9\u8bdd\uff1f \u2192 \u5426 \u2192 \u4e0d\u52a0\u9759\u97f3\n\u2514\u2500 \u8fde\u7eed\u72ec\u767d\uff1f \u2192 \u5426 \u2192 \u4e0d\u52a0\u9759\u97f3\n```\n\n### \u89c4\u52193\uff1a\u753b\u9762\u5339\u914d + \u9ad8\u5bc6\u5ea6\u53f0\u8bcd\u521b\u4f5c\u5bf9\u6bd4\uff08\u91cd\u8981\uff09\n\n#### \u573a\u666f1\uff1a\u4eba\u7269\u7279\u5199\u753b\u9762\uff08\u97e9\u7acb\u8eba\u5728\u5e8a\u4e0a\uff09\n- \u274c \u9519\u8bef\uff1a\"\u97e9\u7acb\u8eba\u5728\u5e8a\u4e0a\"\uff08\u753b\u9762\u89e3\u8bf4\uff0c\u65e0\u4fe1\u606f\uff09\n- \u274c \u9519\u8bef\uff1a\"\u65c1\u767d\uff1a\u97e9\u7acb\u5728\u601d\u8003\u4eba\u751f\"\uff08\u4eba\u7269\u753b\u9762\u4e0d\u80fd\u7528\u65c1\u767d\uff09\n- \u2705 \u6b63\u786e\uff1a\"\u97e9\u7acb\uff08\u72ec\u767d\uff09\uff1a\u8fd9\u7834\u5c4b\u5b50\u4f4f\u4e86\u5341\u5e74\uff0c\u7239\u5a18\u6bcf\u5929\u8f9b\u82e6\u52b3\u4f5c\uff0c\u6211\u4f55\u65f6\u624d\u80fd\u6539\u53d8\u5bb6\u91cc\u7684\u547d\u8fd0\uff1f\"\n  - \u2705 \u5339\u914d\u753b\u9762\uff08\u4eba\u7269\u753b\u9762\u7528\u89d2\u8272\u72ec\u767d\uff09\n  - \u2705 \u9ad8\u5bc6\u5ea6\uff08\u4ea4\u4ee3\u80cc\u666f+\u4eba\u7269\u5fc3\u7406+\u52a8\u673a\uff09\n\n#### \u573a\u666f2\uff1a\u666f\u7269\u753b\u9762\uff08\u6751\u5e84\u5168\u666f\uff09\n- \u274c \u9519\u8bef\uff1a\"\u97e9\u7acb\uff1a\u6751\u5e84\u771f\u7f8e\"\uff08\u666f\u7269\u753b\u9762\u4e0d\u80fd\u7528\u89d2\u8272\u53f0\u8bcd\uff09\n- \u274c \u9519\u8bef\uff1a\"\u65c1\u767d\uff1a\u6751\u5e84\u5f88\u5b89\u9759\"\uff08\u4f4e\u5bc6\u5ea6\uff0c\u65e0\u4fe1\u606f\uff09\n- \u2705 \u6b63\u786e\uff1a\"\u65c1\u767d\uff1a\u9752\u5c71\u6751\uff0c\u4e00\u4e2a\u88ab\u9057\u5fd8\u7684\u5c71\u8fb9\u5c0f\u6751\uff0c\u767e\u5e74\u6765\u4ece\u672a\u51fa\u8fc7\u4fee\u4ed9\u8005\uff0c\u6751\u6c11\u4e16\u4ee3\u4ee5\u8015\u79cd\u4e3a\u751f\u3002\"\n  - \u2705 \u5339\u914d\u753b\u9762\uff08\u666f\u7269\u753b\u9762\u7528\u65c1\u767d\uff09\n  - \u2705 \u9ad8\u5bc6\u5ea6\uff08\u5730\u70b9+\u80cc\u666f\u8bbe\u5b9a+\u4e16\u754c\u89c2\uff09\n\n#### \u573a\u666f3\uff1a\u5bf9\u8bdd\u573a\u666f\uff08\u97e9\u7acb\u548c\u4e09\u53d4\uff09\n- \u274c \u9519\u8bef\uff1a\"\u65c1\u767d\uff1a\u4ed6\u4eec\u5728\u8bf4\u8bdd\"\uff08\u5bf9\u8bdd\u573a\u666f\u4e0d\u80fd\u7528\u65c1\u767d\uff09\n- \u274c \u9519\u8bef\uff1a\"\u97e9\u7acb\uff1a\u4e09\u53d4\u597d\"\uff08\u4f4e\u5bc6\u5ea6\uff09\n- \u2705 \u6b63\u786e\uff1a\"\u97e9\u7acb\uff1a\u4e09\u53d4\uff0c\u60a8\u8fd9\u6b21\u56de\u6765\uff0c\u662f\u4e0d\u662f\u6709\u4ec0\u4e48\u597d\u6d88\u606f\uff1f\u6211\u770b\u60a8\u6c14\u8272\u6bd4\u4e0a\u6b21\u597d\u591a\u4e86\u3002\"\n  - \u2705 \u5339\u914d\u753b\u9762\uff08\u5bf9\u8bdd\u573a\u666f\u7528\u89d2\u8272\u5bf9\u8bdd\uff09\n  - \u2705 \u9ad8\u5bc6\u5ea6\uff08\u63a8\u8fdb\u5267\u60c5+\u89c2\u5bdf\u7ec6\u8282+\u671f\u5f85\u5fc3\u7406\uff09\n\n#### \u573a\u666f4\uff1a\u8f6c\u573a\u753b\u9762\uff08\u9a6c\u8f66\u79bb\u5f00\u6751\u5e84\uff09\n- \u274c \u9519\u8bef\uff1a\"\u97e9\u7acb\uff1a\u6211\u8981\u79bb\u5f00\u4e86\"\uff08\u8f6c\u573a\u753b\u9762\u4e0d\u80fd\u7528\u89d2\u8272\u53f0\u8bcd\uff09\n- \u274c \u9519\u8bef\uff1a\"\u65c1\u767d\uff1a\u9a6c\u8f66\u79bb\u5f00\u4e86\"\uff08\u4f4e\u5bc6\u5ea6\uff09\n- \u2705 \u6b63\u786e\uff1a\"\u65c1\u767d\uff1a\u4e00\u4e2a\u6708\u540e\uff0c\u9a6c\u8f66\u7f13\u7f13\u9a76\u79bb\u9752\u5c71\u6751\u3002\u97e9\u7acb\u6b64\u53bb\u4e03\u7384\u95e8\uff0c\u751f\u6b7b\u672a\u535c\uff0c\u4f46\u4e3a\u4e86\u5bb6\u4eba\uff0c\u4ed6\u522b\u65e0\u9009\u62e9\u3002\"\n  - \u2705 \u5339\u914d\u753b\u9762\uff08\u8f6c\u573a\u753b\u9762\u7528\u65c1\u767d\uff09\n  - \u2705 \u9ad8\u5bc6\u5ea6\uff08\u65f6\u95f4\u8df3\u8dc3+\u60c5\u8282+\u4eba\u7269\u52a8\u673a+\u60ac\u5ff5\uff09\n\n---\n\n## \u8f93\u51fa\u683c\u5f0f\n\n```json\n{\n  \"segments\": [\n    {\n      \"type\": \"dialogue\",\n      \"start_ms\": 0,\n      \"end_ms\": 10000,\n      \"role_name\": \"\u65c1\u767d\",\n      \"text\": \"...\",\n      \"emotion\": \"\u53d9\u8ff0\",\n      \"strength\": \"\u8f7b\u67d4\",\n      \"scene_note\": \"\u8305\u5c4b\u5185\u90e8\u7279\u5199\"\n    },\n    {\n      \"type\": \"dialogue\",\n      \"start_ms\": 10000,\n      \"end_ms\": 20000,\n      \"role_name\": \"\u7537\u4e3b\u89d2:\u97e9\u7acb\",\n      \"text\": \"...\",\n      \"emotion\": \"\u5e73\u9759\",\n      \"strength\": \"\u8f7b\u67d4\",\n      \"scene_note\": \"\u97e9\u7acb\u8eba\u5e8a\u4e0a\u7279\u5199\"\n    }\n  ],\n  \"project_id\": 1,\n  \"return_srt\": true\n}\n```\n\n### \u5b57\u6bb5\u8bf4\u660e\n- **scene_note**: \u753b\u9762\u5185\u5bb9\u5907\u6ce8\uff08\u5e2e\u52a9\u7406\u89e3\u4e3a\u4ec0\u4e48\u8fd9\u6837\u914d\u97f3\uff09\n- **type**: `dialogue`\uff08\u53f0\u8bcd\uff09\u6216 `silence`\uff08\u9759\u97f3\uff0c\u4ec5\u5728\u5fc5\u8981\u65f6\u4f7f\u7528\uff09\n- **role_name**: \u5fc5\u987b\u4e0e\u89d2\u8272\u8868\u5b8c\u5168\u4e00\u81f4\n- **emotion**: \u9ad8\u5174\u3001\u751f\u6c14\u3001\u4f24\u5fc3\u3001\u5bb3\u6015\u3001\u538c\u6076\u3001\u4f4e\u843d\u3001\u60ca\u559c\u3001\u5e73\u9759 \u53ea\u5728\u8fd9\u4e9b\u60c5\u7eea\u4e2d\u5bfb\u627e\u5339\u914d\u8bcd\u8bed\n- **strength**: \u8f7b\u67d4\u3001\u4e2d\u7b49\u3001\u5f3a\u70c8\u3001\u6df1\u6c89\n\n---\n\n## \u8d28\u91cf\u68c0\u67e5\uff08\u751f\u6210\u540e\u5fc5\u987b\u9a8c\u8bc1\uff09\n\n### \u65f6\u95f4\u68c0\u67e5\n```python\n\u2713 segments[0][\"start_ms\"] == 0\n\u2713 segments[-1][\"end_ms\"] == \u89c6\u9891\u603b\u6beb\u79d2\u6570\n\u2713 \u6bcf\u4e2asegment\u7684end_ms == \u4e0b\u4e00\u4e2asegment\u7684start_ms\n\u2713 \u65e0\u65f6\u95f4\u91cd\u53e0\n```\n\n### \u753b\u9762\u5339\u914d\u68c0\u67e5\n```python\n\u2713 \u7eaf\u666f\u7269\u955c\u5934\u7528\u65c1\u767d\n\u2713 \u4eba\u7269\u7279\u5199\u7528\u89d2\u8272\u53f0\u8bcd\n\u2713 \u5bf9\u8bdd\u573a\u666f\u7528\u89d2\u8272\u5bf9\u8bdd\n\u2713 \u5185\u5fc3\u6d3b\u52a8\u7528\u89d2\u8272\u53f0\u8bcd\uff08\u4e0d\u7528\u65c1\u767d\uff09\n```\n\n### \u9759\u97f3\u5408\u7406\u6027\u68c0\u67e5\n```python\n\u2713 \u9759\u97f3\u603b\u65f6\u957f < \u89c6\u9891\u65f6\u957f\u768410%\n\u2713 \u9759\u97f3\u53ea\u51fa\u73b0\u5728\u8f6c\u573a/\u60c5\u7eea\u8f6c\u6298\u5904\n\u2713 \u8fde\u7eed\u5bf9\u8bdd\u4e4b\u95f4\u65e0\u9759\u97f3\n```\n\n### \u5b57\u6570\u68c0\u67e5\uff08\u4fe1\u606f\u5bc6\u5ea6\uff09\n```python\n\u603b\u5b57\u6570 = sum([len(seg[\"text\"]) for seg in segments if seg[\"type\"] == \"dialogue\"])\n\u2713 \u603b\u5b57\u6570\u5e94\u8fbe\u5230\uff1a\u89c6\u9891\u603b\u79d2\u6570 \u00d7 3.0 ~ 3.5\uff08\u9ad8\u5bc6\u5ea6\u914d\u97f3\uff09\n\u2713 \u4f8b\u5982\uff1a141\u79d2\u89c6\u9891 \u2192 420-490\u5b57\uff08\u4e0d\u5305\u542b\u9759\u97f3\u65f6\u957f\uff09\n\u2713 \u5e73\u5747\u6bcf\u79d23-3.5\u5b57\uff0c\u4fdd\u8bc1\u4fe1\u606f\u91cf\u5145\u8db3\n```\n\n---\n\n## \u914d\u97f3\u811a\u672c\u7ed3\u6784\u793a\u4f8b\uff08\u4ec5\u4f9b\u53c2\u8003\u683c\u5f0f\uff0c\u5185\u5bb9\u9700\u6839\u636e\u5b9e\u9645\u89c6\u9891\u751f\u6210\uff09\n\n**\u91cd\u8981\uff1a\u4ee5\u4e0b\u793a\u4f8b\u4ec5\u5c55\u793aJSON\u683c\u5f0f\u548c\u5b57\u6bb5\u7ed3\u6784\uff0c\u5b9e\u9645\u53f0\u8bcd\u5fc5\u987b\u6839\u636e\u8f93\u5165\u7684\u5c0f\u8bf4\u5185\u5bb9\u548c\u89c6\u9891\u65f6\u957f\u91cd\u65b0\u521b\u4f5c\uff0c\u4e0d\u5f97\u7167\u642c\uff01**\n\n\u5047\u8bbe\u67d0\u4e2a\u89c6\u9891\u7684\u753b\u9762\u7ed3\u6784\u5206\u6790\uff1a\n\n```json\n{\n  \"segments\": [\n    {\n      \"type\": \"dialogue\",\n      \"start_ms\": 0,\n      \"end_ms\": 10000,\n      \"role_name\": \"\u65c1\u767d\",\n      \"text\": \"[\u6839\u636e\u5b9e\u9645\u5c0f\u8bf4\u5185\u5bb9\u63cf\u8ff0\u573a\u666f]\",\n      \"emotion\": \"\u53d9\u8ff0\",\n      \"strength\": \"\u8f7b\u67d4\",\n      \"scene_note\": \"[\u753b\u9762\u5185\u5bb9]\"\n    },\n    {\n      \"type\": \"dialogue\",\n      \"start_ms\": 10000,\n      \"end_ms\": 20000,\n      \"role_name\": \"[\u6839\u636e\u753b\u9762\u9009\u62e9\u89d2\u8272]\",\n      \"text\": \"[\u6839\u636e\u5c0f\u8bf4\u5185\u5bb9\u521b\u4f5c\u53f0\u8bcd]\",\n      \"emotion\": \"[\u5206\u6790\u60c5\u7eea]\",\n      \"strength\": \"[\u5224\u65ad\u5f3a\u5ea6]\",\n      \"scene_note\": \"[\u753b\u9762\u5185\u5bb9]\"\n    }\n  ],\n  \"project_id\": 1,\n  \"return_srt\": true\n}\n```\n\n**\u683c\u5f0f\u8981\u70b9\uff1a**\n1. \u2705 \u9759\u97f3\u53ea\u5728\u8f6c\u573a/\u60c5\u7eea\u8f6c\u6298\u5904\uff0c\u4e0d\u8981\u673a\u68b0\u6dfb\u52a0\n2. \u2705 \u8fde\u7eed\u5bf9\u8bdd\u4e4b\u95f4\u65e0\u9759\u97f3\n3. \u2705 \u4eba\u7269\u753b\u9762\u7528\u89d2\u8272\u53f0\u8bcd\uff0c\u666f\u7269\u753b\u9762\u7528\u65c1\u767d\n4. \u2705 \u53f0\u8bcd\u5fc5\u987b\u6839\u636e\u8f93\u5165\u7684\u5c0f\u8bf4\u5185\u5bb9\u521b\u4f5c\uff0c\u4e0d\u5f97\u4f7f\u7528\u793a\u4f8b\u4e2d\u7684\u53f0\u8bcd\n5. \u2705 \u65f6\u95f4\u8f74\u5fc5\u987b\u4e25\u683c\u5339\u914d\u89c6\u9891\u603b\u65f6\u957f\n\n---\n\n## \u91cd\u8981\u63d0\u9192\n\n1. **\u6545\u4e8b\u4f18\u5148**\uff1a\u914d\u97f3\u662f\u8bb2\u6545\u4e8b\uff0c\u4e0d\u662f\u89e3\u8bf4\u753b\u9762\n2. **\u4fe1\u606f\u5bc6\u5ea6**\uff1a\u6bcf\u53e5\u8bdd\u90fd\u8981\u63a8\u8fdb\u5267\u60c5\u6216\u5c55\u73b0\u4eba\u7269\n3. **\u89d2\u8272\u5185\u5fc3**\uff1a\u591a\u7528\u89d2\u8272\u72ec\u767d\u5c55\u73b0\u5fc3\u7406\u6d3b\u52a8\n4. **\u907f\u514d\u5e9f\u8bdd**\uff1a\u4e0d\u8981\"\u4ed6\u770b\u7740\u5929\u7a7a\"\uff0c\u8981\"\u4fee\u4ed9\u4e4b\u8def\uff0c\u4f55\u65f6\u624d\u80fd\u8e0f\u4e0a\"\n5. **\u65f6\u95f4\u7cbe\u786e**\uff1a\u6700\u540eend_ms\u5fc5\u987b\u7b49\u4e8e\u89c6\u9891\u603b\u6beb\u79d2\u6570\n6. **\u76f4\u63a5\u8f93\u51faJSON**\uff1a\u65e0\u9700\u89e3\u91ca\uff0c\u76f4\u63a5\u8f93\u51fa\u53ef\u7528\u7684JSON\u683c\u5f0f\n\n---\n\n## \u5f00\u59cb\u751f\u6210\n\n**\u4e25\u683c\u8981\u6c42\uff1a**\n1. \u5fc5\u987b\u6839\u636e\u8f93\u5165\u7684\u5c0f\u8bf4\u5185\u5bb9\u521b\u4f5c\u53f0\u8bcd\uff0c\u4e0d\u5f97\u4f7f\u7528\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u4efb\u4f55\u53f0\u8bcd\n2. \u53f0\u8bcd\u8981\u7b26\u5408\u5c0f\u8bf4\u60c5\u8282\u548c\u4eba\u7269\u6027\u683c\uff0c**\u4fe1\u606f\u5bc6\u5ea6\u8981\u9ad8**\n3. \u65f6\u95f4\u8f74\u5fc5\u987b\u7cbe\u786e\u5339\u914d\u89c6\u9891\u603b\u65f6\u957f\uff08\u6700\u540eend_ms = \u89c6\u9891\u603b\u6beb\u79d2\u6570\uff09\n4. \u9759\u97f3\u8981\u514b\u5236\u4f7f\u7528\uff0c\u53ea\u5728\u5fc5\u8981\u7684\u8f6c\u573a/\u60c5\u7eea\u8f6c\u6298\u5904\u6dfb\u52a0\n5. **\u603b\u5b57\u6570\u8981\u8fbe\u5230\uff1a\u89c6\u9891\u79d2\u6570 \u00d7 3.0 ~ 3.5**\uff08\u9ad8\u5bc6\u5ea6\u914d\u97f3\uff09\n\n**\u751f\u6210\u6b65\u9aa4\uff1a**\n1. **\u5206\u6790\u753b\u9762\u7ed3\u6784**\uff1a\u7406\u89e3\u6bcf\u4e2a\u955c\u5934\u662f\u4eba\u7269/\u666f\u7269/\u5bf9\u8bdd/\u8f6c\u573a\n2. **\u5339\u914d\u89d2\u8272/\u65c1\u767d**\uff1a\n   - \u4eba\u7269\u753b\u9762 \u2192 \u89d2\u8272\u72ec\u767d/\u5bf9\u8bdd\n   - \u666f\u7269\u753b\u9762 \u2192 \u65c1\u767d\n   - \u8f6c\u573a\u753b\u9762 \u2192 \u65c1\u767d\u6216\u9759\u97f3\n3. **\u4ece\u5c0f\u8bf4\u63d0\u53d6\u4fe1\u606f**\uff1a\u5173\u952e\u60c5\u8282\u3001\u4eba\u7269\u5fc3\u7406\u3001\u80cc\u666f\u8bbe\u5b9a\u3001\u4f0f\u7b14\n4. **\u521b\u4f5c\u9ad8\u5bc6\u5ea6\u53f0\u8bcd**\uff1a\n   - \u4e0d\u8981\u753b\u9762\u89e3\u8bf4\uff08\"\u4ed6\u8d70\u8fdb\u623f\u95f4\"\u274c\uff09\n   - \u8981\u6545\u4e8b\u63a8\u8fdb\uff08\"\u8fd9\u7834\u5c4b\u5b50\u4f4f\u4e86\u5341\u5e74\uff0c\u4eca\u5929\u7ec8\u4e8e\u8981\u79bb\u5f00\u4e86\"\u2705\uff09\n5. **\u68c0\u67e5\u53cc\u91cd\u6807\u51c6**\uff1a\n   - \u2705 \u753b\u9762\u5339\u914d\uff08\u4eba\u7269\u7528\u89d2\u8272\uff0c\u666f\u7269\u7528\u65c1\u767d\uff09\n   - \u2705 \u4fe1\u606f\u5bc6\u5ea6\uff08\u6bcf\u79d23-3.5\u5b57\uff0c\u603b\u5b57\u6570\u8fbe\u6807\uff09\n6. **\u68c0\u67e5\u65f6\u95f4\u8f74\u8fde\u7eed\u6027**\n\n\u73b0\u5728\u8bf7\u76f4\u63a5\u8f93\u51faJSON\u683c\u5f0f\u7684\u914d\u97f3\u811a\u672c\uff0c\u65e0\u9700\u4efb\u4f55\u89e3\u91ca\u6216\u8bf4\u660e\u3002\n"
            }
          ]
        },
        "options": {}
      },
      "id": "4e551a39-c7cd-47c2-87c2-8d1f61f8d877",
      "name": "\u63d0\u793a\u8bcd2",
      "type": "n8n-nodes-base.set",
      "position": [
        -1520,
        816
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://ncat:8080/v1/video/trim",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n    \"video_url\": \"{{ $('\u5f52\u96c6\u5f71\u7247\u5143\u7d20').item.json['\u89c6\u9891'] }}\",\n    \"video_crf\": 32,       \n    \"video_preset\": \"slow\",\n    \"audio_bitrate\": \"96k\"\n  }",
        "options": {}
      },
      "id": "6e2d98bd-ae22-4ed7-b133-96a6a7fc6ee0",
      "name": "\u89c6\u9891\u538b\u7f291",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1376,
        816
      ],
      "typeVersion": 4.3,
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "ac8929da-9bc9-4c04-be08-61d6b13723d6",
              "name": "\u7406\u89e3\u6a21\u578b\u63d0\u793a\u8bcd",
              "type": "string",
              "value": "={{ JSON.stringify($('\u63d0\u793a\u8bcd2').item.json['\u63d0\u793a\u8bcd']) }}"
            }
          ]
        },
        "options": {}
      },
      "id": "3ac8ea6d-63c6-4881-9726-bc155beebe17",
      "name": "\u63d0\u793a\u8bcd\u6620\u5c041",
      "type": "n8n-nodes-base.set",
      "position": [
        -1248,
        816
      ],
      "typeVersion": 3.4
    },
    {
      "parameters": {
        "jsCode": "// \u63d0\u53d6\u6240\u6709\u5206\u955c\u5e76\u8f6c\u6362\u4e3a\u6807\u51c6\u6570\u7ec4\nconst input = $input.first().json;\n\n// \u89e3\u6790 output \u5b57\u6bb5\u4e2d\u7684 JSON \u5b57\u7b26\u4e32\nlet storyboard;\nif (typeof input.output === 'string') {\n  // \u53bb\u6389 markdown \u4ee3\u7801\u5757\u6807\u8bb0\n  const jsonStr = input.output.replace(/```json\\n?/g, '').replace(/```\\n?/g, '');\n  storyboard = JSON.parse(jsonStr);\n} else {\n  storyboard = input.output;\n}\n\n// \u63d0\u53d6\u6240\u6709 shots \u5230\u4e00\u4e2a\u6570\u7ec4\nconst allShots = [];\n\n// \u904d\u5386\u6240\u6709 scenes\nstoryboard.scenes.forEach(scene => {\n  scene.shots.forEach(shot => {\n    allShots.push({\n      shot_id: shot.shot_id,\n      time_code: shot.time_code,\n      duration_seconds: shot.duration_seconds,\n      scene_name: scene.scene_name,\n      location: scene.location,\n      \n      // \u6545\u4e8b\u5185\u5bb9\n      story_beat: shot.narrative.story_beat,\n      voiceover: shot.narrative.voiceover,\n      dialogue: shot.narrative.dialogue,\n      sound_fx: shot.narrative.sound_fx,\n      \n      // \u89c6\u89c9\u63cf\u8ff0\n      image_prompt: shot.visual.image_prompt,\n      subject: shot.visual.key_visual_elements.subject,\n      action: shot.visual.key_visual_elements.action,\n      environment: shot.visual.key_visual_elements.environment,\n      lighting: shot.visual.key_visual_elements.lighting,\n      mood: shot.visual.key_visual_elements.mood,\n      color_scheme: shot.visual.key_visual_elements.color_scheme,\n      \n      // \u955c\u5934\u53c2\u6570\n      shot_type: shot.visual.camera.shot_type,\n      angle: shot.visual.camera.angle,\n      movement: shot.visual.camera.movement,\n      focus: shot.visual.camera.focus\n    });\n  });\n});\n\n// \u5904\u7406 scenes_continued\uff08\u5982\u679c\u6709\uff09\nif (storyboard.scenes_continued) {\n  storyboard.scenes_continued.forEach(scene => {\n    scene.shots.forEach(shot => {\n      allShots.push({\n        shot_id: shot.shot_id,\n        time_code: shot.time_code,\n        duration_seconds: shot.duration_seconds,\n        scene_name: scene.scene_name,\n        location: scene.location,\n        story_beat: shot.narrative.story_beat,\n        voiceover: shot.narrative.voiceover,\n        dialogue: shot.narrative.dialogue,\n        sound_fx: shot.narrative.sound_fx,\n        image_prompt: shot.visual.image_prompt,\n        subject: shot.visual.key_visual_elements.subject,\n        action: shot.visual.key_visual_elements.action,\n        environment: shot.visual.key_visual_elements.environment,\n        lighting: shot.visual.key_visual_elements.lighting,\n        mood: shot.visual.key_visual_elements.mood,\n        color_scheme: shot.visual.key_visual_elements.color_scheme,\n        shot_type: shot.visual.camera.shot_type,\n        angle: shot.visual.camera.angle,\n        movement: shot.visual.camera.movement,\n        focus: shot.visual.camera.focus\n      });\n    });\n  });\n}\n\nreturn allShots.map(shot => ({ json: shot }));"
      },
      "id": "9c13f145-1ed7-440c-b79f-a9a0065efbbf",
      "name": "Code in JavaScript4",
      "type": "n8n-nodes-base.code",
      "position": [
        -3920,
        -160
      ],
      "typeVersion": 2
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -3664,
        416
      ],
      "id": "7c6668dc-8d1c-4731-8b01-516dd81d1724",
      "name": "When clicking \u2018Execute workflow\u2019"
    },
    {
      "parameters": {
        "model": "google/gemini-3-pro-preview",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        -416,
        160
      ],
      "id": "968529c1-5f19-40c2-b2a9-10b9363cbb36",
      "name": "OpenRouter Chat Model",
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": "google/gemini-3-pro-preview",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        -2256,
        672
      ],
      "id": "c276f496-7a33-440f-a019-a11933bb74dc",
      "name": "OpenRouter Chat Model1",
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \u63d0\u53d6\u6240\u6709\u5206\u955c\u5e76\u8f6c\u6362\u4e3a\u6807\u51c6\u6570\u7ec4\nconst input = $input.first().json;\n\n// \u89e3\u6790 output \u5b57\u6bb5\u4e2d\u7684 JSON \u5b57\u7b26\u4e32\nlet storyboard;\nif (typeof input.output === 'string') {\n  // \u53bb\u6389 markdown \u4ee3\u7801\u5757\u6807\u8bb0\n  const jsonStr = input.output.replace(/```json\\n?/g, '').replace(/```\\n?/g, '');\n  storyboard = JSON.parse(jsonStr);\n} else {\n  storyboard = input.output;\n}\n\n// \u63d0\u53d6\u6240\u6709 shots \u5230\u4e00\u4e2a\u6570\u7ec4\nconst allShots = [];\n\n// \u904d\u5386\u6240\u6709 scenes\nstoryboard.scenes.forEach(scene => {\n  scene.shots.forEach(shot => {\n    allShots.push({\n      shot_id: shot.shot_id,\n      time_code: shot.time_code,\n      duration_seconds: shot.duration_seconds,\n      scene_name: scene.scene_name,\n      location: scene.location,\n      \n      // \u6545\u4e8b\u5185\u5bb9\n      story_beat: shot.narrative.story_beat,\n      voiceover: shot.narrative.voiceover,\n      dialogue: shot.narrative.dialogue,\n      sound_fx: shot.narrative.sound_fx,\n      \n      // \u89c6\u89c9\u63cf\u8ff0\n      image_prompt: shot.visual.image_prompt,\n      subject: shot.visual.key_visual_elements.subject,\n      action: shot.visual.key_visual_elements.action,\n      environment: shot.visual.key_visual_elements.environment,\n      lighting: shot.visual.key_visual_elements.lighting,\n      mood: shot.visual.key_visual_elements.mood,\n      color_scheme: shot.visual.key_visual_elements.color_scheme,\n      \n      // \u955c\u5934\u53c2\u6570\n      shot_type: shot.visual.camera.shot_type,\n      angle: shot.visual.camera.angle,\n      movement: shot.visual.camera.movement,\n      focus: shot.visual.camera.focus\n    });\n  });\n});\n\n// \u5904\u7406 scenes_continued\uff08\u5982\u679c\u6709\uff09\nif (storyboard.scenes_continued) {\n  storyboard.scenes_continued.forEach(scene => {\n    scene.shots.forEach(shot => {\n      allShots.push({\n        shot_id: shot.shot_id,\n        time_code: shot.time_code,\n        duration_seconds: shot.duration_seconds,\n        scene_name: scene.scene_name,\n        location: scene.location,\n        story_beat: shot.narrative.story_beat,\n        voiceover: shot.narrative.voiceover,\n        dialogue: shot.narrative.dialogue,\n        sound_fx: shot.narrative.sound_fx,\n        image_prompt: shot.visual.image_prompt,\n        subject: shot.visual.key_visual_elements.subject,\n        action: shot.visual.key_visual_elements.action,\n        environment: shot.visual.key_visual_elements.environment,\n        lighting: shot.visual.key_visual_elements.lighting,\n        mood: shot.visual.key_visual_elements.mood,\n        color_scheme: shot.visual.key_visual_elements.color_scheme,\n        shot_type: shot.visual.camera.shot_type,\n        angle: shot.visual.camera.angle,\n        movement: shot.visual.camera.movement,\n        focus: shot.visual.camera.focus\n      });\n    });\n  });\n}\n\nreturn allShots.map(shot => ({ json: shot }));"
      },
      "id": "05d74b84-9b10-43e1-9834-35befb6dee12",
      "name": "Code in JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        -3440,
        416
      ],
      "typeVersion": 2
    },
    {
      "parameters": {
        "jsCode": "// Code \u8282\u70b9\uff1a\u89e3\u6790 Agent \u8f93\u51fa\u5e76\u6784\u5efa API \u8bf7\u6c42\u4f53\nconst agentOutput = $input.first().json;\nlet parsedOutput;\n\n// 1. \u5f3a\u5316\u7684 JSON \u89e3\u6790\u903b\u8f91 (\u4fdd\u7559\u539f\u6709\u7684\u9c81\u68d2\u6027)\nfunction parseAgentOutput(output) {\n  try {\n    if (typeof output === 'object' && output !== null) return output;\n    if (typeof output === 'string') {\n      let cleaned = output.replace(/```json\\s*/g, '').replace(/```\\s*/g, '').trim();\n      const firstBrace = cleaned.indexOf('{');\n      const lastBrace = cleaned.lastIndexOf('}');\n      if (firstBrace !== -1 && lastBrace !== -1) {\n        cleaned = cleaned.substring(firstBrace, lastBrace + 1);\n        return JSON.parse(cleaned);\n      }\n    }\n    throw new Error('Invalid output format');\n  } catch (error) {\n    throw new Error(`Failed to parse agent output: ${error.message}`);\n  }\n}\n\n// 2. \u89e3\u6790\u6570\u636e\ntry {\n  parsedOutput = parseAgentOutput(agentOutput.output || agentOutput);\n} catch (error) {\n  throw new Error(`Output parsing failed: ${error.message}`);\n}\n\n// 3. \u63d0\u53d6\u53c2\u6570\nconst prompt = parsedOutput.prompt;\n// \u786e\u4fdd\u53c2\u8003\u56fe\u662f\u6570\u7ec4\uff0cAPI \u6587\u6863\u8981\u6c42 image_input \u662f\u6570\u7ec4\nconst referenceImages = parsedOutput.reference_images || [];\n\n// 4. \u6784\u5efa Nano Banana Pro \u8bf7\u6c42\u4f53\n// \u6ce8\u610f\uff1aAPI \u6587\u6863\u663e\u793a image_input \u63a5\u53d7 URL\u3002\u6211\u4eec\u76f4\u63a5\u900f\u4f20 Google Drive \u94fe\u63a5\u3002\n// \u5982\u679c API \u65e0\u6cd5\u5904\u7406 Google Drive \u94fe\u63a5\uff0c\u53ef\u80fd\u9700\u8981\u5148\u4e0a\u4f20\u5230\u516c\u5171\u56fe\u5e8a\uff0c\u4f46\u5728 Kie.ai \u7b49\u73b0\u4ee3 API \u4e2d\u901a\u5e38\u652f\u6301\u91cd\u5b9a\u5411\u94fe\u63a5\u3002\nreturn {\n  json: {\n    model: \"nano-banana-pro\",\n    input: {\n      prompt: prompt,\n      image_input: referenceImages,\n      aspect_ratio: \"9:16\",  // \u6839\u636e\u4f60\u4e4b\u524d\u7684\u914d\u7f6e\u8bbe\u5b9a\u4e3a\u7ad6\u5c4f\n      resolution: \"1K\",      // \u4fdd\u6301\u4e4b\u524d\u7684\u914d\u7f6e\n      output_format: \"jpg\"   // \u8f93\u51fa\u683c\u5f0f\n    }\n  }\n};"
      },
      "id": "9d329078-8f16-4134-b516-64a8e5773004",
      "name": "Code - Prepare Input",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1488,
        1136
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.kie.ai/api/v1/jobs/createTask",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_KIE_API_KEY"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ $json }}",
        "options": {}
      },
      "id": "6d694cd7-e75b-4dc8-b983-2adfe30b3a17",
      "name": "HTTP - Create Task",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -1072,
        592
      ]
    },
    {
      "parameters": {},
      "id": "53548bb2-c7b6-4b49-b875-512356f3ca71",
      "name": "Wait 5s",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        -864,
        592
      ]
    },
    {
      "parameters": {
        "url": "https://api.kie.ai/api/v1/jobs/recordInfo",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "taskId",
              "value": "={{ $json.data ? $json.data.taskId : $('HTTP - Create Task').item.json.data.taskId }}"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_KIE_API_KEY"
            }
          ]
        },
        "options": {}
      },
      "id": "0c9a8d1f-b72b-4aa8-a9b8-8727f7dadc42",
      "name": "HTTP - Query Status",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -640,
        592
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "1",
              "leftValue": "={{ $json.data.state }}",
              "rightValue": "success",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "7f5c0c3a-c931-4512-8561-4b142489401a",
      "name": "If - Success?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        -432,
        592
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u89e3\u6790 ResultJson \u5e76\u83b7\u53d6 URL\nconst responseData = $input.first().json.data;\n\nif (responseData.state === 'fail') {\n  throw new Error(`Task failed: ${responseData.failMsg || 'Unknown error'}`);\n}\n\n// resultJson \u662f\u5b57\u7b26\u4e32\uff0c\u9700\u8981\u89e3\u6790\nconst resultObj = JSON.parse(responseData.resultJson);\n\n// \u83b7\u53d6\u7b2c\u4e00\u5f20\u56fe\u7247\u7684 URL\nif (resultObj.resultUrls && resultObj.resultUrls.length > 0) {\n  return {\n    json: {\n      imageUrl: resultObj.resultUrls[0]\n    }\n  };\n} else {\n  throw new Error(\"No result URLs found in response\");\n}"
      },
      "id": "9c1c88e2-3f3f-4ed5-9d0e-c29ef43339f2",
      "name": "Code - Parse URL",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -208,
        592
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.imageUrl }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "id": "3a6d89e2-695b-41d0-84c0-939a533ee231",
      "name": "HTTP - Download Image",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        0,
        592
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u89e3\u6790 AI Agent \u8f93\u51fa\u5e76\u51c6\u5907\u4e0b\u8f7d\u5217\u8868\nconst agentOutput = $input.first().json;\nlet parsedOutput;\n\n// 1. JSON \u89e3\u6790\u903b\u8f91\nfunction parseAgentOutput(output) {\n  try {\n    if (typeof output === 'object' && output !== null) return output;\n    if (typeof output === 'string') {\n      let cleaned = output.replace(/```json\\s*/g, '').replace(/```\\s*/g, '').trim();\n      const firstBrace = cleaned.indexOf('{');\n      const lastBrace = cleaned.lastIndexOf('}');\n      if (firstBrace !== -1 && lastBrace !== -1) {\n        cleaned = cleaned.substring(firstBrace, lastBrace + 1);\n        return JSON.parse(cleaned);\n      }\n    }\n    throw new Error('Invalid output format');\n  } catch (error) {\n    throw new Error(`Failed to parse agent output: ${error.message}`);\n  }\n}\n\ntry {\n  parsedOutput = parseAgentOutput(agentOutput.output || agentOutput);\n} catch (error) {\n  throw new Error(`Output parsing failed: ${error.message}`);\n}\n\n// 2. \u63d0\u53d6\u9700\u8981\u4e0b\u8f7d\u7684 URL\nconst referenceImages = parsedOutput.reference_images || [];\n\n// 3. \u4e3a\u6bcf\u4e2a URL \u521b\u5efa\u4e00\u4e2a\u5355\u72ec\u7684 item\uff0c\u4ee5\u4fbf Loop \u5904\u7406\nreturn referenceImages.map(url => ({\n  json: {\n    originalUrl: url,\n    prompt: parsedOutput.prompt // \u4fdd\u7559 Prompt \u4f9b\u540e\u7eed\u4f7f\u7528\n  }\n}));"
      },
      "id": "2ff826dd-b897-468d-8e09-b0251937f2fe",
      "name": "Code - Split URLs",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1840,
        576
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.originalUrl }}",
        "options": {}
      },
      "id": "ca5ed4d1-b367-4e97-8bf8-6432a25c4987",
      "name": "HTTP - Download GDrive",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -1200,
        1776
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.imgbb.com/1/upload",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "key",
              "value": "YOUR_IMGBB_API_KEY_HERE"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "parameterType": "formBinaryData",
              "name": "image",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {}
      },
      "id": "ad070996-363b-4056-9339-d92438a92850",
      "name": "HTTP - Upload to ImgBB",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -1296,
        1616
      ]
    },
    {
      "parameters": {
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "data.url"
            },
            {
              "fieldToAggregate": "prompt"
            }
          ]
        },
        "options": {}
      },
      "id": "483de5fa-d236-4989-984f-3ddbe0aa021e",
      "name": "Aggregate URLs",
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        -1264,
        1168
      ]
    },
    {
      "parameters": {
        "jsCode": "// 1. \u83b7\u53d6 Cloudinary \u4e0a\u4f20\u540e\u7684\u6240\u6709\u56fe\u7247\u94fe\u63a5\n// $input.all() \u4f1a\u83b7\u53d6\u5f53\u524d\u8282\u70b9\u6536\u5230\u7684\u6240\u6709\u6570\u636e\uff08\u5373\u4f60\u622a\u56fe\u91cc\u7684\u90a3\u4e2a\u6570\u7ec4\uff09\nconst items = $input.all();\nconst publicImageUrls = items.map(item => item.json.secure_url);\n\n// 2. \u83b7\u53d6\u4e0a\u6e38\u7684 Prompt (\u5173\u952e\u6b65\u9aa4\uff01)\n// Cloudinary \u8282\u70b9\u7684\u8f93\u51fa\u901a\u5e38\u4f1a\u8986\u76d6\u6389\u4e4b\u524d\u7684 input\uff0c\u6240\u4ee5 prompt \u4e22\u4e86\u3002\n// \u6211\u4eec\u9700\u8981\u8de8\u8282\u70b9\u53bb\u62ff\u4e4b\u524d \"Code - Split URLs\" \u91cc\u7684 prompt\u3002\n// \u26a0\ufe0f \u8bf7\u786e\u4fdd\u4e0b\u9762\u7684\u8282\u70b9\u540d\u79f0 'Code - Split URLs' \u4e0e\u4f60\u753b\u5e03\u4e0a\u90a3\u4e2a\u62c6\u5206 URL \u7684\u8282\u70b9\u540d\u79f0\u5b8c\u5168\u4e00\u81f4\uff01\n// \u5982\u679c\u4f60\u7684\u62c6\u5206\u8282\u70b9\u53eb\u5176\u4ed6\u540d\u5b57\uff0c\u8bf7\u5728\u8fd9\u91cc\u4fee\u6539\u3002\nlet prompt = \"\";\ntry {\n    // \u5c1d\u8bd5\u4ece\u62c6\u5206\u8282\u70b9\u83b7\u53d6\n    prompt = $('Code - Split URLs').first().json.prompt; \n} catch (e) {\n    // \u5982\u679c\u4e0a\u9762\u62a5\u9519\uff0c\u8bd5\u7740\u4ece \"AI Agent\" \u83b7\u53d6 (\u5907\u9009\u65b9\u6848)\n    // prompt = $('AI Agent').first().json.output.prompt; // \u6839\u636e\u5b9e\u9645\u60c5\u51b5\u89e3\u5305\n    console.log(\"\u9700\u8981\u68c0\u67e5\u83b7\u53d6 Prompt \u7684\u4e0a\u6e38\u8282\u70b9\u540d\u79f0\");\n}\n\n// 3. \u6784\u5efa Nano Banana Pro \u7684\u8bf7\u6c42\u4f53\nreturn {\n  json: {\n    model: \"nano-banana-pro\",\n    input: {\n      prompt: prompt,\n      image_input: publicImageUrls, // \u8fd9\u91cc\u73b0\u5728\u662f Cloudinary \u7684 https \u94fe\u63a5\u6570\u7ec4\n      aspect_ratio: \"16:9\",\n      resolution: \"1K\",\n      output_format: \"png\"\n    }\n  }\n};"
      },
      "id": "c05ba7a8-fb3c-4261-8f8c-7e94015cd4e8",
      "name": "Code - Format for API",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1296,
        576
      ]
    },
    {
      "parameters": {
        "fieldToSplitOut": "originalUrl",
        "include": "allOtherFields",
        "options": {}
      },
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        -1296,
        1472
      ],
      "id": "7d2fb740-3016-4d90-a7c5-07f9dcaaa3c9",
      "name": "Split Out"
    },
    {
      "parameters": {
        "operation": "download",
        "fileId": {
          "__rl": true,
          "value": "={{ $json.originalUrl.match(/id=([^&]+)/)[1] }}",
          "mode": "id"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        -1664,
        576
      ],
      "id": "32966b45-275d-415d-b648-57d31ded48cd",
      "name": "Download file",
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.cloudinary.com/v1_1/YOUR_CLOUDINARY_CLOUD_NAME/image/upload",
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            },
            {
              "name": "upload_preset",
              "value": "xiaohongshu"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        -1472,
        576
      ],
      "id": "2e74e809-6d47-42f1-a83b-726ca2a4cbf6",
      "name": "Cloudinary"
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        -848,
        304
      ],
      "id": "ee935606-f6d8-45c8-b7d1-bd31dce0f12e",
      "name": "Merge2"
    },
    {
      "parameters": {
        "resource": "folder",
        "name": "\u5206\u955c\u56fetest",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root",
          "cachedResultName": "YOUR_FOLDER_NAME"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        400,
        800
      ],
      "id": "d6fbc11f-4805-4351-9619-e6966b50d7e1",
      "name": "Create folder",
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.kie.ai/api/v1/jobs/createTask",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_KIE_API_KEY"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{\n  {\n    \"model\": \"sora-2-image-to-video\",\n    \"input\": {\n      \"prompt\": $json.output, \n      \"image_urls\": [$json.webContentLink], \n      \"aspect_ratio\": \"landscape\",\n      \"n_frames\": \"10\",\n      \"remove_watermark\": true\n    }\n  }\n}}",
        "options": {}
      },
      "id": "8bbe5e76-0246-42f4-8722-c6268e267a50",
      "name": "HTTP - Create Video Task",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        352,
        560
      ]
    },
    {
      "parameters": {
        "amount": 30
      },
      "id": "6add81ed-54e1-4387-8d88-43debe9813f5",
      "name": "Wait 30s",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        576,
        560
      ]
    },
    {
      "parameters": {
        "url": "https://api.kie.ai/api/v1/jobs/recordInfo",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "taskId",
              "value": "={{ $node[\"HTTP - Create Video Task\"].json.data.taskId }}"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_KIE_API_KEY"
            }
          ]
        },
        "options": {}
      },
      "id": "7f38b4af-c820-445f-a490-b9f6d1d0e6ce",
      "name": "HTTP - Check Video Status",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        784,
        560
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "1",
              "leftValue": "={{ $json.data.state }}",
              "rightValue": "success",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "d5b77d08-24a9-494b-9579-364c89ad7d03",
      "name": "Is Video Ready?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1024,
        560
      ]
    },
    {
      "parameters": {
        "jsCode": "const resultObj = JSON.parse($input.first().json.data.resultJson);\nreturn {\n  json: {\n    videoUrl: resultObj.resultUrls[0]\n  }\n};"
      },
      "id": "ef66db71-3333-4598-86d2-7f0f8bd5322a",
      "name": "Code - Get Video URL",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1232,
        544
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=\u4efb\u52a1\u76ee\u6807\uff1a\u5c06\u3010\u771f\u4eba\u53c2\u8003\u56fe\u3011\u91cd\u7ed8\u6210\u3010\u98ce\u683c\u5316\u6570\u5b57\u827a\u672f\u63d2\u753b (Stylized Digital Illustration)\u3011\u7684\u63d0\u793a\u8bcd\n\n\u8f93\u5165\u5185\u5bb9\uff1a\n\n\u53c2\u8003\u56fe\uff1a{{ JSON.stringify($json['\u53c2\u8003\u56fe\u7247images'], null, 2) }}\n\u5206\u955c\u63cf\u8ff0\uff1a{{ $json.shot }}\n\n\u8981\u6c42\uff1a\n1. \u5ffd\u7565\u5206\u955c\u4e2d\u53ef\u80fd\u5b58\u5728\u7684\"\u7537\u6027/Male\"\u63cf\u8ff0\uff0c\u5f3a\u5236\u4f7f\u7528\"Asian Female Influencer\"\u8bbe\u5b9a\u3002\n2. \u91cd\u70b9\u63cf\u8ff0\u52a8\u4f5c\uff1a{{ $json.shot }}\n3. \u98ce\u683c\u5fc5\u987b\u662f\uff1aStylized Digital Illustration (\u98ce\u683c\u5316\u6570\u5b57\u63d2\u753b)\uff0c\u91cd\u70b9\u5728\u4e8e\u7b14\u89e6\u548c\u7ed8\u753b\u611f\uff0c\u7edd\u5bf9\u4e0d\u8981\u7167\u7247\u8d28\u611f\u3002",
        "options": {
          "systemMessage": "=# Agent: \u98ce\u683c\u5316\u56fe\u50cf\u63d0\u793a\u8bcd\u4e13\u5bb6 (Digital Art Expert)\n\n## \u4f60\u7684\u4efb\u52a1\n\u4f60\u662f\u4e00\u4e2a\u7cbe\u901a Midjourney/Stable Diffusion \u7684\u63d0\u793a\u8bcd\u5de5\u7a0b\u5e08\u3002\n\u4f60\u7684\u76ee\u6807\u662f\u7f16\u5199\u63d0\u793a\u8bcd\uff0c\u6307\u5bfc\u7ed8\u56fe AI (Gemini) \u5c06\u4e00\u5f20\u3010\u771f\u4eba\u53c2\u8003\u56fe\u3011\u91cd\u7ed8\u4e3a\u4e00\u5f20\u3010\u98ce\u683c\u5316\u6570\u5b57\u63d2\u753b (Stylized Digital Illustration)\u3011\u3002\n\n## \u6838\u5fc3\u7b56\u7565 (Style Transfer)\n\u6211\u4eec\u9700\u8981\u751f\u6210\u4e00\u5f20**\u770b\u8d77\u6765\u5b8c\u5168\u662f\u624b\u7ed8/\u539a\u6d82\u98ce\u683c\u7684 2D \u827a\u672f\u56fe**\u3002\n\u8fd9\u5f20\u56fe\u5fc5\u987b\u4fdd\u7559\u4eba\u7269\u7684**\u4e94\u5b98\u7279\u5f81**\u548c**\u8863\u7740**\uff0c\u4f46\u5728\u753b\u8d28\u4e0a\u5fc5\u987b\u5f7b\u5e95\u53bb\u9664\u201c\u771f\u5b9e\u7167\u7247\u201d\u7684\u8d28\u611f\uff0c\u5f3a\u8c03\u201c\u7ed8\u753b\u7b14\u89e6\u201d (Brushstrokes) \u548c\u201c\u5e73\u9762\u611f\u201d (2D Art)\uff0c\u4ee5\u5448\u73b0\u51fa\u7c7b\u4f3c\u97e9\u6f2b\u6216\u63d2\u753b\u7684\u6548\u679c\u3002\n\n## \u6838\u5fc3\u6307\u4ee4\uff1a\u5f3a\u5236\u4e00\u81f4\u6027 (The Immutable Truth)\n\u65e0\u8bba\u8f93\u5165\u7684\u5206\u955c\u63cf\u8ff0\u4e2d\u4eba\u7269\u662f\u8c01\uff0c\u4f60\u5fc5\u987b**\u5f3a\u5236**\u4f7f\u7528\u4ee5\u4e0b\u3010\u56fa\u5b9a\u4eba\u7269\u3011\u548c\u3010\u56fa\u5b9a\u573a\u666f\u3011\u8bbe\u5b9a\u3002\n\n### 1. \u56fa\u5b9a\u4eba\u7269 (Fixed Character)\n* **Identity**: A young Asian female character, fair skin, facing the camera.\n* **Face**: Illustrated style, soft features, large expressive eyes, delicate eyelashes, soft pink lips. No realistic skin pores.\n* **Hair**: Long, straight, light flaxen (milk-tea brown) hair, drawn with smooth lines, draping naturally over shoulders and chest. Bangs styled to frame the face.\n* **Outfit**: Black and white color-block crewneck sweatshirt. Mostly black body, white color blocks on shoulders/upper sleeves, white curved pattern or lettering design on the chest.\n* **Vibe**: Relaxed, direct eye contact with the audience, lips slightly parted as if speaking.\n\n### 2. \u56fa\u5b9a\u573a\u666f (Fixed Environment)\n* **Setting**: Modern minimalist home studio / living room (Illustrated background).\n* **Background**: Painted grey sofa with matching cushions in mid-ground. Wooden staircase with black metal railings in back left. White low cabinet in back right featuring three KAWS-style figures.\n* **Lighting**: Flat lighting, soft global illumination, no harsh realistic reflections.\n\n## \u8f93\u5165\u6570\u636e\u793a\u4f8b\n```json\n{\n  \"shot\": {\n    \"action\": \"Stop gesture\",\n    \"mood\": \"Urgent\",\n    \"scene_name\": \"\u6838\u5fc3\u89c4\u5219\u5efa\u7acb\"\n  },\n  \"images\": [...]\n}\n```\n\n## \u8f93\u51fa\u683c\u5f0f (\u4e25\u683c JSON)\n```json\n{\n  \"prompt\": \"\u82f1\u6587\u63d0\u793a\u8bcd\u5185\u5bb9...\",\n  \"reference_images\": [\"url1\", \"url2\", \"url3...\"]\n}\n```\n\n## \u63d0\u793a\u8bcd\u7f16\u5199\u6a21\u677f (Prompt Structure)\n\u8bf7\u6309\u4ee5\u4e0b\u987a\u5e8f\u7f16\u5199 prompt \u5b57\u6bb5\uff1a\n\nStyle Header: (Masterpiece), (Best Quality), Stylized Digital Illustration, Soft Painterly Style, Manhwa Style, Smooth Brushstrokes, 2D Art, Anime-influenced Semi-realism.\n\nCharacter: [\u63d2\u5165\u4e0a\u65b9\u7684\u56fa\u5b9a\u4eba\u7269\u63cf\u8ff0]. She is [\u6839\u636eshot.action\u63cf\u8ff0\u52a8\u4f5c].\n\nEnvironment: [\u63d2\u5165\u4e0a\u65b9\u7684\u56fa\u5b9a\u573a\u666f\u63cf\u8ff0].\n\nTech Specs: Flat lighting, Soft shading, Vibrant colors, Clean lines, Digital art, High resolution.\n\nNegative Prompt: photograph, photorealistic, 3D, 3D render, unreal engine, octane render, realism, realistic texture, skin pores, noise, grainy, low quality, bad anatomy, distorted face, watermark, text, male, man, beard.\n\n\u26a0\ufe0f \u5173\u952e\u89c4\u5219\n1. \u53c2\u8003\u56fe\u900f\u4f20\uff1a\u8f93\u51fa\u7684 reference_images \u6570\u7ec4\u5fc5\u987b\u5305\u542b\u8f93\u5165\u6570\u636e\u4e2d images \u6570\u7ec4\u91cc\u7684\u6240\u6709 URL\u3002\u4e0d\u8981\u9057\u6f0f\uff0c\u4e0d\u8981\u7b5b\u9009\uff0c\u5168\u90e8\u539f\u6837\u8fd4\u56de\u3002\n2. \u52a8\u4f5c\u63d0\u53d6\uff1a\u7cbe\u51c6\u63d0\u53d6 shot \u4e2d\u7684 action \u548c mood\uff0c\u8f6c\u5316\u4e3a\u5177\u4f53\u7684\u80a2\u4f53\u8bed\u8a00\u63cf\u8ff0\u3002\n3. \u98ce\u683c\u63a7\u5236\uff1a\u59cb\u7ec8\u5f3a\u8c03 \"Illustration\" \u548c \"Painterly\"\uff0c\u4e25\u5389\u7981\u6b62 \"Photo\" \u548c \"Realistic\"\u3002\n\n## \u5f00\u59cb\u5de5\u4f5c\n\u6839\u636e\u8f93\u5165\u7684\u5206\u955c\u63cf\u8ff0\uff0c\u751f\u6210 JSON \u8f93\u51fa\u3002\u786e\u4fdd\u751f\u6210\u7684 Prompt \u80fd\u8ba9 AI \u753b\u51fa\u4e00\u5f20\u65e2\u50cf\u535a\u4e3b\u672c\u4eba\uff0c\u53c8\u5b8c\u5168\u662f\u6570\u5b57\u63d2\u753b\u98ce\u683c\u7684\u56fe\u7247\u3002",
          "passthroughBinaryImages": true,
          "batching": {
            "batchSize": 4
          }
        }
      },
      "id": "587bdbff-5013-42f7-813a-5c61e1da5063",
      "name": "\u6587\u751f\u56fe",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -2176,
        560
      ],
      "typeVersion": 3
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.kie.ai/api/v1/veo/generate",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_KIE_API_KEY"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{\n  {\n    \"model\": \"veo3_fast\",\n    \"generationType\": \"REFERENCE_2_VIDEO\",\n    \"imageUrls\": [\n      $json.webContentLink\n    ],\n    \"prompt\": `A high-quality, realistic video based on the reference image. The Asian female influencer is performing the action: \"${$('Loop Over Items1').item.json.action}\". Her mood is ${$('Loop Over Items1').item.json.mood}. She is looking directly at the camera. maintain consistency with the reference image features and clothing. 4k resolution, smooth motion.`,\n    \"aspectRatio\": \"16:9\"\n  }\n}}",
        "options": {}
      },
      "id": "ef5e1a81-0fd8-4b7d-b4e0-4ff13b980c17",
      "name": "HTTP - Veo Gen Video",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        320,
        224
      ]
    },
    {
      "parameters": {
        "url": "https://api.kie.ai/api/v1/jobs/recordInfo",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "taskId",
              "value": "={{ $node[\"HTTP - Veo Gen Video\"].json.data.taskId }}"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_KIE_API_KEY"
            }
          ]
        },
        "options": {}
      },
      "id": "f9b87f2f-f66d-45fd-8329-75ab6d2fb00c",
      "name": "HTTP - Check Status",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        768,
        224
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "1",
              "leftValue": "={{ $json.data.state }}",
              "rightValue": "success",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "42b9992b-886c-47c2-a4ec-093be72bb550",
      "name": "Is Success?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        992,
        224
      ]
    },
    {
      "parameters": {
        "amount": 30
      },
      "id": "acfcaaab-8ab7-4d69-9b27-447a0c416aa6",
      "name": "Wait 30s1",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        544,
        224
      ]
    },
    {
      "parameters": {
        "jsCode": "const resultObj = JSON.parse($input.first().json.data.resultJson);\nreturn {\n  json: {\n    videoUrl: resultObj.resultUrls[0]\n  }\n};"
      },
      "id": "e600cbab-d61e-4fe6-b23b-dad5c8bf96cd",
      "name": "Code - Parse URL1",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1232,
        192
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=\u4efb\u52a1\u76ee\u6807\uff1a\u5c06\u3010\u771f\u4eba\u53c2\u8003\u56fe\u3011\u91cd\u7ed8\u6210\u3010\u98ce\u683c\u5316\u6570\u5b57\u827a\u672f\u63d2\u753b (Stylized Digital Illustration)\u3011\u7684\u63d0\u793a\u8bcd\n\n\u8f93\u5165\u5185\u5bb9\uff1a\n\n\u53c2\u8003\u56fe\uff1a{{ JSON.stringify($json['\u53c2\u8003\u56fe\u7247images'], null, 2) }}\n\u5206\u955c\u63cf\u8ff0\uff1a{{ $json.shot }}\n\n\u8981\u6c42\uff1a\n1. \u5ffd\u7565\u5206\u955c\u4e2d\u53ef\u80fd\u5b58\u5728\u7684\"\u7537\u6027/Male\"\u63cf\u8ff0\uff0c\u5f3a\u5236\u4f7f\u7528\"Asian Female Influencer\"\u8bbe\u5b9a\u3002\n2. \u91cd\u70b9\u63cf\u8ff0\u52a8\u4f5c\uff1a{{ $json.shot }}\n3. \u98ce\u683c\u5fc5\u987b\u662f\uff1aStylized Digital Illustration (\u98ce\u683c\u5316\u6570\u5b57\u63d2\u753b)\uff0c\u91cd\u70b9\u5728\u4e8e\u7b14\u89e6\u548c\u7ed8\u753b\u611f\uff0c\u7edd\u5bf9\u4e0d\u8981\u7167\u7247\u8d28\u611f\u3002",
        "options": {
          "systemMessage": "=# Agent: \u98ce\u683c\u5316\u56fe\u50cf\u63d0\u793a\u8bcd\u4e13\u5bb6 (Digital Art Expert)\n\n## \u4f60\u7684\u4efb\u52a1\n\u4f60\u662f\u4e00\u4e2a\u7cbe\u901a Midjourney/Stable Diffusion \u7684\u63d0\u793a\u8bcd\u5de5\u7a0b\u5e08\u3002\n\u4f60\u7684\u76ee\u6807\u662f\u7f16\u5199\u63d0\u793a\u8bcd\uff0c\u6307\u5bfc\u7ed8\u56fe AI (Gemini) \u5c06\u4e00\u5f20\u3010\u771f\u4eba\u53c2\u8003\u56fe\u3011\u91cd\u7ed8\u4e3a\u4e00\u5f20\u3010\u98ce\u683c\u5316\u6570\u5b57\u63d2\u753b (Stylized Digital Illustration)\u3011\u3002\n\n## \u6838\u5fc3\u7b56\u7565 (Style Transfer)\n\u6211\u4eec\u9700\u8981\u751f\u6210\u4e00\u5f20**\u770b\u8d77\u6765\u5b8c\u5168\u662f\u624b\u7ed8/\u539a\u6d82\u98ce\u683c\u7684 2D \u827a\u672f\u56fe**\u3002\n\u8fd9\u5f20\u56fe\u5fc5\u987b\u4fdd\u7559\u4eba\u7269\u7684**\u4e94\u5b98\u7279\u5f81**\u548c**\u8863\u7740**\uff0c\u4f46\u5728\u753b\u8d28\u4e0a\u5fc5\u987b\u5f7b\u5e95\u53bb\u9664\u201c\u771f\u5b9e\u7167\u7247\u201d\u7684\u8d28\u611f\uff0c\u5f3a\u8c03\u201c\u7ed8\u753b\u7b14\u89e6\u201d (Brushstrokes) \u548c\u201c\u5e73\u9762\u611f\u201d (2D Art)\uff0c\u4ee5\u5448\u73b0\u51fa\u7c7b\u4f3c\u97e9\u6f2b\u6216\u63d2\u753b\u7684\u6548\u679c\u3002\n\n## \u6838\u5fc3\u6307\u4ee4\uff1a\u5f3a\u5236\u4e00\u81f4\u6027 (The Immutable Truth)\n\u65e0\u8bba\u8f93\u5165\u7684\u5206\u955c\u63cf\u8ff0\u4e2d\u4eba\u7269\u662f\u8c01\uff0c\u4f60\u5fc5\u987b**\u5f3a\u5236**\u4f7f\u7528\u4ee5\u4e0b\u3010\u56fa\u5b9a\u4eba\u7269\u3011\u548c\u3010\u56fa\u5b9a\u573a\u666f\u3011\u8bbe\u5b9a\u3002\n\n### 1. \u56fa\u5b9a\u4eba\u7269 (Fixed Character)\n* **Identity**: A young Asian female character, fair skin, facing the camera.\n* **Face**: Illustrated style, soft features, large expressive eyes, delicate eyelashes, soft pink lips. No realistic skin pores.\n* **Hair**: Long, straight, light flaxen (milk-tea brown) hair, drawn with smooth lines, draping naturally over shoulders and chest. Bangs styled to frame the face.\n* **Outfit**: Black and white color-block crewneck sweatshirt. Mostly black body, white color blocks on shoulders/upper sleeves, white curved pattern or lettering design on the chest.\n* **Vibe**: Relaxed, direct eye contact with the audience, lips slightly parted as if speaking.\n\n### 2. \u56fa\u5b9a\u573a\u666f (Fixed Environment)\n* **Setting**: Modern minimalist home studio / living room (Illustrated background).\n* **Background**: Painted grey sofa with matching cushions in mid-ground. Wooden staircase with black metal railings in back left. White low cabinet in back right featuring three KAWS-style figures.\n* **Lighting**: Flat lighting, soft global illumination, no harsh realistic reflections.\n\n## \u8f93\u5165\u6570\u636e\u793a\u4f8b\n```json\n{\n  \"shot\": {\n    \"action\": \"Stop gesture\",\n    \"mood\": \"Urgent\",\n    \"scene_name\": \"\u6838\u5fc3\u89c4\u5219\u5efa\u7acb\"\n  },\n  \"images\": [...]\n}\n```\n\n## \u8f93\u51fa\u683c\u5f0f (\u4e25\u683c JSON)\n```json\n{\n  \"prompt\": \"\u82f1\u6587\u63d0\u793a\u8bcd\u5185\u5bb9...\",\n  \"reference_images\": [\"url1\", \"url2\", \"url3...\"]\n}\n```\n\n## \u63d0\u793a\u8bcd\u7f16\u5199\u6a21\u677f (Prompt Structure)\n\u8bf7\u6309\u4ee5\u4e0b\u987a\u5e8f\u7f16\u5199 prompt \u5b57\u6bb5\uff1a\n\nStyle Header: (Masterpiece), (Best Quality), Stylized Digital Illustration, Soft Painterly Style, Manhwa Style, Smooth Brushstrokes, 2D Art, Anime-influenced Semi-realism.\n\nCharacter: [\u63d2\u5165\u4e0a\u65b9\u7684\u56fa\u5b9a\u4eba\u7269\u63cf\u8ff0]. She is [\u6839\u636eshot.action\u63cf\u8ff0\u52a8\u4f5c].\n\nEnvironment: [\u63d2\u5165\u4e0a\u65b9\u7684\u56fa\u5b9a\u573a\u666f\u63cf\u8ff0].\n\nTech Specs: Flat lighting, Soft shading, Vibrant colors, Clean lines, Digital art, High resolution.\n\nNegative Prompt: photograph, photorealistic, 3D, 3D render, unreal engine, octane render, realism, realistic texture, skin pores, noise, grainy, low quality, bad anatomy, distorted face, watermark, text, male, man, beard.\n\n\u26a0\ufe0f \u5173\u952e\u89c4\u5219\n1. \u53c2\u8003\u56fe\u900f\u4f20\uff1a\u8f93\u51fa\u7684 reference_images \u6570\u7ec4\u5fc5\u987b\u5305\u542b\u8f93\u5165\u6570\u636e\u4e2d images \u6570\u7ec4\u91cc\u7684\u6240\u6709 URL\u3002\u4e0d\u8981\u9057\u6f0f\uff0c\u4e0d\u8981\u7b5b\u9009\uff0c\u5168\u90e8\u539f\u6837\u8fd4\u56de\u3002\n2. \u52a8\u4f5c\u63d0\u53d6\uff1a\u7cbe\u51c6\u63d0\u53d6 shot \u4e2d\u7684 action \u548c mood\uff0c\u8f6c\u5316\u4e3a\u5177\u4f53\u7684\u80a2\u4f53\u8bed\u8a00\u63cf\u8ff0\u3002\n3. \u98ce\u683c\u63a7\u5236\uff1a\u59cb\u7ec8\u5f3a\u8c03 \"Illustration\" \u548c \"Painterly\"\uff0c\u4e25\u5389\u7981\u6b62 \"Photo\" \u548c \"Realistic\"\u3002\n\n## \u5f00\u59cb\u5de5\u4f5c\n\u6839\u636e\u8f93\u5165\u7684\u5206\u955c\u63cf\u8ff0\uff0c\u751f\u6210 JSON \u8f93\u51fa\u3002\u786e\u4fdd\u751f\u6210\u7684 Prompt \u80fd\u8ba9 AI \u753b\u51fa\u4e00\u5f20\u65e2\u50cf\u535a\u4e3b\u672c\u4eba\uff0c\u53c8\u5b8c\u5168\u662f\u6570\u5b57\u63d2\u753b\u98ce\u683c\u7684\u56fe\u7247\u3002",
          "passthroughBinaryImages": true,
          "batching": {
            "batchSize": 4
          }
        }
      },
      "id": "b9a8cd8d-0e3f-46d2-9fdc-a7c565aab3f0",
      "name": "\u6587\u751f\u56fe1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -2768,
        1280
      ],
      "typeVersion": 3
    }
  ],
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Code in JavaScript6",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "HTTP Request - \u8c03\u7528Gemini API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u56fe\u751f\u89c6\u9891\u63d0\u793a\u8bcd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "sora2": {
      "main": [
        [
          {
            "node": "HTTP Request3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "HTTP - Create Video Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "\u591a\u89c6\u9891\u62fc\u63a5URL1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u63d0\u793a\u8bcd2": {
      "main": [
        [
          {
            "node": "\u89c6\u9891\u538b\u7f291",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Edit Fields3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u6587\u751f\u56fe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields2": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Edit Fields3": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Edit Fields4": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields5": {
      "main": [
        [
          {
            "node": "\u63d0\u793a\u8bcd2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields11": {
      "main": [
        [
          {
            "node": "\u4e0a\u4f20\u5230video-factory\u687611",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request3": {
      "main": [
        [
          {
            "node": "\u2705 \u662f\u5426\u5b8c\u62103",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u89c6\u9891\u538b\u7f291": {
      "main": [
        [
          {
            "node": "\u63d0\u793a\u8bcd\u6620\u5c041",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze video1": {
      "main": [
        [
          {
            "node": "\u63d0\u53d6\u65f6\u95f4\u8f74JSON1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to File": {
      "main": [
        []
      ]
    },
    "\u23f3 \u7b49\u5f8510\u79d2": {
      "main": [
        [
          {
            "node": "HTTP Request3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items1": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code in JavaScript5",
            "type": "main",
            "index": 0
          },
          {
            "node": "Search files and folders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u591a\u89c6\u9891\u62fc\u63a52": {
      "main": [
        [
          {
            "node": "Edit Fields11",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u63d0\u793a\u8bcd\u6620\u5c041": {
      "main": [
        [
          {
            "node": "\u4e0b\u8f7d3-\u539f\u59cb\u4e8c\u8fdb\u52361",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2705 \u662f\u5426\u5b8c\u62103": {
      "main": [
        [],
        [
          {
            "node": "\u23f3 \u7b49\u5f8510\u79d2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript3": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript5": {
      "main": [
        [
          {
            "node": "Edit Fields2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript6": {
      "main": [
        [
          {
            "node": "Convert to File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u591a\u89c6\u9891\u62fc\u63a5URL1": {
      "main": [
        [
          {
            "node": "\u591a\u89c6\u9891\u62fc\u63a52",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u63d0\u53d6\u65f6\u95f4\u8f74JSON1": {
      "main": [
        [
          {
            "node": "\u65f6\u95f4\u8f74\u667a\u80fd\u914d\u97f3API1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u56fe\u751f\u89c6\u9891\u63d0\u793a\u8bcd": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search files and folders": {
      "main": [
        [
          {
            "node": "Code in JavaScript3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u4e0b\u8f7d3-\u539f\u59cb\u4e8c\u8fdb\u52361": {
      "main": [
        [
          {
            "node": "Analyze video1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - \u4e0b\u8f7d\u5e76\u8f6cBase64": {
      "main": [
        [
          {
            "node": "HTTP Request - \u8c03\u7528Gemini API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u4e0a\u4f20\u5230n8n-storage\u687617": {
      "main": [
        [
          {
            "node": "Edit Fields4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u65f6\u95f4\u8f74\u667a\u80fd\u914d\u97f3API1": {
      "main": [
        [
          {
            "node": "\u573a\u666furl-\u81ea\u52a8\u8bc6\u522b\u5b57\u5e551",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u4e0a\u4f20\u5230video-factory\u687611": {
      "main": [
        [
          {
            "node": "Edit Fields5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request - \u8c03\u7528Gemini API": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Executed by Another Workflow": {
      "main": [
        []
      ]
    },
    "Code in JavaScript4": {
      "main": [
        []
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "\u56fe\u751f\u89c6\u9891\u63d0\u793a\u8bcd",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "\u6587\u751f\u56fe",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Prepare Input": {
      "main": [
        []
      ]
    },
    "HTTP - Create Task": {
      "main": [
        [
          {
            "node": "Wait 5s",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 5s": {
      "main": [
        [
          {
            "node": "HTTP - Query Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Query Status": {
      "main": [
        [
          {
            "node": "If - Success?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If - Success?": {
      "main": [
        [
          {
            "node": "Code - Parse URL",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 5s",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Parse URL": {
      "main": [
        [
          {
            "node": "HTTP - Download Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Split URLs": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Download GDrive": {
      "main": [
        []
      ]
    },
    "HTTP - Upload to ImgBB": {
      "main": [
        []
      ]
    },
    "Aggregate URLs": {
      "main": [
        []
      ]
    },
    "Split Out": {
      "main": [
        []
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Cloudinary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cloudinary": {
      "main": [
        [
          {
            "node": "Code - Format for API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Format for API": {
      "main": [
        [
          {
            "node": "HTTP - Create Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Download Image": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge2": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create folder": {
      "main": [
        []
      ]
    },
    "HTTP - Create Video Task": {
      "main": [
        [
          {
            "node": "Wait 30s",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 30s": {
      "main": [
        [
          {
            "node": "HTTP - Check Video Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Check Video Status": {
      "main": [
        [
          {
            "node": "Is Video Ready?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Video Ready?": {
      "main": [
        [
          {
            "node": "Code - Get Video URL",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 30s",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Get Video URL": {
      "main": [
        [
          {
            "node": "\u4e0a\u4f20\u5230n8n-storage\u687617",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u6587\u751f\u56fe": {
      "main": [
        [
          {
            "node": "Code - Split URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Veo Gen Video": {
      "main": [
        [
          {
            "node": "Wait 30s1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP - Check Status": {
      "main": [
        [
          {
            "node": "Is Success?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Success?": {
      "main": [
        [
          {
            "node": "Code - Parse URL1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait 30s1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 30s1": {
      "main": [
        [
          {
            "node": "HTTP - Check Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Parse URL1": {
      "main": [
        []
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false
  },
  "createdAt": "2025-12-30 13:42:25.070",
  "updatedAt": "2026-02-06 04:01:14.579"
}