A speech engine.
A simple boundary.
Vox Homini v1 turns audio into a transcript and a punctuated, paragraph-structured version. Call it from your application's server.
Keep authentication server-side.
All /v1 routes require an Authorization: Bearer <client API key> header. Client keys are configured by the operator. Provider credentials stay inside the Vox Homini service; do not ship either kind of credential in browser code.
Your server sends the audio buffer. Vox Homini handles recognition and text structuring through external providers and returns the result. Trubado is the first integration, not a requirement to use the API.
Audio in. Both texts out.
POST /v1/process
Send multipart/form-data with a single file field named audio. The service validates decoded audio, performs speech recognition, then adds punctuation, case and paragraphs.
curl --request POST \
"$YOUR_VOX_ENDPOINT/v1/process" \
--header "Authorization: Bearer $VOX_API_KEY" \
--form "audio=@voice-note.wav"Set these environment variables in your server-side environment. This page does not make API requests.
Response fields
- rawText
- string · The speech-recognition transcript before text structuring.
- text
- string · The punctuated, paragraph-structured text.
- provider
- string · The text-structuring provider label. Existing labels include
minimax-directandstt-verbatim. - audioDurationMs
- number · Authoritative duration of the decoded audio, in milliseconds.
- durationMs
- number · Duration reported by the processing operation, in milliseconds. Not a latency promise.
Use the whole pipeline.
Or call each step.
POST /v1/audio/inspect
Input: the same multipart audio file. Decodes and validates audio without calling providers. Returns { audioDurationMs: number, normalizedBytes: number }. Use the decoded duration for application-side quota decisions before a provider request.
POST /v1/transcriptions
Input: the same multipart audio file. Validates audio and performs speech recognition without text structuring. Returns { text: string, durationMs: number, audioDurationMs: number }.
POST /v1/normalize
Input: JSON { "text": "your transcript" } with Content-Type: application/json. Adds punctuation, case and paragraphs while preserving words, language and profanity. Returns { text: string, provider: string, durationMs: number }.
GET /v1/capabilities
Authenticated version, limits and readiness/availability information. It does not expose provider credentials.
The boundary matters.
- Maximum audio file size: 20 MiB.
- Maximum decoded audio duration: 120 seconds. The service validates actual audio rather than trusting a duration supplied by the client.
- Text structuring is punctuation, case and paragraphs only: no paraphrasing, word deletion, summaries or censoring.
- Application and service rate/concurrency budgets are bounded. The API does not accept caller-supplied provider URLs, models or prompts.
- The service does not retry through alternative billed providers.
Your application remains responsible for its user authentication, consent, quotas, history and retry policy. Do not automatically repeat a failed billable request without considering its outcome.
Schema and availability.
GET /openapi.json provides the machine-readable v1 schema, authentication requirements, request/response structures, error statuses and limits at your deployment's base URL. Consult that deployed schema for exact error handling; this guide does not invent undocumented response details.
GET /health is the public liveness endpoint. GET /ready reports readiness without revealing secrets. Neither replaces the authenticated API.
V1 contract · No fixed language list, accuracy benchmark, processing-time promise, pricing or public key-issuance flow is asserted here.