AutomationFlowsAI & RAG › Batch Transcribe Google Drive Videos to Text Files with Gemini

Batch Transcribe Google Drive Videos to Text Files with Gemini

ByChristine @zophiel on n8n.io

This workflow is designed for creators, researchers, and operators who need to transcribe large volumes of video content stored in Google Drive. It is especially useful for users working with TikTok archives, interview recordings, or social media datasets where manual…

Event trigger★★★★☆ complexityAI-powered23 nodesGoogle GeminiGoogle Drive
AI & RAG Trigger: Event Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:
Batch Transcribe Google Drive Videos to Text Files with Gemini — n8n workflow card showing Google Gemini, Google Drive integration

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

This workflow follows the Google Drive → Googlegemini 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": "KZSZO9fW3AsmLcG9",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Batch Video Transcription with Google Docs and Gemini",
  "tags": [
    {
      "id": "dpUy663UOuB6i21k",
      "name": "transcription",
      "createdAt": "2026-04-14T00:13:08.373Z",
      "updatedAt": "2026-04-14T00:13:08.373Z"
    }
  ],
  "nodes": [
    {
      "id": "83d11cfd-94ae-4229-bd9e-1748ea74cd4f",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        768
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "8fb9d54e-8e2a-47d9-a31d-8f34ffc218a9",
      "name": "Loop Over Videos",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        896,
        768
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "621fdf6c-6bf4-4e79-bb24-d9deb8e93225",
      "name": "Analyze video",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "onError": "continueRegularOutput",
      "position": [
        1344,
        528
      ],
      "parameters": {
        "text": "{{ $('Config').first().json.transcriptPrompt }}",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "video",
        "simplify": false,
        "inputType": "binary",
        "operation": "analyze"
      },
      "retryOnFail": true,
      "typeVersion": 1.1,
      "waitBetweenTries": 5000
    },
    {
      "id": "4f38b07d-7ce4-4288-a6ee-dfbfeaac7061",
      "name": "Download Video",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1120,
        528
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {
          "fileName": "={{ $json.name }}",
          "binaryPropertyName": "data"
        },
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "5b042c4b-474f-4fec-bb4c-0d6fef118975",
      "name": "Config",
      "type": "n8n-nodes-base.set",
      "position": [
        224,
        768
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f0b10cb8-37fe-4827-9fdc-707c02a2d5c4",
              "name": "incomingFolderId",
              "type": "string",
              "value": ""
            },
            {
              "id": "a93fa913-01fd-46b2-b84d-9fe4e47944b6",
              "name": "processedFolderId",
              "type": "string",
              "value": ""
            },
            {
              "id": "9c5675e6-6567-46c0-af72-361111c8c48e",
              "name": "transcriptFolderID",
              "type": "string",
              "value": ""
            },
            {
              "id": "146dd8b9-456c-4fe5-8549-b3a9d8bd9005",
              "name": "transcriptPrompt",
              "type": "string",
              "value": "Create a plain transcript of all spoken words in this video. Do not summarize. Do not add commentary. If there is no speech, return exactly [NO SPEECH]."
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d086d5ba-7fd7-4996-bd8c-497b88e907f4",
      "name": "Test Limit",
      "type": "n8n-nodes-base.limit",
      "position": [
        672,
        768
      ],
      "parameters": {
        "maxItems": 25
      },
      "typeVersion": 1
    },
    {
      "id": "4ea7f6b8-73d6-4802-bc68-2533d81b54e6",
      "name": "Move Source Video to Processed",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2464,
        432
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Download Video').item.json.id }}"
        },
        "driveId": {
          "__rl": true,
          "mode": "url",
          "value": "My Drive",
          "__regex": "https:\\/\\/drive\\.google\\.com(?:\\/.*|)\\/folders\\/([0-9a-zA-Z\\-_]+)(?:\\/.*|)"
        },
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "="
        },
        "operation": "move"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "9136ba3e-73b3-47e9-8433-57db8647f00c",
      "name": "Pause Between Videos",
      "type": "n8n-nodes-base.wait",
      "position": [
        1568,
        528
      ],
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "2541e0a1-31ea-427b-9c2c-707930435194",
      "name": "Transcript Succeeded?",
      "type": "n8n-nodes-base.if",
      "position": [
        1792,
        528
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "98bc6c7f-d3ce-48cf-8d84-e712053f1d03",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.candidates[0].content.parts[0].text }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "789c8389-e3fb-4520-ab70-83f70af06f20",
      "name": "Log Failure",
      "type": "n8n-nodes-base.set",
      "position": [
        2016,
        624
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "85304300-8c34-49fd-bba8-47552d45d831",
              "name": "failedFileID",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "77e0a941-5ef2-4452-b59c-267738bd4679",
              "name": "failedFileName",
              "type": "string",
              "value": "={{ $json.name }}"
            },
            {
              "id": "f4a9943b-338e-4fe0-ac75-71562dbbba2d",
              "name": "status",
              "type": "string",
              "value": "transcript_failed_or_empty"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e0bd37be-7a6a-4b89-96cd-595cee7f9e6a",
      "name": "Find Incoming Videos",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        448,
        768
      ],
      "parameters": {
        "filter": {
          "whatToSearch": "files"
        },
        "options": {},
        "resource": "fileFolder",
        "returnAll": true,
        "queryString": "={{ \"'XXXXX' in parents\" }}",
        "searchMethod": "query"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "c162af13-0422-4f0d-88e2-895a3d3edf6a",
      "name": "Format Transcript",
      "type": "n8n-nodes-base.code",
      "position": [
        2016,
        432
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const videoFile = $('Download Video').item.json;\n\nconst transcript =\n  $json.candidates?.[0]?.content?.parts?.[0]?.text ??\n  $json.text ??\n  $json.output ??\n  $json.response ??\n  $json.content ??\n  $json.result ??\n  JSON.stringify($json, null, 2);\n\nconst safeBaseName = (videoFile.name || 'untitled_video')\n  .replace(/\\.[^/.]+$/, '')\n  .replace(/[\\\\/:*?\"<>|]/g, '_');\n\nreturn {\n  json: {\n    sourceFileId: videoFile.id,\n    sourceFileName: videoFile.name,\n    transcriptFileName: `${safeBaseName}.txt`,\n    transcriptText:\n`FILE: ${videoFile.name}\nFILE ID: ${videoFile.id}\nCREATED: ${videoFile.createdTime ?? ''}\nMODIFIED: ${videoFile.modifiedTime ?? ''}\nDRIVE LINK: ${videoFile.webViewLink ?? ''}\n\n==================================================\n\n${transcript}\n`\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "040157b1-bcf6-4a66-a45c-56f3f777886c",
      "name": "Create Transcript File",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2240,
        432
      ],
      "parameters": {
        "name": "={{ $json.transcriptFileName }}",
        "content": "={{ $json.transcriptText }}",
        "driveId": {
          "__rl": true,
          "mode": "url",
          "value": "My Drive",
          "__regex": "https:\\/\\/drive\\.google\\.com(?:\\/.*|)\\/folders\\/([0-9a-zA-Z\\-_]+)(?:\\/.*|)"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "url",
          "value": "https://drive.google.com/drive",
          "__regex": "https:\\/\\/drive\\.google\\.com(?:\\/.*|)\\/folders\\/([0-9a-zA-Z\\-_]+)(?:\\/.*|)"
        },
        "operation": "createFromText"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "e0245335-62dc-4d50-9f74-8a243b581ba1",
      "name": "Pause Between Loops",
      "type": "n8n-nodes-base.wait",
      "position": [
        2688,
        608
      ],
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "2705dbac-ec03-4371-9316-b8e31cb716e1",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        544
      ],
      "parameters": {
        "color": "#FDFCFC",
        "height": 192,
        "content": "In the config node, you will need to add the folder ids of your 3 google drive folders. \nIn addition, you will enter your prompt for the AI. There is a suggested prompt in place for this workflow, but you encouraged to review and edit to your preferences."
      },
      "typeVersion": 1
    },
    {
      "id": "2b2c3876-104e-4c1c-891b-860cec41a58e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        928
      ],
      "parameters": {
        "color": "#FFFFFF",
        "height": 208,
        "content": "Incoming folder = the folder where all your videos are now\n\nProcessed folder=where the workflow will move your videos after they are processed.\n\nTranscript folder = where the workflow will create the transcripts from the videos."
      },
      "typeVersion": 1
    },
    {
      "id": "6277c7f6-3442-4f77-a2b3-24c74c0c29de",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        560
      ],
      "parameters": {
        "color": "#FFFAFA",
        "content": "1) Add your Google Drive Credentials\n2) In the Query, replace the XXXXX with the folder ID of your \"Incoming folder\""
      },
      "typeVersion": 1
    },
    {
      "id": "a94ee720-54a4-4598-bb86-977f2d78db7f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        608,
        928
      ],
      "parameters": {
        "color": "#FFFFFF",
        "content": "Choose your batch size. Currently set to 25. Recommending starting smaller in case of errors in the workflow, then increasing once everything is smooth."
      },
      "typeVersion": 1
    },
    {
      "id": "5da1145f-d75b-43df-b72b-8abc9a456017",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        896
      ],
      "parameters": {
        "color": "#FFFFFF",
        "content": "In the Loop node, select how many videos will be sent to Gemini to transcribe at a time. Recommend 1, to keep from overloading Gemini systems."
      },
      "typeVersion": 1
    },
    {
      "id": "f8c9b218-8907-441c-95d3-c641818a0ab7",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1488,
        400
      ],
      "parameters": {
        "color": "#FFFFFF",
        "width": 176,
        "height": 112,
        "content": "This pause minimizes chance of bombarding Gemini with requests. Currently set at 10 seconds."
      },
      "typeVersion": 1
    },
    {
      "id": "df9bda26-4453-4348-8d4f-34be044243c3",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2784,
        448
      ],
      "parameters": {
        "color": "#FFFFFF",
        "height": 176,
        "content": "This pause ensures that the video just transcribed is moved to the new folder before the next video is sent. This prevents the same video from being processed over and over. Currently set at 10 seconds. Reccomend this length."
      },
      "typeVersion": 1
    },
    {
      "id": "ec64f2c8-d7fb-4a1e-91dd-207f7002b5cf",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2000,
        816
      ],
      "parameters": {
        "color": "#F7F7F7",
        "height": 192,
        "content": "Regarding \"failures\": these are normally a result of Gemini being overloaded at peakhours, not so much a problem with the mp4 file. \"failed\" attempts are not moved to the processed folder, so it is likely that they will be processed in a later batch with no problem."
      },
      "typeVersion": 1
    },
    {
      "id": "c6ef9a94-f792-4201-a0ca-ee7200a22f57",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        96,
        144
      ],
      "parameters": {
        "color": "#FFFB80",
        "width": 528,
        "height": 288,
        "content": "Batch transcribe videos from Google Drive to text files using Gemini\n\nThis workflow automatically processes videos from a designated Google Drive folder, transcribes each file using Google Gemini, and saves the results as individual text files.\n\nEach video is handled independently:\n\n1- Videos are pulled from an \u201cIncoming\u201d folder\n\n2-The file is downloaded and sent to Gemini for transcription\n\n3- A .txt transcript file is created in a separate folder\n\n4- The original video is moved to a \u201cProcessed\u201d folder after success\n\nThis structure ensures progress is saved continuously, allowing the workflow to resume where it left off if interrupted."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "callerPolicy": "none",
    "timeSavedMode": "fixed",
    "availableInMCP": false,
    "executionOrder": "v1",
    "timeSavedPerExecution": 4
  },
  "versionId": "2e0a1813-88f6-4cd2-ac8c-2116235356e4",
  "connections": {
    "Config": {
      "main": [
        [
          {
            "node": "Find Incoming Videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Test Limit": {
      "main": [
        [
          {
            "node": "Loop Over Videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Failure": {
      "main": [
        [
          {
            "node": "Loop Over Videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze video": {
      "main": [
        [
          {
            "node": "Pause Between Videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Video": {
      "main": [
        [
          {
            "node": "Analyze video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Videos": {
      "main": [
        [],
        [
          {
            "node": "Download Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Transcript": {
      "main": [
        [
          {
            "node": "Create Transcript File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pause Between Loops": {
      "main": [
        [
          {
            "node": "Loop Over Videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find Incoming Videos": {
      "main": [
        [
          {
            "node": "Test Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pause Between Videos": {
      "main": [
        [
          {
            "node": "Transcript Succeeded?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcript Succeeded?": {
      "main": [
        [
          {
            "node": "Format Transcript",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Failure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Transcript File": {
      "main": [
        [
          {
            "node": "Move Source Video to Processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Move Source Video to Processed": {
      "main": [
        [
          {
            "node": "Pause Between Loops",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Config",
            "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

This workflow is designed for creators, researchers, and operators who need to transcribe large volumes of video content stored in Google Drive. It is especially useful for users working with TikTok archives, interview recordings, or social media datasets where manual…

Source: https://n8n.io/workflows/15048/ — 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

Monitor a Google Drive folder, process each image based on the prompt defined in and save the new image to the specified output Google Drive folder. Maintain a processing log in Google Sheets.

Google Drive Trigger, Google Drive, HTTP Request +2
AI & RAG

This workflow serves as a complete "AI Receptionist" for mortgage brokers or high-ticket service providers. It automates the messy process of qualifying leads, getting internal approval, and collectin

Google Gemini, Gmail, Google Drive +3
AI & RAG

Understand your customers before you build for them. This workflow, Market Segmentation: Buyer Persona Pain Point Report, automates the grueling process of primary market research. By scraping real-wo

Form Trigger, Google Gemini, N8N Nodes Olostep +3
AI & RAG

This template and YouTube video goes over 8 different examples of how we can utilize Binary data within n8n.

Mistral Ai, Google Gemini, Google Drive Trigger +4
AI & RAG

Stop spending hours manually repurposing long-form content. The Content Atomizer.json workflow takes a single article URL and automatically "atomizes" it into high-authority LinkedIn posts, Twitter (X

Form Trigger, Google Gemini, N8N Nodes Olostep +2