All work

Voice training tool

Euphonia

A voice-feminization training tool. You read a passage, it analyses the recording locally and surfaces pitch, resonance, steadiness and vocal weight as metrics you can track across takes. It ships as a Windows desktop app and a browser version from the same interface code, the browser one audited down to phone width rather than just assumed to work.

Shipped, Windows installer and web app, mobile-audited

themes, three light and five dark
8
narrowest viewport checked by the responsive audit
320px

The problem

Voice training feedback is usually either subjective or locked behind a clinical appointment. The acoustic measures that matter, things like fundamental frequency and formant positions, are well established in the research literature and perfectly computable from a recording.

The design problem is presentation. A number attached to someone's voice reads as a judgement very easily, so every metric had to be framed as a direction to move in rather than a score to be graded against.

How it works

Analysis uses Praat, the standard acoustic phonetics toolkit, driven from Python. The desktop build runs it locally, so recordings never leave the machine.

One React and TypeScript interface serves both targets. The desktop app wraps it in Electron with auto-updating, and the browser build runs the analysis path compiled to WebAssembly.

The dashboard reports pitch, resonance from formants, loudness, steadiness from jitter and shimmer, vocal weight, and a breakdown of where the voice sits relative to a target range. Each card explains what it measures and which direction is which.

Written insights are generated from the metrics directly, with an optional path to richer AI-written commentary for anyone who supplies their own key.

The browser build carries an automated responsive audit across eight viewports down to 320px wide, checking horizontal overflow, chart label legibility, 44px touch targets, and modal reachability with plain assertions rather than screenshots for a human to squint at.

Where it landed

Euphonia is published as a Windows installer with background auto-updates, and as a browser version that needs no install. Recordings and results stay in the user's own folder on desktop.

The mobile claim in the README was wrong once, and got caught by the same audit meant to prove it. The first pass tested empty state only, recordings.json shipped as [] and the theme screenshots captured a blank page, so chart labels rendering at 3px on a populated dashboard went unnoticed. Seeding real takes before auditing surfaced it, the layout and touch targets got fixed, and the README now says exactly what was checked and by what, including that viewport emulation is not a real handset and that microphone capture specifically has not been verified on physical hardware.

What it taught me

Framing is a feature when the data is personal

The same number can read as encouragement or as a verdict depending entirely on the copy around it. Writing every metric card as a compass rather than a grade took longer than computing the metrics did, and it is the part that determines whether the tool is usable at all.

One codebase, two runtimes, one honest limitation

Sharing the interface between Electron and the browser worked well. Being straightforward in the documentation about what is not there, including the unbuilt macOS target and the unsigned installer warning, turned out to be better than papering over it.

An audit of an empty state is not an audit

The first responsive pass ran clean across every viewport, which felt like proof mobile worked. It was proof an empty dashboard fits on a small screen. No seed data meant no populated charts, so 3px chart labels on a real take sat undetected behind a passing test. Fixing it meant seeding real takes before auditing, not just widening the viewport list.

Built with

  • Electron
  • React
  • TypeScript
  • Python
  • Praat
  • WebAssembly