This workflow corresponds to n8n.io template #9301 — we link there as the canonical source.
This workflow follows the Executecommand → HTTP Request 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 →
{
"id": "w2qeYCgIcuMglLEB",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Generate Subtitles for Videos",
"tags": [],
"nodes": [
{
"id": "7fa3143f-a837-4711-a72e-ee8b85e56757",
"name": "Webhook Trigger",
"type": "n8n-nodes-base.webhook",
"position": [
-1504,
112
],
"parameters": {
"path": "generate-subtitles",
"options": {
"responseData": {
"responseBody": "Processing started"
}
},
"httpMethod": "POST"
},
"typeVersion": 1
},
{
"id": "23f12e94-e98c-4787-be58-763624e59537",
"name": "Download Video",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1200,
112
],
"parameters": {
"url": "={{$json[\"body\"][\"video_url\"]}}",
"options": {},
"responseFormat": "file"
},
"typeVersion": 2
},
{
"id": "d0f75494-fa2c-46f1-9ff2-2e17f8a88d0b",
"name": "Extract Audio (FFmpeg)",
"type": "n8n-nodes-base.executeCommand",
"position": [
-896,
112
],
"parameters": {
"command": "ffmpeg -i /data/video.mp4 -q:a 0 -map a /data/audio.wav"
},
"typeVersion": 1
},
{
"id": "8d462da7-7935-4c5d-9528-2f4a41d2b79b",
"name": "Run Whisper (Local)",
"type": "n8n-nodes-base.executeCommand",
"position": [
-608,
112
],
"parameters": {
"command": "whisper /data/audio.wav --model base --output_format srt --output_dir /data/"
},
"typeVersion": 1
},
{
"id": "85ffc4ca-8f9d-485b-ab99-83b6774781b0",
"name": "Read SRT File",
"type": "n8n-nodes-base.readBinaryFile",
"position": [
-304,
112
],
"parameters": {
"filePath": "/data/audio.srt"
},
"typeVersion": 1
},
{
"id": "c982d95f-b63b-4dc0-abc5-0bfdb6fbced9",
"name": "Translate Subtitles (LibreTranslate)",
"type": "n8n-nodes-base.httpRequest",
"position": [
224,
560
],
"parameters": {
"url": "https://libretranslate.com/translate",
"options": {},
"authentication": "genericCredentialType",
"jsonParameters": true
},
"typeVersion": 2
},
{
"id": "aa3eee42-8559-4f05-891c-9169b32f58cf",
"name": "Write Translated SRT",
"type": "n8n-nodes-base.writeBinaryFile",
"position": [
448,
560
],
"parameters": {
"options": {},
"fileName": "audio_translated.srt"
},
"typeVersion": 1
},
{
"id": "fb95e5aa-dd78-4249-b0d1-775dc259a870",
"name": "Merge Paths",
"type": "n8n-nodes-base.merge",
"position": [
112,
128
],
"parameters": {
"mode": "passThrough"
},
"typeVersion": 1
},
{
"id": "dae85000-c87f-4607-b80c-5c9c70276ce1",
"name": "Send a message",
"type": "n8n-nodes-base.gmail",
"position": [
768,
128
],
"parameters": {
"sendTo": "user@example.com",
"message": "Attached are the subtitles (original and translated, if requested).",
"options": {},
"subject": "Video Subtitles Generated"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "22d8ef5e-e319-4f76-8366-7b23bc600f43",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1536,
-176
],
"parameters": {
"color": 3,
"width": 480,
"height": 480,
"content": "## Input\n- Receives a video URL via webhook.\n- Acts as the workflow\u2019s entry point.\n- Downloads the video from the provided URL.\n- Prepares it for audio extraction."
},
"typeVersion": 1
},
{
"id": "5bf9004c-5e09-4cc2-af0f-63f9a2df15f7",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-960,
-176
],
"parameters": {
"color": 4,
"width": 848,
"height": 480,
"content": "## Audio Extraction & Transcribing\n- Uses FFmpeg to separate audio from the video file.\n- Run Whisper (Local)\n- Uses OpenAI Whisper (running locally) to transcribe the extracted audio into text/subtitles.\n- Read SRT File\n- Reads the generated subtitle file (.srt)\n- Prepares the subtitle data for optional translation."
},
"typeVersion": 1
},
{
"id": "2627a7bc-a0f7-4d03-b849-878abe63eb6a",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
144,
336
],
"parameters": {
"color": 5,
"width": 480,
"height": 400,
"content": "## Translation\n- Combines transcription and translation paths.\n- Ensures that subtitles (original or translated) are passed downstream.\n- Translate Subtitles (LibreTranslate)\n- Sends the .srt file text to LibreTranslate for language translation.\n- Write Translated SRT\n- Outputs a new .srt file containing translated subtitles."
},
"typeVersion": 1
},
{
"id": "fc33c12c-d054-4afe-bbf3-2f8a36c2f9df",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2432,
-160
],
"parameters": {
"width": 608,
"height": 912,
"content": "# Subtitle Generator & Translator N8N Template Instructions\n\nThis workflow automatically processes a video URL received via a webhook, generates highly accurate subtitles using **OpenAI Whisper**, and optionally translates them before delivering the final `.srt` file.\n\n---\n\n## \ud83d\udd34 Prerequisites\n\n- **Self-Hosted N8N** \n This workflow requires a self-hosted N8N instance, as it uses the **Execute Command** node.\n\n- **FFmpeg** \n The **Extract Audio (FFmpeg)** node requires the `ffmpeg` command-line tool to be installed and accessible via your N8N server's shell path.\n\n- **OpenAI Whisper** \n The **Run Whisper (Local)** node requires the `whisper` command-line tool (Python package) to be installed and accessible via your N8N server's shell path.\n\n- **Translation Service** \n You will need a credential for the **LibreTranslate** node "
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "66d89da8-0755-4e8b-bf81-d1ae3fad5507",
"connections": {
"Merge Paths": {
"main": [
[
{
"node": "Send a message",
"type": "main",
"index": 0
}
]
]
},
"Read SRT File": {
"main": [
[
{
"node": "Merge Paths",
"type": "main",
"index": 0
}
]
]
},
"Download Video": {
"main": [
[
{
"node": "Extract Audio (FFmpeg)",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Download Video",
"type": "main",
"index": 0
}
]
]
},
"Run Whisper (Local)": {
"main": [
[
{
"node": "Read SRT File",
"type": "main",
"index": 0
}
]
]
},
"Write Translated SRT": {
"main": [
[
{
"node": "Merge Paths",
"type": "main",
"index": 1
}
]
]
},
"Extract Audio (FFmpeg)": {
"main": [
[
{
"node": "Run Whisper (Local)",
"type": "main",
"index": 0
}
]
]
},
"Translate Subtitles (LibreTranslate)": {
"main": [
[
{
"node": "Write Translated SRT",
"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.
gmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Use cases Auto-generate subtitles for training or educational videos Translate videos into multiple languages for global reach Create accessibility-friendly content with minimal effort Build a backend for media platforms to process subtitles automatically
Source: https://n8n.io/workflows/9301/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
TestFixer CI Integration. Uses executeCommand, httpRequest, slack. Webhook trigger; 16 nodes.
PRAGMAS - Main Analysis. Uses httpRequest, executeCommand. Webhook trigger; 6 nodes.
Eu Clara – Funil Kiwify Completo. Uses postgres, openAi, httpRequest, gmail. Webhook trigger; 70 nodes.
This comprehensive n8n automation template orchestrates a complete end-to-end workflow for generating engaging short-form Point-of-View (POV) style videos using multiple AI services and automatically
User Signup & Verification: The workflow starts when a user signs up. It generates a verification code and sends it via SMS using Twilio. Code Validation: The user replies with the code. The workflow