Free while in beta ยท no signup ยท no cloud model

Speech in, text out.
Text in, speech out.

English speech-to-text and text-to-speech behind one OpenAI-compatible endpoint, running on a single small server. Point any OpenAI SDK at it and your existing code works unchanged.

2endpoints, both OpenAI's
12voices to choose from
0.66ร—real time โ€” transcribes faster than you speak
0data sent to third parties

Try it

Running live on the server this page is served from. Free to use while in beta โ€” a shared key is already filled in, limited to twenty requests a minute per visitor and two at a time.

Kokoro on CPU. Roughly a second of compute per second of speech โ€” a laptop with Apple silicon is about ten times quicker.
Whisper small on CPU, English only. Transcribes at about two thirds of real time, so a clip comes back sooner than it took to record.
๐Ÿ”Œ

Drop-in OpenAI

Both endpoints are byte-for-byte OpenAI's. Change the base URL and existing SDK code keeps working โ€” no wrapper, no rewrite.

๐Ÿ”’

Nothing leaves the box

Models run on this server, not behind someone else's API. No third party sees your audio or your text, because there is no third party.

๐Ÿ”‘

Free while in beta

No signup, no card, no quota beyond a fair-use rate limit. Metered keys and paid plans come later โ€” for now it costs nothing to build against.

API

Base URL https://voice.devops-monk.com ยท every request needs Authorization: Bearer <key>

POST/v1/audio/speechText to speech
FieldTypeDefaultNotes
modelstringrequiredtts-1 or kokoro
inputstringrequiredThe text to speak
voicestringaf_heartAny Kokoro English voice
response_formatstringmp3mp3, wav, opus, flac
speednumber1.00.25 to 4.0
POST/v1/audio/transcriptionsSpeech to text
FieldTypeDefaultNotes
filefilerequiredwav, mp3, m4a, ogg, flac, webm โ€” max 25 MB
modelstringrequiredwhisper-1 โ€” English, Whisper small Q8_0
response_formatstringjsonjson, text, verbose_json, srt, vtt
temperaturenumber00 to 1. Raise only if output is repetitive
GET/v1/modelsWhat is routable
# speak
curl https://voice.devops-monk.com/v1/audio/speech \
  -H "Authorization: Bearer $KEY" \
  -H 'Content-Type: application/json' \
  -d '{"model":"tts-1","voice":"af_heart","input":"Hello."}' \
  --output hello.mp3

# transcribe
curl https://voice.devops-monk.com/v1/audio/transcriptions \
  -H "Authorization: Bearer $KEY" \
  -F file=@meeting.m4a -F model=whisper-1
# the official OpenAI SDK works unchanged
from openai import OpenAI
client = OpenAI(base_url="https://voice.devops-monk.com/v1", api_key=KEY)

client.audio.speech.create(model="tts-1", voice="af_heart",
                           input="Hello.").stream_to_file("hello.mp3")

with open("meeting.m4a", "rb") as f:
    print(client.audio.transcriptions.create(model="whisper-1", file=f).text)

Run your own

Four containers, one compose file. No GPU required.

git clone https://github.com/devops-monk/voice-api /opt/voice-api
cd /opt/voice-api && cp .env.example .env
./scripts/deploy.sh

whisper.cpp

Whisper small Q8_0, English. Measured at 0.66ร— real time on four shared vCPUs.

Kokoro

The same weights the Lector desktop app offers as its quality option.

LiteLLM

Auth, virtual keys, budgets and rate limits. Routing lives in one config file.

This is not a backend for Vox and Lector. Those run entirely on your own machine and always will. This exists for clients that cannot run a 900 MB model โ€” browser extensions, web pages, phones โ€” and it is slower than a laptop. Hosting buys reach, not speed.