Skip to content

Text to speech

Text to speech reads viewer messages out on your stream. Pyre sends the audio to a browser source you add once, and it is on by default: tips, cheers, Super Chats, resubs and channel point redemptions you have mapped all get read.

Every voice your channel can reach is available, and out of the box every one of them is free to your viewers. No voice is held back until you decide to hold it back. A fresh channel has a single base tier priced at zero, every voice sits in it, and any tip, cheer or resub reads in whichever voice the viewer asks for.

Tiers are the optional layer on top. If you want premium voices to cost something, you can put them behind a tip amount, a bits amount, a channel point reward or Pyre points. Most channels never need to.

A viewer does not type a command to be read out by tipping or cheering. Their message is the message. What they can do is name a voice, by starting their message with the voice’s tag and a colon:

moist: chat I have made a terrible mistake

The tag is always a single word, and matching is case insensitive on both sides. ASMRGUY:, AsmrGuy: and asmrguy: are the same voice. A colon that is not a voice tag, in a URL or in “note: whatever”, is left alone and the whole message is read.

If the named voice is out of reach, the message is never dropped. It reads in your default voice instead.

!tts <your message>, with !say as an alias, is the one route that spends Pyre loyalty points. It works on every platform the bot reads, because it is an ordinary chat command rather than a platform payment.

It is off until you price it. A tier whose Pyre points price is 0 is not purchasable, so on a fresh channel !tts does nothing. That is deliberate: every other trigger costs the viewer real money or a real redemption, and a free chat command that makes your stream talk is a spam surface. Set a Pyre points price on a tier and !tts starts working for the voices in it.

Two things bound it. Spoken text is cut at 300 characters, and each viewer waits out a cooldown between requests, 30 seconds by default.

A viewer who types a bare !tts with no message gets the usage line back, and when you have a public handle it now carries a link to your voices page, so someone learning the command can see the voices they are allowed to ask for. The link is only on that usage reply, never on a request that actually speaks, so a working !tts never spams your page into chat.

The page is split in two, and the split is the first thing to know when a control is not where you remember leaving it.

Operate is everything you touch while the stream is running. It opens with the two addresses you have to hand out, then the live queue and its controls, then Alert read-outs, then Recent activity, and it ends with Voice tiers & pricing folded down to a summary. The live read comes before the configuration on purpose: what TTS is doing right now outranks what you set up last month.

Voices is the catalogue: Your custom voice first, then the Premium voices table with its search box and the new voices footer.

In the Pyre.Stream dashboard each tab has its own address, so a link can open either one. In the Pyre.Bot portal the tabs are page state rather than an address, so a link always lands on Operate and you switch from there.

  1. Open Text to speech in Pyre.Bot. Use the channel selector at the top of the portal to switch channels. You land on Operate.

  2. Take your Overlay URL from the banner at the top of Operate. It is masked, the way a stream key is: press Reveal to read it and Copy to take it. Add it to your streaming software as a browser source. It plays audio and shows nothing, so it needs no size. The banner says the rest in one line: The browser source that plays your TTS in OBS. Keep it secret. Anyone holding that address can play sound on your stream, and this is a page people screen share.

  3. Or let Pyre add it for you. The Browser source card below carries Add to scene, which creates the source in your managed OBS with “Control audio via OBS” already ticked. A source you paste in by hand does not have that, and OBS then plays the read-out out of your own speakers while the stream stays silent.

  4. Hand out your TTS guide. The second banner holds the public page listing every voice, what it costs and how to ask for it. Copy link takes the address; Panel text gives you a paste ready line for a Twitch panel.

  5. Check the Voice & speech card. Read events aloud is the master switch and starts on. Pick a Default voice, the one used when a viewer does not name a voice or asks for one they have not unlocked.

  6. Set Read format. The default {message} reads just the message. Use {user} for the viewer’s name, for example {user} says {message}.

  7. Set Wait between !tts requests, the per viewer cooldown in seconds. 0 turns it off.

  8. Save, then use Alert read-outs to switch individual event types on and off. New event types default to on.

The live queue sits on Operate, next to Test and controls, and it is where you reach while something is speaking: Test fires a sample event through the real overlay, Skip drops the utterance that is playing, Clear queue drops all of them at once, and a Volume slider re-levels an open browser source immediately and is remembered for the next one.

Under them is the escape hatch, labelled with the symptom rather than the mechanism:

TTS not working? Reload the overlay

A browser source left open across a Pyre deploy is running yesterday’s script and quietly ignores every button above it. That is what this fixes, and it costs you at most whatever was mid sentence.

The Alert read-outs card is where individual event types go on and off: Which of your own events get spoken for free. Paid read-outs viewers buy are set up in the tiers card below.

Under it is a line stating the ceilings plainly rather than leaving you to discover them from a truncated read-out. It looks like this:

300 characters · 30 s max per message · voice: tag picks a voice

Both numbers come from the server rather than from this page, because Pyre can move them. Read the ones your own card prints.

Some voices can act out a direction written in square brackets: a viewer types !tts [whispering] they're right behind you and the voice whispers it. Directions are off until you switch on Let viewers add emotion directions in the Voice & speech card on Operate: Viewers can write directions in square brackets, like [whispering] or [laughing], and voices that support it perform them. Other voices skip them.

How it behaves:

  • A voice that supports directions performs up to 3 per message. Each one can be up to 60 characters, in plain words: [laughing], [quietly, nervous], [shouting]. A direction can also go mid-sentence: I'm fine. [shaky breath] Really.
  • Every other voice gets the message without them, so nobody hears “laughing” read aloud. With the switch off, every voice gets the message without them.
  • Directions are checked by your TTS moderation together with the rest of the message, so a blocked word inside brackets still stops the read.
  • A message that is only directions, sent to a voice that skips them, has nothing to read. It is turned away before anything is charged, and Recent activity says so.

Below that, Operate shows what text to speech actually did, newest first: A read-out quotes the line that was spoken; a message that was turned away says why, in the same words the viewer got. So a viewer telling you “it did not read mine” is a question you can answer from the page rather than from a guess. Rows are kept for 7 days.

The Voices tab holds the catalogue. The Premium voices card lists every voice your channel can reach, with five columns: the Voice name, what Viewers type to pick it, a Preview button, its Tier, and whether it is On.

Voices arrive enabled. A voice you have never touched is on, and a config row only ever exists to record a decision you made. Enable all and Disable all flip the whole list at once, and New voices decides what happens when the provider adds one: Auto-enable new voices is on by default, and turning it off leaves a new voice explicitly disabled until you look at it.

The names in the list are the ones viewers already know. The provider’s API answers with neutral codenames that its own site never adopted, so Pyre translates at the display seam: you see and your viewers type the public name. Where a provider publishes a shorter tag than the name, the tag wins, so “Moist Cr1TiKaL” is moist: and a two word name collapses to one word rather than growing a space.

Where the provider ships a sample clip, the row carries a ▶ Play button that becomes ■ Stop. No sample means no button, which is a voice without a clip, not a broken one.

Viewers can browse and preview your voices themselves at pyre.studio/s/your-handle/voices, grouped by tier so the question they are actually asking, what a given amount gets them, is answered in one place.

The Voice tiers & pricing card is where the optional layer lives. It sits last on Operate and it is folded by default, showing one summary row per tier (its name, how many voices are in it, its payment chips and the state of its reward). Open it and today’s full editor is underneath, unchanged. A channel that never charges for a voice therefore never has to scroll past the machinery for charging.

How viewers pay sits at the top of the open card and reads back every method that is currently on, with Set up or Change to open the wizard.

Every voice belongs to a tier. Tier 1 is the base tier and cannot be removed. Keep its prices at 0 and any tip, cheer or resub uses the base voices at no extra cost. Higher tiers cost more and also grant every lower tier voice, so a viewer who clears tier 3 can use tier 1 and 2 voices as well.

Each tier is its own card carrying four independent prices: a Tip price, a Bits price, a Channel points reward, and a Pyre points price. A tip, cheer or Super Chat unlocks the highest tier its amount clears; a resub unlocks the base tier; a channel point redemption unlocks whichever tier its reward is mapped to; Pyre points buy exactly the tier the named voice sits in.

Add tier, then Save tiers to keep your changes. Reward selections save with the button; creating or unlinking a tier’s own reward saves straight away.

You can create one custom voice of your own, trained from a short clip of you speaking, and it then behaves like any other voice on your channel. Its identity is fixed for you: it appears in the voices list under your handle, and viewers reach it with streamer: message. That is the same word on every channel, so a viewer who knows it anywhere knows it everywhere, and it always means the voice of whoever owns the channel they are watching.

  1. Open the Your custom voice card. It leads the Voices tab.

  2. There is nothing to name. The card states what it will be: your handle is the name, streamer is the tag.

  3. Provide a sample of your voice, either way you like:

    • Upload a clean speech clip: ten to ninety seconds of just you talking, no music or background, up to 10 MB.
    • Record one right there in your browser, reading the script the card gives you.
  4. Read and tick the rights confirmation, then Create. Training takes a few seconds; when it finishes your voice is live on your channel.

The script, and why the card gives you one

Section titled “The script, and why the card gives you one”

The Record tab prints a short paragraph of ordinary stream talk and asks you to read it aloud: Read this aloud. Once or twice through is plenty. It is written to sound like a normal opener (a welcome, a plug for the follow button, what is on the schedule, a thank you) rather than like a test sentence, because the clone copies how you actually talk.

Four tips sit beside it, and they hold for an uploaded clip just as much as for a recorded one: record in a quiet room with a decent mic and no music behind you; speak the way you stream, because the clone copies your pace, energy, accent and even your breathing; keep one consistent tone, since big swings in pitch or volume make the clone unpredictable; and aim for about a minute, because more than three minutes does not help.

A clip you record here also trains with the script’s own text as its transcript, which sharpens the clone’s pronunciation. An uploaded clip is sent without one, because Pyre does not know what you said in it and a wrong transcript is worse than none.

Replacing or removing it. You have one slot. Replace trains a new voice from a new sample and retires the old one; your input is checked before anything is removed, so an unticked box or a clip Pyre cannot read never costs you your working voice. A replace also re-reads your handle, so if you changed it the voice takes the new one. Delete removes the voice entirely. While a custom voice is being replaced, is still training, or has been taken down, a viewer who asks for it is never charged. The request is refused and, on a channel-point or points redeem, refunded, exactly like any voice that is momentarily out of reach.

A moderator you have given access to can Pause, Resume, Skip, Clear queue and Reload the overlay on your TTS. That last one is the classic support action: a browser source that has gone deaf is the commonest “TTS is broken” report, and a mod can now fix it without you.

Volume stays with you, because it is a stored setting rather than a live verb, and so do your voices, your tiers, your settings, your overlay address and the activity log. Those cards are absent on a delegated channel rather than greyed out, and a delegated page shows no tab strip: a mod sees the controls they have and nothing else.