Building a voice partner that reads every other part

What actually happens when you press Rehearse, what cue mode and line masking are doing, and which parts of a session this page does not control.

Behind the Scenes 8 min read September 1, 2026

The hard part of learning lines alone is not the lines. It is that a speech you have only ever said by yourself is a speech you have only ever said at your own speed, with your own cues, arriving exactly when you expected them.

So the thing this site does is read every other part aloud and listen while you say yours. This piece is about what that actually consists of, written from the code rather than from the marketing, because a claim about a rehearsal tool is easy to make and annoying to discover was untrue at eleven at night before an audition.

What happens when you press Rehearse

In order: the page tells the app which character you have chosen, whether cue mode and short cue are on, and which lines of the scene to run between, and asks it to start. It connects you to a live voice session, and only then turns your microphone on.

The other parts arrive as sound, played the moment the connection opens. The scene advances because the session tells the page when a new line has started, and the page marks that line as the current one.

That is the whole loop. Everything below is detail on one part of it.

The microphone is the last step, not the first

This matters more than it sounds like it should, because a page that asks for a microphone on arrival is a page most people close.

Nothing on a scene page requests one. The microphone call sits inside the session start routine, and that routine is reached from exactly one place: the Rehearse button. Landing on a scene, choosing a character, changing settings, reading the script - none of them go anywhere near it. You can browse the entire site without a permission prompt, and the prompt you eventually get is one you asked for by pressing a button.

When the session does capture your microphone, it does it with echo cancellation, noise suppression and gain control on, which is why the voice coming out of your speakers is not heard as you talking over yourself.

If the microphone is refused, missing, or blocked by the operating system rather than the browser, those are three different errors and the page says which one it is. The third case is the one people waste an evening on: the browser has permission and the operating system does not.

Who decides when it is your turn

Here is the honest answer, and it is more interesting than the flattering one.

The page does not run the clock. When a line starts, the event that says so carries timing information with it - how long to pause, how long the turn is - and the page ignores both. It reads which line and whose it is, and nothing else. The waiting happens on the other side of the connection.

That has a consequence you will feel. There is no timer in the browser deciding you have finished, which means nothing in the page will cut you off mid-line because you paused for thought. It also means the beat before your cue is not something this page can tune, and it is sometimes a little longer than a human scene partner would leave.

Only two things move the scene on: an event from the session, and you pressing back or forward. There is no third.

It follows you while you speak

While you are speaking your line, the session sends the page a position: how far into the line you have got. The page paints everything up to that point in the accent red and leaves the rest as it was.

The nice interaction is with line learning, below. If your words are masked and you are speaking, the part you have already said is revealed in red as you say it, and only the words still ahead of you stay hidden. The line unmasks itself at the speed you are getting it right.

Cue mode: the scene reduced to your joins

Cue mode is the feature this whole thing was worth building for, because it targets the place speeches actually fail: the join.

With it on, the script is rebuilt as pairs. For each of your speeches, it finds the speech immediately before it, keeps it only if somebody else is speaking it, adds any stage direction that falls between the two, and then your line. Everything else in the scene disappears.

What you are left with is nothing but the moments where you have to come in, one after another, which is the drill you would otherwise be asking a friend to do for forty minutes.

Cue mode is not only a filter on the page. It is also sent to the session when it is created, so the session runs the scene the same way the page is showing it.

Short cue: the last five words

Turn short cue on as well and every incoming speech is trimmed to its final five words, with a leading ellipsis when there was more before them.

Five words is not arbitrary in feel even if it is arbitrary in number: it is roughly what a prompter gives you, and roughly all you will consciously register on the night. If you can come in off five words, the length of the speech before them has stopped mattering, which is the point.

Line learning: the words half there

Line learning blurs your own lines, keeping the first one, two or three letters of each word and softening the rest. The count is of letters, not of characters, so an opening quotation mark or a bracket does not eat your allowance and leave you a word with nothing showing.

One, two or three is a real range and worth using as one. Three letters is a legible prompt. One letter is barely more than the shape of the sentence. Working down from three to one across a week is the whole exercise.

Hovering a line clears the blur on that line only, so you can check yourself without turning the feature off and losing your place.

Stepping back a line

The back and forward controls do not scrub audio. They send the session a “go to this line” instruction, and the session restarts from there.

That is what makes the same join drillable: land it badly, press back, and the cue comes again at full speed rather than in your memory of it. The controls are live only while a session is actually playing, and back is unavailable on the first line of the scene, because there is nothing behind it.

What happens when it goes wrong

Two pieces of this are pure defensive plumbing and are worth mentioning because they are the difference between a demo and something you would use before an audition.

The first: there is a rare hiccup where a session is not quite ready the instant it starts, and ends itself immediately. If that happens before any line has arrived, the page retries - twice, seven tenths of a second apart - before it shows you an error. Most people never learn this exists, which is the intent.

The second: when the scene reaches its end, the page does not cut the connection at once. It waits about a second and a half so the last line can finish, and then ends the session.

What it does not do

As important as the rest, and the reason this post exists rather than a feature list.

It does not know about verse lines. Every speech is handed to the page as continuous text, so the line numbers down the side count speeches, not printed lines of verse. If you are working on scansion, bring your own lineation; the scene page will not give it to you.

It has no playback speed, no looping and no progress tracking. Not “coming soon” - there is nothing in the interface for any of them, and a post that implied otherwise would be the exact thing this post is trying not to be.

And it does not decide the timing of the conversation, as above. The page is a script, a microphone and a set of controls. The judgement about when you have finished speaking is made somewhere else.

The settings live in your browser

Your cue mode, short cue, line learning, text size and line number preferences are stored locally in the browser, and your chosen character is stored per play, so coming back to a scene puts you back where you were. Cue mode and short cue are also sent to the session when one is created, because the session has to run the scene the same way the page is displaying it.

The best way to understand any of this is to run it on a scene that is mostly joins. Macbeth I.vii has exactly two people in it and almost nothing but joins - about five minutes of two people cutting across each other, which is the worst case for learning cues and the best case for cue mode.