I Wanted to Hear Every Telnyx Voice in One Scene, So I Built a Multi-Character Narrator

2026年8月5日1 次浏览来源:Dev.to阅读原文

Telnyx ships over 700 Ultra voices across 36 languages with sub-100ms time-to-first-byte.

The voices are not the problem.

Hearing them is.

The docs list three.

The Voices API returns 4,000+ across every provider.

Voice pickers play a fixed sample sentence per voice.

None of that tells you how a voice handles emotion, pacing, or character inside a real scene.

So I built a small app that lets you do exactly that.

You write a short scene with a few characters, assign each character a different Telnyx Ultra voice and an SSML emotion, and render the whole thing into one MP3.

Every voice speaks in character, in context, in one continuous audio file.

The Telnyx code example is: https://github.com/team-telnyx/telnyx-code-examples/tree/main/multi-character-narrator-python The Use Case Voice pickers exist.

They play a fixed sample sentence per voice.

What they do not do is let you hear a voice inside a real scene — a tense argument, a calm narrator, a panicked character, a reassuring guide — because a single sample sentence does not tell you how a voice handles emotion, pacing, or character.

This example solves that.

You write a short scene with a few characters.

Each character gets a different Telnyx Ultra voice.

Each character gets an SSML emotion.

You hit render.

The app fans out parallel TTS calls, stitches the per-line audio in script order, and plays you one continuous MP3 with every voice speaking in character.

The default scene is the Ides of March from Julius Caesar.

Five characters, ten lines, five distinct voices, five different emotions: Cassius — determined, plotting the assassination Caesar — surprised, realizing the betrayal Brutus — apologetic, justifying the act Mark Antony — angry, mourning the fallen leader Narrator — calm, setting the scene One render, one MP3, every voice in context.

That is the demo.

The Eight Curated Ultra Voices The app ships with eight pre-built Telnyx Ultra voices curated for the most common use cases.

Each one is a real Telnyx voice with a UUID voice ID that works on the REST endpoint.

Voice Gender Language Best Use Case Sound Profile Asher Male en Voice Assistants & Media Smooth, dynamic, podcaster-style tone Callie Female en Coaching & Onboarding High energy, encouraging, friendly tone Clara Female en-US General Purpose IVR/AI Clear, standard US accent, versatile pacing Howard Male en-US Conversational Agents Deep, reassuring, highly trustworthy Allie Female en-US Casual & Interactive AI Conversational flow, natural pauses Jasper Male en-GB Finance & Healthcare Calm, authoritative, precise delivery Skyler Neutral en Modern Brand Voice Casual, tech-forward, friendly vibe Arvin Male en Navigation & Directives Steady, clear cadence for detailed guidance Pick any of the eight for any character.

Click Preview to hear the voice with the selected emotion before rendering the whole scene.

Twenty Ultra SSML Emotions Ultra supports inline SSML emotion tags placed before the text: The app exposes all twenty Ultra SSML emotions as a per-character dropdown.

Primary emotions: angry, excited, content, sad, scared.

Additional: happy, enthusiastic, curious, calm, grateful, affectionate, sarcastic, surprised, confident, hesitant, apologetic, determined, frustrated, disappointed.

Each character in the default Julius Caesar scene is auto-assigned an emotion that fits the role.

Cassius is determined.

Caesar is surprised.

Brutus is apologetic.

Mark Antony is angry.

The Narrator is calm.

Same voice, different emotion, different delivery — all from one inline SSML tag per line.

How It Was Made The app is a single Flask file with an inline browser UI.

No phone number, no webhook, no Cloud Storage, no database.

One env var: .

The pipeline Why REST, not WebSocket Ultra is REST-only on the public WebSocket.

A 403 on is intentional.

The app uses with so it can measure true time-to-first-byte per line.

Base64 mode would hide the real latency.

Why UUIDs, not display names Ultra voice IDs are UUIDs in the format, not short

分享
Baike.dev

baike.dev helps you discover great languages, frameworks, databases, DevOps and cloud-native tools.

Quick links

About

Contribute

Found a great developer tool? Share it with the community.

Submit a tool
© 2026 baike.dev Developer EncyclopediaUpdated daily · Discover great developer tools