Live Caption with Intention
Weave automates the Caption with Intention design system: a microphone streams into captions that carry the speaker in color, the moment in motion, and the voice in typography — entirely offline.
A subtitle keeps the words and discards the rest. Caption with Intention, from the Chicago Hearing Society, restores three: speaker as color, timing as motion, delivery as typography — derived live, from a microphone.
Color is who, the cue is when, size is how loud.
| Field | Holds |
|---|---|
words[] — what was said | text · start · end — the word, and the moment it begins and ends |
words[] — who said it | the speaker, and whether that is settled or still a guess |
words[] — how it was said | loudness and pitch, each placed within that speaker’s own range |
speakers | S1 … S12, each given a color from the palette below |
schema.py.
start and end are the pair everything else is
keyed to: prosody, the motion clock, the read-ahead floor and the haptic
cue all read them, which is why a recognizer that cannot supply them is
no use here.
| The palette, by order of first appearance | |||
|---|---|---|---|
| S1 | #E5E517 | S4 | #E517E5 |
| S2 | #17E517 | S5 | #E51717 |
| S3 | #17E5E5 | S6 | #E58017 |
| S7+ | twelve supporting hues | — | unknown |
Eight kinds of event travel the stream; these are the four a renderer acts on. A corrected word comes back under the same id, so it replaces the old one rather than adding to it.
| Event | Carries |
|---|---|
word | text, span, speaker, loudness, pitch, and the salience flags the haptics read |
verification | a finished phrase, re-recognized and corrected word by word |
sound | a non-speech sound — laughter, applause, music, the room itself |
level | input level, noise floor, gain, and the bearing when an array supplies one |
The design system needs the line on screen before it is spoken, and a live recognizer cannot produce text early. So captions present from a clock running behind the acoustic one.
| Rule | Figure | Explanation |
|---|---|---|
| The playhead trails the acoustic clock | 1.75 s | The color turn runs 1.75 s behind the voice, so recognized words are on screen well before they are colored. |
| Read-ahead is a per-word floor | 420 ms | Words arrive in bursts, so a fixed delay guarantees nothing. Every word gets at least 420 ms on screen before its color turns. |
| The turn is never gated on the speaker | — | Text arrives long before a durable speaker decision, so the turn happens on time in whatever color is known. |
| Gain is applied to the recognizer's copy only | — | Loudness is measured from the original signal. Amplify it first and a whisper and a shout end up the same size. |
The 80 ms is split evenly across the letters, so the color sweeps from the first to the last at a constant rate. The last letter turns exactly 80 ms after the first, however long the word is.
Color turn. Read-ahead ink until the spoken onset, then wiped across the letters rather than switched.
Half the pop is given to every word outright and the other half is earned by how much that word swelled. A word with no growth still moves 1.038×, and the most emphatic one reaches the full 1.076×.
Pop and lift. One animation. Every word rises 0.16 em and every word grows, in proportion to its crest.
The fraction places this word’s level between that speaker’s quiet and loud ends — 0 at one, 1 at the other — with emphasis added on top and clip holding the result inside them. PWL turns that into how much to grow: nothing at all below 0.21, and at most 0.425 above it.
Crest. A real font-size, not a transform — and the row does not move. Upward only, to 1.425×.
Weight starts at the neutral 400 and is moved by two pushes that add: where the pitch sits, and how loud this word is right now. Pitch alone cannot tell a habitually high voice from one that is shouting, which is why it is split in two.
r reduced: the pull toward Light weakens as the word gets louder, and vanishes entirely at full p. A pressed voice is not an airy oneWeight. The speaker’s habitual pitch sets where a word starts — the lower the voice, the heavier — this word’s own pitch moves it from there, and a loud or pressed word climbs further.
Seven tenths of the width comes from the word’s own pitch and three tenths from breathiness: the lower the pitch the wider, the breathier the voice the narrower. It never leaves 82 to 124 percent.
Width. Driven by the word’s own pitch, with a breathiness reading blended in. The quietest of the eight channels.
A constant. The only decision this channel makes is whether it applies at all, and that depends on silence sitting on both sides of the word.
Hold lift. Silence either side lifts a word, and it lands on its turn. Isolation, not sustain.
The same 80 ms as the color turn, split across syllable groups instead of letters. A two-syllable word therefore takes two steps where a six-letter word would take six.
Character wave. One syllable at a time — se+en, but+ton. Never one letter.
All of it, on one line. Every channel together, on the studio’s own clocks — a swelling word overlaps its neighbors rather than shoving them along.