Skip to content
New · the open voice benchmark is liveRead it
cantari
← All posts
ResearchSeptember 30, 2026 · 7 min read

How to write a voiceover script that TTS can actually perform

A template is paperwork. The script is the performance.

Last updated September 30, 2026

The search box sold you a template

Type voiceover script, voice over script template, or how to write a voiceover script and the pages that come back are mostly the same two artifacts: a two-column table (picture on the left, words on the right) and a stack of XML tags. Those pages are not wrong. They are incomplete if the next reader is an engine.

A human talent already knows to write for the ear. Short sentences. Contractions. A note in the margin. An engine will still wreck a good page if you paste the camera directions, leave a name as a spelling bee, or drop a stage direction on a voice that cannot act it.

The product page for this is Text to Speech. This post is the craft version: the three jobs hiding under one search, the marks that actually change a take, and the markup we refuse on purpose.

Three jobs, not one blank page

People type the same phrase for three products. Mixing them up is how a 15-second spot gets written like a chapter, or a chapter gets jammed into a generate box.

JobWhat you actually needWhat we return today
Timed spotA 15, 30, or 60 second read that hits the clockA file you can audition before anyone books a booth
Explainer / video VOThe spoken column only, written against pictureAn MP3 or WAV you drop on the timeline
Long narrationBreath, paragraph breaks, a page that can still be rewrittenA take you expect to regenerate, not a novel in one click

* House product truth as of 2026-09-30. Exports are MP3 or WAV. There is no SSML input and no pronunciation dictionary.

Write for the ear, then press generate

If a sentence needs a comma just to survive, cut it in two. That advice is older than any model on this roster. It still saves more takes than a new voice will.

Read the page out loud before you generate. If you stumble, the engine will too. Contractions help (you'll, we're, it's). Formal copy that looks tidy on a slide often sounds like a terms-of-service overlay once it is spoken.

Punctuation is direction you already have. A period lands. A comma buys a beat. A question mark lifts. An ellipsis can buy a pause on the engine that follows cues. ALL CAPS is not a performance. It is a hope.

Names and numbers are where fluent takes die

Engines guess. They are pretty good at ordinary prose and sloppy at the words you actually care about: the founder, the street, the SKU, the year said as a year.

If the order of a number matters, write it the way it should be spoken. Three hundred, not 300, if you do not want three-zero-zero. 2026 can come out twenty twenty-six or two thousand twenty-six; pick one on the page.

If a name is not obvious, spell the sound next to it in the script, the way a session sheet would: Nguyen (win). We do not ship a pronunciation lexicon. The script is the lexicon. Fix it in the words. Do not regenerate ten times hoping the spelling appears in the mouth.

Stage directions, not SSML

Talent blogs already put feeling in brackets. TTS blogs often paste XML. Those are different documents.

As of September 2026, Speech Synthesis Markup Language 1.1 is still a W3C specification for authors who need XML control of pitch, rate, and breaks across synthesis platforms. We do not take SSML as studio input. If you need that standard, read W3C's page. We are not W3C, and implementations differ by vendor. Verify before you rely.

On Cantari, a cue is a stage direction in square brackets, written on the line it directs: [warm] Five a.m. The boats are out. The studio palette ships [whispering], [calm], [quietly], [nervously], [trembling], [breathing heavily], [excited], and [pause]. You can type your own. Place it immediately before the line. A single [calm] at the top of a page will not carry a whole spot.

Only Gemini Flash acts those brackets. The rest of the roster is a plain read. Our pipeline strips the brackets before a plain-read engine sees the text, so Kokoro does not say the word whispering out loud. You also do not get the performance. The longer engine-split is in cued TTS vs flat reads. The short definition is what is a TTS cue.

Same page, two engines

The usual failure is directing a draft, or drafting a keeper.

Write the words on Kokoro until they are actually the words. It is the unlimited draft engine: a clean, plain read, fast enough that rewriting a sentence is cheaper than arguing about the take. When a line has to sound confident instead of flat, move that line, not the whole page, onto the engine that acts direction.

On this roster that engine is Gemini Flash. The Advertising worked example is the same Harbor Coffee spot run [warm], [confident], and [playful], which is what a Thursday client meeting needs before anyone books a booth.

MAI Voice 2 is the other honest exception: real style and speed controls, not cues. Use the sliders when the job is intensity on a plain English read. Do not stack a cue on top and expect both systems to fire.

Enhance can insert cues around your words. It does not rewrite the copy. One click adds direction, one click undoes it. The button is disabled on plain-read engines, because inserting cues they will ignore is just noise. The studio walkthrough is how to use Text to Speech.

Time the page before you generate

Overwritten copy is the usual timing problem. The read gets rushed, then you blame the voice.

House rule of thumb: about 1,000 characters of script is about a minute of audio. Speed varies by voice and writing, so treat it as an estimate. The words to minutes calculator does the arithmetic when you want it interactive. Human coaches often budget about 150 spoken words a minute. That lands in the same neighborhood. Pick a clock and use it.

On the Advertising page, a 15-second radio spot is about 250 characters. If your 15-second draft is 400, the engine will not save you. Cut the sentence that explains the company founding date.

Where it still fails

A fluent take can still be the wrong file. These are the misses we see when people treat the search phrase as a spec.

  • Pasting the whole two-column script, so the engine reads CAMERA PUSHES IN.
  • Dropping SSML into the box and waiting for tags to become performance.
  • Cues on a plain-read engine, then blaming the voice for a flat take.
  • Three moods stacked on twelve words.
  • ALL CAPS instead of a cue, or a cue instead of a shorter sentence.
  • A name or number left as a spelling bee.
  • Timing by wishful reading, not a clock.
  • A clone of a real announcer (we do not offer that, and acceptable use would not either).

Honest limits

No SSML. No pronunciation dictionary. No visemes, no lip-sync, no in-editor timeline. The output is a file. You own the export: commercial use, no watermark, same as the rest of the studio (you own what you make here).

Cue-following is Gemini Flash only. The other engines on the roster read plainly. We strip brackets so they do not speak the direction. We do not pretend they performed it.

A generation has a character cap. Split a chapter. Do not paste a book into one box and call the truncation a voice problem.

Premium generation sits inside a flat monthly allowance (published free-tier premium budget: 10,000 characters, about 10 minutes by house math). Kokoro drafting stays unlimited so you can rehearse a page without burning keeper budget on every micro-edit. Paid plans raise the flat allowance; they do not put you on a per-character anxiety meter.

Voice cloning is not a live path today. When it ships it will be English-first with a consent attestation. Until then, roster voices and personas are the honest path.

Write one this week

The shortest proof is a spot you already have in a doc, not a roundup of vendors.

  • Pick a 15-second line. Count it in words to minutes.
  • Cut until you can say it without rushing.
  • Mark every name and number the way it should be spoken.
  • Draft the words on Kokoro until they are the words.
  • If the line needs a mood, move it onto Gemini Flash. One cue, right before the sentence.
  • Export. Listen once without looking at the page. If a word is wrong, fix the page, not the voice picker.

Open the studio, not the XML

If you came here from a voiceover script or script-template search, the honest product is a spoken page you can hear this afternoon. Open Text to Speech, or start from the Text to Speech guide if you want the short version first.

When you want a timed spot with a cue you can audition, the worked example lives on Advertising. When you want the full studio, create a free account. Written to be heard starts on the page, as long as we do not lie about what the engine will do with it.

Check our work, then make your own.

The benchmark is live and the studio is free to start. Every claim above is one click from its source.