Two days ago, Hume released its Audio Decision API: a single model that answers configurable questions about an audio clip and returns probabilities, not text. You ask "does this caller sound frustrated?" and get back a number. Ask "is anyone laughing?" and get another. Same recording, multiple questions, one call.
This matters past the demo because it names a pattern that is quietly becoming load-bearing in production voice agents: a parallel audio-native classifier running next to ASR, feeding probabilities into the same policy the LLM uses to decide what to do next. If your agent now escalates on frustration, soft-handles on hesitation, or routes on the presence of a second speaker, you are shipping a decision surface that your transcript-only tests do not touch.
What an audio-decision layer actually does
In a cascaded voice stack, the traditional flow is: audio in, ASR to text, LLM over text, TTS back out. The audio itself is thrown away before the model sees it.
A decision layer sits in parallel. Hume describes it as a model that takes a recording and your questions as input, and answers each question with probabilities instead of text. It returns no transcript, no reply, no explanation: just numbers your code combines with thresholds. The company reports 70.7% agreement with a human panel's average judgment, compared with 56.5% for an individual-rater baseline.
The questions are plain English. From the Python SDK quickstart, a single request can ask "does the agent talk over the caller?" and "how natural does the agent sound?" at the same time, each answered as either a yes/no probability or a probability distribution across a rating scale.
AlphaSignal's writeup positions the product as a parallel judgment layer whose probabilities can be combined with transcripts, application state, and business rules. That framing matters. This is not a drop-in emotion classifier. It is an arbitrary question-answering layer, and it collapses what used to be a stack of specialized audio models (speaker diarization, emotion, laughter detection, language ID) into one call.

The new fault surface
A perception layer introduces faults that do not show up in text-only tests. Three categories matter most.
Threshold faults. Probability in, decision out means you are maintaining a thresholds table somewhere. Set the frustration threshold at 0.6 and you wake up next week when a soft-spoken caller who genuinely needs help gets routed to a short-circuit "I will transfer you" script because the model crossed the line. Set it at 0.9 and you miss the ones you were trying to catch.
Population drift. The probabilities come from how human raters would judge the audio. That means they shift with the caller distribution. A model tuned on North American English call-center audio behaves differently on a bilingual household in Queens, on a recording with HVAC noise, or on an older caller with reduced pitch range. Hume advises teams to validate evaluations against representative human ratings. In production that means you own the drift monitoring.
Interaction faults. Your LLM policy now has two inputs for the same turn: the transcript and the probabilities. When they disagree, which wins? The transcript says "I am fine", the perception layer says 0.72 frustrated. A community discussion on daily.dev picks out exactly this case, where a flat "I'm fine" actually signals the opposite. Whichever branch you take needs to be exercised in test, not discovered in a postmortem.
What to test at the perception layer itself
Testing the decision layer in isolation is a separate job from testing your agent. You want to know what probabilities the layer returns for inputs you control.
- Hold prompts, answer criteria, thresholds, and API version fixed. AlphaSignal notes that keeping these constant across runs is necessary for meaningful comparisons when the underlying model changes. Treat your question set as versioned code, not configuration.
- Build a fixed audio corpus per question. For every question in production, you want a small bank of clips: clear positives, clear negatives, and the ambiguous middle. Rerun that corpus on every model refresh.
- Sweep thresholds against the corpus. The output you care about is the threshold calibration curve, not a single accuracy number. Get a sense of where you buy precision and where it costs you recall.
- Instrument confidence, not just the chosen label. A probability near 0.5 does not mean the model is unsure; Hume's docs are explicit that it means raters would split on the audio. Your policy needs to distinguish "the layer gave a confident 0.9" from "the layer flipped a coin."
What to test at the policy that consumes those probabilities
This is where voice-agent testing proper takes over. You are exercising the branching logic that routes on probabilities, and that branching logic is the part your users meet.
The right harness is end-to-end: real audio in, real agent out, real routes taken. Transcript-level unit tests cannot help here because the branch you are testing fires on the sound of the call, not on the words. You need simulated callers with controlled emotional register, pace, accents, and background noise, dialing your production endpoint over PSTN or WebRTC and being scored on what the agent actually does.
Roark's simulation testing is built for this shape. Personas define the caller's voice, language, accent, speech pace, emotional register, and background-noise environment. A run plan dials your agent over real telephony and plays each persona against your scenario. You can hold the LLM and prompt fixed and sweep the persona axis to find the inputs that cause your perception-layer branch to fire or to miss, and you can do it before any of this reaches production.

Designing scenarios that exercise the layer
Scenario design for a perception-aware agent is different from scenario design for a text agent. The question is not "what will the caller say", it is "what will the caller sound like while they say it".
A useful starting set for a support agent:
- Flat negatives. "I am fine" or "it is okay" delivered with a sigh, a long pause, or a drop in pitch. Tests whether the agent trusts the audio over the transcript when they conflict.
- Polite frustration. Everything is "please" and "thank you", but the pacing is clipped and the pitch is tight. Tests the realistic middle, not the easy extreme.
- Laughter at the wrong moment. Caller laughs during a serious instruction. Tests whether the agent misreads laughter as agreement.
- Multi-speaker contamination. A second voice in the background answers on behalf of the caller. Tests whether your perception question for "who is speaking" is stable when the primary caller is quiet.
- Background-noise shifts. Same script, same persona, different environment: quiet room, car cabin, cafe, street. Tests whether your thresholds hold when the acoustic conditions change.
- Accent and language variants. Same intent, different accents and languages. The decision layer and your thresholds need to behave consistently across the populations you serve.
Each of these is a persona plus a scenario, not a text transcript. Roark's personas cover distinct voices, languages and accents, speech pace, emotional register, and background-noise environments, and simulations cover 45 languages and accents, so a scenario set like the one above becomes a nightly job rather than a quarterly audit.
Regression testing when the model changes under you
Audio decision models are an API dependency. The vendor will retrain. Your prompts will not change, your thresholds will not change, and your probabilities will. Hume's docs are explicit that a probability estimates the share of human raters who would give that answer, which means the moment the rater pool is expanded or rebalanced, your decision boundary moves.
Three habits make that bearable.
- Freeze a labeled regression corpus. A few hundred real calls with human-labeled ground truth for each question you ask. Rerun it on every model or prompt change. This is the only honest way to measure drift at the layer itself.
- Capture every live call that crossed a threshold. The borderline cases are where regressions hide. If your agent took the "frustrated caller" branch last Tuesday, keep that recording and add it to the replay set.
- Replay production calls against the updated agent. Real failures beat synthetic ones. Roark's production call replay captures real calls and replays them against updated agent logic, so a production incident becomes a repeatable regression test instead of a one-off ticket.

Scoring a call that depends on audio
A separate question is how you score the calls your agent produces. If you only score the transcript, you miss the thing the perception layer exists to catch: a technically correct answer delivered with the wrong feel.
Roark's audio-native evaluation scores the sound of the call, not just the transcript: pronunciation, emotion, vocal stress, pace and pauses, and interruptions. That is the right ground truth to hold a perception-driven agent to, because it evaluates your agent on the same axis the agent is making decisions on. Every production call is scored against the suite, and what breaks is filed as an issue you can replay.
Note the point: the perception layer tells your agent what the caller sounded like, and your call scoring tells you what your agent sounded like in response. You want both, and you want them under the same regression harness.
Closing
The audio-decision layer is a useful pattern. It gives a cascaded voice agent access to signals that transcript-only pipelines throw away, and it collapses what used to be a stack of specialized classifiers into one call. The cost is a new decision surface that does not show up in text, does not stay stable across populations, and shifts when the vendor retrains.
Treat it the way you treat any new input to your agent. Write tests before you ship. Simulate the inputs that exercise each branch. Score the agent on the audio it produces. Freeze the calls you want to replay forever. The teams who do that will get the benefit of the perception layer. The teams who do not will find out from a customer.

