Back to Local voice AI

Local voice AI / Guide 3 of 7

Run local speech output

Start Kokoro and choose a voice for text-to-speech.

Run this step · Terminal

docker run -d --name kokoro \
  --restart unless-stopped \
  -p 127.0.0.1:8880:8880 \
  ghcr.io/remsky/kokoro-fastapi-cpu:latest

Start Kokoro and inspect its voices

If you have an NVIDIA GPU, swap the image tag for kokoro-fastapi-gpu. On Apple Silicon, the CPU image is fine — Kokoro is small (82M params).

Verify it's running:

bash

curl http://127.0.0.1:8880/v1/audio/voices | jq '.voices'

If Docker bound the port to a different interface (Tailscale, LAN) instead of loopback, recreate the container with the loopback binding shown above for this local setup.

Available voices

Kokoro ships 60+ voices across 9 languages. Voice IDs follow the pattern <language><gender>_<name> — e.g. bf_emma = British Female, Emma. Voices prefixed with v0_ are older / legacy versions; the unprefixed names are current.

LanguageFemaleMale
🇺🇸 American English (a)af_alloy, af_aoede, af_bella, af_heart, af_jadzia, af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_skyam_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa
🇬🇧 British English (b)bf_alice, bf_emma, bf_lilybm_daniel, bm_fable, bm_george, bm_lewis
🇪🇸 Spanish (e)ef_doraem_alex, em_santa
🇫🇷 French (f)ff_siwis—
🇮🇳 Hindi (h)hf_alpha, hf_betahm_omega, hm_psi
🇮🇹 Italian (i)if_saraim_nicola
🇯🇵 Japanese (j)jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukurojm_kumo
🇧🇷 Portuguese (p)pf_dorapm_alex, pm_santa
🇨🇳 Mandarin (z)zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyizm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang

Voice quality varies — community favorites tend to be af_heart, af_bella, af_nicole, bf_emma, am_michael, and bm_george. We default to bf_emma (clean British English, natural prosody) but experiment to find what fits.

Preview a voice from the command line:

bash

curl -s -X POST http://127.0.0.1:8880/v1/audio/speech \
  -H 'Content-Type: application/json' \
  -d '{"model":"kokoro","input":"Hello — this is what I sound like.","voice":"bf_emma","response_format":"mp3"}' \
  -o /tmp/preview.mp3 && afplay /tmp/preview.mp3

Swap bf_emma for any voice ID above.

No German?

Kokoro doesn't ship native German voices yet. For DE, NautPin can fall back to macOS's built-in voices (Anna, Markus — both premium quality, fully on-device) configured under Settings → Voice Output → Apple voices.

It’s working if

The voices endpoint returns a JSON list at http://127.0.0.1:8880/v1/audio/voices. Install jq if you want to use the formatting command.