---
title: "Transcribe audio with a supported model"
method: POST
path: "/v1/audio/transcriptions"
---

# Transcribe audio with a supported model

`POST /v1/audio/transcriptions`

## Request

- Base URL: `https://speech-api.oruk.ai`
- URL: `https://speech-api.oruk.ai/v1/audio/transcriptions`
- Auth: HTTP bearer

Spectra-2 (oruk-spectra-2) uses existing Oruk API keys and shared speech understanding minutes. Send file and model only. Both batch endpoints retain plain transcript and 31 clip-level scores. Capable builds may also return bounded tagged_transcript and structured prosody, including word times; diarization is not added. Streaming audio upload uses the separate /v1/audio/spectra-2/stream WebSocket endpoint. For retries, retain X-Request-ID, endpoint and exact file bytes.

## Headers

- `X-Request-ID` string

## Response `200`

Completed result. Spectra-2 returns transcript and all 31 clip-level scores on either endpoint.

- union
  - SpeechResult
    - `id` string, required
    - `object` 'speech.result', required
    - `task` 'transcription' | 'emotion' | 'style' | 'affect' | 'analysis' | 'proficiency', required
    - `model` string, required
    - `text` string, nullable
    - `tagged_text` string, nullable: Model-specific annotated transcript, not XML or word-level affect alignment. Resonance analysis may append unpaired <|label|> tags after a segment to annotate that segment. Use the structured segment emotions/styles arrays and start/end times for timed labels.
    - `language` string, nullable
    - `duration` number, required
    - `emotions` Score[], required
      - `label` string, required
      - `score` number, required
    - `styles` Score[], required
      - `label` string, required
      - `score` number, required
    - `segments` Segment[], required
      - `id` integer, required
      - `start` number, required
      - `end` number, required
      - `text` string, nullable
      - `tagged_text` string, nullable: Model-specific annotated transcript, not XML or word-level affect alignment. Resonance analysis may append unpaired <|label|> tags after a segment to annotate that segment. Use the structured segment emotions/styles arrays and start/end times for timed labels.
      - `words` Word[]
        - `word` string, required
        - `start` number, required
        - `end` number, required
        - `confidence` number, nullable: Optional transcription confidence from 0 to 1 when returned. Null or absent means unavailable, not zero or a transcription failure; unrelated to emotion/style scores. Word timings may be present without confidence.
      - `emotions` Score[], required
        - `label` string, required
        - `score` number, required
      - `styles` Score[], required
        - `label` string, required
        - `score` number, required
      - `speaker` string, nullable: Speaker label (speaker_0, speaker_1, ...) when the request set diarize=true; labels are stable within one response only.
      - `scores` object: All unfiltered sigmoid scores for the requested task, keyed by label, including below-threshold labels. Present only with include_logits=true; scores do not need to sum to one.
      - `raw_logits` object: Actual finite model outputs before sigmoid, keyed by the same labels as scores. Values are unbounded and may be negative. Present only with include_logits=true.
    - `diarized` boolean: True when segments are speaker turns (diarize=true).
    - `speakers` string[]: Speaker labels in order of first appearance; empty unless diarized.
    - `usage` Usage, required: Measured audio duration and reference cost metadata. Subscription usage draws from shared plan minutes, with additional minutes at the plan’s overage rate. Reference amounts are not the subscription invoice.
      - `audio_seconds` number, required
      - `billable_seconds` number, required
      - `rate_per_minute_usd` string, required
      - `estimated_cost_usd` string, required
      - `pricing_version` string, required
      - `billing_unit` 'audio_second' | 'request': Reference unit returned by the inference API. Subscription billing uses audio minutes regardless of this field.
      - `rate_per_request_usd` string, nullable: Reference cost metadata when billing_unit is 'request'; subscription charges are based on audio minutes.
  - OrukeetTranscription
    - `id` string, required
    - `object` 'audio.transcription', required
    - `model` 'oruk-orukeet', required
    - `text` string, required
    - `duration` number, required
    - `audio_seconds` number
    - `language` 'en'
    - `asr_ms` number: Server transcription processing time; excludes network, authentication, and usage reservation.
    - `server_ms` number: Server processing including optional tasks; excludes network, authentication, and usage reservation.
    - `emotions` Score[]
      - `label` string, required
      - `score` number, required
    - `styles` Score[]
      - `label` string, required
      - `score` number, required
    - `emotion_detection` object: Present when emotion_detection=true.
      - `emotions` Score[]
        - `label` string, required
        - `score` number, required
      - `scores` object
      - `thresholds` object
      - `segments` object[]
    - `diarized` boolean
    - `speakers` string[]
    - `segments` object[]: Speaker turns with diarize=true; empty for transcription alone. No word timestamps.
      - `id` integer
      - `start` number
      - `end` number
      - `speaker` string
      - `text` string
    - `usage` object, required
      - `audio_seconds` number
      - `billable_seconds` number
      - `billing_basis` 'subscription' | 'prepaid'
      - `cost_microusd` integer
      - `estimated_cost_usd` string
      - `rate_per_minute_usd` string
      - `pricing_version` string
      - `tasks` string[]
    - `request_id` string
  - Spectra2Result
    - `id` string, required: Opaque result identity.
    - `object` 'speech.result', required
    - `model` 'oruk-spectra-2', required
    - `task` 'transcription' | 'analysis', required
    - `text` string, required
    - `tagged_transcript` string: Optional escaped HTML-style data string paired with prosody. A transcript root wraps the clip; expression tags with scope=clip describe the whole recording, while emph wraps the selected nuclear word. Current predicted emph spans include origin=model_predicted, experimental=true and confidence=conditional_on_predicted_phrase. Treat as literal text using textContent or a React text value, never arbitrary HTML. When prosody is unavailable this string may be empty or escaped plain text; display text instead. See https://oruk.ai/docs#spectra-2-output.
    - `prosody` Spectra2Prosody: Optional structured output, paired with tagged_transcript. Word and phrase times are seconds from the recording start. Unknown nuclear positions remain null. Current predicted phrases are experimental: phrase scores are conditional on the phrase and annotation profile, not joint correctness. A result may have zero phrases even when word timings exist. Combined prosody and tagged_transcript JSON is bounded to 65,536 UTF-8 bytes. Unavailable outputs have empty words/phrases and a reason. See https://oruk.ai/docs#spectra-2-output.
      - `version` 'spectra2.prosody.v1', required
      - `status` 'available' | 'experimental' | 'unavailable', required
      - `reason` string: Diagnostic code present only when status is unavailable. Use text as the display fallback.
      - `words` object[], required
        - `word_id` string, required: Opaque identity within this response. Phrase nuclear_word_id references this value.
        - `text` string, required
        - `start_s` number, required
        - `end_s` number, required
        - `prominence` number, nullable, required: Acoustic prominence, or null if unavailable. Separate from nuclear selection, emotion scores, and transcription confidence; preserve numeric zero.
        - `nuclear` boolean, nullable, required: True for the selected nucleus, false for other words in the same accepted phrase, null outside accepted phrases.
      - `phrases` object[], required
        - `phrase_id` string, required
        - `scheme` 'aix_marsec_iu_v1' | 'nxt-edinburgh-fluent-phrase-v1' | 'ivie_ip_v1', required
        - `start_s` number, required
        - `end_s` number, required
        - `nuclear_word_id` string, required
        - `score` number, required
        - `score_semantics` 'conditional_on_phrase_and_profile', required: The score is conditional on the phrase and annotation profile; it is not the joint probability of a correct boundary and selected word.
        - `origin` 'model_predicted' | 'verified_phrase', required: Predicted phrases use model_predicted, experimental=true, and top-level status=experimental.
        - `experimental` boolean, required
    - `duration` number, required
    - `emotions` object[], required: One score for every label, covering the whole recording. Scores are independent and do not sum to one.
      - `label` 'happy' | 'excited' | 'hopeful' | 'sad' | 'worried' | 'angry' | 'frustrated' | 'disappointed' | 'scared' | 'disgusted' | 'surprised' | 'embarrassed' | 'proud' | 'relieved' | 'neutral', required
      - `score` number, required
    - `styles` object[], required: One score for every label, covering the whole recording. Scores are independent and do not sum to one.
      - `label` 'energetic' | 'passionate' | 'irritated' | 'warm' | 'playful' | 'sarcastic' | 'deadpan' | 'hesitant' | 'confident' | 'sincere' | 'skeptical' | 'tired' | 'formal' | 'casual' | 'impatient' | 'distracted', required
      - `score` number, required
    - `usage` object, required
      - `audio_seconds` number, required
      - `billable_seconds` number, required
      - `rate_per_minute_usd` string, required: Legacy reference rate; subscription invoices follow shared speech understanding plan minutes.
      - `estimated_cost_usd` string, required: Legacy reference cost, not the subscription invoice.
      - `pricing_version` string, required
      - `billing_unit` 'audio_second', required

## Other responses

- `409`: For Spectra-2: request_in_progress for pending or uncertain completion; request_already_completed for a completed ID; idempotency_conflict if the same organization/request ID changes audio bytes, task, model or key. Responses and audio are not retained for replay.
- `429`: Capacity or rate limit reached. Spectra-2 upload_busy and model_busy return Retry-After in seconds. Retry upload_busy with the same ID; model_busy closes the rejected attempt without inference or a charge, so use a new ID after waiting. For network/5xx errors retain the original ID.
- `default`: Stable error envelope

---

[API](https://skmtc.dev/oruk/apis/oruk-speech-api.md) · [All operations](https://skmtc.dev/oruk/apis/oruk-speech-api/llms.txt) · [OpenAPI document](https://skmtc.dev/oruk/apis/oruk-speech-api/revisions/c668cecab401?raw)
