Docs
Browse documentation

Docs / Speech

Transcribe and dictate

Transcribe audio files, dictate live from the microphone, and serve the audio API with Phonon-1.

Install

shell
pip install fermion-research
pip install mlx mlx-audio mlx-lm soundfile scipy zstandard

Speech runs on the MLX audio stack, installed separately from the CLI. The second line is needed once, on Apple silicon; if anything is missing, fermion transcribe prints the exact command. On NVIDIA GPUs, use the Docker image from the GitHub repository instead.

File transcription

shell
fermion transcribe meeting.wav
fermion transcribe clip.flac --json

transcribe turns an audio file into a line of text. It reads anything libsndfile decodes: wav, flac, ogg, and aiff at any sample rate or channel count, resampled to 16 kHz mono. mp3 and m4a are refused with the exact ffmpeg conversion command to run first.

Standard output carries only the transcript, so fermion transcribe clip.wav > out.txt writes exactly the words. Progress, warnings, and timings go to standard error. --json returns a JSON object with the text, the model id, and the decode time. There are no sampler flags: transcription decodes greedily, and punctuation and capitalization come from the model itself.

Live dictation

shell
fermion listen
fermion listen > note.txt
fermion listen --wav clip.wav

listen transcribes the microphone live. The current hypothesis updates on one terminal line, finished segments print permanently, and Ctrl-C stops the session and prints the full transcript to standard output.--wav streams a file through the identical live path, paced to real time.

  • The first hypothesis appears after about 0.35 s of speech and updates about twice per second.
  • A segment finalizes after about 0.7 s of silence, or at the 30 s segment cap.
  • On macOS, grant your terminal microphone access under System Settings, Privacy & Security, Microphone.

Transcription server

shell
fermion serve --model phonon

With a speech model, serve mounts the audio routes and answers OpenAI audio clients unmodified againstbase_url=http://127.0.0.1:8000/v1. The chat routes are not mounted; a request to one returns a 404 naming the endpoint that exists.

MethodRoutePurpose
POST/v1/audio/transcriptionsOne-shot file transcription.
GET/v1/audio/streamLive transcription over WebSocket.
GET/v1/modelsThe served model id.
GET/healthModel, decode configuration, and request counters.
bash
curl -s http://127.0.0.1:8000/v1/audio/transcriptions \
  -F file=@clip.wav
# {"text": "The transcript."}

response_format selects json (default), text, or verbose_json. Themodel form field is checked: a name this process does not serve returns 404 rather than a transcript from a different model. Request bodies are capped at 32 MB; the model handles utterances up to 30 s and decodes longer audio in chunks. --api-key requires a bearer token on every /v1 route. The Docker image serves this same API on an NVIDIA GPU.

Streaming API covers the live WebSocket route: the opening frame, audio formats, server frames, and session limits.

Model selection

Phonon-1 is the default and the more accurate model. Phonon-1 Micro is the smallest build of the family and trades accuracy for a smaller download.

ModelDownloadOn diskLibriSpeech test-cleanAliases
Phonon-1415 MB455 MB2.640%phonon, phonon-1, stt, asr
Phonon-1-Micro285 MB331 MB3.002%phonon-1-micro, micro
shell
fermion transcribe clip.wav --model micro
fermion listen --model FermionResearch/Phonon-1-Micro

Both models transcribe English from 16 kHz audio, were trained at 2.4 bits per weight from the start, and are open under Apache 2.0. fermion models lists every published model and marks the ones already on your machine. Speech models lists every Phonon release with its measurements.