craft · ai writing
Why Every AI Character Talks the Same
JP LeBlanc · September 25, 2026 · 6 min read

Two characters walk into a scene. One is burying her father. One is ending a marriage. Cover the names and you can’t tell which is which. Both speak in full, grammatical sentences. Both say exactly what they feel, on the first try. Neither interrupts, evades a question, or leaves a sentence unfinished. This is the most common failure I see in AI-drafted fiction, and the hardest to catch on a fast read, because nothing about it is technically wrong. People just don’t talk like that.
The tells have names
At AIStoryHub we’ve spent a long time cataloging the phrasings that make prose read as machine-drafted. The cliché corpus behind our free Slop Checker has 758 entries, and a real slice, maybe forty or fifty, is dialogue. Not bad dialogue. Convergent dialogue: feed a model enough scenes of people talking and it settles on a small set of moves and repeats them.
The one I see most is the voice-emotion dialogue tag: voice laced with quiet fury, voice tinged with sadness, voice dripping with contempt. The corpus’s own example is “You knew,” she said, her voice laced with quiet fury. It’s a shortcut. Instead of writing a line that sounds furious, the model tells you the voice is furious and lets the adjective do the work.
Next to it sit said gently and said quietly, plus the sympathy-check dialogue crutch, “Are you okay?” she asked, fine once in three hundred pages and exhausting as a reflex. Worse is therapy-speak reassurance: “I understand how you feel,” he said. Nobody says that mid-argument. People say okay and change the subject, or say nothing at all.
Then there’s a family of moves that skip the moment entirely: something shifted between them, an unspoken understanding passed between them, words left unsaid between them, she said more than words ever could. Subtext lives in what a character declines to say. These lines just announce that it happened, like a stage direction reading “a joke occurs” instead of writing the joke.
Same cast, one mouth
Mara and her brother Colin are clearing out their father’s garage after his funeral.
“Are you okay?” Mara asked, her voice laced with quiet concern.
“I’m fine,” Colin said. “I just miss him so much, and being in this garage brings back so many memories.”
“I understand how you feel,” Mara said gently. “We’ll get through this together.”
Something shifted between them, and for a moment, no more words were needed.
Both are fluent about their own grief, and both sound like every grieving sibling this kind of draft has ever produced. Here’s a version where they don’t.
“You want the drill or not,” Colin said.
“I don’t want anything, I’m just, I keep picking things up and putting them back down. I feel like I’m supposed to be crying and I’m cataloging his socket wrenches.”
“Take the drill, Ren.”
“Renata. He hasn’t called me Ren since I was nine.”
Colin didn’t answer that. He wound the cord around his fist, once, twice, and set it in the box marked GARAGE, in handwriting twenty years old.
Colin answers a feeling with a task. Renata keeps talking past where she meant to stop. Neither says grief.
Different register, same failure. Priya has just told Walt his contract isn’t renewing.
“Are you upset with me?” Priya asked. “I understand how you feel. We value you so much.” An unspoken understanding passed between them.
Rewritten:
“I need you to say something, Walt.”
“What do you want me to say.”
“Anything. Yell at me.”
“I’ve got the Henderson invoices to finish.” He didn’t look up.
“That’s not.” She stopped. “Fine. Do the invoices.”
He did the invoices. He did not do them well.
Why the model defaults there
“It’s AI” explains nothing, so it’s worth naming the mechanism. Models learn dialogue overwhelmingly from published, edited fiction: speech a human editor already smoothed into its most legible form. Real transcribed speech is full of false starts and sentences that never resolve, and it reads badly on the page unedited, so almost nobody publishes it that way, which means the clean, resolved version is what “good dialogue” looks like in nearly everything the model has read. Holding two or three distinct, consistent idiolects across a scene is also just harder than generating one fluent voice and adjusting the temperature word by word. The model isn’t lazy. It’s doing the easiest thing, and the easiest thing happens to sound like competent prose when you read any one line alone.
The fix isn’t a global dial
My first instinct was that the fix was mechanical: add contractions, throw in interruptions, let people trail off. I tried roughly that on a draft last year, and it made the scene worse. I’d asked for more interruption and gotten it evenly, so four people trailed off in the same rhythm. One tic for another. The interruption wasn’t wrong. Applying it globally was. The fix lives at the level of the character, not the scene: this one interrupts, that one goes quiet, this one answers a different question than the one asked. Sameness isn’t a feature you bolt on. It’s a decision about who each person is, made once per character and held.
What cataloging your own slop looks like
I ran a scene of my own through the Slop Checker a few months back and it flagged a line I’d written without thinking twice: her voice laced with something between anger and relief. I hadn’t consciously chosen that. It’s just where my hand went, the path of least resistance for “she’s feeling two things at once.” I cut it, wrote a real line of dialogue to carry the ambivalence, and felt pleased with myself for about four minutes. Then I noticed the phrase the tool caught wasn’t the real problem. Both characters were still building the identical sentence: subject, verb, one complete thought, resolved by the period. The Slop Checker doesn’t catch that, since sentence-level sameness isn’t a banned phrase, it’s a structural habit. Fixing the flagged phrase was the easy ten percent.
Practical fixes
A few things help, in editing and in how you set up generation. Give each character two or three words or habits the others never use: one says “look” before disagreeing, another drops contractions when nervous, a third answers with a question. Decide, per character, who answers directly and who deflects, and hold that across the manuscript. Let someone interrupt or trail off, and resist finishing the thought for them in narration. If you catch yourself writing an unspoken understanding passed between them, ask what was understood, then write that moment, or cut the line and trust the gap. And the oldest trick still works: cover the tags and read it back. Can’t tell who’s talking without the name? You have one character wearing two name tags.
Where the tools actually help
The Slop Checker, free, no account needed, catches the phrase level: paste a scene and it flags voice-laced-with-X constructions and emotional-beat clichés against the corpus. It won’t catch structural sameness, since that’s a pattern across sentences, not a phrase, and stays an editing judgment.
The generation-side lever is closer to the cause. Voiceprint, our style-profile system, has 33 controls for pacing, diction, tone, and more, and you can save more than one. Writing multi-POV, a separate Voiceprint per major character instead of one global voice for the book is the actual mechanical fix at the drafting stage. It’s partial: it shapes the generation pass, it doesn’t replace the cover-the-tags read afterward. Story Rules can carry a character’s habits into every generation, with the same conditional logic that lets a rule fire only when two named characters share a scene, and Story Rules already support banned words as an instruction type, so pairing the two lets you keep “voice laced with” out of a scene specifically while your leads are in the room.
Still reaching for it
I still reach for “voice laced with” about once a week. It’s a comfortable phrase. It fits in the hand. The difference lately is I notice it before I finish the sentence, which isn’t the same as never writing it, just faster to catch.