TikTok の文字起こし

上級

これはContent Creation, Multimodal AI分野の自動化ワークフローで、21個のノードを含みます。主にIf, Code, Wait, HttpRequest, GoogleSheetsなどのノードを使用。 RapidAPIとGoogle Sheetsを使ってTikTok動画の自動文字起こし

前提条件
  • ターゲットAPIの認証情報が必要な場合あり
  • Google Sheets API認証情報
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "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": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1100,
        40
      ],
      "parameters": {
        "options": {
          "reset": false
        }
      },
      "typeVersion": 3
    },
    {
      "id": "d5d6e8a4-a2da-4cd5-80fc-3cf7c294697d",
      "name": "Wait",
      "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": "If",
      "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": "If1",
      "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": "ワークフロー実行時",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1580,
        40
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5d36dbf3-ebd6-4cd8-913b-ee1308d6847b",
      "name": "付箋",
      "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": "付箋1",
      "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": "付箋2",
      "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": "付箋3",
      "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": "付箋4",
      "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": "付箋5",
      "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": "付箋6",
      "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": "付箋7",
      "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": "付箋8",
      "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": "付箋9",
      "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": "付箋10",
      "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
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級 - コンテンツ作成, マルチモーダルAI

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数21
カテゴリー2
ノードタイプ8
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34