{"slug":"merlino-voice","title":"Merlino Voice — Fish Audio TTS","tags":["fish-audio","tts","voice-clone","audio"],"agent_summary":"Generate TTS voiceovers using Mike Merlino's cloned Fish Audio voice. Covers auth, API call pattern, defaults (speed 0.9, bitrate 192kbps), and temp-file shell trick for special characters.","trigger_phrases":["merlino voice","fish audio tts","voice clone","generate voiceover","mike voice","fish audio api","tts mp3","clone voice video"],"runnable":true,"markdown":"\n# Merlino Voice — Fish Audio TTS\n\nGenerate voiceovers using Mike's cloned voice on Fish Audio. Used for video narrations, page explainers, and podcast-style content.\n\n## Voice Defaults\n\n| Setting | Value |\n|---------|-------|\n| Voice Model ID | `3782f7b36e5d411fb9d70d1809b134a0` |\n| Model | s1 |\n| Speed | 0.9 |\n| Temperature | 0.9 |\n| Bitrate | 192kbps |\n| Latency | normal (best quality) |\n| Chunk Length | 300 |\n| Format | mp3 |\n\n## Auth\n\n```\nAuthorization: Bearer <FISH_AUDIO_API_KEY>\nBase URL: https://api.fish.audio\n```\n\nKey location: `D:\\Ecosystem\\secrets\\MASTER_API_KEYS.env` → `FISH_AUDIO_API_KEY`\n\n## Quick Generate — Shell\n\nAlways use a temp JSON file to avoid shell escaping issues with exclamation marks, em dashes, or apostrophes.\n\n```bash\ncat > /tmp/fish-tts.json << 'ENDJSON'\n{\n  \"text\": \"Your narration text here. Keep it natural.\",\n  \"reference_id\": \"3782f7b36e5d411fb9d70d1809b134a0\",\n  \"format\": \"mp3\",\n  \"mp3_bitrate\": 192,\n  \"chunk_length\": 300,\n  \"latency\": \"normal\",\n  \"temperature\": 0.9,\n  \"speed\": 0.9\n}\nENDJSON\n\ncurl -s -X POST \"https://api.fish.audio/v1/tts\" \\\n  -H \"Authorization: Bearer $FISH_AUDIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d @/tmp/fish-tts.json \\\n  --output output.mp3\n```\n\n## Node.js Integration\n\n```javascript\nimport fs from 'fs';\nimport fetch from 'node-fetch';\n\nasync function generateVoiceover(text, outputPath) {\n  const response = await fetch('https://api.fish.audio/v1/tts', {\n    method: 'POST',\n    headers: {\n      'Authorization': `Bearer ${process.env.FISH_AUDIO_API_KEY}`,\n      'Content-Type': 'application/json'\n    },\n    body: JSON.stringify({\n      text,\n      reference_id: '3782f7b36e5d411fb9d70d1809b134a0',\n      format: 'mp3',\n      mp3_bitrate: 192,\n      chunk_length: 300,\n      latency: 'normal',\n      temperature: 0.9,\n      speed: 0.9\n    })\n  });\n\n  const buffer = await response.buffer();\n  fs.writeFileSync(outputPath, buffer);\n  console.log(`Saved: ${outputPath}`);\n}\n```\n\n## Character Limit\n\nFish Audio max: approximately 5000 characters per request. For longer scripts, split on sentence boundaries and concatenate MP3 files with ffmpeg-agent.\n\n```bash\n# Concatenate multiple TTS clips\npython cli.py concat part1.mp3 part2.mp3 part3.mp3 -o full-narration.mp3\n```\n\n## Other Fish Audio Voices\n\nTo use a different cloned voice or browse available models, hit the voices endpoint:\n\n```bash\ncurl https://api.fish.audio/v1/models \\\n  -H \"Authorization: Bearer $FISH_AUDIO_API_KEY\"\n```\n\n## Use in Video Production\n\n1. Write script using [[scriptwriter]]\n2. Generate voiceover with Merlino Voice\n3. Sync audio with video in [[ffmpeg-agent]] or [[video-factory]]\n4. Add captions with ffmpeg add-subs or Remotion [[remotion-compositions]]\n\n## Cost\n\nFish Audio charges per character. Mike's voice clone is already set up — no additional clone cost.\n\n## Related Topics\n\n- [[assemblyai-transcription]] — transcribe audio back to text\n- [[video-factory]] — full video narration pipeline using this voice\n- [[ffmpeg-agent]] — merge audio into video\n\n#video-sop #fish-audio #tts #voice-clone #audio\n","html":"<h1>Merlino Voice — Fish Audio TTS</h1>\n<p>Generate voiceovers using Mike's cloned voice on Fish Audio. Used for video narrations, page explainers, and podcast-style content.</p>\n<h2>Voice Defaults</h2>\n<p>| Setting | Value |\n|---------|-------|\n| Voice Model ID | <code>3782f7b36e5d411fb9d70d1809b134a0</code> |\n| Model | s1 |\n| Speed | 0.9 |\n| Temperature | 0.9 |\n| Bitrate | 192kbps |\n| Latency | normal (best quality) |\n| Chunk Length | 300 |\n| Format | mp3 |</p>\n<h2>Auth</h2>\n<pre><code>Authorization: Bearer &#x3C;FISH_AUDIO_API_KEY>\nBase URL: https://api.fish.audio\n</code></pre>\n<p>Key location: <code>D:\\Ecosystem\\secrets\\MASTER_API_KEYS.env</code> → <code>FISH_AUDIO_API_KEY</code></p>\n<h2>Quick Generate — Shell</h2>\n<p>Always use a temp JSON file to avoid shell escaping issues with exclamation marks, em dashes, or apostrophes.</p>\n<pre><code class=\"language-bash\">cat > /tmp/fish-tts.json &#x3C;&#x3C; 'ENDJSON'\n{\n  \"text\": \"Your narration text here. Keep it natural.\",\n  \"reference_id\": \"3782f7b36e5d411fb9d70d1809b134a0\",\n  \"format\": \"mp3\",\n  \"mp3_bitrate\": 192,\n  \"chunk_length\": 300,\n  \"latency\": \"normal\",\n  \"temperature\": 0.9,\n  \"speed\": 0.9\n}\nENDJSON\n\ncurl -s -X POST \"https://api.fish.audio/v1/tts\" \\\n  -H \"Authorization: Bearer $FISH_AUDIO_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d @/tmp/fish-tts.json \\\n  --output output.mp3\n</code></pre>\n<h2>Node.js Integration</h2>\n<pre><code class=\"language-javascript\">import fs from 'fs';\nimport fetch from 'node-fetch';\n\nasync function generateVoiceover(text, outputPath) {\n  const response = await fetch('https://api.fish.audio/v1/tts', {\n    method: 'POST',\n    headers: {\n      'Authorization': `Bearer ${process.env.FISH_AUDIO_API_KEY}`,\n      'Content-Type': 'application/json'\n    },\n    body: JSON.stringify({\n      text,\n      reference_id: '3782f7b36e5d411fb9d70d1809b134a0',\n      format: 'mp3',\n      mp3_bitrate: 192,\n      chunk_length: 300,\n      latency: 'normal',\n      temperature: 0.9,\n      speed: 0.9\n    })\n  });\n\n  const buffer = await response.buffer();\n  fs.writeFileSync(outputPath, buffer);\n  console.log(`Saved: ${outputPath}`);\n}\n</code></pre>\n<h2>Character Limit</h2>\n<p>Fish Audio max: approximately 5000 characters per request. For longer scripts, split on sentence boundaries and concatenate MP3 files with ffmpeg-agent.</p>\n<pre><code class=\"language-bash\"># Concatenate multiple TTS clips\npython cli.py concat part1.mp3 part2.mp3 part3.mp3 -o full-narration.mp3\n</code></pre>\n<h2>Other Fish Audio Voices</h2>\n<p>To use a different cloned voice or browse available models, hit the voices endpoint:</p>\n<pre><code class=\"language-bash\">curl https://api.fish.audio/v1/models \\\n  -H \"Authorization: Bearer $FISH_AUDIO_API_KEY\"\n</code></pre>\n<h2>Use in Video Production</h2>\n<ol>\n<li>Write script using [[scriptwriter]]</li>\n<li>Generate voiceover with Merlino Voice</li>\n<li>Sync audio with video in [[ffmpeg-agent]] or [[video-factory]]</li>\n<li>Add captions with ffmpeg add-subs or Remotion [[remotion-compositions]]</li>\n</ol>\n<h2>Cost</h2>\n<p>Fish Audio charges per character. Mike's voice clone is already set up — no additional clone cost.</p>\n<h2>Related Topics</h2>\n<ul>\n<li>[[assemblyai-transcription]] — transcribe audio back to text</li>\n<li>[[video-factory]] — full video narration pipeline using this voice</li>\n<li>[[ffmpeg-agent]] — merge audio into video</li>\n</ul>\n<p>#video-sop #fish-audio #tts #voice-clone #audio</p>\n"}