v1.24.10 engine · v1.28 Bun CLI · MIT · macOS · Linux · Windows

Voice in, text out. A Rust toolkit that's ~19× faster than Whisper on Apple Silicon.

Local speech-to-text with word-level timestamps, text-to-speech, live dictation, and language ID. Install the engine and models deliberately, see progress on stderr, and keep your audio on your machine. CoreML/ANE on Apple Silicon; ONNX on Linux and Windows. No Python. No ffmpeg. No surprise downloads.

$ bun add -g @drakulavich/kesha-voice-kit
  • 25 STT languages
  • 107 Detection langs
  • ~65 MB Published engine binary
  • 19× vs Whisper (M-series)

Capabilities

Everything voice, in a single CLI.

Four pipelines, one binary. Pick what you need; the rest stays out of your way.

Speech-to-text

25 languages via NVIDIA Parakeet TDT. ~19× faster than Whisper on Apple Silicon, ~2.5× on CPU. Auto language detection, optional VAD for long audio, word-level timestamps, plain text, or LLM-friendly TOON output.

  • EN · RU · DE · FR · ES
  • + 20 more
  • word timestamps
  • VAD opt-in
  • JSON / TOON
New

Speaker diarization

Drop a meeting recording in, get back timestamped segments tagged with a stable speaker ID. Powered by FluidAudio’s Sortformer model running on the Apple Neural Engine via a Swift sidecar — ~4.6× real-time on a 71-minute Zoom call. v1.19 gives the cold ANE warmup extra headroom so the first --speakers call on a fresh process no longer hits a false timeout.

  • --speakers
  • darwin-arm64
  • Sortformer (CoreML)
  • opt-in install

Text-to-speech

Kokoro runs through CoreML/ANE on Apple Silicon and ONNX on Linux and Windows; Vosk-TTS covers Russian, and macOS system voices need no model download. macOS auto-routes from the text language; Linux and Windows use --lang or --voice. Kokoro (ANE or ONNX) and Vosk support SSML <prosody rate> and <break>; <emphasis> is Vosk-only. macOS system voices reject --ssml.

OGG/Opus voice notes

Synthesize straight into the format Telegram, WhatsApp, Signal and Discord expect for inline voice messages — ~24× smaller than WAV. Pick a bitrate; the engine handles the OggOpus container, no ffmpeg required.

  • --format ogg-opus
  • 16 / 32 / 64 kbps

Timestamped transcripts

--json --timestamps adds a words array to each segment: file-relative predictions on a 0.08-second grid. Each word end is predicted independently, so consecutive spans may overlap and an end is not necessarily the next word’s start. The field is absent when the decoder has no usable words (for example after --itn), not an empty array.

Language detection

107 languages from audio via SpeechBrain ECAPA-TDNN. JSON and TOON also expose textLanguage separately from spoken audioLanguage: Apple’s recognizer on macOS and bundled tinyld elsewhere. Their confidence scales are not comparable.

Voice activity detection

Silero VAD v5 trims silence on long, sparse recordings. Install it explicitly with kesha install --vad; Kesha uses it automatically past 120 seconds once it is available.

Persistent --stdin-loop

One TTS process, many requests. Models stay in memory across calls so each synthesis hits ~10 ms cold-start instead of ~800 ms. Ideal for chatbots, live agents, and long agentic loops.

New

Live dictation with recovery

On darwin-arm64, kesha record --live prints the microphone transcript to stdout. Install VAD explicitly, then opt into silence stopping with --auto-stop: 1,000 ms silence after 250 ms speech by default. Live recording has a 120-second hard stop by default; pass --max-seconds to override it. Ctrl-C prints the transcript; the recovery WAV is deleted only after uninterrupted successful stdout delivery, and is kept if delivery fails or Ctrl-C or SIGTERM ends the session.

  • darwin-arm64
  • kesha install --vad
  • --auto-stop
New

Privacy-safe diagnostic logs

Opt-in local-only command events with paths and user-supplied text redacted. kesha doctor surfaces status; kesha logs manages them; kesha support-bundle bundles them for support. Mode retain-on-failure keeps logs only when a command actually fails.

  • kesha doctor
  • kesha logs
  • support-bundle
  • local only
v1.24

Multilingual TTS

Install TTS only when you need it. Kokoro powers English and multilingual voices through CoreML/ANE on Apple Silicon and ONNX on Linux/Windows; Russian uses Vosk-TTS. Chinese, Japanese, and Hindi are darwin-arm64 only; Chinese accepts Han text, while Hindi requires romanized Latin input and Japanese requires romaji (Devanagari and kana/kanji are rejected). Use --lang on Linux and Windows rather than relying on macOS auto-routing.

  • en · es · fr · it · pt
  • ru (Vosk)
  • hi · ja · zh (darwin-arm64)
  • --lang off macOS
v1.22

Structured error taxonomy

Every failure path prints a stable, machine-readable error [CODE]: … line. kesha-engine --error-codes-json dumps the whole taxonomy; a docs drift gate keeps docs/errors.md honest. Agents and CI can branch on why something failed instead of regexing log soup.

  • stable codes
  • --error-codes-json
  • exit codes
  • agent-friendly

Rust engine, zero deps

A single Rust binary for macOS arm64, Linux x64, and Windows x64. FluidAudio (CoreML) on Apple Silicon via dedicated sidecars (diarization, TTS, language detection); ort (ONNX) elsewhere. Symphonia decodes WAV, MP3, OGG/Opus, FLAC, AAC, M4A; pure-Rust opus + flacenc handle encode — royalty-free codecs, no C dep, no patent exposure. Linux .deb and .rpm packages signed with Sigstore. No ffmpeg. No Python. No native Node addons.

OpenClaw-ready

Plug straight into your LLM agent as a voice-processing skill. Give Claude (or any agent) ears and a voice in one install.

Hear it

Four samples, two engines, two languages.

Real output from kesha say — Kokoro-82M for English, Vosk-TTS for Russian. SSML <prosody rate> renders the same text at different speeds without resampling artifacts. Kokoro and Vosk honor <prosody> and <break>; <emphasis> is Vosk-only.

EN · Kokoro-82M medium (1.0×)

“Kesha turns voice into text in a single command — no Python, no ffmpeg.”

kesha say --voice en-am_michael "…" --out demo.flac
EN · Kokoro-82M <prosody rate="x-fast"> · 1.5×

Same text, x-fast prosody. Tempo only — pitch and timbre unchanged.

kesha say --voice en-am_michael --ssml '<speak><prosody rate="x-fast">…'
RU · Vosk-TTS medium (1.0×)

«Кеша превращает голос в текст одной командой — без зависимостей.»

kesha say --voice ru-vosk-m02 "…" --out demo.flac
RU · Vosk-TTS <prosody rate="slow"> · 0.75×

Same text, slow prosody. Useful for accessibility and dictation.

kesha say --voice ru-vosk-m02 --ssml '<speak><prosody rate="slow">…'

Performance

Faster than Whisper.
Quieter than your fans.

Compared against Whisper large-v3-turbo across Russian and English clips — every engine left to auto-detect language. CoreML on M-series lands at roughly 19× real-time; the ONNX path on x86 still beats Whisper by ~2.5×.

  • ~19× vs openai-whisper · M-series
  • ~2.5× vs openai-whisper · CPU x86
  • ~7× vs faster-whisper · M-series
Read the full benchmark
Bar chart comparing transcription speed: openai-whisper vs faster-whisper vs Kesha Voice Kit
Lower bars = faster. Source: BENCHMARK.md.

Quick start

Three commands to a working transcript.

Requires Bun ≥ 1.3 on macOS arm64, Linux x64, or Windows x64. Engine and models download only when you ask them to.

01

Install Bun

Skip if you already have it.

macOS / Linux

$ curl -fsSL https://bun.sh/install | bash

Windows PowerShell

> powershell -c "irm bun.sh/install.ps1 | iex"
02

Install Kesha

Preview the size, then explicitly download the engine and base STT models. Progress and recovery hints go to stderr; Kesha never downloads them while you transcribe or speak. Add --tts or --vad only when those workflows need them.

$ bun add -g @drakulavich/kesha-voice-kit
$ kesha install --plan && kesha install
$ kesha install --vad    # only for live auto-stop / VAD
03

Transcribe

Pipe-friendly: stdout is the transcript; stderr carries progress and errors.

$ kesha audio.ogg
Свободу попугаям! Свободу!
# Plain transcript
$ kesha audio.ogg

# Text + language/confidence
$ kesha --format transcript audio.ogg

# Full JSON with lang fields
$ kesha --format json audio.ogg

# Compact, LLM-friendly TOON
$ kesha --toon audio.ogg

# Long / silence-heavy audio (after: kesha install --vad)
$ kesha --vad lecture.m4a

# Segments plus word-level timestamps
$ kesha --json --timestamps interview.ogg

# Meeting transcript with speaker IDs (darwin-arm64)
$ kesha --json --vad --speakers meeting.m4a

# Warn if detected language differs
$ kesha --lang en interview.wav

# Live dictation: darwin-arm64 + explicit VAD install
$ kesha install --vad && kesha record --live --auto-stop
# Opt-in TTS pack: English; preview sizes first
$ kesha install --tts

# macOS auto-routes from text language
$ kesha say "Hello, world" > hello.wav
$ kesha say "Привет, мир" > privet.wav

# Linux / Windows: state the language explicitly
$ kesha say --lang ru "Привет, мир" > privet.wav

# OGG/Opus voice notes (drop straight into Telegram)
$ kesha say --format ogg-opus "Уже бегу!" --out voice.ogg

# Kokoro / Vosk only: variable-speed playback via SSML <prosody rate>
$ kesha say --voice en-am_michael --ssml \
    '<speak><prosody rate="x-fast">Read this fast.</prosody></speak>' \
    --out fast.wav

# Use a macOS system voice
$ kesha say --voice Milena "Чао!"

Want to hear what these voices sound like? Play the four samples ↗

import { transcribe, downloadModel } from "@drakulavich/kesha-voice-kit/core";

// One-time install
await downloadModel();

// Transcribe a file
const text = await transcribe("audio.ogg");

// With detection metadata
const result = await transcribe("audio.ogg", { format: "json" });
console.log(result.language, result.confidence);
# Multiple files — headers per file, like `head`
$ kesha freedom.ogg tahiti.ogg
=== freedom.ogg ===
Свободу попугаям! Свободу!

=== tahiti.ogg ===
Таити, Таити! Не были мы ни в какой Таити! Нас и тут неплохо кормят.

# Pipe transcripts into your favorite LLM
$ kesha --toon meeting.m4a | llm "Summarize action items"

# Status of installed engine + models
$ kesha status

# Diagnose env, log status, and CoreML caches
$ kesha doctor

# Bundle logs + manifests for a bug report
$ kesha support-bundle

What's inside

Nine models, one runtime.

Each model is best-in-class for its task and runs through kesha-engine — Rust, with CoreML sidecars on Apple Silicon and ONNX everywhere else. Nine multilingual voices ship in one bundle as of v1.22.

Model Task Size Source
NVIDIA Parakeet TDT 0.6B v3 Speech-to-text ~2.5 GB HuggingFace ↗
SpeechBrain ECAPA-TDNN Audio language detection ~86 MB HuggingFace ↗
Apple NLLanguageRecognizer Text language detection built-in macOS framework
Silero VAD v5 (opt-in) Voice activity detection ~2.3 MB snakers4/silero-vad ↗
Kokoro-82M (opt-in) Text-to-speech · English ~990 MB HuggingFace ↗
Vosk-TTS (opt-in) Text-to-speech · Russian bundled alphacep/vosk-tts ↗
FluidAudio Sortformer v2 (opt-in, darwin-arm64) Speaker diarization ~245 MB FluidInference/FluidAudio ↗
FluidAudio Kokoro — multilingual (opt-in, darwin-arm64) Text-to-speech (CoreML) · en + native zh; es/fr/it/pt via Eng G2P ~990 MB FluidInference/FluidAudio ↗

Audio decoding via Symphonia — WAV, MP3, OGG/Opus, FLAC, AAC, M4A.

Languages

25 for transcription. 107 for detection.

English Spanish German French Italian Portuguese Russian Polish Dutch Czech Slovak Slovenian Croatian Bulgarian Romanian Greek Hungarian Finnish Swedish Danish Estonian Latvian Lithuanian Ukrainian Maltese

Need detection only? VoxLingua107 covers 107 languages.

Integrations

Drop in where you already work.

OpenClaw

Give your LLM agent ears. Voice-processing skill, pre-wired.

Setup guide →

Raycast

macOS launcher commands: transcribe selected audio, speak the clipboard. From the raycast/ directory.

Source & install →

Programmatic API

Import transcribe() and downloadModel() directly into any Bun/Node project.

See examples →

Air-gapped mirrors

Behind a corporate proxy or fully offline? Point Kesha at your model mirror.

Mirror docs →

Ready to ship voice?

Open source, MIT licensed, and improving every week. Star the repo or jump straight to the install.

Copied