AutomationFlowsData & Sheets › Translate an Audio Recording Into a Target-language Transcript Using Gladia…

Translate an Audio Recording Into a Target-language Transcript Using Gladia…

Original n8n title: Translate an Audio Recording Into a Target-language Transcript Using Gladia and Google Drive

Translate an audio recording into a target-language transcript using Gladia and Google Drive. Uses formTrigger, httpRequest, googleSheets, googleDrive. Event-driven trigger; 15 nodes.

Event trigger★★★★☆ complexity15 nodesForm TriggerHTTP RequestGoogle SheetsGoogle Drive
Data & Sheets Trigger: Event Nodes: 15 Complexity: ★★★★☆ Added:

This workflow follows the Form Trigger → Google Drive 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
{
  "name": "Translate an audio recording into a target-language transcript using Gladia and Google Drive",
  "nodes": [
    {
      "parameters": {
        "formTitle": "Translate an audio recording",
        "formDescription": "Paste a publicly reachable audio or video URL and choose a target language. You get back the original transcript and its translation.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Media URL",
              "placeholder": "https://example.com/podcast-episode.mp3",
              "requiredField": true
            },
            {
              "fieldLabel": "Target language code",
              "placeholder": "en"
            }
          ]
        },
        "options": {
          "appendAttribution": false,
          "respondWithOptions": {
            "values": {
              "formSubmittedText": "Thanks. Your recording is being transcribed and translated. When it finishes, the result is saved to your Google Drive and logged to your sheet. You can close this page."
            }
          }
        }
      },
      "id": "a39f4fc1-d08c-4c61-ab6b-37c66e34c3c2",
      "name": "When Translation Requested",
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.6,
      "position": [
        -16,
        384
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "media_url",
              "value": "={{ $json['Media URL'] }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "target_language",
              "value": "={{ ($json['Target language code'] || 'en').toString().trim().toLowerCase() }}",
              "type": "string"
            },
            {
              "id": "a3",
              "name": "wait_seconds",
              "value": 10,
              "type": "number"
            },
            {
              "id": "a4",
              "name": "max_attempts",
              "value": 60,
              "type": "number"
            }
          ]
        },
        "options": {}
      },
      "id": "18bf3787-af9d-4772-9f0c-ba6f187abc59",
      "name": "Prepare Config Values",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        224,
        384
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.gladia.io/v2/pre-recorded",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ { \"audio_url\": $('Prepare Config Values').item.json.media_url, \"translation\": true, \"translation_config\": { \"target_languages\": [$('Prepare Config Values').item.json.target_language] } } }}",
        "options": {
          "timeout": 30000
        }
      },
      "id": "c1bb5020-6f28-4633-aa8d-c62b053dbaa7",
      "name": "Start Gladia Translation",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        464,
        384
      ],
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000,
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_YOUR_SHEET_ID"
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "REPLACE_WITH_SHEET_TAB",
          "cachedResultName": "Log"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Timestamp": "={{ $now.toISO() }}",
            "Media URL": "={{ $('Prepare Config Values').first().json.media_url }}",
            "Detected Language": "",
            "Target Language": "={{ $('Prepare Config Values').first().json.target_language }}",
            "Status": "Failed",
            "Translation Link": "",
            "Detail": "={{ $json.error?.message || ($json.status ? ('Gladia status: ' + $json.status) : 'Translation failed or timed out. Check that the media URL is public, then retry.') }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "Timestamp",
              "displayName": "Timestamp",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Media URL",
              "displayName": "Media URL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Detected Language",
              "displayName": "Detected Language",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Target Language",
              "displayName": "Target Language",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "displayName": "Status",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Translation Link",
              "displayName": "Translation Link",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Detail",
              "displayName": "Detail",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ]
        },
        "options": {}
      },
      "id": "6d363354-d166-4be3-99de-cf28af7ca745",
      "name": "Log Failure in Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        2048,
        640
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "amount": "={{ $('Prepare Config Values').item.json.wait_seconds }}"
      },
      "id": "c9786554-1fdd-4e52-b8e6-e4a9254a3144",
      "name": "Wait for Processing",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        800,
        368
      ]
    },
    {
      "parameters": {
        "url": "={{ $('Start Gladia Translation').item.json.result_url }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {
          "timeout": 30000
        }
      },
      "id": "f35fc781-7e5d-4d8e-947b-7a2a24869674",
      "name": "Get Translation Result",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        1024,
        368
      ],
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000,
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 1
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.status }}",
                    "rightValue": "done",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  }
                ],
                "combinator": "and"
              }
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "loose",
                  "version": 1
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.status }}",
                    "rightValue": "error",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    }
                  },
                  {
                    "leftValue": "={{ $runIndex }}",
                    "rightValue": "={{ $('Prepare Config Values').item.json.max_attempts }}",
                    "operator": {
                      "type": "number",
                      "operation": "gte"
                    }
                  }
                ],
                "combinator": "or"
              }
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra",
          "renameFallbackOutput": "Still Processing"
        }
      },
      "id": "fa92a06e-8ad4-46c5-a521-54ac9e1aa4db",
      "name": "Route by Status",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.4,
      "position": [
        1264,
        336
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const result = $json.result || {};\nconst transcription = result.transcription || {};\nconst translation = result.translation || {};\nconst original = (transcription.full_transcript || '').trim();\nconst firstTranslation = (Array.isArray(translation.results) && translation.results[0]) || {};\nconst translated = (firstTranslation.full_transcript || '').trim();\nconst detected = (Array.isArray(transcription.languages) && transcription.languages[0]) || 'unknown';\nconst target = $('Prepare Config Values').item.json.target_language || 'en';\nconst mediaUrl = $('Prepare Config Values').item.json.media_url || '';\nconst stamp = $now.toFormat('yyyyLLdd-HHmmss');\nconst fileName = 'translation-' + target + '-' + stamp + '.md';\nconst lines = [\n  '# Audio translation',\n  '',\n  '- Source media: ' + mediaUrl,\n  '- Detected source language: ' + detected,\n  '- Target language: ' + target,\n  '- Translated: ' + $now.toISO(),\n  '',\n  '## Original transcript (' + detected + ')',\n  '',\n  original || '(No transcript text was returned.)',\n  '',\n  '## Translated transcript (' + target + ')',\n  '',\n  translated || '(No translation text was returned.)',\n  ''\n];\nconst body = lines.join('\\n');\nreturn {\n  json: {\n    media_url: mediaUrl,\n    detected_language: detected,\n    target_language: target,\n    original_characters: original.length,\n    translated_characters: translated.length,\n    file_name: fileName,\n    preview: translated.slice(0, 180),\n  },\n  binary: {\n    data: {\n      data: Buffer.from(body, 'utf-8').toString('base64'),\n      mimeType: 'text/markdown',\n      fileName: fileName,\n      fileExtension: 'md',\n    },\n  },\n};"
      },
      "id": "234f544a-a9ff-40c4-8d3c-b11b6c06e979",
      "name": "Build Translation File",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1584,
        224
      ]
    },
    {
      "parameters": {
        "name": "={{ $json.file_name }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive",
          "cachedResultName": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_TRANSLATIONS_FOLDER_ID"
        },
        "options": {}
      },
      "id": "910d3760-870c-42a5-b754-d25d0f601dd1",
      "name": "Save Translation to Drive",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1824,
        224
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_YOUR_SHEET_ID"
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "REPLACE_WITH_SHEET_TAB",
          "cachedResultName": "Log"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Timestamp": "={{ $now.toISO() }}",
            "Media URL": "={{ $('Build Translation File').item.json.media_url }}",
            "Detected Language": "={{ $('Build Translation File').item.json.detected_language }}",
            "Target Language": "={{ $('Build Translation File').item.json.target_language }}",
            "Status": "Translated",
            "Translation Link": "={{ $json.webViewLink || ('https://drive.google.com/file/d/' + $json.id + '/view') }}",
            "Detail": "={{ $('Build Translation File').item.json.preview }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "Timestamp",
              "displayName": "Timestamp",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Media URL",
              "displayName": "Media URL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Detected Language",
              "displayName": "Detected Language",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Target Language",
              "displayName": "Target Language",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "displayName": "Status",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Translation Link",
              "displayName": "Translation Link",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Detail",
              "displayName": "Detail",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ]
        },
        "options": {}
      },
      "id": "9eb9b1a6-b547-4274-a31c-73f6d1f65bcc",
      "name": "Log Translation in Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        2064,
        224
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## Translate an audio recording into a target-language transcript using Gladia and Google Drive\n\n### How it works\n\n1. Someone submits a form with a public audio or video URL and a target language code.\n2. The workflow sends that URL to Gladia and turns on transcription plus translation in one call.\n3. It polls Gladia until the job returns done, or stops on an error or timeout.\n4. A Code node builds a Markdown file holding the original transcript and the translation.\n5. The file is saved to Google Drive and a row is appended to a Google Sheet, with failures logged too.\n\n### Setup steps\n\n- [ ] Create a Header Auth credential named Gladia with header name x-gladia-key and your Gladia API key, then select it on both Gladia nodes.\n- [ ] Connect a Google Drive credential and set the Translations folder on Save Translation to Drive.\n- [ ] Connect a Google Sheets credential and pick the spreadsheet and tab on both Sheets nodes.\n- [ ] Open the form URL on the trigger and submit a public media URL to test.\n\n### Customization\n\nChange wait_seconds and max_attempts in Prepare Config Values to tune how long it polls, or edit the file layout in Build Translation File.",
        "height": 568,
        "width": 1056
      },
      "id": "dd9dcbaa-cec7-4316-9e94-163ae8ac042f",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -80,
        -576
      ]
    },
    {
      "parameters": {
        "content": "## Receive request and start translation\n\nA form submission provides the media URL and target language, config values are prepared, then Gladia starts transcription with translation.",
        "height": 340,
        "width": 740,
        "color": 7
      },
      "id": "c38333d1-a04e-47a8-8161-0daa97a82653",
      "name": "Group Receive And Start",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -80,
        224
      ]
    },
    {
      "parameters": {
        "content": "## Poll until translation completes\n\nWait, fetch the result, and route by status. Loop back until Gladia returns done or the attempt limit is reached.",
        "height": 356,
        "width": 696,
        "color": 7
      },
      "id": "18441406-c550-4ec5-be2c-d3cb55bf3b2d",
      "name": "Group Poll For Result",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        736,
        176
      ]
    },
    {
      "parameters": {
        "content": "## Save and log the translation\n\nBuild a Markdown file with both transcripts, save it to Drive, and append a row to the log sheet.",
        "height": 324,
        "width": 748,
        "color": 7
      },
      "id": "8109d85e-9e8f-4e6b-a018-59f6cc30eedb",
      "name": "Group Save And Log",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1520,
        80
      ]
    },
    {
      "parameters": {
        "content": "## Handle failures\n\nAny API error or a timeout writes a Failed row with a reason, so nothing fails silently.",
        "height": 352,
        "width": 364,
        "color": 7
      },
      "id": "cb3fc6cc-8bfa-4f86-b716-e75dd8d52978",
      "name": "Group Handle Failures",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1904,
        464
      ]
    }
  ],
  "connections": {
    "When Translation Requested": {
      "main": [
        [
          {
            "node": "Prepare Config Values",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Config Values": {
      "main": [
        [
          {
            "node": "Start Gladia Translation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Gladia Translation": {
      "main": [
        [
          {
            "node": "Wait for Processing",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Failure in Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Processing": {
      "main": [
        [
          {
            "node": "Get Translation Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Translation Result": {
      "main": [
        [
          {
            "node": "Route by Status",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Failure in Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Status": {
      "main": [
        [
          {
            "node": "Build Translation File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Failure in Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait for Processing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Translation File": {
      "main": [
        [
          {
            "node": "Save Translation to Drive",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Translation to Drive": {
      "main": [
        [
          {
            "node": "Log Translation in Sheets",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Failure in Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

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

Translate an audio recording into a target-language transcript using Gladia and Google Drive. Uses formTrigger, httpRequest, googleSheets, googleDrive. Event-driven trigger; 15 nodes.

Source: https://github.com/exekyute/n8n-exekyute-templates/blob/main/published/n8n-gladia-audio-translator/workflow.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

Description: The Spotify Music Downloader is an automation flow that allows users to easily download music from Spotify tracks. By leveraging the powerful Spotify Downloader API, the flow downloads Sp

Form Trigger, HTTP Request, Google Drive +1
Data & Sheets

n8n can indeed help to solve this challenge by providing the data input interface via its forms and orchestrate AI-powered classification of images using AI nodes. However, in some cases - say you run

Form Trigger, HTTP Request, Google Drive +2
Data & Sheets

Automate downloading Threads videos from URLs, upload them to Google Drive, and log results in Google Sheets using n8n.

Form Trigger, HTTP Request, Google Drive +1
Data & Sheets

Description: This n8n workflow automates the process of downloading videos from any supported platform (like LinkedIn, Facebook, or Instagram) using the RapidAPI best All-In-One Video Downloader. It t

Form Trigger, HTTP Request, Google Drive +1
Data & Sheets

📝 On Form Submission → Displays a form for users to input the Slideshare URL. 🌐 Slideshare Downloader → Sends the submitted URL to the Slideshare Downloader Pro API to fetch a downloadable PDF link. ✅

Form Trigger, Google Drive, Google Sheets +1