All guides
Fish AudioGPT-6 AstraAI VoiceDialogueCodex7 min read

Write a scene, cast it, hear it

GPT-6 Astra × Fish Audio

From Adam

Hey, it's Adam. Two characters, a full conversation, two different voices — and I never wrote a line of dialogue or a single voice description. GPT-6 Astra wrote the scene and tagged the emotion into it, then Fish Audio performed each character in their own voice. That's the whole thing, and it takes about five minutes. Fish Audio partners with me on this content; the workflow is the one I ran. You commented VOICE, so here it is.

The idea 🎭

Most AI voiceover fails at the same place: the script and the performance get written by different people, at different times, and neither knows about the other. You write flat text, hand it to a voice tool, and get flat audio back.

The unlock is having the model that writes the dialogue also direct it — dropping emotion cues into the script as it writes, line by line, because it already knows what each character is feeling. Then the voice engine performs the cues instead of guessing.

Three moving parts:

What you need ✅

Try Fish Audio — free development tier available

(partner — they sponsor my content)

Try Fish Audio →
step one

Let it write and direct 📋

The prompt that matters. Note it asks for tags inline and for the lines to be split by character, which is what makes the next step painless:

📋 the scene-writing prompt
Write a short conversation between two characters, about [topic].CHARACTER A — [name]: calm, confident, speaks in short measured sentences, never rushes.CHARACTER B — [name]: excited and curious, interrupts herself, asks a lot of questions.Rules:- 8 to 12 exchanges, natural spoken rhythm, no narration- Put delivery cues inline in square brackets, e.g. [calmly], [excited], [laughing], [quietly] — at the moments the delivery actually changes, not on every line- Tags describe HOW it's said, never what's happening- Keep each line under 25 wordsOutput as two clean blocks — all of A's lines, then all of B's — each line numbered so I can interleave them again after voicing.

Test: read a few lines aloud following the tags. If the tags don't change how you'd say it, ask for stronger cues — that's the fastest fix, and it costs nothing.

step two

Cast it 🎙

Take Character A's block to Fish Audio, pick a voice that fits the calm one, and generate. Then do the same for Character B with a different voice. Keep the square-bracket tags in the text — Fish Audio performs them and never reads them aloud.

Picking voices is the part worth slowing down on. Two rules:

Then interleave the two audio blocks back in the numbered order and you have your scene.

step three

Build it into an app 🛠

The manual version is fine for one scene. If you're doing it weekly, Codex with GPT-6 Astra can wrap the whole loop into a small app:

📋 the Codex prompt
Build me a simple local web app for two-character AI dialogue.- A form: topic, Character A personality, Character B personality- Calls the model to generate the tagged dialogue, split by character- Sends each character's lines to Fish Audio's TTS API with a different voice ID per character- Stitches the clips back together in script order and gives me one audio file to download- Read the Fish Audio API key from an environment variable, never hardcode it- Use the s2.1-pro-free model string

One scene in, one finished audio file out. That's the version you actually keep using.

the rules

Three things that help 🔑

  1. 1Tag the turns, not the lines. Four to six cues across a whole scene. A tag on every line reads as hysterical.
  2. 2Keep lines short. Under 25 words. Long sentences are where synthetic delivery starts to wander.
  3. 3Lock your voices. Save the voice IDs once you've picked them, so episode two sounds like episode one.
straight talk

The honest bit ⚠️

Fish Audio

(partner — they sponsor my content)

Try Fish Audio →