Ollama for voice: pull, hot-swap and serve local speech models (TTS + STT) on any machine, fully offline.
Project description
🎙️ ses
Ollama for voice. Pull, hot-swap and serve local speech models with one command, fully offline.
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]' # adds whisper.cpp, Vosk, Chatterbox, learned VAD
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:
speakreads text out loud and returns when the audio ends. It takes alanguageargument, so an agent answering in Japanese picks a Japanese voice, downloading it on demand the first time.notifyis the short version: a one-liner ping when a long build or test run finishes, so you can leave the desk.listenanddictateopen the mic. Answer a question by speaking, or dictate a commit message instead of typing it.transcribetakes an audio file path, so "transcribe this voice memo and turn it into a ticket" works end to end.set_voice,list_voicesandvoice_modelet 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. ⭐ marks the three ses recommends; they are also the three that run everywhere.
| speech to text | size | notes |
|---|---|---|
whisper-turbo ⭐ |
1.5 GB | large-v3 accuracy at a fraction of the cost |
whisper-tiny … whisper-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 (Apple Silicon) |
canary · parakeet |
2.4 – 4.7 GB | open ASR leaderboard toppers, 25 European languages |
parakeet-v2 |
2.4 GB | English only, the fastest of the three |
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, ~30× real time |
chatterbox-turbo |
2.8 GB | voice cloning from a sample, English, slower than real time |
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.
ses does not run the thinking model itself, it borrows one from Ollama. ses pull reaches those too, including any GGUF repo on Hugging Face:
ses pull llama3.2 # curated brain
ses pull hf.co/unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF
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).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ses-0.0.2-1-py3-none-any.whl.
File metadata
- Download URL: ses-0.0.2-1-py3-none-any.whl
- Upload date:
- Size: 102.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f514a3b004873a6919161a023d4fb86a741608ba6d052bc6e139e1d1f4e10663
|
|
| MD5 |
c4461f43fd0e17b1476f4c612b5fcd8a
|
|
| BLAKE2b-256 |
bd43331dafdf4030a6ee7aa075c3811faabf29142bc37c554044a247af5efb4d
|