AutomationFlowsWeb Scraping › Content Voice

Content Voice

40_32_CONTENT_VOICE. Uses httpRequest. Webhook trigger; 8 nodes.

Webhook trigger★★★★☆ complexity8 nodesHTTP Request
Web Scraping Trigger: Webhook Nodes: 8 Complexity: ★★★★☆ Added:

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": "40_32_CONTENT_VOICE",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "content-voice",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "webhook-trigger",
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// Input: { pipeline_job_id, text_content, voice_id?, speed? }\nconst body = $input.first().json.body ?? $input.first().json;\n\nif (!body.text_content) throw new Error('text_content fehlt im Request');\nif (!body.pipeline_job_id) throw new Error('pipeline_job_id fehlt im Request');\n\n// Text k\u00fcrzen falls zu lang (Fish Audio limit: ~4000 chars)\nconst text = String(body.text_content).slice(0, 4000);\n\nreturn [{ json: {\n  pipeline_job_id: body.pipeline_job_id,\n  text,\n  voice_id: body.voice_id ?? '',\n  speed: body.speed ?? 1.0,\n  format: 'mp3'\n} }];"
      },
      "id": "prepare-tts",
      "name": "TTS vorbereiten",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.fish.audio/v1/tts",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.FISH_AUDIO_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "bodyParameters": {
          "parameters": [
            {
              "name": "text",
              "value": "={{ $json.text }}"
            },
            {
              "name": "reference_id",
              "value": "={{ $json.voice_id }}"
            },
            {
              "name": "format",
              "value": "mp3"
            },
            {
              "name": "mp3_bitrate",
              "value": 128
            },
            {
              "name": "normalize",
              "value": true
            },
            {
              "name": "streaming",
              "value": false
            },
            {
              "name": "prosody",
              "value": "={ \"speed\": {{ $json.speed }}, \"volume\": 0 }"
            }
          ]
        },
        "options": {
          "responseFormat": "file",
          "timeout": 120000
        }
      },
      "id": "fish-audio-tts",
      "name": "Fish Audio: TTS generieren",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// Dateiname f\u00fcr S3\nconst jobId = $('TTS vorbereiten').item.json.pipeline_job_id;\nconst ts = new Date().toISOString().replace(/[:.]/g, '-');\nconst fileName = `voice-${jobId}-${ts}.mp3`;\nconst date = new Date().toISOString().split('T')[0];\n\nreturn [{ json: {\n  ...$input.first().json,\n  fileName,\n  s3Key: `assets/audio/${date}/${fileName}`,\n  s3Url: `https://noco-aios.fsn1.your-objectstorage.com/assets/audio/${date}/${fileName}`,\n  pipeline_job_id: $('TTS vorbereiten').item.json.pipeline_job_id\n} }];"
      },
      "id": "build-filename",
      "name": "Dateiname erstellen",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        900,
        300
      ]
    },
    {
      "parameters": {
        "method": "PUT",
        "url": "=https://noco-aios.fsn1.your-objectstorage.com/{{ $json.s3Key }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "audio/mpeg"
            },
            {
              "name": "x-amz-acl",
              "value": "public-read"
            }
          ]
        },
        "sendBody": true,
        "contentType": "binaryData",
        "inputDataFieldName": "data",
        "options": {
          "timeout": 60000
        }
      },
      "id": "upload-s3",
      "name": "S3 Upload",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1120,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://directus.automation-plus-ki.de/items/420_media_assets",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer ={{ $env.DIRECTUS_TOKEN }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "bodyParameters": {
          "parameters": [
            {
              "name": "source_service",
              "value": "fishaudio"
            },
            {
              "name": "asset_type",
              "value": "audio"
            },
            {
              "name": "s3_url",
              "value": "={{ $('Dateiname erstellen').item.json.s3Url }}"
            },
            {
              "name": "file_name",
              "value": "={{ $('Dateiname erstellen').item.json.fileName }}"
            },
            {
              "name": "mime_type",
              "value": "audio/mpeg"
            },
            {
              "name": "pipeline_job_id",
              "value": "={{ $('Dateiname erstellen').item.json.pipeline_job_id }}"
            },
            {
              "name": "status",
              "value": "ready"
            },
            {
              "name": "created_at",
              "value": "={{ $now.toISO() }}"
            }
          ]
        }
      },
      "id": "nocodb-asset",
      "name": "NocoDB: media_assets anlegen",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1340,
        300
      ]
    },
    {
      "parameters": {
        "method": "PATCH",
        "url": "https://directus.automation-plus-ki.de/items/400_content_pipeline",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer ={{ $env.DIRECTUS_TOKEN }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "bodyParameters": {
          "parameters": [
            {
              "name": "Id",
              "value": "={{ $('Dateiname erstellen').item.json.pipeline_job_id }}"
            },
            {
              "name": "audio_url",
              "value": "={{ $('Dateiname erstellen').item.json.s3Url }}"
            },
            {
              "name": "stage",
              "value": "publish"
            },
            {
              "name": "status",
              "value": "idle"
            },
            {
              "name": "updated_at",
              "value": "={{ $now.toISO() }}"
            }
          ]
        }
      },
      "id": "update-pipeline",
      "name": "Pipeline Job aktualisieren",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1560,
        300
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={ \"ok\": true, \"audio_url\": \"{{ $('Dateiname erstellen').item.json.s3Url }}\", \"pipeline_job_id\": \"{{ $('Dateiname erstellen').item.json.pipeline_job_id }}\" }"
      },
      "id": "respond-ok",
      "name": "Response OK",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1780,
        300
      ]
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "TTS vorbereiten",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "TTS vorbereiten": {
      "main": [
        [
          {
            "node": "Fish Audio: TTS generieren",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fish Audio: TTS generieren": {
      "main": [
        [
          {
            "node": "Dateiname erstellen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dateiname erstellen": {
      "main": [
        [
          {
            "node": "S3 Upload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "S3 Upload": {
      "main": [
        [
          {
            "node": "NocoDB: media_assets anlegen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "NocoDB: media_assets anlegen": {
      "main": [
        [
          {
            "node": "Pipeline Job aktualisieren",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pipeline Job aktualisieren": {
      "main": [
        [
          {
            "node": "Response OK",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner"
  },
  "staticData": null,
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "versionId": "40_32_CONTENT_VOICE_v1",
  "tags": [
    {
      "name": "content-pipeline"
    }
  ]
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

40_32_CONTENT_VOICE. Uses httpRequest. Webhook trigger; 8 nodes.

Source: https://github.com/timo-goetz-ai/apki-core-platform/blob/5cd9c9d9ed0ed464da995af94683e9301965a3bc/automations/n8n-workflows/content-pipeline/40_32_CONTENT_VOICE.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di

n8n, Execute Workflow Trigger, HTTP Request +1
Web Scraping

This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .

HTTP Request, Ssh
Web Scraping

eek-Go v2 (Batch-Then-Review). Uses httpRequest. Webhook trigger; 75 nodes.

HTTP Request
Web Scraping

This workflow receives webhook requests from a content calendar and uses the X API v2 to publish text posts, threads, image/video posts, and polls, as well as delete existing posts and run a credentia

HTTP Request
Web Scraping

This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c

HTTP Request