AMD: Answering Machine Detection Engine
In outbound calling, 30-40% of calls reach voicemail. Every second an agent waits for a machine to finish its greeting is wasted labor. The AMD Engine classifies answering entities in under 3 seconds using a four-feature decision tree — detecting humans, voicemail systems, beep tones, and unknown entities with explainable confidence scores.
1. The Outbound Calling Problem
Outbound contact centers face a persistent efficiency challenge: a significant fraction of calls connect to answering machines rather than humans. Without AMD:
- Agents wait 5-15 seconds listening to voicemail greetings before realizing no human is present
- False positives (human classified as machine) cause premature hangups and lost customers
- False negatives (machine classified as human) waste agent time on voicemail recordings
- Beep detection failures mean agents miss the opportunity to leave automated messages
Traditional AMD systems rely on single features (usually silence duration or greeting length) and take 5-8 seconds to reach a verdict — by which time, a human caller has already said “hello” and heard silence.
2. Four-Feature Decision Architecture
The AMD Engine extracts four orthogonal features from the first 3 seconds of audio:
3. Decision Tree Classifier
The four features feed into a priority-ordered decision tree:
Why a Decision Tree?
The AMD classifier deliberately uses a rule-based decision tree rather than a neural network for three reasons:
- Explainability — every verdict comes with a human-readable reason (“initial_silence=1800ms exceeds human threshold of 1500ms”)
- Calibration — thresholds can be tuned per carrier, region, or campaign without retraining
- Determinism — the same audio always produces the same verdict, critical for audit compliance
4. AMD Contracts
@dataclass(frozen=True)
class AmdFeatures:
initial_silence_ms: int # Silence after connect
greeting_duration_ms: int # First speech segment length
speech_continuity: float # 0.0-1.0 flow score
cadence_regularity: float # 0.0-1.0 rhythm uniformity
beep_tone_detected: bool # Frequency-domain beep flag
beep_frequency_hz: float # Dominant beep frequency
background_noise_level: float # Ambient noise floor
total_duration_ms: int # Total analyzed duration
@dataclass(frozen=True)
class AmdResult:
result_id: str
correlation_id: str
ts_ms: int
verdict: str # "human" | "machine" | "beep" | "unknown"
confidence: float # 0.0 - 1.0
features: AmdFeatures
reason: str # Human-readable explanation
5. SignalOS Integration
AMD results automatically convert to SignalOS signals:
Downstream Actions
| Verdict | Action |
|---|---|
| human | Route call to next available agent immediately |
| machine | Optionally leave pre-recorded message after beep |
| beep | Trigger automated message playback |
| unknown | Hold briefly, retry classification, or route to agent |
6. Evidence Pack Integration
AMD results are automatically included in the session evidence pack:
- AMD Card: verdict, confidence, all four feature values, decision reason
- Timeline: AMD classification timestamp relative to call connect
- Audit Trail: feature thresholds used, calibration version, carrier info
This ensures that every AMD decision is traceable and auditable for compliance.
7. Performance Characteristics
| Metric | Value |
|---|---|
| Classification latency | < 3 seconds from call connect |
| Beep detection accuracy | > 98% (strongest single feature) |
| Human/machine accuracy | > 92% (four-feature fusion) |
| False positive rate (human as machine) | < 3% |
| Kernel tests | 12 (classifier + contracts) |
| Frozen contracts | 2 (AmdFeatures, AmdResult) |
| Pure domain modules | 1 (amd_classifier.py) |
| Gate violations | 0 |