Transcription de texte TikTok

Avancé

Ceci est unContent Creation, Multimodal AIworkflow d'automatisation du domainecontenant 21 nœuds.Utilise principalement des nœuds comme If, Code, Wait, HttpRequest, GoogleSheets. Automatiser la transcription de vidéos TikTok avec RapidAPI et Google Sheets

Prérequis
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Informations d'identification Google Sheets API
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "OW8DfG2xXPS60mSj",
  "meta": {
    "instanceId": "60c025075753afcab9f803964b4caaca9402f435deb4efafbb8e3b93b54d8752"
  },
  "name": "TikTok Transcript",
  "tags": [],
  "nodes": [
    {
      "id": "c0de0228-f79b-4b18-9e5d-ee6218259078",
      "name": "Google Sheets2",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1380,
        40
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "id": "qUtlCnYpk7bXXaYp",
          "name": "Google Sheets account 3"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "4b18deea-cfc2-4a8d-b2f3-8b31cac0d573",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        -560,
        40
      ],
      "parameters": {
        "url": "https://tiktok-transcript-generator.p.rapidapi.com/tiktok/index.php",
        "method": "POST",
        "options": {
          "response": {
            "response": {}
          }
        },
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "url",
              "value": "={{ $json['Video Url'] }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "tiktok-transcript-generator.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key"
            }
          ]
        }
      },
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "id": "baad7161-51f5-4f29-8af0-39244e10eb60",
      "name": "Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        580,
        -40
      ],
      "parameters": {
        "columns": {
          "value": {
            "Video Url": "={{ $('If').item.json['Video Url'] }}",
            "Transcript": "={{ $json.cleanedSubtitles }}",
            "Generated Date": "={{ new Date().toISOString().slice(0, 10) }}"
          },
          "schema": [
            {
              "id": "Video Url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Video Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Transcript",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Transcript",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Generated Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Generated Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Video Url"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "id": "qUtlCnYpk7bXXaYp",
          "name": "Google Sheets account 3"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "ab5bcc9b-e2a0-4ec7-a4db-de512662549d",
      "name": "Boucler sur les éléments",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1100,
        40
      ],
      "parameters": {
        "options": {
          "reset": false
        }
      },
      "typeVersion": 3
    },
    {
      "id": "d5d6e8a4-a2da-4cd5-80fc-3cf7c294697d",
      "name": "Attendre",
      "type": "n8n-nodes-base.wait",
      "position": [
        900,
        140
      ],
      "webhookId": "74ac1ccb-f843-41b8-97c4-b8d32892a5ea",
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "6bea9362-5502-4c3c-acac-3f1a16bb0c64",
      "name": "Si",
      "type": "n8n-nodes-base.if",
      "position": [
        -820,
        60
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e0b7b7c8-3a7a-466d-bae7-269282b49d34",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json['Video Url'] }}",
              "rightValue": ""
            },
            {
              "id": "64dde394-0e49-4306-a24a-de2bf448fc95",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json.Transcript }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a9ca3926-efbd-42fa-9388-b24625690145",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        -20,
        -40
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  const raw = item.json.subtitles;\n\n  // Remove \"WEBVTT\" header and timestamp lines\n  const cleaned = raw\n    .replace(/^WEBVTT\\s*/gm, '')                       // Remove \"WEBVTT\"\n    .replace(/^\\d{2}:\\d{2}:\\d{2} --> \\d{2}:\\d{2}:\\d{2}/gm, '') // Remove timestamps\n    .replace(/^\\s*\\n/gm, '')                           // Remove empty lines\n    .trim();\n\n  return {\n    json: {\n      cleanedSubtitles: cleaned\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "becf9d6b-26a1-4498-9683-18ad15bc82ea",
      "name": "Si1",
      "type": "n8n-nodes-base.if",
      "position": [
        -260,
        40
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cd25e377-5c82-40b1-85ea-b372ee7765b7",
              "operator": {
                "type": "number",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.error.status }}",
              "rightValue": 404
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "7c8d30f1-df83-4ee1-83ce-32f6d9b0a810",
      "name": "Google Sheets1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        300,
        140
      ],
      "parameters": {
        "columns": {
          "value": {
            "Video Url": "={{ $('If').item.json['Video Url'] }}",
            "Transcript": "No transcription available",
            "Generated Date": "={{ new Date().toISOString().slice(0, 10) }}"
          },
          "schema": [
            {
              "id": "Video Url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Video Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Transcript",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Transcript",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Generated Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Generated Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Video Url"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "id": "qUtlCnYpk7bXXaYp",
          "name": "Google Sheets account 3"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "90a316f5-0f08-42f8-86a0-318bcc9814f9",
      "name": "Au clic sur 'Exécuter le workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1580,
        40
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5d36dbf3-ebd6-4cd8-913b-ee1308d6847b",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2500,
        -480
      ],
      "parameters": {
        "width": 780,
        "height": 980,
        "content": "# 📝 TikTok Transcript Extraction & Logging Workflow\n\nThis n8n workflow automatically fetches TikTok video transcripts via the RapidAPI TikTok Transcript Generator and updates a Google Sheet with cleaned transcriptions. It processes only rows missing transcripts, handles errors, and adds timestamps.\n\n---\n\n## 🧩 Node-by-Node Explanation\n1. **Manual Trigger** – Starts the workflow manually on demand.  \n2. **Google Sheets2** – Reads TikTok video URLs and existing transcripts from the sheet.  \n3. **Loop Over Items** – Processes rows in batches of 10 for rate limiting.  \n4. **If** – Checks if a video URL exists and transcript is missing.  \n5. **HTTP Request** – Calls TikTok transcript API to fetch subtitles.  \n6. **If1** – Verifies the API response is successful (no 404 error).  \n7. **Code** – Cleans raw subtitles by removing timestamps and headers.  \n8. **Google Sheets** – Updates the sheet with cleaned transcript and date.  \n9. **Google Sheets1** – Marks videos with no transcript available in the sheet.  \n10. **Wait** – Pauses workflow to manage API rate limits before next batch.  \n\n---\n\n## 🔑 Summary Use Cases  \n- Automate generation of TikTok video transcripts for content teams.  \n- Maintain a centralized Google Sheet of transcripts for SEO, captions, or repurposing content.  \n- Reduce manual effort and errors in transcribing TikTok videos.  \n- Handle API errors and missing data gracefully.\n\n---\n\n**This workflow enables seamless, automated transcription fetching and management for TikTok videos via Google Sheets integration, ideal for marketing, social media managers, and content creators.**\n"
      },
      "typeVersion": 1
    },
    {
      "id": "708c75c1-2ed7-48eb-b606-d6ff3eca7e30",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1660,
        -320
      ],
      "parameters": {
        "height": 580,
        "content": "### 1. When clicking ‘Execute workflow’  \n**Type:** Manual Trigger  \n**Purpose:**  \nManually triggers the workflow to start the process of reading TikTok URLs and generating transcripts.  \n**Use Case:**  \nInitiate the entire flow on demand without waiting for scheduled triggers."
      },
      "typeVersion": 1
    },
    {
      "id": "b7c01b0d-726b-44e7-8099-93812eccce4b",
      "name": "Note adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1400,
        -320
      ],
      "parameters": {
        "height": 580,
        "content": "### 2. Google Sheets2  \n**Type:** Google Sheets (Read)  \n**Purpose:**  \nReads rows from the specified Google Sheet containing TikTok video URLs and existing transcript data.  \n**Use Case:**  \nFetch the list of videos to process and identify which ones need transcription.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2d5229aa-2c40-41f6-8556-77690c3ed956",
      "name": "Note adhésive3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1140,
        -320
      ],
      "parameters": {
        "height": 580,
        "content": "### 3. Loop Over Items  \n**Type:** Split In Batches  \n**Purpose:**  \nProcesses the fetched rows in smaller batches (default 10 items per batch) to avoid rate limits or overload.  \n**Use Case:**  \nControl the workflow execution speed and resource usage when handling large data sets.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "89710512-98f5-4dc2-b8a5-234ae49d343f",
      "name": "Note adhésive4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -880,
        -320
      ],
      "parameters": {
        "height": 580,
        "content": "### 4. If  \n**Type:** Conditional Check (If)  \n**Purpose:**  \nFilters each row to process only those where the `Video Url` is not empty and `Transcript` is empty (i.e., videos needing transcription).  \n**Use Case:**  \nSkip rows already having transcripts to avoid redundant API calls."
      },
      "typeVersion": 1
    },
    {
      "id": "7514d668-1b6d-4786-8e7f-f07fbfeac194",
      "name": "Note adhésive5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -620,
        -320
      ],
      "parameters": {
        "height": 580,
        "content": "### 5. HTTP Request  \n**Type:** HTTP Request  \n**Purpose:**  \nCalls the TikTok Transcript Generator API with the video URL to retrieve the transcript.  \n**Use Case:**  \nGet the subtitle/transcript data for TikTok videos programmatically.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "2cfb2c0d-980c-4654-9486-45bc765372c6",
      "name": "Note adhésive6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -360,
        -320
      ],
      "parameters": {
        "height": 580,
        "content": "### 6. If  \n**Type:** Conditional Check (If)  \n**Purpose:**  \nChecks if the API response is valid and does not contain a 404 error.  \n**Use Case:**  \nHandle cases where transcripts are unavailable or the video URL is invalid."
      },
      "typeVersion": 1
    },
    {
      "id": "167cf773-1543-4778-ba99-d4adc87f3ec3",
      "name": "Note adhésive7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -100,
        -320
      ],
      "parameters": {
        "height": 580,
        "content": "### 7. Code  \n**Type:** Code (JavaScript)  \n**Purpose:**  \nCleans the raw subtitles returned by the API by removing headers, timestamps, and empty lines for better readability.  \n**Use Case:**  \nPrepare the transcript text for clean storage and further processing."
      },
      "typeVersion": 1
    },
    {
      "id": "ad776fb7-d066-4f10-917e-a1fbf476e961",
      "name": "Note adhésive8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        -180
      ],
      "parameters": {
        "height": 480,
        "content": "### 8. Google Sheets  \n**Type:** Google Sheets (Append or Update)  \n**Purpose:**  \nWrites the cleaned transcript, video URL, and generation date back into the Google Sheet, updating existing rows.  \n**Use Case:**  \nMaintain an up-to-date record of transcripts next to each TikTok video URL."
      },
      "typeVersion": 1
    },
    {
      "id": "45271bfa-118b-46c7-8e73-e077119ce31f",
      "name": "Note adhésive9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        520,
        -380
      ],
      "parameters": {
        "height": 580,
        "content": "### 9. Google Sheets1  \n**Type:** Google Sheets (Append or Update)  \n**Purpose:**  \nFor cases where the API returns an error (like 404), it updates the sheet with a \"No transcription available\" message for that video URL.  \n**Use Case:**  \nClearly indicate videos for which transcripts could not be generated."
      },
      "typeVersion": 1
    },
    {
      "id": "4bb59f93-a06c-4252-bec4-2809fa4d6067",
      "name": "Note adhésive10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        840,
        -220
      ],
      "parameters": {
        "height": 540,
        "content": "### 10. Wait  \n**Type:** Wait  \n**Purpose:**  \nPauses the workflow briefly between batches to prevent hitting API rate limits and ensure smooth execution.  \n**Use Case:**  \nThrottle the flow execution for stability and API compliance."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "957a8859-b78c-4fdc-b1c6-50de2acaa6a0",
  "connections": {
    "6bea9362-5502-4c3c-acac-3f1a16bb0c64": {
      "main": [
        [
          {
            "node": "4b18deea-cfc2-4a8d-b2f3-8b31cac0d573",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "ab5bcc9b-e2a0-4ec7-a4db-de512662549d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "becf9d6b-26a1-4498-9683-18ad15bc82ea": {
      "main": [
        [
          {
            "node": "a9ca3926-efbd-42fa-9388-b24625690145",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "7c8d30f1-df83-4ee1-83ce-32f6d9b0a810",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a9ca3926-efbd-42fa-9388-b24625690145": {
      "main": [
        [
          {
            "node": "baad7161-51f5-4f29-8af0-39244e10eb60",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d5d6e8a4-a2da-4cd5-80fc-3cf7c294697d": {
      "main": [
        [
          {
            "node": "ab5bcc9b-e2a0-4ec7-a4db-de512662549d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4b18deea-cfc2-4a8d-b2f3-8b31cac0d573": {
      "main": [
        [
          {
            "node": "becf9d6b-26a1-4498-9683-18ad15bc82ea",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "baad7161-51f5-4f29-8af0-39244e10eb60": {
      "main": [
        [
          {
            "node": "d5d6e8a4-a2da-4cd5-80fc-3cf7c294697d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7c8d30f1-df83-4ee1-83ce-32f6d9b0a810": {
      "main": [
        [
          {
            "node": "d5d6e8a4-a2da-4cd5-80fc-3cf7c294697d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c0de0228-f79b-4b18-9e5d-ee6218259078": {
      "main": [
        [
          {
            "node": "ab5bcc9b-e2a0-4ec7-a4db-de512662549d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ab5bcc9b-e2a0-4ec7-a4db-de512662549d": {
      "main": [
        [],
        [
          {
            "node": "6bea9362-5502-4c3c-acac-3f1a16bb0c64",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "90a316f5-0f08-42f8-86a0-318bcc9814f9": {
      "main": [
        [
          {
            "node": "c0de0228-f79b-4b18-9e5d-ee6218259078",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Création de contenu, IA Multimodale

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds21
Catégorie2
Types de nœuds8
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34