Skip to main content

🎙️ ses

Ollama for voice. Pull, hot-swap and serve local speech models with one command, fully offline.

Platforms Python License: MIT Models

uv tool install ses

ses say "hello world"     # your speakers, model auto-pulled
ses listen --live         # live captions from your mic
ses talk                  # voice assistant on top of your Ollama model
ses serve                 # OpenAI-compatible API and a web playground

No model URLs, no config files, no Docker, no API keys.

Why

Running speech models locally still means an afternoon of glue: hunt Hugging Face for the right port of the right model, figure out which runtime your machine can actually run, wire up audio formats, then redo all of it when you switch models. Text models stopped being like this the day Ollama gave them curated names, one pull and one API.

ses brings that to speech. It is a model manager, not another demo script: pull a model by name, ls and rm what is installed, hot-swap without a restart, and serve everything behind one API that keeps models warm.

One name gets the right backend for your machine. ses pull whisper-base fetches MLX weights on Apple Silicon and CTranslate2 everywhere else, and your commands never change. 49 languages to speak, 99 to transcribe. And through MCP, Claude Code or Codex can speak and listen with the same local models.

Install

macOS, Linux or Windows, Python 3.10+.

uv tool install ses             # core
uv tool install 'ses[default]'  

The only permission ses ever asks for is mic access, the first time you listen.

Use it

$ ses say "The quick brown fox jumps over the lazy dog."
model kokoro not installed, pulling from onnx-community/Kokoro-82M-v1.0-ONNX (~340 MB) pulled kokoro
🔊

$ ses transcribe meeting.m4a -m whisper-turbo -f srt -o meeting.srt
✓ wrote meeting.srt

$ ses listen --live
🎧 live, whisper-turbo listening, Ctrl-C to stop
00:02  Let's start with the roadmap for next quarter.
00:09  Marta is taking the migration work.

--live keeps the mic open and prints each sentence the moment you finish it. Boundaries come from voice activity detection; ses[vad] swaps the built-in energy threshold for a learned detector that holds up in a noisy room.

Give your coding agent a voice

This is the part I use every day. ses ships an MCP server, so any MCP client, Claude Code, Codex, or your own agent, gets ears and a mouth that run locally:

uv tool install 'ses[mcp]'
claude mcp add ses -- ses mcp

That is the whole setup. Your agent now has eight tools:

  • speak reads text out loud and returns when the audio ends. It takes a language argument, so an agent answering in Japanese picks a Japanese voice, downloading it on demand the first time.
  • notify is the short version: a one-liner ping when a long build or test run finishes, so you can leave the desk.
  • listen and dictate open the mic. Answer a question by speaking, or dictate a commit message instead of typing it.
  • transcribe takes an audio file path, so "transcribe this voice memo and turn it into a ticket" works end to end.
  • set_voice, list_voices and voice_mode let the agent switch voices and toggle spoken summaries without you touching a config file.

After that, things like "summarize the diff and read it to me" or "tell me out loud when the tests pass" just work, in whatever language you write. Nothing goes to a cloud API; the same local models serve every tool.

For Codex, put the same command in ~/.codex/config.toml under [mcp_servers.ses].

The models

80 curated models across 12 runtimes, 75 of them on every platform. Each one was picked by download numbers first, then verified with a real recording.

speech to text size notes
whisper-turbo 1.5 GB large-v3 accuracy at a fraction of the cost
whisper-tinywhisper-large 71 MB – 2.9 GB every size, 99 languages
whisper-cpp-* 31 MB – 1.1 GB GGML quantized, smallest downloads
qwen-asr-large 2.3 GB 5.76% WER, best Turkish in our tests
canary · parakeet 2.4 – 4.7 GB open ASR leaderboard toppers, 25 European languages
vosk-* ~40 MB six languages, tiny, CPU only
text to speech size notes
kokoro 340 MB most downloaded open voice model, 54 voices, 8 languages
tts-<language> ~61 MB 49 languages via Piper, ~20× real time
chatterbox-turbo 2.8 GB voice cloning from a short sample
qwen-tts · omnivoice 1.6 GB newer multilingual families (Apple Silicon)
ses search german       # browse; any language name or code works
ses system              # what runs on this machine, and how fast
ses use stt whisper-turbo

The curated list is not the limit. Any Hugging Face repo in a format ses can open installs directly, MLX, CTranslate2, ONNX and GGML out of the box, plain PyTorch with ses[transformers]:

ses pull mlx-community/whisper-large-v3-mlx-4bit --engine mlx-whisper
ses pull facebook/mms-tts-tur --engine transformers-tts   # 1000-language MMS

The assistant

ses talk

Mic in, Whisper to text, your Ollama or LM Studio model thinks, Kokoro speaks. Hands free through voice activity detection, or --push-to-talk for Enter. The voice starts on the first finished sentence while the model is still writing. Three local models passing audio around your own machine.

The server

ses serve
# api         http://127.0.0.1:11435/v1
# playground  http://127.0.0.1:11435

Drop-in for any OpenAI SDK, just change the base URL:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:11435/v1", api_key="ses")
client.audio.speech.create(model="kokoro", voice="af_heart",
                           input="Local models, cloud API shape.")

/v1/audio/speech, /v1/audio/transcriptions and /translations (json, srt, vtt), /v1/models, plus streaming PCM and NDJSON chat. Models load on first request, stay warm for --keep-alive (default 10m), least recently used is evicted past --max-loaded (default 3).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ses-0.0.1-1-py3-none-any.whl (98.1 kB view details)

Uploaded Python 3

File details

Details for the file ses-0.0.1-1-py3-none-any.whl.

File metadata

  • Download URL: ses-0.0.1-1-py3-none-any.whl
  • Upload date:
  • Size: 98.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for ses-0.0.1-1-py3-none-any.whl
Algorithm Hash digest
SHA256 c91242dae499114d38767940e16de49a1ce41eb2a92706f14c891d62fca1aa4e
MD5 5223b759a6a7c72e78c7f880345622a0
BLAKE2b-256 caa47ef066b113d60d0ffad40ad6d4c40518004a2af3c5bb0ca4403d2da3d573

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page