This workflow corresponds to n8n.io template #6777 — we link there as the canonical source.
This workflow follows the Chainllm → Form Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "p6ZGlBlqg4mNUqot",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "automated-video-generator",
"tags": [],
"nodes": [
{
"id": "9952a111-d549-4603-b90f-0a189d645647",
"name": "Set Idea",
"type": "n8n-nodes-base.set",
"position": [
360,
220
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "84924182-8e05-4bc6-b8b6-3863c1be0f06",
"name": "User Input",
"type": "string",
"value": "={{ $json['The Main Topic'] }}"
},
{
"id": "02602696-d3ad-4aeb-9d18-e80c6cf2ec17",
"name": "Script Duration",
"type": "string",
"value": "={{ $json.Duration }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "81619121-5bb2-4403-8edc-8a6e0d2bec48",
"name": "Create Clips",
"type": "n8n-nodes-base.httpRequest",
"position": [
1420,
2100
],
"parameters": {
"url": "http://host.docker.internal:9090/v1/image/transform/video",
"method": "POST",
"options": {},
"jsonBody": "={\n \"image_url\":\"https://drive.usercontent.google.com/download?id={{ $json['Image-id']}}&authuser=0\",\n \"length\": {{ $json.Duration }},\n \"frame_rate\": 25,\n \"zoom_speed\": 3,\n \"id\": \"{{ $json.Record_id }}\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
},
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "bc97bab1-190f-49cb-989f-a46b2c011bf7",
"name": "Combine Clips",
"type": "n8n-nodes-base.httpRequest",
"position": [
1640,
2400
],
"parameters": {
"url": "http://host.docker.internal:9090/v1/video/concatenate",
"method": "POST",
"options": {
"timeout": 50000
},
"jsonBody": "={\n \"video_urls\": {{ JSON.stringify($json.video_urls) }}\n \n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "1f168f4f-e151-492b-9305-267edc4b794d",
"name": "Aggregate1",
"type": "n8n-nodes-base.aggregate",
"position": [
1220,
2400
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "Video Clip URL"
}
]
}
},
"typeVersion": 1
},
{
"id": "01c7bec8-58da-4e12-add3-2af23058f3ae",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
1980
],
"parameters": {
"color": 5,
"width": 1460,
"height": 320,
"content": "## Create clips from images\n"
},
"typeVersion": 1
},
{
"id": "9133e060-88a1-4d79-b7e6-f769623233ac",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
340,
2320
],
"parameters": {
"color": 5,
"width": 1740,
"height": 300,
"content": "## Combine clips into 1 video"
},
"typeVersion": 1
},
{
"id": "567afa71-7ae6-496a-aa4b-ae0f4dcd1dfe",
"name": "Loop Over Items3",
"type": "n8n-nodes-base.splitInBatches",
"position": [
980,
2080
],
"parameters": {
"options": {}
},
"executeOnce": false,
"typeVersion": 3
},
{
"id": "7ff31caf-5d94-4686-9621-edaed5aebe17",
"name": "Video url to array",
"type": "n8n-nodes-base.code",
"position": [
1420,
2400
],
"parameters": {
"jsCode": "// Extract the array of URLs\nconst urls = items[0].json[\"Video Clip URL\"] || [];\n\n// Map URLs into the required structure\nconst formattedURLs = urls.map(url => ({ \"video_url\": url }));\n\n// Return the transformed data\nreturn [{\n json: {\n \"video_urls\": formattedURLs\n }\n}];"
},
"typeVersion": 2
},
{
"id": "91c97201-5d66-4b00-9162-3b3bd26fc85d",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
340,
2900
],
"parameters": {
"color": 5,
"width": 1700,
"height": 440,
"content": "## Add Captions"
},
"typeVersion": 1
},
{
"id": "6a2f1f67-0854-4f23-a782-2279b1f02b16",
"name": "Combine Clips3",
"type": "n8n-nodes-base.httpRequest",
"position": [
720,
2720
],
"parameters": {
"url": "http://host.docker.internal:9090/v1/ffmpeg/compose",
"method": "POST",
"options": {
"timeout": 50000
},
"jsonBody": "={\n \"id\": \"audio-layering\",\n \"inputs\": [\n {\n \"file_url\": \"{{ $('Google Sheets15').item.json['Raw Video URL'] }}\"\n },\n {\n \"file_url\": \"https://drive.usercontent.google.com/download?id={{ $json.fileId }}&authuser=0\"\n }\n ],\n \"filters\": [\n {\n \"filter\": \"[1:a]volume=1[outa]\"\n }\n ],\n \"outputs\": [\n {\n \"options\": [\n {\n \"option\": \"-map\",\n \"argument\": \"0:v\"\n },\n {\n \"option\": \"-map\",\n \"argument\": \"[outa]\"\n },\n {\n \"option\": \"-c:v\",\n \"argument\": \"copy\"\n },\n {\n \"option\": \"-c:a\",\n \"argument\": \"aac\"\n }\n ]\n }\n ]\n}\n",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "ab15ed7b-fe1a-496d-90d0-1e1a22b0704e",
"name": "Add Music",
"type": "n8n-nodes-base.httpRequest",
"disabled": true,
"position": [
600,
3420
],
"parameters": {
"url": "http://host.docker.internal:9090/v1/ffmpeg/compose",
"method": "POST",
"options": {},
"jsonBody": "={\n \"id\": \"audio-layering\",\n \"inputs\": [\n {\n \"file_url\": \"{{ $json['Video + Caption URL'] }}\"\n },\n {\n \"file_url\": \"http://host.docker.internal:9000/music/epic-emotinal-inspirational-207071.mp3\"\n }\n ],\n \"filters\": [\n {\n \"filter\": \"[1:a]aloop=loop=-1:size=2G[audio_loop];[0:a]volume=2[audio1];[audio_loop]volume=0.5[audio2];[audio1][audio2]amix=inputs=2:duration=first[outa]\"\n }\n ],\n \"outputs\": [\n {\n \"options\": [\n {\n \"option\": \"-map\",\n \"argument\": \"0:v\"\n },\n {\n \"option\": \"-map\",\n \"argument\": \"[outa]\"\n },\n {\n \"option\": \"-c:v\",\n \"argument\": \"copy\"\n },\n {\n \"option\": \"-c:a\",\n \"argument\": \"aac\"\n }\n ]\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "69bbc938-61d7-4339-abe0-eed1258338bf",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
340,
2640
],
"parameters": {
"color": 5,
"width": 720,
"height": 240,
"content": "## Combine Video & Audio"
},
"typeVersion": 1
},
{
"id": "743f15c4-28b5-4f24-9dde-9af278397137",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
60
],
"parameters": {
"color": 5,
"width": 1820,
"height": 540,
"content": "## Create script, title & description"
},
"typeVersion": 1
},
{
"id": "ccf8666d-2c27-4c32-88d1-238411cfc18a",
"name": "Get Captions",
"type": "n8n-nodes-base.httpRequest",
"position": [
400,
900
],
"parameters": {
"url": "=http://host.docker.internal:8880/dev/timestamps/{{ $('Generate TTS').item.json.headers[\"x-timestamps-path\"] }}",
"method": "=GET",
"options": {
"response": {
"response": {
"fullResponse": true,
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "275bb51e-18da-402f-a766-d6dbda6b7f54",
"name": "Generate TTS",
"type": "n8n-nodes-base.httpRequest",
"position": [
600,
680
],
"parameters": {
"url": "http://host.docker.internal:8880/dev/captioned_speech",
"method": "POST",
"options": {
"response": {
"response": {
"fullResponse": true
}
}
},
"jsonBody": "={\n \"model\": \"kokoro\",\n \"input\": {{ JSON.stringify($json.Script) }},\n \"voice\": \"{{ $json['TTS Voice'] }}\",\n \"response_format\": \"mp3\",\n \"download_format\": \"mp3\",\n\"return_timestamps\": true,\n \"speed\": 0.8\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "f5d63602-20f5-4a6d-931a-c5029d0b9673",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
620
],
"parameters": {
"color": 5,
"width": 860,
"height": 460,
"content": "## Generate TTS (Voice Over)\n"
},
"typeVersion": 1
},
{
"id": "f796c284-dc54-4b81-995e-0eb41bd8d433",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
760,
1180
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "Segments"
},
"typeVersion": 1
},
{
"id": "4fee4ec5-68ab-489e-87b0-740322eee2d3",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
1260,
1180
],
"parameters": {
"options": {},
"fieldToSplitOut": "segments"
},
"typeVersion": 1
},
{
"id": "fac5709b-1cf0-4423-8242-5912c0c3adbb",
"name": "Fixer",
"type": "n8n-nodes-base.code",
"position": [
1100,
1180
],
"parameters": {
"jsCode": "// Assume the previous node output is available here\nconst inputSegments = $input.first().json.segments; // Accessing segments from the previous output\n\nif (inputSegments.length > 0) {\n const lastSegment = inputSegments[inputSegments.length - 1].json;\n \n // Check if the last segment's duration is less than 2 seconds\n if (parseFloat(lastSegment.duration) < 2.0) {\n // Combine the last segment with the previous segment if it exists\n if (inputSegments.length > 1) {\n const secondLastSegment = inputSegments[inputSegments.length - 2].json;\n\n // Update the second last segment's words and duration\n secondLastSegment.words += ' ' + lastSegment.words;\n secondLastSegment.duration = (\n parseFloat(secondLastSegment.duration) +\n parseFloat(lastSegment.duration)\n ).toFixed(2); // Update duration\n\n // Remove the last segment as it has been merged\n inputSegments.pop();\n }\n }\n}\n\n// Return the updated segments\nreturn [{ json: { segments: inputSegments } }];"
},
"typeVersion": 2
},
{
"id": "d5d7bfd9-3b10-43e2-9ed7-dc6132eae433",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
1100
],
"parameters": {
"color": 5,
"width": 2380,
"height": 380,
"content": "## Generate scenes & image prompts\n"
},
"typeVersion": 1
},
{
"id": "32919086-5d9d-4fe8-9043-13b9d113166b",
"name": "Split into 5s Scenes",
"type": "n8n-nodes-base.code",
"position": [
920,
1180
],
"parameters": {
"jsCode": "// Set the segment length in seconds\nconst splitLength = 6;\n\n// Extract the list of words from the input\nconst segmentWrapper = $input.first().json; // Get the JSON input\nconst wordList = segmentWrapper.Segments[0].data; // Access the words array\n\n// Initialize variables\nconst segments = [];\nlet currentSegment = {\n id: 0,\n words: \"\",\n duration: 0\n};\nlet currentStartTime = -1;\nlet totalDuration = 0;\nlet currentEndTime = 0;\n\n// Define a small pause buffer for spacing between segments\nconst pauseBuffer = 0.1;\n\n// Loop through each word and create segments\nfor (const wordObj of wordList) {\n const { word, start_time, end_time } = wordObj;\n\n // Set start time for the segment if not already set\n if (currentStartTime === -1) {\n currentStartTime = start_time;\n }\n\n // Add the current word to the segment\n currentSegment.words += (currentSegment.words ? ' ' : '') + word;\n\n // Update the segment's end time\n currentEndTime = end_time;\n\n // Calculate duration of the current segment\n currentSegment.duration = (currentEndTime - currentStartTime).toFixed(2);\n\n // If duration exceeds split length, finalize this segment\n if (currentSegment.duration >= splitLength) {\n currentSegment.duration = (parseFloat(currentSegment.duration) + pauseBuffer).toFixed(2);\n totalDuration += parseFloat(currentSegment.duration);\n segments.push(currentSegment);\n\n // Reset for the next segment\n currentSegment = {\n id: segments.length,\n words: \"\",\n duration: 0\n };\n currentStartTime = -1;\n }\n}\n\n// Handle the last segment if any words are left\nif (currentSegment.words) {\n currentSegment.duration = (currentEndTime - currentStartTime).toFixed(2);\n currentSegment.duration = (parseFloat(currentSegment.duration) + pauseBuffer).toFixed(2);\n totalDuration += parseFloat(currentSegment.duration);\n segments.push(currentSegment);\n}\n\n// Calculate total duration in minutes and seconds\nconst roundedTotalDuration = Math.round(totalDuration);\nconst minutes = Math.floor(roundedTotalDuration / 60);\nconst seconds = roundedTotalDuration % 60;\n\n// Use string concatenation instead of template literals (for n8n compatibility)\nconst totalRuntimeString = minutes + \" minute\" + (minutes !== 1 ? \"s\" : \"\") + \", \" + seconds + \" second\" + (seconds !== 1 ? \"s\" : \"\");\n\n// Return the output as an array of objects\nreturn [\n {\n json: {\n segments: segments.map(segment => ({ json: segment })),\n totalDuration: roundedTotalDuration,\n TotalMinutes: totalRuntimeString\n }\n }\n];\n"
},
"typeVersion": 2
},
{
"id": "4b23af81-ff27-4fc1-bba6-5fda21bd1fc3",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
340,
3360
],
"parameters": {
"color": 4,
"width": 720,
"height": 240,
"content": "## Add BG Music"
},
"typeVersion": 1
},
{
"id": "aeb274a4-a631-4473-bc1b-7637b22de343",
"name": "Create Captions",
"type": "n8n-nodes-base.httpRequest",
"position": [
580,
2980
],
"parameters": {
"url": "http://host.docker.internal:9090/v1/video/caption",
"method": "POST",
"options": {
"timeout": 90000
},
"jsonBody": "={\n \"video_url\": \"{{ $json['Video + Audio URL'] }}\",\n \"settings\": {\n \"line_color\": \"#FFFFFF\",\n \"word_color\": \"#FF0000\",\n \"all_caps\": false,\n \"max_words_per_line\": 3,\n \"font_size\": 70,\n \"bold\": false,\n \"italic\": false,\n \"underline\": false,\n \"strikeout\": false,\n \"outline_width\": 6,\n \"shadow_offset\": 8,\n \"style\": \"highlight\",\n \"font_family\": \"The Bold Font\",\n \"position\": \"middle_center\"\n },\n \"id\": \"{{ $json['Captions URL'] }}\"\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "496a8900-4fd3-4a68-a7ab-99275a015701",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-680,
1660
],
"parameters": {
"options": {
"ignoreBots": true,
"appendAttribution": false
},
"formTitle": "Magic Video Generator",
"formFields": {
"values": [
{
"fieldType": "textarea",
"fieldLabel": "The Main Topic",
"placeholder": "Amazing world of cats",
"requiredField": true
},
{
"fieldType": "dropdown",
"fieldLabel": "Duration",
"fieldOptions": {
"values": [
{
"option": "30 Second"
},
{
"option": "1 Minute"
},
{
"option": "2 Minutes"
},
{
"option": "1.5 Minutes"
}
]
}
},
{
"fieldType": "dropdown",
"fieldLabel": "Generative Style",
"fieldOptions": {
"values": [
{
"option": "Lego"
},
{
"option": "Minecraft"
},
{
"option": "Disney Pixar"
},
{
"option": "Hand-Drawn"
},
{
"option": "Chibi"
},
{
"option": "Anime"
},
{
"option": "Hyper-Realistic"
},
{
"option": "Cyberpunk"
},
{
"option": "fantasy"
}
]
}
},
{
"fieldType": "dropdown",
"fieldLabel": "Video Type",
"fieldOptions": {
"values": [
{
"option": "From user idea"
},
{
"option": "From transcript"
}
]
},
"requiredField": true
},
{
"fieldType": "dropdown",
"fieldLabel": "TTS Voice",
"fieldOptions": {
"values": [
{
"option": "af_alloy"
},
{
"option": "af_aoede"
},
{
"option": "af_bella"
},
{
"option": "af_heart"
},
{
"option": "af_jadzia"
},
{
"option": "af_jessica"
},
{
"option": "af_kore"
},
{
"option": "af_nicole"
},
{
"option": "af_nova"
},
{
"option": "af_river"
},
{
"option": "af_sarah"
},
{
"option": "af_sky"
},
{
"option": "am_adam"
},
{
"option": "am_echo"
},
{
"option": "am_eric"
},
{
"option": "am_fenrir"
},
{
"option": "am_liam"
},
{
"option": "am_michael"
},
{
"option": "am_onyx"
},
{
"option": "am_puck"
},
{
"option": "am_santa"
},
{
"option": "am_v0adam"
}
]
},
"requiredField": true
},
{
"fieldType": "dropdown",
"fieldLabel": "Image Provider",
"fieldOptions": {
"values": [
{
"option": "together.ai"
},
{
"option": "fal.ai"
}
]
},
"requiredField": true
}
]
},
"formDescription": "By: Laki"
},
"typeVersion": 2.2
},
{
"id": "1429b509-1e99-420f-9f7a-c232a7b68f0b",
"name": "Structured Output Parser1",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1380,
440
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"Title\": {\n \"type\": \"string\",\n \"description\": \"Short and engaging title, curiosity-driven.\"\n },\n \"Description\": {\n \"type\": \"string\",\n \"description\": \"Short description with key hashtags, hook, context, CTA, and hashtags.\"\n },\n \"Hook\": {\n \"type\": \"string\",\n \"description\": \"Introduction.\"\n },\n \"MainScript\": {\n \"type\": \"string\",\n \"description\": \"Main script content.\"\n },\n \"CTA\": {\n \"type\": \"string\",\n \"description\": \"Call to action\"\n }\n },\n \"required\": [\"Title\", \"Description\", \"Intro\", \"MainScript\"]\n}"
},
"typeVersion": 1.2
},
{
"id": "1326ed6c-21d0-453e-8a53-d99008e4ff1d",
"name": "Structured Output Parser2",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
1660,
1300
],
"parameters": {
"jsonSchemaExample": "{\n \"Prompt\": \"enter prompt here\"\n}"
},
"typeVersion": 1.2
},
{
"id": "48f543c4-7558-4f02-b7b5-6a8d3c847a7a",
"name": "Script Writier \ud83e\udde0",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
800,
320
],
"parameters": {
"text": "=The Topic:\n{{ $json[\"User Input\"] }}\n\nRough Duration:\n{{ $('Set Idea').item.json['Script Duration'] }}",
"messages": {
"messageValues": [
{
"message": "=Act as a YouTube video scriptwriter who specializes in transforming user-submitted ideas\u2014whether they are story concepts or intriguing facts\u2014into engaging, bite-sized video scripts. The user will also provide a target video length, which you should keep in mind while crafting the content. Your goal is to take these ideas and produce compelling, original content without referencing specific sources or names.\n\nYour script should be engaging, energetic, and easy to follow, turning user concepts into captivating narratives within the specified video length. Use a conversational tone, vivid descriptions, and a strong hook to instantly grab attention. Keep the pacing snappy, ensuring that every second counts.\n\nNEVER add linebreaks or emojis to the hook, main script & CTA\n\n**Output Format:**\n- **Title:** [Catchy, curiosity-driven title based on user idea] \n- **Description:** [50-150 characters, snappy summary with key hashtags relevant to the user\u2019s topic] \n- **Hook:** [An attention-grabbing opening line inspired by the user idea] \n- **MainScript:** [A natural, spoken-style script without line breaks or emojis, tailored to the user-defined video length] \n- **Call to Action:** [A compelling prompt encouraging viewers to engage, like \"What was your favorite part of this story?\" or \"Want to explore more ideas? Follow for more!\"]\n\nMake sure the MainScript feels seamless and original, as if these insights are being shared firsthand. No direct references to names, specific sources, or the user\u2014just pure, engaging storytelling that keeps viewers hooked."
}
]
},
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "d2b139a7-431c-4bb2-bcda-05e3b2ca1ddc",
"name": "Output Parser \ud83d\udee0",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1200,
220
],
"parameters": {
"text": "=User Imput:\n{{ $json.text }}",
"messages": {
"messageValues": [
{
"message": "=Take the user input and output in the following JSON Structure, DO NOT change or alter any of the text\n\n{\n \"type\": \"object\",\n \"properties\": {\n \"Title\": {\n \"type\": \"string\",\n \"description\": \"Short and engaging title, curiosity-driven.\"\n },\n \"Description\": {\n \"type\": \"string\",\n \"description\": \"Short description with key hashtags, hook, context, CTA, and hashtags.\"\n },\n \"Hook\": {\n \"type\": \"string\",\n \"description\": \"The hook.\"\n },\n \"MainScript\": {\n \"type\": \"string\",\n \"description\": \"Main script content.\"\n },\n \"CTA\": {\n \"type\": \"string\",\n \"description\": \"Call to action\"\n }\n },\n \"required\": [\"Title\", \"Description\", \"Intro\", \"MainScript\"]\n}"
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5
},
{
"id": "d284010f-deaa-4d33-8ab7-3d5a57752232",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
540,
220
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "From transcript",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "67835e1a-7770-4d3e-b9d6-0dac59a5923a",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $('On form submission').item.json['Video Type'] }}",
"rightValue": "From transcript"
}
]
},
"renameOutput": true
},
{
"outputKey": "User Idea",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "171a9dfd-59a3-49a4-af28-c284abc85f13",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "",
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "73a78c20-1913-497c-a8f1-e15d8bd3ff3a",
"name": "Image Prompter V2 \ud83d\udcf7",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1520,
1140
],
"parameters": {
"text": "=Heres the full script:\n{{ $('Google Sheets3').item.json.Script }}\n\nGenerative style:\n{{ $('Google Sheets3').item.json['Generative Style'] }}\n\nHere is the current scene:\nScript portion: {{ $json.json.words }}\nScript position: {{ $json.json.id }}",
"messages": {
"messageValues": [
{
"message": "=You are an image prompt generator agent for video production. Your role is to create starting frames for a longer video by transforming script segments into visually descriptive image prompts. Each scene will be generated in a specified artistic style, which must be factored into the prompt to ensure consistency. \n\nOutput a JSON object containing the prompt for the current script segment that you are presented with: \n\n```json\n{\n \"Prompt\": \"enter prompt here\"\n}\n``` \n\n### **IMPORTANT INSTRUCTIONS:** \n\n- **Always** incorporate the given style into the visual description. \n- **Never** include text in the images.\n- **Never** exceed 240 characters in your prompt. \n- **Keep images visually compelling** \u2013 Instead of basic or static representations, focus on **dynamic compositions, dramatic angles, striking lighting, immersive textures, and environmental storytelling**. \n- **Small subjects should have compelling micro-world narratives** \u2013 If the subject is small (e.g., a drop of water, a single key, a lone leaf), provide a **rich atmosphere**, interplay of lighting, and framing that enhances storytelling. \n- **Focus on depth, detail, and artistic impact** rather than excessive complexity. \n\n\nA well-crafted prompt should now include: \n\n- **Subject:** The main focus of the image. \n- **Style:** The artistic style provided for this scene (e.g., Lego, Minecraft, Disney Pixar, Hand-Drawn, Chibi, Anime, Hyper-Realistic, Cyberpunk). \n- **Composition:** Use **engaging angles** (macro close-ups, over-the-shoulder, dynamic perspectives). \n- **Lighting:** Prioritize dramatic effects like **backlighting, neon glows, moody shadows, or iridescent reflections** for added immersion. \n- **Micro-World Storytelling:** Ensure even small objects contribute to a **scene with intrigue, interaction, or emotion**. \n- **Color Palette:** The dominant colors or color scheme. \n- **Mood/Atmosphere:** The emotional tone of the image. \n- **Technical Details:** Camera effects like **bokeh, depth of field, contrast**, or lens distortion to make the image feel real. \n- **Additional Elements:** Small but meaningful details that **enhance interest without overwhelming the scene**. \n\n\nExample Prompts\n\n- **Style: Hyper-Realistic** \u2013 A hyperrealistic macro shot of a single droplet of glue stretching delicately from a cracked porcelain teacup, caught in the moment before it falls. The soft golden glow from a nearby desk lamp refracts through the droplet, revealing tiny swirling textures inside. Dust particles float around, illuminated in the warm evening light. \n- **Style: Minecraft** \u2013 A blocky Minecraft-style cavern glowing with radiant blue crystals embedded in stone. A pixelated adventurer stands at the entrance, silhouetted against eerie, ambient light. Shadows dance across the cave walls, creating intrigue. \n- **Style: Disney Pixar** \u2013 A cozy animated bakery at sunrise, where a little girl with oversized round glasses watches a tray of fresh golden pastries steaming on the counter. Soft beams of morning sunlight filter in, casting a warm, dreamy glow on the checkered tiles. \n- **Style: Cyberpunk** \u2013 A neon-lit cyberpunk alleyway drenched in rain. The headlights of a hoverbike cut through thin mist as a shadowy figure in a metallic trench coat leans against a graffiti-covered wall. Bright neon blues and deep magentas create dramatic contrast. \n\n"
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.5
},
{
"id": "5d4fe68e-e8e7-4cfd-a51c-a1ac075101f8",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
560,
1580
],
"parameters": {
"options": {}
},
"executeOnce": false,
"typeVersion": 3
},
{
"id": "9ad9d92d-3e55-4d4e-a215-c9ad3e30caed",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
340,
1500
],
"parameters": {
"color": 5,
"width": 2240,
"height": 460,
"content": "## Image Generation - flux/schnell\n"
},
"typeVersion": 1
},
{
"id": "b8617797-562a-4ea3-8f63-54ae0b6642a5",
"name": "Wait1",
"type": "n8n-nodes-base.wait",
"position": [
1960,
1760
],
"parameters": {
"amount": 10
},
"typeVersion": 1.1
},
{
"id": "8b5575ff-891c-482b-acb5-308d19c20a21",
"name": "Long form to Script Writier \ud83e\udde0",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
800,
100
],
"parameters": {
"text": "=The Transcript:\n{{ $json['User Input'] }}",
"messages": {
"messageValues": [
{
"message": "=Act as a YouTube video scriptwriter who specializes in transforming insights, interesting facts, and key takeaways into engaging, bite-sized video scripts. Your goal is to craft compelling short-form scripts based on the most intriguing ideas from long-form podcast transcripts\u2014presenting them as fresh, original content without referencing sources or names. \n\nYour script should be engaging, energetic, and easy to follow, turning complex ideas into exciting, digestible narratives. Use a conversational tone, vivid descriptions, and a strong hook to instantly grab attention. Keep the pacing snappy, ensuring every second counts. \n\nImportant Guidelines:\n- Do NOT use asterisks (*) or emojis. Keep the text clean and formatted naturally. \n- Do NOT include line breaks within the \"MainScript\" unless necessary for readability. Write in a natural, spoken style as if it\u2019s being delivered by a person. \n- The script must feel ORIGINAL and conversational, without direct references to specific podcasts, hosts, or episodes. \n- The Call to Action should remain simple and engaging. Examples: \"What was your favorite insight?\" or \"Want more ideas like this? Follow for more!\"\n\nOutput Format: \n- Title: [Catchy, curiosity-driven title] \n- Description: [50-150 characters, snappy summary with key hashtags] \n- Hook: [An attention-grabbing opening line] \n- MainScript: [A natural, spoken-style script\u2014NO asterisks, NO emojis, NO unnecessary formatting] \n- Call to Action: [A compelling prompt encouraging viewers to engage] \n\nMake sure the MainScript feels seamless and engaging, as if these insights are being shared firsthand. Keep everything punchy and to the point, ensuring high retention and engagement. "
}
]
},
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "3101bf3e-914f-4399-a79e-e71062ab4f5a",
"name": "Open Router - Deepseek v3.1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
1100,
460
],
"parameters": {
"model": "deepseek/deepseek-chat-v3-0324:free",
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "73ccefcd-3853-4377-a512-0d4aea250e63",
"name": "Open Router - Deepseek v3.",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
1460,
1320
],
"parameters": {
"options": {}
},
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "8a09ae17-3741-4c11-aec3-b3310dc59b6e",
"name": "Combine",
"type": "n8n-nodes-base.set",
"position": [
1540,
220
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "7cd1dc03-8331-44ba-bda9-848145bab939",
"name": "Main Script",
"type": "string",
"value": "={{ $json.output.Hook }} {{ $json.output.MainScript }} {{ $json.output.CTA }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "397ad456-d135-482f-a1c4-b9ff75018299",
"name": "Format Cleanup",
"type": "n8n-nodes-base.set",
"position": [
1720,
220
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "bfd6c0e6-93c2-496a-8f3d-9ebc3061e78f",
"name": "Script",
"type": "string",
"value": "={{$json['Main Script']\n .replace(/\\n{2,}/g, \"\") // Remove multiple newlines\n .replace(/\\*(.*?)\\*/g, \"$1\") // Remove asterisks around words\n}}\n"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2992c735-486d-4774-89cc-86ed1b79e71f",
"name": "Base64 To String",
"type": "n8n-nodes-base.set",
"position": [
1260,
1760
],
"parameters": {
"fields": {
"values": [
{
"name": "base64Image",
"stringValue": "={{ $json.body.data[0].b64_json }}"
}
]
},
"options": {}
},
"typeVersion": 3.1
},
{
"id": "b403ba33-534a-4681-bcc1-ffcf90f7193c",
"name": "Convert String to binary",
"type": "n8n-nodes-base.moveBinaryData",
"position": [
1440,
1760
],
"parameters": {
"mode": "jsonToBinary",
"options": {
"fileName": "image.png",
"mimeType": "image/png",
"dataIsBase64": true
},
"sourceKey": "base64Image",
"convertAllData": false
},
"typeVersion": 1
},
{
"id": "19c12852-22f8-4ebc-b97e-da5c9f0119bc",
"name": "IDs To Array1",
"type": "n8n-nodes-base.code",
"position": [
2320,
1140
],
"parameters": {
"jsCode": "// Initialize an array to hold IDs\nconst ids = [];\n\n// Loop over input items\nfor (const item of $input.all()) {\n // Loop through each 'data' array\n for (const dataItem of item.json.data) {\n // Check if 'Record_id' is present\n if ('Record_id' in dataItem) {\n // Push the ID into the array\n ids.push(dataItem.Record_id);\n }\n }\n}\n\n// Return the array wrapped in an object\nreturn [{ json: { ids } }];\n"
},
"typeVersion": 2
},
{
"id": "6a93455d-0f4d-4fdf-9f7a-ae0e988e2eb7",
"name": "Aggregate3",
"type": "n8n-nodes-base.aggregate",
"position": [
2100,
1140
],
"parameters": {
"include": "specifiedFields",
"options": {},
"aggregate": "aggregateAllItemData",
"fieldsToInclude": "=Record_id"
},
"typeVersion": 1
},
{
"id": "38d9896d-7013-4d40-adfc-c775c7649ce9",
"name": "HTTP - Together.ai",
"type": "n8n-nodes-base.httpRequest",
"position": [
1060,
1760
],
"parameters": {
"url": "https://api.together.xyz/v1/images/generations",
"method": "POST",
"options": {
"response": {
"response": {
"fullResponse": true
}
}
},
"jsonBody": "={\n \"model\": \"black-forest-labs/FLUX.1-schnell-Free\",\n \"prompt\": {{ JSON.stringify($json.Prompt) }},\n \"width\": 576,\n \"height\": 1024,\n \"steps\": 4,\n \"n\": 1,\n \"response_format\": \"b64_json\"\n }",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "07e21acd-5108-42cb-8694-0245c9ddf325",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"disabled": true,
"position": [
1000,
1680
],
"parameters": {
"width": 1160,
"height": 260,
"content": "## together.ai FREE - Has rate limits so much slower due to batching"
},
"typeVersion": 1
},
{
"id": "4ea7537f-f72c-4f2f-96ed-4cb6a14d6e0f",
"name": "Google Sheets1",
"type": "n8n-nodes-base.googleSheets",
"position": [
380,
680
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1DkNSHR_yeqTR3IKudp8-W__PtvnnReOyaT0b8qmAK7E",
"cachedResultUrl": "",
"cachedResultName": "video"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "40b30a2c-22ee-437e-aaff-d1d0d65ddd2f",
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
1940,
220
],
"parameters": {
"columns": {
"value": {
"Title": "={{ $('Output Parser \ud83d\udee0').item.json.output.Title }}",
"Script": "={{ $json.Script }}",
"TTS Voice": "={{ $('On form submission').item.json['TTS Voice'] }}",
"Description": "={{ $('Output Parser \ud83d\udee0').item.json.output.Description }}",
"Initial Prompt": "={{ $('Set Idea').item.json['User Input'] }}",
"Generative Style": "={{ $('On form submission').item.json['Generative Style'] }}"
},
"schema": [
{
"id": "Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Script",
"type": "string",
"display": true,
"required": false,
"displayName": "Script",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Final Video URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Final Video URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video + Caption URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Video + Caption URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video + Audio URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Video + Audio URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Raw Video URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Raw Video URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "TTS Audio",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "TTS Audio",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "TTS Voice",
"type": "string",
"display": true,
"required": false,
"displayName": "TTS Voice",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "scenes",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "scenes",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Captions URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Captions URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Generative Style",
"type": "string",
"display": true,
"required": false,
"displayName": "Generative Style",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Initial Prompt",
"type": "string",
"display": true,
"required": false,
"displayName": "Initial Prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1DkNSHR_yeqTR3IKudp8-W__PtvnnReOyaT0b8qmAK7E",
"cachedResultUrl": "",
"cachedResultName": "video"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "46245ef4-d075-4ca8-b069-09e3df764c51",
"name": "Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
800,
680
],
"parameters": {
"name": "={{ $json.headers.date }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultUrl": "",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "18-Q0caunbnwIJRDKTMb8fHKvVS3kqynF",
"cachedResultUrl": "",
"cachedResultName": "tts"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "9c74b2ef-d345-4cb5-b2c3-200468987d5f",
"name": "Google Drive1",
"type": "n8n-nodes-base.googleDrive",
"position": [
600,
900
],
"parameters": {
"name": "={{ $json.headers.date }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultUrl": "",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1ELY3F2IhJGLrrKBIE5cMV22GyAMXx6zN",
"cachedResultUrl": "",
"cachedResultName": "caption"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "31dcda2a-01da-4dbc-a741-74fdb94eb61c",
"name": "Google Sheets2",
"type": "n8n-nodes-base.googleSheets",
"position": [
820,
900
],
"parameters": {
"columns": {
"value": {
"row_number": "={{ $('Google Sheets1').item.json.row_number }}",
"Captions URL": "={{ $json.webViewLink }}"
},
"schema": [
{
"id": "Title",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Script",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Script",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Final Video URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Final Video URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video + Caption URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Video + Caption URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Video + Audio URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Video + Audio URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Raw Video URL",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Raw Video URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "TTS Audio",
"type": "string",
"display": true,
"required": false,
"displayName": "TTS Audio",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "TTS Voice",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "TTS Voice",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "scenes",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "scenes",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Captions URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Captions URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Generative Style",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Generative Style",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Initial Prompt",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Initial Prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1DkNSHR_yeqTR3IKudp8-W__PtvnnReOyaT0b8qmAK7E",
"cachedResultUrl": "",
"cachedResultName": "video"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "472a6076-28b6-401a-943d-2c5b1f113aaf",
"name": "Google Sheets3",
"type": "n8n-nodes-base.googleSheets",
"position": [
360,
1180
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1DkNSHR_yeqTR3IKudp8-W__PtvnnReOyaT0b8qmAK7E",
"cachedResultUrl": "",
"cachedResultName": "video"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "ba9a5c64-4132-4b29-bd1a-9031f078e577",
"name": "Google Drive2",
"type": "n8n-nodes-base.googleDrive",
"position": [
500,
1180
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "url",
"value": "={{ $json['Captions URL'] }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "ec7b39cc-fdd4-4690-8a98-0dfea0df5933",
"name": "Extract from File",
"type": "n8n-nodes-base.extractFromFile",
"position": [
640,
1180
],
"parameters": {
"options": {},
"operation": "fromJson"
},
"typeVersion": 1
},
{
"id": "cb49323d-be0e-4e2c-adb6-cdc0804641ad",
"name": "Google Sheets4",
"type": "n8n-nodes-base.googleSheets",
"position": [
1880,
1140
],
"parameters": {
"columns": {
"value": {
"Prompt": "={{ $json.output.Prompt }}",
"Duration": "={{ $('Split Out').item.json.json.duration }}",
"Record_id": "={{ $('Split Out').item.json.json.id }}"
},
"schema": [
{
"id": "Record_id",
"type": "string",
"display": true,
"required": false,
"displayName": "Record_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Prompt",
"type": "string",
"display": true,
"required": false,
"displayName": "Prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Duration",
"type": "string",
"display": true,
"required": false,
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleDriveOAuth2ApigoogleSheetsOAuth2ApihttpHeaderAuthopenRouterApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow turns a user idea or transcript into a complete AI-generated video by first creating a script with DeepSeek, then producing a voiceover using customizable TTS voices and generating scene images with Together.ai. It is designed for content creators, marketers, and educators who need quick video assets without traditional filming or editing teams. The key step is the automated clip creation and concatenation that stitches everything into one finished video ready for distribution.
Use it when you need consistent short-form video from a simple prompt on a regular basis, but avoid it for high-production-value projects or when brand voice must be strictly controlled by hand. Common variations include swapping the TTS provider for different accents or languages and inserting a manual review node before final rendering.
About this workflow
End-to-End Video Creation from user idea or transcript AI-Powered Scriptwriting using LLMs (e.g., DeepSeek via OpenRouter) Voiceover Generation with customizable TTS voices Image Scene Generation using generative models like together.ai Clip Creation & Concatenation into a full…
Source: https://n8n.io/workflows/6777/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Send any URL to your Telegram bot and get an AI summary instantly.
This comprehensive N8N automation template revolutionizes content creation by delivering a complete end-to-end solution for AI-powered blog generation. Transform simple ideas into fully SEO-optimized,
Effortlessly track your expenses with MoneyMate, an n8n workflow that transforms receipts into organized financial insights.
Disclaimer: This template requires the community node, which is only available on self-hosted n8n instances. You’ll need a self-hosted n8n setup to use this workflow.
The Recap AI - VEO 3 Bigfoot Video. Uses formTrigger, lmChatAnthropic, chainLlm, slack. Event-driven trigger; 26 nodes.