DEV Community

Cover image for Rehearse: a presentation coach that watches your pauses, with no microphone
Emanuele Miranda
Emanuele Miranda

Posted on

Rehearse: a presentation coach that watches your pauses, with no microphone

Presage SmartSpectra SDK Challenge Submission

This is a submission for the Presage SmartSpectra SDK Challenge

What I Built

Rehearse is a desktop app for practising a talk in front of your webcam. It shows the rhythm of your delivery: when you spoke, when you paused, how long you went without a pause, and, experimentally, whether you breathed in your pauses.

It never listens. Most rehearsal tools record your voice; Rehearse uses no microphone and records nothing. It reads the live signals the SmartSpectra SDK computes from the camera on your own computer and turns them into a timeline and a few plain-language notes. You can rehearse in an open-plan office, on a train or at midnight with someone asleep next door, and no audio of you ever exists.

  1. Calibrate (about 20 s): live preview, a checklist that turns green as each signal settles, and the SDK's positioning hints ("Make your upper chest visible").
  2. Rehearse: a big timer with an optional target length, a live Speaking / Pause 1.8 s chip, a live breathing trace, and an optional quiet nudge after 45 s of speech without a pause.
  3. Review: notes such as "Your longest stretch without a pause was 52 s (from 1:10). Try a short pause after each key point there", key numbers, and a timeline of speaking blocks, pauses, chest movement and blinks.
  4. Compare: History tracks runs of the same talk ("since your previous run: longest stretch 52 s → 25 s").
  5. Check how well it reads you: an 85-second guided check (read aloud, pause and breathe in, pause without breathing in) scores each signal for you, in your light: "Reliable for you", "Use with care" or "Not reliable in these conditions".

One button deletes everything.

Demo

Demo video (63 s, live signals, camera preview blurred on purpose): https://github.com/emamira02/rehearse/raw/main/docs/demo.webm

What the video shows, all with live SmartSpectra signals on my laptop webcam: consent → calibration going green → a 30-second rehearsal with the live Speaking chip and the breathing trace following me → the report and timeline → Privacy & data, including the network-block counter and Delete all my data. (Honest note: my pauses in that take were short, around a second, which is below what the lip-based pause detector reliably catches, so the report shows one long stretch. The accuracy numbers below come from a scripted check with 3-4 s pauses.)

Code

GitHub logo emamira02 / rehearse

Camera-only presentation rehearsal coach on the Presage SmartSpectra SDK: no microphone, no recording, everything local

Rehearse

Practise a talk in front of your webcam. Rehearse shows when you spoke, when you paused, and how long you went without a pause. It uses no microphone, records nothing, and sends nothing anywhere.

Demo video (63 s, live SmartSpectra signals, camera preview blurred on purpose): docs/demo.webm

Built with the Presage SmartSpectra SDK for the DEV Presage SmartSpectra SDK Challenge.

Most rehearsal tools listen to your voice. Rehearse watches your delivery instead: the rhythm of speech and silence and (experimentally) whether you breathe in your pauses rather than in the middle of a sentence. That makes it usable in an open-plan office, on a train or late at night, and it means no audio of you ever exists.

Rehearsal Report
Rehearsal screen: timer, live Speaking/Pause chip and live signals Report timeline: speaking blocks, pauses, chest movement, pulse reading, blinks
History Accuracy check
History with trends across runs of the same talk Accuracy check results per signal

Screenshots taken in simulated mode (no camera); the demo video shows the app with live signals.

What it does

  1. Calibrate (about 20 s). The camera…

https://github.com/emamira02/rehearse

Electron + @smartspectra/node-sdk 3.5.0, plain JavaScript, no UI framework. The README has setup instructions, the full consent and data-handling text, the accuracy numbers below and how to reproduce them, and a simulated mode (npm run simulate) that runs the whole app without a camera or an API key.

How It Responds to Human Signals

SmartSpectra signal What Rehearse does with it
face.landmarks Reduced on arrival to the inner-lip opening; lip movement per second is the main speaking signal (live chip, pauses, longest stretch). The points are discarded.
face.talking Combined with lip movement: either one means speaking
breathing.upperTrace Live breathing sparkline; experimental "breath taken in this pause"
face.blinking Blinks per minute, shown without interpretation
cardio.pulseRate (opt-in) Start-vs-end pulse reading, labelled information only
Validation status Calibration checklist, positioning hints, face-tracking warnings

What testing taught me. I built an in-app accuracy check and ran it live, because a coach that is confidently wrong is worse than no coach. Three findings changed the app:

  • face.talking alone caught only 10-12% of my read-aloud frames in three runs. So Rehearse reads lip movement from the SDK's face landmarks and combines both. The threshold was set on the first half of the check and confirmed on the second: on the 8 scripted pauses, Rehearse found 8 of 8 (2 extra pauses while reading; 77% of reading frames marked as speech, 87% of quiet frames as quiet).
  • The SDK pauses face tracking when the upper chest is out of view, and stops if the frame rate stays under 25 fps. Calibration now waits for steady positioning and live face tracking, the app warns when tracking pauses, and a rehearsal cut short by the SDK still produces a report that says so.
  • Breath in a pause was clearly separable in a run with a strong chest signal and not in another, so it ships as experimental. Head direction (looking down at notes) agreed only 50-89% of the time and is not used; smiles were reliable but the extra expression model cost frame rate, so they are not used either.

Integration details I cared about.

  • The API key never reaches page JavaScript. My preload has the same bridge contract as the SDK's own preload (a unit test checks it against the installed SDK) but adds the key to the SDK's configure message itself. The main process reads the key from an environment variable and removes it from its environment.
  • Data minimisation. Rehearse asks only for the chest trace, talking, blinking and landmarks (pulse only if you switch it on): no breathing rate, expressions or other cardio metrics.
  • Timing. Measurements carry frame timestamps and the signals need seconds to settle, so Rehearse calibrates before the timer starts, slices the rehearsal by frame timestamp and keeps measuring 2.5 s after Finish.
  • No credits needed to develop. A simulated speaker (speech breathing, word gaps, lip movement, blinks) with the start-up delays I measured on the real SDK emits the same events as the live source, and end-to-end tests drive the real Electron app through every screen in simulated mode.

Prize Categories

Best Thoughtful Real-World Use (and Most Creative or Delightful Use).

The need. Pacing is what people can't hear in themselves: rushing, never pausing, running out of air mid-sentence. Recording yourself helps, but people avoid it, and you can't record audio in an office, a library or a shared flat. Rehearse is for students before a thesis defence, people before a pitch or a quarterly update, and anyone presenting in a second language.

Designed for those people.

  • No microphone and no recording, so it works anywhere and nothing embarrassing exists afterwards.
  • Coaching in presenting terms (pauses, stretches), never in health terms.
  • Quiet during the talk: one chip, an optional nudge, live signals you can hide; the detail comes after.
  • Progress across runs of the same talk, because rehearsal is about the third run, not the first.
  • It tells you how much to trust it: the in-app check rates each signal for you instead of assuming it works.

What makes it unexpected: a speaking coach that never listens, and that measures its own accuracy before giving advice.

Consent and Data Handling

  • Consent. A consent screen on first launch explains what the camera is used for and what is computed, stored and sent; nothing starts until the person in front of the camera ticks "I am the person in front of the camera and I agree". The camera is on only during calibration, a rehearsal or the check, with a live preview, a Camera on label and the camera light, and turns off when you finish, cancel or close the window. Rehearse never requests the microphone (video-only permission, everything else denied). It is for practising on yourself, never for measuring someone else.
  • Processing. Frames go in memory to the SmartSpectra SDK on your computer and are never stored. Face landmarks are reduced to three numbers per frame on arrival and discarded.
  • Storage. Each rehearsal is a JSON file in the app's user-data folder: title, date, summary numbers, the speaking/pause timeline, a chest trace at 10 samples per second, blink times, pulse readings if enabled. Settings hold the consent record and the summary of your last check. No images, video, audio, landmarks or API key.
  • Sharing. No backend, no accounts, no analytics. The app window is blocked from the network (CSP connect-src 'none' plus a main-process filter that cancels every web request; the Privacy page shows the counter). In live mode the SDK contacts Presage to validate the API key.
  • SDK telemetry. On by default in the SDK; Rehearse turns it off (enableTelemetry: false).
  • AI services. None in Rehearse: the notes come from fixed rules. Presage documents that the SDK sends periodic vitals snapshots (pulse, HRV, breathing rate; never images) to its LLM insight service when breathing and cardio metrics are requested. I measured it: with the SDK's full breathing set, one insight packet arrived within ~50 s; with Rehearse's chest-only request, none arrived in three live runs (~8 min). The optional pulse reading adds cardio data, so the toggle (off by default) warns that snapshots are then expected. Rehearse never requests insights and discards any it receives.
  • Retention and deletion. Kept until you delete: one rehearsal from its report or History, or everything (rehearsals, consent, settings, check results, browser storage) with Delete all my data.
  • Not medical. Rehearse gives feedback on presenting. It does not diagnose, treat or assess health, makes no medical decisions, and the pulse reading is information only.

Top comments (0)