V
Video Production SOPKnowledge Base
Search
← All topics

Merlino Voice — Fish Audio TTS

runnable

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.

fish-audiottsvoice-cloneaudio
Agent trigger phrases: merlino voice · fish audio tts · voice clone · generate voiceover · mike voice · fish audio api · tts mp3 · clone voice video

Merlino Voice — Fish Audio TTS

Generate voiceovers using Mike's cloned voice on Fish Audio. Used for video narrations, page explainers, and podcast-style content.

Voice Defaults

| Setting | Value | |---------|-------| | Voice Model ID | 3782f7b36e5d411fb9d70d1809b134a0 | | Model | s1 | | Speed | 0.9 | | Temperature | 0.9 | | Bitrate | 192kbps | | Latency | normal (best quality) | | Chunk Length | 300 | | Format | mp3 |

Auth

Authorization: Bearer <FISH_AUDIO_API_KEY>
Base URL: https://api.fish.audio

Key location: D:\Ecosystem\secrets\MASTER_API_KEYS.envFISH_AUDIO_API_KEY

Quick Generate — Shell

Always use a temp JSON file to avoid shell escaping issues with exclamation marks, em dashes, or apostrophes.

cat > /tmp/fish-tts.json << 'ENDJSON'
{
  "text": "Your narration text here. Keep it natural.",
  "reference_id": "3782f7b36e5d411fb9d70d1809b134a0",
  "format": "mp3",
  "mp3_bitrate": 192,
  "chunk_length": 300,
  "latency": "normal",
  "temperature": 0.9,
  "speed": 0.9
}
ENDJSON

curl -s -X POST "https://api.fish.audio/v1/tts" \
  -H "Authorization: Bearer $FISH_AUDIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d @/tmp/fish-tts.json \
  --output output.mp3

Node.js Integration

import fs from 'fs';
import fetch from 'node-fetch';

async function generateVoiceover(text, outputPath) {
  const response = await fetch('https://api.fish.audio/v1/tts', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.FISH_AUDIO_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      text,
      reference_id: '3782f7b36e5d411fb9d70d1809b134a0',
      format: 'mp3',
      mp3_bitrate: 192,
      chunk_length: 300,
      latency: 'normal',
      temperature: 0.9,
      speed: 0.9
    })
  });

  const buffer = await response.buffer();
  fs.writeFileSync(outputPath, buffer);
  console.log(`Saved: ${outputPath}`);
}

Character Limit

Fish Audio max: approximately 5000 characters per request. For longer scripts, split on sentence boundaries and concatenate MP3 files with ffmpeg-agent.

# Concatenate multiple TTS clips
python cli.py concat part1.mp3 part2.mp3 part3.mp3 -o full-narration.mp3

Other Fish Audio Voices

To use a different cloned voice or browse available models, hit the voices endpoint:

curl https://api.fish.audio/v1/models \
  -H "Authorization: Bearer $FISH_AUDIO_API_KEY"

Use in Video Production

  1. Write script using [[scriptwriter]]
  2. Generate voiceover with Merlino Voice
  3. Sync audio with video in [[ffmpeg-agent]] or [[video-factory]]
  4. Add captions with ffmpeg add-subs or Remotion [[remotion-compositions]]

Cost

Fish Audio charges per character. Mike's voice clone is already set up — no additional clone cost.

Related Topics

  • [[assemblyai-transcription]] — transcribe audio back to text
  • [[video-factory]] — full video narration pipeline using this voice
  • [[ffmpeg-agent]] — merge audio into video

#video-sop #fish-audio #tts #voice-clone #audio