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 →
{
"name": "40_420_FISH_AUDIO",
"nodes": [
{
"id": "wh-420",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
0
],
"parameters": {
"path": "fish-audio",
"httpMethod": "POST",
"responseMode": "onReceived",
"options": {}
}
},
{
"id": "prep-420",
"name": "TTS vorbereiten",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
220,
0
],
"parameters": {
"jsCode": "const raw = $input.first().json;\nconst d = raw.body ?? raw; // typeVersion-2 webhook: body under .body\nconst text = String(d.text_content || d.topic || 'Test').slice(0,4000);\nconst jobId = d.pipeline_job_id || 'test';\nconst voiceId = d.voice_id || '';\nreturn [{json:{pipeline_job_id:jobId, text, voice_id:voiceId, speed:1.0, format:'mp3'}}];"
}
},
{
"id": "fish-420",
"name": "Fish Audio TTS",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
440,
0
],
"onError": "continueRegularOutput",
"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"
}
]
},
"options": {
"response": {
"response": {
"responseFormat": "file"
}
},
"timeout": 120000
}
}
},
{
"id": "fname-420",
"name": "Dateiname",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
660,
0
],
"parameters": {
"jsCode": "const jobId = $('TTS vorbereiten').item.json.pipeline_job_id;\nconst ts = new Date().toISOString().replace(/[:.]/g,'-');\nconst fileName = `voice-${jobId}-${ts}.mp3`;\n// No persistent storage configured yet \u2014 audio_url placeholder\nreturn [{json:{pipeline_job_id:jobId, fileName, audio_url:'', mime_type:'audio/mpeg'}}];"
}
},
{
"id": "nocodb-420",
"name": "NocoDB media_assets",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
880,
0
],
"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": "asset_id",
"value": "={{ $randomString(12) }}"
},
{
"name": "source_service",
"value": "fish_audio"
},
{
"name": "asset_type",
"value": "audio"
},
{
"name": "s3_url",
"value": "={{ $json.audio_url || '' }}"
},
{
"name": "file_name",
"value": "={{ $json.fileName }}"
},
{
"name": "mime_type",
"value": "audio/mpeg"
},
{
"name": "pipeline_job_id",
"value": "={{ $json.pipeline_job_id }}"
},
{
"name": "status",
"value": "ready"
},
{
"name": "created_at",
"value": "={{ $now.toISO() }}"
}
]
},
"options": {}
}
},
{
"id": "find-pipeline-420",
"name": "Pipeline Job finden",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1100,
0
],
"onError": "continueRegularOutput",
"parameters": {
"method": "GET",
"url": "https://directus.automation-plus-ki.de/items/400_content_pipeline?filter[job_id][_eq]=${$('Dateiname').item.json.pipeline_job_id}&limit=1",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer ={{ $env.DIRECTUS_TOKEN }}"
}
]
},
"options": {}
}
},
{
"id": "patch-pipeline-420",
"name": "Pipeline-Job updaten",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
1320,
0
],
"onError": "continueRegularOutput",
"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",
"body": "={{ JSON.stringify([{Id:$json.data?.[0]?.Id,audio_url:$('Dateiname').item.json.audio_url||'',stage:'publish',status:'running'}]) }}",
"options": {
"response": {
"response": {
"neverError": true
}
}
}
}
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "TTS vorbereiten",
"type": "main",
"index": 0
}
]
]
},
"TTS vorbereiten": {
"main": [
[
{
"node": "Fish Audio TTS",
"type": "main",
"index": 0
}
]
]
},
"Fish Audio TTS": {
"main": [
[
{
"node": "Dateiname",
"type": "main",
"index": 0
}
]
]
},
"Dateiname": {
"main": [
[
{
"node": "NocoDB media_assets",
"type": "main",
"index": 0
}
]
]
},
"NocoDB media_assets": {
"main": [
[
{
"node": "Pipeline Job finden",
"type": "main",
"index": 0
}
]
]
},
"Pipeline Job finden": {
"main": [
[
{
"node": "Pipeline-Job updaten",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
40_420_FISH_AUDIO. Uses httpRequest. Webhook trigger; 7 nodes.
Source: https://github.com/timo-goetz-ai/apki-core-platform/blob/main/automations/n8n-workflows/content-pipeline/40_420_FISH_AUDIO.json — 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.
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
This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .
eek-Go v2 (Batch-Then-Review). Uses httpRequest. Webhook trigger; 75 nodes.
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
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