AutomationFlowsAI & RAG › Auto-translate & Recreate Tiktok Carousels with Gemini Vision & Midjourney

Auto-translate & Recreate Tiktok Carousels with Gemini Vision & Midjourney

ByXavier Tai @xaviertai on n8n.io

An end-to-end automation system that monitors TikTok accounts for new 3-image carousel posts, extracts text overlays and visual layouts using AI vision analysis, translates content into English, and automatically regenerates brand-new carousel images ready for review and posting.

Cron / scheduled trigger★★★★☆ complexityAI-powered21 nodesHTTP RequestMove Binary DataGoogle GeminiAgentOpenAI ChatGoogle SheetsGmailOpenAI
AI & RAG Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #9305 — we link there as the canonical source.

This workflow follows the Agent → Gmail 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 →

Download .json
{
  "id": "X6VDrKCPuYTJ0C2N",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "TikTok Carousel Replicator & Translator",
  "tags": [],
  "nodes": [
    {
      "id": "e4fd6e4d-dcaf-4f3d-9a43-a5d4c9a4cbff",
      "name": "Daily TikTok Check",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        64,
        144
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "0f6cc537-4250-4bbe-a1d6-b3d664e91b0a",
      "name": "Fetch TikTok RSS Feed",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Replace USERNAME with target account. Alternative: use TikTok API if available",
      "position": [
        336,
        144
      ],
      "parameters": {
        "url": "https://www.tiktok.com/@USERNAME/rss",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ca4a910c-c14c-42be-97aa-dbd351446141",
      "name": "Parse RSS Feed",
      "type": "n8n-nodes-base.moveBinaryData",
      "position": [
        656,
        144
      ],
      "parameters": {
        "mode": "jsonToBinary",
        "options": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "b4aed3a0-d173-4cde-b9af-069b11de4d3d",
      "name": "Filter: Only 3-Image Posts",
      "type": "n8n-nodes-base.if",
      "position": [
        928,
        144
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition-carousel",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.imageCount }}",
              "rightValue": 3
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9ae70971-c546-46eb-8c2e-3e59aa5da694",
      "name": "Split Images",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        48,
        560
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "images"
      },
      "typeVersion": 1
    },
    {
      "id": "bfb111ff-7b4a-4826-9dfb-eab08413fff3",
      "name": "Download Image",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        480,
        560
      ],
      "parameters": {
        "url": "={{ $json.imageUrl }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "492fa7f6-32aa-4047-a8c4-15a519875608",
      "name": "Extract Text & Layout (Gemini Vision)",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        928,
        560
      ],
      "parameters": {
        "text": "Analyze this image and extract:\n1. All visible text overlays (exact text)\n2. Text position (top/center/bottom)\n3. Text style (bold, font size relative to image)\n4. Image type (emotional scene / product mockup / text excerpt)\n5. Main visual elements\n6. Color scheme\n\nReturn as structured JSON.",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "image",
        "inputType": "binary",
        "operation": "analyze"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e6140758-3349-4944-8c6a-830fff40d768",
      "name": "Create Midjourney Prompt",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        464,
        944
      ],
      "parameters": {
        "text": "=Original Image Analysis:\n{{ $('Extract Text & Layout (Gemini Vision)').item.json.analysis }}\n\nTranslated Text:\n{{ $json.translatedText }}\n\nImage Type: {{ $('Extract Text & Layout (Gemini Vision)').item.json.imageType }}\n\nGenerate a Midjourney v6 prompt to recreate this image with:\n- Same composition and layout\n- Same emotional tone\n- Translated English text overlay in the same position\n- High quality, realistic style\n- Text should be: {{ $json.translatedText }}",
        "options": {
          "systemMessage": "You are an expert at creating detailed Midjourney prompts. Generate prompts that recreate the exact layout, emotion, and text positioning from the original image analysis."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "fc9b7717-b143-4e7c-b2dc-b6287a329d88",
      "name": "OpenAI GPT-4",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        464,
        1088
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "aa71c972-0469-4858-a2dd-ac52602ca9b9",
      "name": "Generate New Image (Midjourney)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        736,
        944
      ],
      "parameters": {
        "url": "https://api.midjourney.com/v1/imagine",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"prompt\": {{ JSON.stringify($json.output) }},\n  \"aspect_ratio\": \"9:16\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.2
    },
    {
      "id": "299b4233-3d17-4978-bbc7-0bf702cf4f7b",
      "name": "Wait for Image Generation",
      "type": "n8n-nodes-base.wait",
      "position": [
        928,
        944
      ],
      "parameters": {
        "resume": "webhook",
        "options": {},
        "httpMethod": "POST",
        "resumeUnit": "minutes",
        "resumeAmount": 5,
        "limitWaitTime": true
      },
      "typeVersion": 1.1
    },
    {
      "id": "1571ebe4-03e0-462e-add0-eb822bf47eab",
      "name": "Combine 3 Images",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        48,
        1376
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "generatedImageUrl"
            },
            {
              "fieldToAggregate": "originalImageUrl"
            },
            {
              "fieldToAggregate": "translatedText"
            },
            {
              "fieldToAggregate": "imageType"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e86bf189-f18b-4989-a3dd-de0a5493dde1",
      "name": "Save to Review Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        432,
        1376
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $now.format('yyyy-MM-dd') }}",
            "Status": "Ready for Review",
            "Post URL": "={{ $json.originalPostUrl }}",
            "Image 1 - New": "={{ $json.generatedImageUrl[0] }}",
            "Image 2 - New": "={{ $json.generatedImageUrl[1] }}",
            "Image 3 - New": "={{ $json.generatedImageUrl[2] }}",
            "Image 1 - Text": "={{ $json.translatedText[0] }}",
            "Image 1 - Type": "={{ $json.generatedImageUrl[0].imageType }}",
            "Image 2 - Text": "={{ $json.translatedText[1] }}",
            "Image 2 - Type": "={{ $json.generatedImageUrl[1].imageType }}",
            "Image 3 - Text": "={{ $json.translatedText[2] }}",
            "Image 3 - Type": "={{ $json.generatedImageUrl[2].imageType }}",
            "Image 1 - Original": "={{ $json.originalImageUrl[0] }}",
            "Image 2 - Original": "={{ $json.originalImageUrl[1] }}",
            "Image 3 - Original": "={{ $json.originalImageUrl[2] }}"
          },
          "schema": [
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "79815f6e-db2e-4eef-8922-bf56d3b9f452",
      "name": "Send Review Notification",
      "type": "n8n-nodes-base.gmail",
      "position": [
        832,
        1376
      ],
      "parameters": {
        "message": "=<h2>Daily TikTok Carousel Generation Complete</h2>\n<p>A new 3-image carousel has been generated and is ready for your review.</p>\n<p><strong>View in Google Sheets:</strong> <a href=\"https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID\">Review Dashboard</a></p>\n<hr>\n<h3>Preview:</h3>\n<ul>\n<li><strong>Image 1 ({{ $json.generatedImageUrl[0].imageType }}):</strong><br><img src=\"{{ $json.generatedImageUrl[0] }}\" width=\"300\"><br>Text: {{ $json.translatedText[0] }}</li>\n<li><strong>Image 2 ({{ $json.generatedImageUrl[1].imageType }}):</strong><br><img src=\"{{ $json.generatedImageUrl[1] }}\" width=\"300\"><br>Text: {{ $json.translatedText[1] }}</li>\n<li><strong>Image 3 ({{ $json.generatedImageUrl[2].imageType }}):</strong><br><img src=\"{{ $json.generatedImageUrl[2] }}\" width=\"300\"><br>Text: {{ $json.translatedText[2] }}</li>\n</ul>",
        "options": {},
        "subject": "\ud83c\udfa8 New TikTok Carousel Ready for Review"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "abe01273-a4ef-4926-9d77-5d7873786742",
      "name": "Monitor Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "color": 2,
        "width": 1076,
        "height": 400,
        "content": "## \ud83d\udcf1 TikTok Monitor\nDaily check for new carousel posts"
      },
      "typeVersion": 1
    },
    {
      "id": "cfc5514f-2172-46d4-9348-e94a7e484e35",
      "name": "Analysis Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        416
      ],
      "parameters": {
        "color": 3,
        "width": 1076,
        "height": 400,
        "content": "## \ud83d\udd0d Extract & Analyze\nOCR + Vision AI to extract text overlays and layout"
      },
      "typeVersion": 1
    },
    {
      "id": "a542ce25-2347-4792-8609-93af68f1e95d",
      "name": "Translation Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        832
      ],
      "parameters": {
        "color": 4,
        "width": 388,
        "height": 400,
        "content": "## \ud83c\udf10 Translate\nAutomatic translation to English"
      },
      "typeVersion": 1
    },
    {
      "id": "a1b30c21-29d4-46ee-91ad-75ede44d0cfd",
      "name": "Generation Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        832
      ],
      "parameters": {
        "color": 5,
        "width": 676,
        "height": 400,
        "content": "## \ud83c\udfa8 Generate New Images\nAI-powered recreation with translated text"
      },
      "typeVersion": 1
    },
    {
      "id": "305f6492-6e4f-43f7-9695-23cf24218372",
      "name": "Delivery Section",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        1248
      ],
      "parameters": {
        "color": 6,
        "width": 1076,
        "height": 448,
        "content": "## \u2705 Review & Deliver\nOrganize results for client approval"
      },
      "typeVersion": 1
    },
    {
      "id": "65f6dd0c-458d-46c1-bd66-0ed90967a665",
      "name": "Setup Guide",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 1700,
        "content": "## \ud83c\udfa8 TikTok Carousel Replicator & Translator\nAn end-to-end automation system that monitors TikTok accounts for new 3-image carousel posts, extracts text overlays and visual layouts using AI vision analysis, translates content into English, and automatically regenerates brand-new carousel images ready for review and posting.\n\n### What It Does\nThis workflow eliminates the manual process of:\n- Daily monitoring for new carousel content\n- Screenshot capture and image extraction\n- Text transcription and translation\n- Layout recreation in design tools\n- Manual formatting and brand consistency checks\n\nInstead, it delivers **3 production-ready images to your inbox every morning**\u2014complete with translated text, matched composition, and side-by-side comparisons for quick approval.\n\n### Key Features\n- **Automated Daily Monitoring** - Checks target TikTok accounts on schedule\n- **AI-Powered Vision Analysis** - Extracts text, layout, and composition with Gemini Vision\n- **Smart Translation** - Converts text to natural English while preserving intent\n- **Intelligent Image Generation** - Recreates carousels with Midjourney/DALL-E based on analyzed layouts\n- **Review Dashboard** - Organized Google Sheets with original vs. new comparisons\n- **Email Notifications** - Morning digest with clickable previews\n\n### Who It's For\nContent creators, social media managers, and marketing teams who need to adapt high-performing carousel content from other languages into English\u2014without spending hours in Canva every day.\n\n### Time Saved\n**From 3+ hours of manual work \u2192 2 minutes of review** per carousel set.\n\n### Workflow Breakdown\n**Monitor** \u2192 **Extract & Analyze** \u2192 **Translate** \u2192 **Generate** \u2192 **Review & Deliver**\n\nEach section runs automatically, processing images sequentially and delivering organized results to your review dashboard with email notifications.\n\n## \ud83d\ude80 SETUP INSTRUCTIONS\n### Required Credentials:\n1. **Google Gemini API** - For vision analysis\n2. **Midjourney API** (or alternative: DALL-E, Stable Diffusion)\n3. **OpenAI API** - For prompt generation and translation enhancement\n4. **Google Sheets** - For review dashboard\n5. **Gmail** - For notifications\n\n### Configuration Steps:\n1. Replace `@USERNAME` in TikTok RSS node with target account\n2. Set your Google Sheet ID in \"Save to Review Sheet\" node\n3. Update email addresses in notification node\n4. Test with a single post before enabling daily schedule\n\n### Alternative Approaches:\n- Can use TikTok API instead of RSS (if available)\n- Can use Canva API instead of Midjourney for generation\n- Can integrate with Airtable for more advanced review workflows\n- Can add approval workflow with interactive buttons"
      },
      "typeVersion": 1
    },
    {
      "id": "e7a07314-0b19-4289-bdb2-9d43ff500014",
      "name": "Translate to English",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        48,
        1008
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4",
          "cachedResultName": "GPT-4"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Translate {{ JSON.stringify($json.extractedText) }} to english "
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "57a0dde8-1ac1-4e44-9c15-933fdb097944",
  "connections": {
    "OpenAI GPT-4": {
      "ai_languageModel": [
        [
          {
            "node": "Create Midjourney Prompt",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Split Images": {
      "main": [
        [
          {
            "node": "Download Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Image": {
      "main": [
        [
          {
            "node": "Extract Text & Layout (Gemini Vision)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse RSS Feed": {
      "main": [
        [
          {
            "node": "Filter: Only 3-Image Posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine 3 Images": {
      "main": [
        [
          {
            "node": "Save to Review Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily TikTok Check": {
      "main": [
        [
          {
            "node": "Fetch TikTok RSS Feed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save to Review Sheet": {
      "main": [
        [
          {
            "node": "Send Review Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Translate to English": {
      "main": [
        [
          {
            "node": "Create Midjourney Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch TikTok RSS Feed": {
      "main": [
        [
          {
            "node": "Parse RSS Feed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Midjourney Prompt": {
      "main": [
        [
          {
            "node": "Generate New Image (Midjourney)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Image Generation": {
      "main": [
        [
          {
            "node": "Combine 3 Images",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter: Only 3-Image Posts": {
      "main": [
        [
          {
            "node": "Split Images",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate New Image (Midjourney)": {
      "main": [
        [
          {
            "node": "Wait for Image Generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Text & Layout (Gemini Vision)": {
      "main": [
        [
          {
            "node": "Translate to English",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

An end-to-end automation system that monitors TikTok accounts for new 3-image carousel posts, extracts text overlays and visual layouts using AI vision analysis, translates content into English, and automatically regenerates brand-new carousel images ready for review and posting.

Source: https://n8n.io/workflows/9305/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow automates the creation, rendering, approval, and posting of TikTok-style POV (Point of View) videos to Instagram, with cross-posting to Facebook and YouTube. It eliminates manual video p

OpenAI Chat, Output Parser Item List, HTTP Request +10
AI & RAG

Most blogs publish words. This system publishes experiences.

OpenAI Chat, HTTP Request, Output Parser Structured +7
AI & RAG

This workflow automates the process of generating, reviewing, and publishing blog posts across multiple platforms, now enhanced with support for RSS Feeds as a content source. It streamlines the manag

HTTP Request, Html Extract, RSS Feed Read +9
AI & RAG

This n8n automation workflow automates the creation, scripting, production, and posting of YouTube videos. It leverages AI (OpenAI), image generation (PIAPI), video rendering (Shotstack), and platform

Agent, OpenAI Chat, Airtable Tool +7
AI & RAG

This workflow is designed for: Content creators and marketers E-commerce and product-based businesses Agencies producing social media visuals and videos Automation builders looking for AI-powered crea

HTTP Request, Edit Image, Google Drive +7