Attuned Resonance Intelligent Call Routing
Four-model routing cascade; PPO router beats a skill-weighted heuristic (+1.27 reward), offline only
For call-center routing, where the advisor assigned to a call shapes its outcome and those outcomes feed back into the routing policy.
At a glance
- Role
- Creator and technical lead (solo)
- Timeframe
- 2026 v2 research rework (B2 intake retrain Apr 2026)
- Team
- Solo
- Users
- No live users; research-stage benchmark
- Status
- Draft v0.1 research benchmark; offline metrics only, not deployed to live traffic
- Stack
- PyTorch, RoBERTa, wav2vec2, LSTM, Stable-Baselines3 PPO, ElevenLabs v3, Hugging Face
Problem and stakes
Call-center routing is a sequential decision problem with strong selection bias. The advisor assigned to a call largely determines its outcome, and those outcomes feed the routing policy that generates the next round of training data. Most existing work treats routing as queuing (Erlang-C, skill-based rules) or as single-step classification, and treats callers as interchangeable.
The original system was scope-cut to a single XGBoost model. Attuned Resonance is the reworked v2: the full original vision, made open for reuse.
Constraints
No access to live workforce telemetry, so the system relies on a synthetic simulator plus ~95,000 real anonymized transcripts (not redistributed). Voice-tone data had to be generated, not hand-annotated. Solo build on rented compute.
Options considered
Monolithic model vs. a cascade of specialized models: the cascade was chosen so each stage can be trained, evaluated, and replaced independently. For voice tone, hand-annotated emotion datasets were set aside in favor of synthesis-as-label (the TTS audio tag is the ground-truth label), which avoids annotator disagreement.
Decision
A four-model cascade with explicit feature contracts between stages: Intake NLP → Voice Tone → Outcome Predictor → RL Router. Callers are modeled with a 120-cell Jung × Campbell archetype taxonomy (12 archetypes × 10 hero's-journey phases) that drives behavior in the synthetic data.
Technical system
Intake NLP: roberta-base with six classification heads on a shared encoder (intent, action, sentiment, urgency, complexity, Jung type, Campbell phase), retrained on 90,093 transcripts on 2× H100.
Outcome Predictor: an LSTM over advisor history plus intake and advisor features, with heads for handle time, first-call resolution, and CSAT.
RL Router: PPO (Stable-Baselines3) with a delta reward against a skill-weighted-random baseline and top-k candidate filtering.
Voice Tone: a frozen wav2vec2-base with a small head, trained on 6,021 ElevenLabs v3 clips (34 voices × 10 emotions) using a voice-stratified split.
Synthetic generator: 6,000 advisors across 40 teams and 5 regions, 13.6M call records, and 12 weekly feedback cycles. Every hand-off between models has a smoke test in verify_models.py.
Execution
The "B2 cascade fix" (Apr 2026) caught a silent bug: the predictor was fed the intake model's intent vocabulary instead of its own call_type vocabulary, so every call fell back to class 0. Adding an action head aligned the vocabularies. The router's v2 flat reward plateaued, and v3's delta reward plus top-k filtering broke the plateau. Router training took 4h 17m on a single RunPod CPU pod.
Outcome
Offline research metrics only; outcomes in production not measured. Mean episode reward for the RL router went from -0.016 at step 2,500 to +1.27 at step 250,000, where positive means it beats the heuristic. The voice-tone classifier reached 59.9% test accuracy on 10 classes (random is 10%), and 91% on frustrated and 85% on angry. Real-speech transfer is not yet measured.
Reflection
The cascade structure made the B2 bug diagnosable, and the explicit feature contracts are deliberately brittle. The frozen audio backbone can't separate mid-arousal emotions (calm, anxious, confused). There is no fairness audit of assignments yet. Next steps: a full wav2vec2 fine-tune, fusing the tone vector into the predictor, a real-audio held-out eval, and a shadow-mode pilot.