Skip to content

Speech API / v1

Build with oruk

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.

Production base URL
https://speech-api.oruk.ai
Current scope
Prerecorded English audio
On this page

01

Quickstart

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
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"
Response
{
  "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

Authentication

Send a bearer key on inference and model-catalog requests. Keys are shown only once. Never put a key in a URL.

Authorization

Authorization: Bearer oruk_live_...

Idempotency

Send a unique X-Request-ID for each inference. Reusing one returns 409 and does not create another debit.

03

Endpoints

All inference endpoints accept file and an optional model field as multipart/form-data.

EndpointTaskOutputDefault model
POST /v1/audio/transcriptionsTranscriptionEnglish transcriptoruk-resonance
POST /v1/audio/emotionsEmotionCalibrated multilabel emotionsoruk-spectra-1
POST /v1/audio/stylesStyleCalibrated multilabel speaking stylesoruk-spectra-1
POST /v1/audio/affectAffectEmotion and style labelsoruk-spectra-1
POST /v1/audio/analysisAnalysisTranscript, labels, segments, and tagged textoruk-resonance

Catalog and health routes: GET /v1/models, GET /v1/pricing, GET /livez, and GET /readyz.

04

Playground

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.

Your key and audio go directly from this browser to https://speech-api.oruk.ai. Nothing is stored on this page.

Equivalent cURL
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

API reference

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.

POST/v1/audio/transcriptionsTranscription

Returns 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.
POST/v1/audio/emotionsEmotion

Returns calibrated multilabel emotion predictions per acoustic segment. The response intentionally omits transcript text.

file
Required. WAV, FLAC, MP3, M4A, OGG, or WebM audio.
model
Optional. Defaults to oruk-spectra-1.
POST/v1/audio/stylesStyle

Returns calibrated multilabel speaking-style predictions per acoustic segment. The response intentionally omits transcript text.

file
Required. WAV, FLAC, MP3, M4A, OGG, or WebM audio.
model
Optional. Defaults to oruk-spectra-1.
POST/v1/audio/affectAffect

Returns calibrated emotion and speaking-style labels without transcript text.

file
Required. WAV, FLAC, MP3, M4A, OGG, or WebM audio.
model
Optional. Defaults to oruk-spectra-1.
POST/v1/audio/analysisAnalysis

Returns an English transcript, emotion labels, speaking-style labels, and a tagged transcript from one request.

file
Required. WAV, FLAC, MP3, M4A, OGG, or WebM audio.
model
Optional. Defaults to oruk-resonance.
speech.result envelope
{
  "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

Multilabel output

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.

Emotion

15 labels
happyexcitedhopefulsadworriedangryfrustrateddisappointedscareddisgustedsurprisedembarrassedproudrelievedneutral

Speaking style

16 labels
energeticpassionateirritatedwarmplayfulsarcasticdeadpanhesitantconfidentsincereskepticaltiredformalcasualimpatientdistracted

07

Models

Spectra 1

oruk-spectra-1

Efficient emotion, style, and combined affect classification

Stable

Spectra 2

oruk-spectra-2

Compatibility and workflow evaluation

Preview

Resonance

oruk-resonance

Highest-accuracy transcription and unified analysis

Stable

08

Pricing

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.

ModelTranscriptEmotionStyleAffectAnalysis
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

Audio

  • WAV, FLAC, MP3, M4A, OGG, and WebM
  • Mono or stereo input
  • Common sample rates accepted
  • English language in API v1
  • 30 MB maximum upload
  • 60 minute maximum duration

10

Errors and retries

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.

402 insufficient_credits

Add organization credit before sending another request.

409 duplicate_request_id

Use a new ID for a new inference. Failed requests release their ID.

Error response
{
  "error": {
    "type": "invalid_request_error",
    "code": "audio_decode_failed",
    "message": "Audio could not be decoded.",
    "param": "file",
    "request_id": "req_6fc1..."
  }
}

Ready to make a request?

Create an account, generate a key, and inspect usage in one place.