/v1/audio/transcriptionsTranscriptionReturns an English transcript with time-ordered segments and word timings.
- file
- Required. WAV, FLAC, MP3, M4A, OGG, or WebM audio.
- model
- Optional. Defaults to
oruk-resonance.
Speech API / v1
Transcribe English audio and return calibrated emotion and speaking-style labels through one versioned API. Use individual tasks when you need one output, or unified analysis when you need words and acoustic context together.
01
Create a production key in the developer portal, set ORUK_API_KEY, and send a multipart request with an audio file. The example below returns transcript, emotion, style, segments, and usage in one response.
curl https://speech-api.oruk.ai/v1/audio/analysis \
-H "Authorization: Bearer $ORUK_API_KEY" \
-H "X-Request-ID: $(uuidgen)" \
-F "model=oruk-resonance" \
-F "file=@sample.wav"{
"id": "speech_8a3f...",
"object": "speech.result",
"task": "analysis",
"model": "oruk-resonance",
"text": "that is genuinely wonderful",
"tagged_text": "that is genuinely wonderful <|happy|> <|warm|>",
"language": "en",
"duration": 2.84,
"emotions": [{"label": "happy", "score": 0.94}],
"styles": [{"label": "warm", "score": 0.81}],
"segments": [],
"usage": {
"audio_seconds": 2.84,
"billable_seconds": 2.84,
"rate_per_minute_usd": "0.0120",
"estimated_cost_usd": "0.000568",
"pricing_version": "2026-07-11"
}
}02
Send a bearer key on inference and model-catalog requests. Keys are shown only once. Never put a key in a URL.
Authorization: Bearer oruk_live_...Send a unique X-Request-ID for each inference. Reusing one returns 409 and does not create another debit.
03
All inference endpoints accept file and an optional model field as multipart/form-data.
| Endpoint | Task | Output | Default model |
|---|---|---|---|
| POST /v1/audio/transcriptions | Transcription | English transcript | oruk-resonance |
| POST /v1/audio/emotions | Emotion | Calibrated multilabel emotions | oruk-spectra-1 |
| POST /v1/audio/styles | Style | Calibrated multilabel speaking styles | oruk-spectra-1 |
| POST /v1/audio/affect | Affect | Emotion and style labels | oruk-spectra-1 |
| POST /v1/audio/analysis | Analysis | Transcript, labels, segments, and tagged text | oruk-resonance |
Catalog and health routes: GET /v1/models, GET /v1/pricing, GET /livez, and GET /readyz.
04
Test any endpoint without leaving this page. Requests are sent straight from your browser to the API with your key, and the matching cURL command updates as you change the request.
curl https://speech-api.oruk.ai/v1/audio/analysis \
-H "Authorization: Bearer $ORUK_API_KEY" \
-H "X-Request-ID: $(uuidgen)" \
-F "model=oruk-resonance" \
-F "file=@sample.wav"05
Every inference endpoint takes a multipart/form-data body with a required file and an optional model, and returns one speech.result envelope. The full machine-readable contract is in the OpenAPI schema.
/v1/audio/transcriptionsTranscriptionReturns an English transcript with time-ordered segments and word timings.
oruk-resonance./v1/audio/emotionsEmotionReturns calibrated multilabel emotion predictions per acoustic segment. The response intentionally omits transcript text.
oruk-spectra-1./v1/audio/stylesStyleReturns calibrated multilabel speaking-style predictions per acoustic segment. The response intentionally omits transcript text.
oruk-spectra-1./v1/audio/affectAffectReturns calibrated emotion and speaking-style labels without transcript text.
oruk-spectra-1./v1/audio/analysisAnalysisReturns an English transcript, emotion labels, speaking-style labels, and a tagged transcript from one request.
oruk-resonance.{
"id": "speech_...", // unique result ID
"object": "speech.result",
"task": "analysis", // transcription | emotion | style | affect | analysis
"model": "oruk-resonance",
"text": "...", // transcript tasks only
"tagged_text": "...", // transcript with inline affect tags
"language": "en",
"duration": 2.84, // measured seconds
"emotions": [{"label": "happy", "score": 0.94}],
"styles": [{"label": "warm", "score": 0.81}],
"segments": [ // time-local outputs for longer audio
{
"id": 0, "start": 0.0, "end": 2.84,
"text": "...", "tagged_text": "...",
"words": [{"word": "...", "start": 0.0, "end": 0.4, "confidence": 0.99}],
"emotions": [], "styles": []
}
],
"usage": {
"audio_seconds": 2.84,
"billable_seconds": 2.84,
"rate_per_minute_usd": "0.0120",
"estimated_cost_usd": "0.000568",
"pricing_version": "2026-07-11"
}
}Transcript fields are only populated by transcription and analysis; emotion, style, and affect intentionally omit transcript text. Every response reports measured duration, billable duration, estimated cost, and pricing version in usage.
06
A clip can return several emotions, several styles, or no selected style. At least one emotion is returned; the top emotion is the fallback when no score crosses its calibrated threshold. Use segment labels when affect changes over a longer recording.
happyexcitedhopefulsadworriedangryfrustrateddisappointedscareddisgustedsurprisedembarrassedproudrelievedneutralenergeticpassionateirritatedwarmplayfulsarcasticdeadpanhesitantconfidentsincereskepticaltiredformalcasualimpatientdistracted07
oruk-spectra-1Efficient emotion, style, and combined affect classification
Stable
oruk-spectra-2Compatibility and workflow evaluation
Preview
oruk-resonanceHighest-accuracy transcription and unified analysis
Stable
08
USD per audio minute, billed by measured second with a one-second minimum. Pricing version 2026-07-11. Spectra 2 is a preview tier and is not yet serving traffic.
| Model | Transcript | Emotion | Style | Affect | Analysis |
|---|---|---|---|---|---|
| Spectra 1 | $0.0045 | $0.0060 | $0.0060 | $0.0075 | $0.0090 |
| Spectra 2Preview | $0.0065 | $0.0080 | $0.0080 | $0.0100 | $0.0120 |
| Resonance | $0.0080 | $0.0080 | $0.0080 | $0.0100 | $0.0120 |
09
10
Errors use one stable envelope and include the request ID. Retry 429, 500, 502, 503, and 504 with exponential backoff and jitter. Do not automatically retry other 4xx responses.
Add organization credit before sending another request.
Use a new ID for a new inference. Failed requests release their ID.
{
"error": {
"type": "invalid_request_error",
"code": "audio_decode_failed",
"message": "Audio could not be decoded.",
"param": "file",
"request_id": "req_6fc1..."
}
}Create an account, generate a key, and inspect usage in one place.