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.

Shipped, Windows installer and web app

themes, three light and five dark
8
delivery targets from one UI codebase
2

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.

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.

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.

Built with

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