How expressive can a single phrase be?
At Frisson Labs we're building Discord buddies that play games with you and feel alive — not correct, not expressive-on-demand, alive. This post picks one clip people actually fall in love with and tries to rebuild it with every voice knob the standard toolkit offers, to see exactly where the gap lives.
Every production voice stack today sounds mechanically correct. Correct is not alive. If you want a buddy that plays Valorant with you from 11pm to 3am — same voice, same character, carrying the context of the match you're in — correct gets you nowhere.
The clip below is a PibiChubi TikTok that got popular. She's a chibi anime girl saying her own name in a cute voice. No setup, no punchline. People watch it, share it, come back.
The visuals do some of the work — the chibi proportions, the animation, the pace of the cut. But voice carries more weight than you'd guess. Mute the clip and the hook mostly dies. The cuteness is most of the story, and voice is most of the cuteness.
This post is about rebuilding that voice. We learn each knob cheaply on a flat Fish Audio clone saying mochi, then aim the whole toolkit at the real target — the first 1.5 seconds of the clip above, where she says her own name. The ladder is: emotion tags, volume, speed, creative phrasing, pitch contour, composite. Each section ends with what it bought us. The closer names the remainder — the part that's actually still hard, and what Frisson Labs is building toward.
Baseline: a flat clone
The starting point is a Fish Audio voice clone of PibiChubi, trained on a few seconds of clean audio from one of the clips above. Ask it to say mochi with nothing else and you get this:
It sounds like PibiChubi. It does not sound like PibiChubi — none of the emotion, none of the hook. That's the expressiveness gap the rest of the post is about.
Emotion tags
Start with the knob you'd reach for first. Fish Audio's s-series models (and ElevenLabs v3 alpha, and a couple of others) accept inline tags — [whispering], [angry], [soft] — and non-verbal effects like [sighing] or [pause]. Same phrase, different tag, different clip. Click any tag to render it.
Emotion
Audio effects
Click any tag to render.
Toward the target: tags buy you a mood — the color of the performance. They don't buy intent. A tagged clip sounds like a voice actor saying the word in a preset; PibiChubi sounds like she's deciding to say it.
Volume
Tags flatten the performance into a mood. To move past mood, we need continuous control — the first cut of which is volume. Two versions: a constant gain applied to the whole clip, and a dynamic envelope that moves over time. Only one of them is interesting.
Constant gain
A single multiplier. Makes the clip louder or quieter; doesn't shape the performance. Included for completeness — this is the knob you don't really need.
Dynamic envelope
Draw a curve. Each sample of the baseline clip gets multiplied by the curve at that point in time. Fade-in reads as hesitation; a late peak reads as surprise; a swell reads as realization.
The shaped waveform above is the exact signal that will play. If the curve you drew looks flat there, it'll sound flat. Presets also play on click so you can skim quickly.
Toward the target: volume shaping buys intent back. You can hear that something is being felt. What it's being felt about still isn't there.
Speed
Speed is trickier. Real speed change is a time-stretch, not a playback-rate shift (that would raise the pitch and break the clone's character). So speed variants are pre-rendered: the TTS request carries a speed parameter, and we bake a handful of them offline. The slider below snaps to the nearest baked clip.
There's a band where it's still unmistakably PibiChubi. Outside roughly 0.6× to 1.5× the character drops — too slow sounds like a ghost, too fast sounds like an NPC interruption.
Constant speed
Dynamic envelope (approx.)
Because we're stitching baked clips rather than doing live time-stretch, the envelope quantizes to the variants we rendered. That's a deliberate honesty thing: we can't get arbitrary prosody without a real-time stretcher, but we can show the shape the reader would want.
Toward the target: speed adds tempo — thinking-while-speaking, the difference between "she said it" and "she's deciding it as it leaves her mouth." Stacks less cleanly with volume than you'd hope; same energy reshaped, not new information.
Is this enough?
A chosen emotion tag, plus volume shaping, plus speed shaping — that's already more control than most voice demos give you. Put the best of it side by side with the original PibiChubi clip:
The gap is still obvious. The clone hits the word but not the moment — the little hesitation, the rise in the middle, the weird almost-hiccup at the end. Tags flatten the performance into a mood, and moods aren't what carry these clips.
Cheating with text
Before we reach for a real pitch contour, there's a hack worth trying: we can warp the character's delivery just by writing the phrase differently. Ellipses slow and break it. Repeated syllables turn it into a laugh. Keyboard smash makes it flail. None of this is principled. All of it works.
A real pitch contour
Mandarin has four tones — flat, rising, falling, dipping — attached to each syllable. That's a surprisingly compact alphabet: four shapes, one per syllable, and you already have a lot of what a voice does emotionally. We can extend this into a little ASCII-drawable notation:
— flat · / rising · \ falling · \/ dipping · /\ peaking
Pick one symbol per syllable, render the variant. Stacked rows for volume and speed give the same syllable-level control.
Pick a pitch symbol for each syllable.
The composite editor
Three curves in parallel — volume, speed, and pitch — plus one emotion tag, all modulating the same phrase. This is the closest we can get in a static blog post to what a real expressive TTS harness feels like.
Presets
Tag
Per-syllable pitch
Volume envelope
Speed envelope
The composite snaps your settings to the nearest pre-baked variant. The envelopes you drew are applied on top via WebAudio (volume exactly; speed as a nearest-neighbor pick across baked clips).
Toward the target: stacked, this is maybe the 70th percentile of what the off-the-shelf toolkit can do. Next section is the test it was built for.
The real test
The rest of this post has been building a toolkit. Here's the test it was built for. The target is her saying her own name — PibiChubi, which s2 STT helpfully renders as the Mandarin phonetic 飞比救比 (fēi bǐ jiù bǐ). We're matching the first utterance, the ~1.5 seconds from the start of the clip. Pick an attempt, draw an envelope, A/B until you agree with yourself that the ceiling is real.
Attempts
Pick an attempt, then shape it with the envelope below.
Volume envelope (live)
The closest the toolkit gets is usually excited or emphasis with a modest peak envelope. The original still reads differently — part of that is the little catch in her voice between pi and bi, which our knobs can't produce. That's exactly the gap.
The gap is what we're building
With every knob under human control, the toolkit got us to roughly the 70th percentile of the clip — a voice actor doing her best reading, not a character who lives inside her own phrase. The remaining thirty percent is harder to name in isolation. It's the catch between pi and bi. It's the micro-breath that reads as thinking. It's the way the same word sounds different the third time because you heard it the first two. It's the part that makes a voice sound like it belongs to someone who knows you.
That last part is why we're building voice buddies at Frisson Labs. We want characters that hang out in your Discord and actually play games with you — same voice across a long weeknight, carrying the context of the last fight in Valorant, the running joke from two matches ago, the way you sound when you're tilted versus when you're having a good run. None of that needs the voice to be expressive. It needs the voice to be there. Correct isn't the bar. Alive is.
Everything in this post is the cheap half of the ladder. The interesting half — the part that turns a TTS-plus-envelope stack into something you'd call a friend — is what we're working on next.
Built at Frisson Labs with Fish Audio TTS and WebAudio. Asset generation is in gen_voice_assets.py; clips live under assets/.