AI narration flattens out over long paragraphs
Prosody decays as the model loses sentence structure. A chunking strategy, punctuation that restores emphasis, and joins you cannot hear.
The first two sentences sound like a person. By the middle of the paragraph the pitch range has narrowed, the stresses have evened out, and the last clause is a straight line with words on it. That is not the voice "getting tired." It is the model running out of sentence-level structure to perform against. Prosody in TTS is predicted from the text in view: punctuation, clause boundaries, question marks, the length of the unit being synthesised. A 180-word block with two commas and a period at the end is, to the model, one long exhalation. It will start with a contour and then regress to a mean.
The fix is not a more expensive voice. It is smaller chunks, punctuation that marks the performance, and a join at silence so the edit does not announce itself. Generate the performance in pieces the model can still see.
Why long paragraphs go flat
Speech models do not "understand" a paragraph the way a narrator marks up a script. They assign duration, pitch, and energy from local cues: a period means a fall, a question mark means a rise, a comma a short hold. When those cues are sparse, the contour has nothing to hang on. Attention over a long span also washes out: the start of the take still has a shape, the tail is an average of how this voice talks.
You hear it as stress landing on function words by the third sentence, lists read as one run-on, a mid-paragraph question that does not rise, and the same pace on a throwaway clause as on the claim you needed to land.
Style settings do not defeat this. emotion and style_instructions on Versely’s generate_speech (and the equivalent style prompt on Gemini and Qwen 3) set a register: warm, unhurried, confident. They do not reintroduce clause boundaries you failed to write. Audio tags can punch a moment — ElevenLabs and Inworld take [excited] / [whispers]; Grok wraps the phrase in paired tags such as <cheerful>…</cheerful> — but a cue at the top of a 200-word block will not carry to the end. ElevenLabs’ own v3 prompting guide is blunt about structure: punctuation, ellipses, and capitalisation are first-class controls, and v3 does not take SSML break tags. If the paragraph is a wall, the tag is a sticker on the wall.
Style locking is the cousin problem: takes that disagree with each other. Flattening is one take that disagrees with itself. You can lock a voice and still flatten a paragraph.
Chunk at the sentence, not the chapter
Do not synthesise a blog post as one request. Do not synthesise one word at a time either. Word-level chunks destroy intonation; chapter-level chunks flatten it. The unit that holds a contour is a sentence, sometimes two or three that belong to the same thought.
A working split:
- Break the script at sentence boundaries first. Every
. ? !is a legal cut. Keep the punctuation on the chunk that owns it. - Pack 1–3 sentences per generation, as long as they are one move: setup plus payoff, or a claim plus the example. When the thought changes, start a new chunk even if the last one was short.
- Do not cut inside a clause. "The plan is simple, and" / "it saves you a day" is how you get a rising join into nowhere. Cut after
simple.Rewrite as two sentences if you need a breath there. - Keep list items as separate chunks if the list is the point. Three benefits in one sentence will be spoken as porridge. Three sentences will be spoken as three hits.
- Repeat the register per chunk. If you are on a tag engine, put the tag on the chunk that needs it, not on chunk one with the hope it leaks. If you are on Cartesia, Gemini, or Qwen 3, send the same
emotion/style_instructionswith every call so the register does not drift even as the text changes.
Example. This paragraph will flatten:
Today we are going to look at the three reasons your ads stop converting after week two and what to do about each of them including the creative fatigue you cannot see in the dashboard the offer that quietly expired and the audience that already bought which is why the next thirty seconds are the part you should screenshot.
This is the same meaning, in chunks the model can play:
Your ads stop converting after week two for three reasons.
One: creative fatigue you cannot see in the dashboard.
Two: an offer that quietly expired.
Three: the audience already bought.
Screenshot this next part.
Generate those as five generate_speech calls on the same voice and model, same style field, then stitch. The text-to-speech tool and adding a voiceover do not require a single take.
If a chunk still comes back flat, the chunk is still too long or still under-punctuated. Split it again before you change voices.
Punctuation that restores emphasis
You are writing a performance, not a paragraph for print. The on-screen caption can stay literary. The spoken script should look slightly over-punctuated.
| Cue | What it does | Use |
|---|---|---|
| Period | Fall, end of move | Default. Prefer two short sentences over one clause chain |
| Comma | Short hold | After a setup, before a name, in a list you must keep in one chunk |
| Question mark | Rise | On actual questions. A rhetorical question with a period will not rise |
Ellipsis ... |
Longer hold, weight | Before a reveal. ElevenLabs documents ellipses as a pause/weight control on v3 |
| ALL CAPS on one word | Emphasis, on engines that look at it | ElevenLabs documents this for v3. Do not rely on it for Multilingual v2. Never caps a whole sentence |
| Audio tag | Local delivery shift | [whispers], [sighs], [excited] on ElevenLabs / Inworld, immediately before the phrase. Grok uses paired tags around the phrase (<cheerful>…</cheerful>). Not on Cartesia / Gemini / Qwen 3, which will read the brackets |
Rewrite, do not decorate. A comma spliced onto a 40-word sentence is still a 40-word sentence.
Flat: "The setup is simple which is useful but the second step is the one that matters so do not confuse the two."
Playable: "The setup is simple. Useful. The second step is the one that matters. Do not confuse the two."
ElevenLabs documents capitalisation as emphasis on v3. On ElevenLabs Multilingual (Multilingual v2 in the catalog) do not lean on that trick: put the contrast in the period.
"The second step is the one that matters. Do not confuse the two."
On Cartesia, Gemini, and Qwen 3, same rule: punctuation and chunking, not orthographic shouting. Send the same emotion on every chunk so the register holds while the punctuation supplies the contour. Ask the agent to write and generate a voiceover with the spoken, punctuated script, not the blog paragraph.
Numbers and names are a separate rewrite. Expand them into spoken words before you chunk, or the model will flatten and also mis-say the price.
Stitching without an audible join
A bad join is a click, a double breath, a pitch jump, or a room-tone drop. All four are assembly defects, not synthesis defects.
Print WAV, not MP3. Then:
- Cut on silence. End each chunk after the last word, plus a little ring-out. Trim leading silence so you are not stacking two holes.
- Crossfade 20–40 ms at the join, equal-power. Shorter than 10 ms can click. Longer than about 80 ms smears two words together.
- Match level before the fade. If chunk 4 came back 2 dB hotter, the join is a pump. Normalise the chunks to each other, not each chunk to full scale.
- Do not overlap speech. Leave a 100–200 ms gap after a period; use the short crossfade to hide the cut, not a collision.
- Keep the room constant. Same voice, same model, same style field. Switching models mid-paragraph is a join no crossfade will hide.
If one sentence in the middle is the only bad take, regenerate that chunk only. Regenerating the whole paragraph to fix line four asks for the long span again, and flattening creeps back in.
Lay the stitched VO onto picture with mix or replace, same as any other voiceover. The listener should hear one person who keeps finding a new sentence.
FAQ
Can I just generate the whole script in one pass if the voice is good?
Only if the script is already short, already punctuated, and still has a contour when you listen to the tail. The first twenty seconds lying to you is the usual trap. Skip to the last sentence of a long take before you approve it. If that sentence is a drone, split the script and regenerate in chunks.
Do audio tags fix flattening?
They fix a moment. [excited] on the first line of a long paragraph will not still be there on line six. Put the cue on the chunk that needs it, keep chunks short, and close every Grok tag. On Cartesia, Gemini, and Qwen 3 do not put tags in the script at all: those engines read brackets as text. Use emotion / style_instructions instead.
How short is too short?
One clause with no ending punctuation is too short: the model has no cadence to finish. One complete sentence is enough. One word, looped, is how you get karaoke stress on every token and a join every 400 ms. Pack a whole move, then stop.
Why does the stitched version still sound like two takes?
Level mismatch, a leftover breath on both sides of the cut, or a style field that changed between calls. Match the style parameters, trim to silence, 20–40 ms crossfade, WAV. If you changed the model for one sentence, that sentence will never belong to the paragraph. Generate it on the original model and throw the hero take out.