Skip to content

Try Resonance 2 early.

Tell us a little about yourself and what you’re building.

A brief description of your use case.

We’ll use these details to review your application and contact you about access. Privacy policy

Explore oruk

Emotion API

Speech Emotion Recognition API

Analyze vocal expression with selected emotion labels and timed segments, or use Resonance-2 Preview for continuous emotion and speaking-style scores.

Plans from $9/month · 7-day free trial · minutes included

Create your free account

Choose a plan after signup. Self-serve plans include a 7-day free trial.

Preview a recording — no account

The preview returns transcript, emotion, and speaking style together. Emotion API docs

Already have an account? Sign in · Compare plans

curl --fail-with-body https://speech-api.oruk.ai/v1/audio/emotions \
  -H "Authorization: Bearer $ORUK_API_KEY" \
  -F file=@call.wav -F model=oruk-resonance

Illustrative response · values depend on the recording

{
  "model": "oruk-resonance",
  "emotions": [
    { "label": "frustrated", "score": 0.83 },
    { "label": "worried",    "score": 0.61 }
  ],
  "usage": { "audio_seconds": 42.7, "billable_seconds": 42.7 }
}

Continuous scores with Resonance-2

The new preview returns all 31 emotion and speaking-style scores: six opposite pairs share signed axes, and 19 labels have independent scores. Call /v1/audio/resonance-2 with a 0.1–120-second clip, up to 30 MiB. It returns clip-level expression scores without a transcript, diarization, or streaming events.

Its selected labels list can be empty. The f1 and precision regimes change label thresholds; continuous scores stay the same. Save model_revision and calibration_revisionwith each result. Scores describe perceived expression, not a speaker's private feelings.

Existing accounts keep access. New organizations need Resonance-2 approval, separate from plan activation. Request it in Model access. Until approved, inference returns 403 with model_access_required. After approval, use your existing API key and shared speech allowance. The public demo is available without approval.

Run a short recording through Resonance 2

This CREMA-D recording is an actor saying “It's eleven o'clock” with intended happiness. The command downloads the sample from the dataset’s pinned source revision, sends it to the API, and saves the full response as result.json. Use a terminal with cURL and Python 3, an API key from an approved organization, and an active allowance or credit balance. The request uses your normal audio allowance. Run it in an empty directory; it writes clip.wav and result.json.

Terminal · Resonance 2 sample request
set -eu
: "${ORUK_API_KEY:?Set ORUK_API_KEY to your Oruk API key first}"

curl --fail --silent --show-error --location \
  'https://media.githubusercontent.com/media/CheyneyComputerScience/CREMA-D/1658cd342dff90010aa843eaeebd53610a08b1dc/AudioWAV/1001_IEO_HAP_MD.wav' -o clip.wav
request_id="$(python3 -c 'import uuid; print(uuid.uuid4())')"

curl --fail-with-body --silent --show-error \
  'https://speech-api.oruk.ai/v1/audio/resonance-2?regime=f1' \
  -H "Authorization: Bearer $ORUK_API_KEY" \
  -H "X-Request-ID: $request_id" \
  -F model=oruk-resonance-2 -F file=@clip.wav -o result.json

python3 - <<'PY'
import json
from pathlib import Path

result = json.loads(Path("result.json").read_text())
print("Selected labels:", result["labels"])
print("Sad (-) / happy (+):", result["axes"]["sad__happy"])
print("Model revision:", result["model_revision"])
print("Calibration revision:", result["calibration_revision"])
PY

Keep request_id and the same audio if you retry the cURL request after a timeout. Starting the whole example again creates a new request. SDK 0.2.10 has no dedicated helper for this route; the example uses HTTP directly.

Listen and compare with the saved September 17 response

The saved response selected energetic (0.797) and happy (0.785). Its sad__happy axis was 0.785. That positive value favors happy; it is not a 79% probability of happiness. A new request may differ as the preview changes, so keep both revision fields. An empty labels array is also a valid result.

This is one format example, not an accuracy estimate. The research article includes all six examples from this actor, including mistakes.

CREMA-D, Cao et al. (2014). Audio source and license · Complete saved response and provenance · API fields and error handling

Read the HTTP response reference or listen to six real API examples, including the model's mistakes.

Use the original emotion endpoint

  1. 01

    Create your account. Create a free account, then choose a plan in your portal. Self-serve plans include a 7-day free trial. Add your card when you activate the trial; no charge is made today.

  2. 02

    Send audio. POST a prerecorded English audio file (WAV, FLAC, MP3, M4A, OGG, or WebM; up to 30 MB / 60 minutes) to /v1/audio/emotions.

  3. 03

    Read selected labels and segments. The model scores a vocabulary of 15 emotion labels and returns labels selected with model-specific thresholds. If none passes, it returns the highest-scoring emotion. A clip can carry several labels; long files include time-local segments.

A request you can run

Resonance 1 is oruk’s flagship speech recognition model. It transcribes English recordings and analyzes emotion and speaking style in one request. For emotion scores alone, use the emotions endpoint below. It omits transcript text. Choose analysis when you also need words and speaking styles.

cURL · emotion-only request
curl --fail-with-body https://speech-api.oruk.ai/v1/audio/emotions \
  -H "Authorization: Bearer $ORUK_API_KEY" \
  -F "file=@recording.wav" \
  -F "model=oruk-resonance"

Read the emotions array for recording-level label scores and segments for time-local results. usage.audio_seconds reports measured duration. Thresholded labels are model annotations, not a determination of a speaker’s private feelings.

Python walkthrough · Response reference · Interpret segment scores

Hear a recording and inspect its scores

This saved unified-analysis result uses the same label-and-score structure as the emotion endpoint. Its diarized intervals are speaker turns; an emotion-only request can return different acoustic windows. Listen to the recording and inspect the original JSON before choosing how your application should use these annotations.

The price of groceries · 14.45 seconds. This previously published analysis response contains model-generated annotations. It illustrates the format; it is not a new accuracy measurement.
Read the saved model transcript

I'm sorry. The price of food has gone up so much. I mean... It really has. What what happened? I don't know. Like, honestly, I don't know what happened.

  1. 0.185–4.325 sdisappointed 0.868
  2. 4.325–6.065 shappy 0.780neutral 0.756
  3. 6.065–7.805 sangry 0.903frustrated 0.849disgusted 0.847
  4. 8.805–14.125 sdisgusted 0.845frustrated 0.827angry 0.815
Inspect the JSON excerpt
Saved analysis response · first interval
{
  "id": "speech_a852195bbb04415d8b506d94d5a09148",
  "task": "analysis",
  "model": "oruk-resonance",
  "duration": 14.45,
  "segments": [
    {
      "start": 0.185,
      "end": 4.325,
      "emotions": [
        {
          "label": "disappointed",
          "score": 0.8679338097572327
        }
      ]
    }
  ]
}

Cost estimates in this saved JSON are historical reference values. Use your current plan and account usage to check billing.

Open Yap 1K, The Agentic Data Company (2026), CC BY 4.0. Oruk excerpted and downmixed the audio. Attribution and scope · Complete saved response · Replay each passage in Python

Choose the response your application needs

Emotion scores
/v1/audio/emotions returns selected emotion scores and acoustic intervals without transcript text. Keep an existing ASR such as Whisper.
Transcript, emotion, and style
/v1/audio/analysis returns all three together. Add diarize=true on Resonance when you need speaker-labeled turns.
Continuous emotion and style
Resonance-2 Preview returns all 31 scores and selected labels for a short clip. It uses a dedicated route and does not return timed segments or transcript text.
Live speech
/v1/realtime is a separate preview for multilingual tokens and phrase-emotion events. Its output differs from the 15-label English file API.

How Reflect uses emotion suggestions

In its August 2026 React Native demo, Reflect used Oruk's public speech API to suggest feelings after a spoken reflection. The user could read a definition, choose what fit, or select “Something else.” That choice gave the app context for its next question.

“we didn't want to make direct assumptions about the user's emotional state”
Shane Pope, Reflect

Read the Reflect story and see the interface.

Evaluate on the recordings your product will process

The September 17 Resonance-2 run classified 337 of 546 CREMA-D recordings correctly (61.7%). All 170 empty or out-of-taxonomy answers count as errors. This fixed-sentence acted diagnostic has unaudited training overlap; it does not establish independent accuracy on conversations. Read the recorded results, replay instructions and limitations or inspect all predictions.

Our September 7, 2026 run sent 546 CREMA-D recordings through oruk-fourier and recorded 55.7% accuracy and 0.542 macro F1 on a six-class task. This is acted speech; training overlap has not been audited. It is a dated Fourier result, not a current Resonance accuracy estimate. Replay the saved responses and inspect the errors.

Use speaker-independent examples from your domain, including silence, noise, accents, and overlapping speech. Review per-label precision and recall, missed events, and confidence calibration. A public score for the historical Resonance checkpoint does not establish the accuracy of the current Resonance endpoint.

The separate Realtime preview streams transcription in 32 locales with automatic language detection and phrase-level emotion scores. Resonance 2 returns 15 emotion and 16 speaking-style scores for explicit WebSocket commits or file requests, without transcription or timestamps. Original unified analysis uses the English file endpoints.

Published benchmark, with its limits

speech-emotion-bench

77.8% accuracy

Top measured result in our July 2026 release. Open models use the full 64,384 held-out clips; closed/API and audio-LLM systems use a fixed 5,000-clip subset. The highest-scoring non-oruk row is emotion2vec+ seed at 68.7%. The caveat, stated plainly: the oruk entry is trained in-distribution while other systems are evaluated zero-shot. This seven-class result does not establish the current 15-label endpoint’s accuracy on your recordings. Protocol and downloadable results are on the methodology page.

What a response means

On the original Resonance and Fourier file endpoints, a returned emotion either passed its model-specific threshold or was the highest-scoring fallback when none passed. Resonance-2 never forces a top label: its selected labels can be empty, while all 31 continuous scores are returned. Scores describe perceived vocal expression, not probabilities of a speaker’s feelings. Validate them on your speakers and recording conditions before setting application rules.

Try it yourself first: run the live analyzer on your own voice, no account needed.

Data handling: Request audio is discarded after processing; Resonance 2 streams also buffer audio in memory until reset or session closure. Resonance 2 result payloads, without raw audio, are stored for durable settlement and same-ID replay. Authorized replay is available for 24 hours; this is not a physical-deletion deadline. Optional speaker diarization retains uploaded audio for up to 48 hours and speaker-label results for up to 24 hours. Oruk does not use customer audio or outputs to train, fine-tune, or evaluate models without your explicit written agreement. Processing details are in the privacy policy.

Start free trial

Plans from $9/month. $0 today, cancel any time.

The original endpoint’s 15 emotion labels

On /v1/audio/emotions, every label is scored on every request. Labels crossing their model-specific threshold are selected; if none cross, the highest-scoring label is returned as a fallback so responses are never empty. Emotion responses intentionally omit transcript text — use /v1/audio/analysis when you want the transcript, emotion, and speaking style together.

Select a label to explore.

Pricing

Emotion scoring with Resonance or Resonance-2 uses one minute from the shared other-model allowance per minute of audio. Plans start at $9/month with 250 minutes included; Builder ($49/month) includes 2,500 minutes, roughly 41.7 hours of emotion scoring, with additional minutes at $0.015 each. Every response reports its own measured duration. Self-serve plans start with a 7-day free trial. Full plan details are on the pricing page.

Start free trial

Plans from $9/month. $0 today, cancel any time.

Exactly what you are buying

The limits below are stated here so you do not discover them after integrating.

Input
The original Resonance and Fourier file endpoints accept prerecorded English audio. Resonance-2 at /v1/audio/resonance-2 accepts short clips without a language-code parameter; accuracy across languages is not established. Both accept WAV, FLAC, MP3, M4A, OGG, and WebM.
Realtime preview
The separate Realtime preview streams transcription in 32 locales with automatic language detection and phrase-level emotion scores. Resonance 2 returns 15 emotion and 16 speaking-style scores for explicit WebSocket commits or file requests, without transcription or timestamps. Original unified analysis uses the English file endpoints.
File limits and formats
The original Resonance and Fourier file endpoints accept up to 30 MB and 60 minutes per file. Resonance-2 accepts 0.1–120 seconds and up to 30 MiB per clip. Both accept WAV, FLAC, MP3, M4A, OGG, and WebM.
Request behavior
File endpoints return a synchronous JSON response with measured audio duration. Realtime uses WebSocket events for live tokens and phrase-level emotion. Resonance 2 WebSocket commits return expression scores for a buffered sample range.
Pricing
Monthly plans start at $9. Resonance, Fourier, Realtime, and Proficiency share one audio-minute allowance. Orukeet has a separate allowance; its optional tasks use that allowance at their listed rates. The other-model allowance ranges from 250 minutes on Hobby to 20,000 on Production. Extra usage follows each allowance's published rates. Self-serve plans start with a 7-day free trial. Contact us for Enterprise pricing. Details on the pricing page.
Data retention and training
Request audio is discarded after processing; Resonance 2 streams also buffer audio in memory until reset or session closure. Resonance 2 result payloads, without raw audio, are stored for durable settlement and same-ID replay. Authorized replay is available for 24 hours; this is not a physical-deletion deadline. Optional speaker diarization retains uploaded audio for up to 48 hours and speaker-label results for up to 24 hours. Oruk does not use customer audio or outputs to train, fine-tune, or evaluate models without your explicit written agreement.
What scores are — and are not
On the original Resonance and Fourier file endpoints, a returned emotion either passed its model-specific threshold or was the highest-scoring fallback when none passed. Resonance-2 never forces a top label: its selected labels can be empty, while all 31 continuous scores are returned. Scores describe perceived vocal expression, not probabilities of a speaker’s feelings. Validate them on your speakers and recording conditions before setting application rules.
Model and version stability
The original Resonance and Fourier models are stable. Resonance-2 is preview; Realtime and Proficiency 1 are in preview. Save Resonance-2 model_revision and calibration_revision with its result. Changes are announced on the Oruk changelog.
Support
Email access@oruk.ai; the production guide covers retries, limits, and error handling.
Start free trial

Plans from $9/month. $0 today, cancel any time.

Try it free for 7 days

Plans start at $9 a month, with access to every speech model. Add a card, pay nothing today, and cancel any time before the trial ends.