A production-grade transcription analysis system that combines local ML models (cost-free, instant) with LLM intelligence (high-value reasoning) for enterprise call analytics.
| Aspect | Details |
|---|---|
| Purpose | Analyze customer/internal calls to extract topics, sentiment, risks, and strategic insights |
| Architecture | Hybrid: local models (Hugging Face, spaCy) + LLM (Claude/OpenAI) |
| Input | Transcript directories with meeting-info.json, transcript.json, summary.json |
| Output | JSON report + PowerPoint slides with analytics & insights |
| Scale | Processes 1-1000s of calls; LLM calls bounded regardless of volume |
┌──────────────────────────────────────────────────────────────────────┐
│ TRANSCRIPT INTELLIGENCE AGENT v3 │
└──────────────────────────────────────────────────────────────────────┘
INPUT LAYER
│
┌───────────────┴───────────────┐
│ │
┌─────▼────────┐ ┌──────────▼──────────┐
│ Transcript │ │ Meeting Info │
│ (JSON) │ │ Summary (JSON) │
└─────┬────────┘ └──────────┬──────────┘
│ │
└───────────────┬───────────────┘
│
┌───────▼──────────┐
│ Validation Layer │
└───────┬──────────┘
│
┌───────────┴──────────────┐
│ │
┌───────────▼──────────────┐ ┌──────▼──────────┐
│ Call Type Detection │ │ Full Text Build │
│ (Rule-based) │ │ (Join Sentences)│
└───────────┬──────────────┘ └──────┬──────────┘
│ │
└───────────┬─────────────┘
│
┌───────────────────────▼────────────────────────┐
│ PER-CALL HYBRID ANALYSIS LAYER │
│ (ONE ANALYSIS PER TRANSCRIPT) │
├────────────────────────────────────────────────┤
│ LOCAL MODELS (Cost: load-time only) │
│ ├─ Topic Classification (BART zero-shot) │
│ ├─ Topic Mapping (sentence-transformers) │
│ ├─ Sentiment Analysis (DistilBERT) │
│ ├─ Action Item Extraction (spaCy NER) │
│ ├─ Risk Keyword Scoring (regex + heuristics) │
│ └─ Speaker Engagement (turn counts) │
│ │
│ + Optional: Per-Call LLM Summary │
│ (Disabled by default — expensive) │
└────────────────────────┬─────────────────────┘
│
Per-Call Analysis JSON
(topic, sentiment, risks, actions)
│
┌────────────┴─────────────┐
│ │
▼ ▼
┌─────────────────────┐ ┌───────────────────┐
│ All Transcripts │ │ All Analyses │
│ (list of dicts) │ │ (list of dicts) │
└─────────────────────┘ └───────────────────┘
│ │
└────────────┬─────────────┘
│
┌────────────────────────▼─────────────────────┐
│ CROSS-CALL INSIGHTS LAYER (1 LLM CALL) │
├──────────────────────────────────────────────┤
│ Aggregates: │
│ • Topic distribution (call counts) │
│ • Sentiment trends by call type │
│ • Risk flags (consolidated list) │
│ • Feature requests (from actions) │
│ • Call digest (top 8 calls by risk/sentiment)│
│ │
│ LLM Generates: │
│ • Executive summary │
│ • Strategic insights (with evidence) │
│ • Risk assessment │
│ • Opportunities │
│ • Stakeholder actions (Sales, Product, etc.)│
└────────────────────────┬──────────────────────┘
│
Cross-Call Insights JSON
(executive_summary, insights,
risks, opportunities, actions)
│
┌────────────────────────▼─────────────────────┐
│ SLIDE CONTENT LAYER (1 LLM CALL) │
├──────────────────────────────────────────────┤
│ Input: │
│ • Statistics (aggregated counts) │
│ • Executive summary │
│ • Top insights │
│ • Stakeholder actions │
│ • Per-call digest │
│ │
│ LLM Generates Structured JSON: │
│ • Slide titles & subtitles │
│ • Headline statistics │
│ • Key findings (bullet points) │
│ • Charts: pie (topics), bar (call types) │
│ • Risk themes (top + secondary) │
│ • Expansion opportunities │
│ • Impact table (customer-level signals) │
└────────────────────────┬──────────────────────┘
│
JSON with Slide Schema
│
┌────────────────────────▼─────────────────────┐
│ OUTPUT GENERATION LAYER │
├──────────────────────────────────────────────┤
│ JSON Report: agent_analysis_results_v3.json │
│ ├─ Metadata (timestamps, config) │
│ ├─ Statistics (call counts, topics) │
│ ├─ Individual analyses (all calls) │
│ ├─ Cross-call insights │
│ └─ Failed calls (with errors) │
│ │
│ PowerPoint: generate_slide.py │
│ ├─ Loads results JSON │
│ ├─ Passes to build_deck.js (Node) │
│ └─ Outputs: Customer_Call_Intelligence... │
│ _Run_Summary.pptx │
└──────────────────────────────────────────────┘
# Paths
DATASET_PATH=./dataset # Where transcripts live
OUTPUT_PATH=./outputs # Where results go
# LLM Provider
LLM_PROVIDER=openai # "openai" (Claude not yet in LLMClient.__init__)
OPENAI_API_KEY=sk-... # Your OpenAI key
# Feature Flags
USE_LOCAL_CLASSIFIER=true # BART zero-shot for topic
USE_LOCAL_SENTIMENT=true # DistilBERT for sentiment
USE_LOCAL_NER=true # spaCy for action items + risks
PER_CALL_LLM_SUMMARY=false # Expensive; default off
# Models
OPENAI_MODEL=gpt-4o-mini
TAG_CACHE_PATH=./tag_topic_cache.jsonDATASET_PATH=./dataset
OUTPUT_PATH=./outputs
LLM_PROVIDER=openai
OPENAI_API_KEY=sk-...
OPENAI_MODEL=gpt-4o-mini
USE_LOCAL_CLASSIFIER=true
USE_LOCAL_SENTIMENT=true
USE_LOCAL_NER=true
PER_CALL_LLM_SUMMARY=false
TAG_CACHE_PATH=./tag_topic_cache.json
python orchestrator.pyOutput:
outputs/agent_analysis_results_v3.json— Complete analysis- Console: progress, summary stats, insights
python generate_slide.py outputs/agent_analysis_results_v3.json outputs/my_deck.pptxOr with defaults:
python generate_slide.pyfrom config import DATASET_PATH
from transcript_loader import load_transcript
from local_analyzers import classify_sentiment_local
# Load one call
t = load_transcript(DATASET_PATH / "call_0")
# Analyze sentiment
result = classify_sentiment_local(t["full_text"], t["sentences"])
print(result["sentiment_label"], result["sentiment_score"])| Stage | Time | Cost | Notes |
|---|---|---|---|
| Load (N calls) | ~0.1s per call | $0 | Sequential file I/O |
| Local analysis (N calls) | ~2–5s per call | $0 | Model load is one-time cost |
| Cross-call insights (1×) | ~2–3s | ~$0.01 | Fixed prompt size |
| Slide content (1×) | ~2–3s | ~$0.01 | Fixed prompt size |
| Total (100 calls) | ~10–15 min | ~$0.02 | Dominated by local model load |
Scaling:
- 1–10 calls: ~1 min
- 100 calls: ~10 min
- 1000 calls: ~100 min (model load amortized)
Version: 3.0 (Modularized)
Last Updated: 2026-06-16
License: Proprietary