EdTech Voice Tutors

View as Markdown

A voice tutor has different priorities than a contact-center bot. Clarity and patience matter more than shaving milliseconds off every turn, and factual accuracy matters more than in almost any other vertical: a hallucinated collections policy is annoying, but a hallucinated math step teaches a student the wrong thing.

This guide covers the architecture and tuning common to EdTech voice agents, then walks through the Tutor Agent example as the concrete implementation.

In short: slow the TTS down, let the LLM reason through step-by-step problems, and turn on wiki_grounding for anything factual so the tutor doesn’t confidently teach something wrong.

Architecture

Student Audio → STT (streaming) → Context Aggregator → LLM (reasoning-friendly) → TTS (streaming, slower pace) → Student

This is the standard voice-agent pipeline with a few deliberate changes from a latency-first setup like IVR:

1

Keep conversation context across the whole session

Unlike a single-intent contact-center call, a tutoring session builds on itself. A student’s question 10 turns in often references something explained earlier, so keep the full session in context (within the model’s context window) rather than resetting per question.

2

Let the LLM think for step-by-step problems

Math and science explanations benefit from the model actually reasoning through steps before answering. This is a case where the latency cost of reasoning_effort is worth paying, unlike routine conversational turns elsewhere.

3

Slow the TTS down

Set pace below the 1.0 conversational default. Students need time to process spoken explanations, especially numbers and multi-step instructions.

4

Ground factual answers

For “what is X” or “explain Y” style questions, especially history, science, and general knowledge, use wiki_grounding to retrieve and cite real content instead of relying purely on the model’s parametric knowledge.

LayerSettingWhy
STTsaaras:v3, mode="transcribe", language="unknown"Students code-mix (Hinglish, Tanglish) constantly, especially when discussing technical terms in English within a regional-language conversation
LLMsarvam-105b for problem-solving and explanations; sarvam-30b for quick fact lookupsStep-by-step math/science reasoning benefits from the larger model’s reasoning depth, and session pacing is more forgiving of latency here than in a live phone call
LLM paramswiki_grounding=True for factual/general-knowledge questionsReduces hallucination on “explain X” questions. See Improve response factual accuracy
TTSbulbul:v3, WebSocket streaming, pace=0.9, temperature=0.6Matches the “EdTech Narration” preset in TTS Best Practices: slightly slower than the conversational default, natural enough to hold a young learner’s attention
SpeakerA clear, articulate voice (e.g. ishita) rather than one optimized purely for warmthIntelligibility matters more than personality when the content is instructional

Latency targets

EdTech is more tolerant of latency than telephony IVR. A 1–2 second pause while sarvam-105b reasons through a step-by-step explanation reads as “thinking,” not as a dropped connection, especially in an app UI where you can show a typing/thinking indicator.

  • Don’t let it drift too far, though: still use streaming STT and streaming TTS so the student hears the first words of a response quickly, even while the full explanation is still generating.
  • For quick factual lookups (definitions, quick facts) that don’t need deep reasoning, route to sarvam-30b to keep the interaction snappy. Save the extra latency budget for genuinely hard problems.

Pitfalls

An EdTech bot that confidently states something wrong is worse than one that says “let me think about that differently.” Enable wiki_grounding for factual/general-knowledge questions rather than trusting the model’s parametric memory unconditionally.

The 1.0 conversational default is tuned for natural dialogue, not for a student parsing a multi-step algebra explanation for the first time. Use pace=0.9 (or slower) as the default for instructional content specifically.

The Tutor Agent system prompt explicitly instructs the model to “ask questions to check understanding” and adapt explanations. Don’t skip this in your own prompt: a tutor that only lectures isn’t actually tutoring.

reasoning_effort (and the default “low” thinking mode) adds latency and cost. That’s fine for problem-solving but wasted on “good job, next question” style turns. Consider disabling it (reasoning_effort=None) for short acknowledgement or encouragement turns.

A single generic system prompt won’t serve a 6th grader and a 12th grader equally well. Pass grade level and subject as session context rather than baking one difficulty level into the prompt.

Full example

The Tutor Agent guide has the complete, runnable code (Pipecat-based). The teaching-approach portion of the system prompt:

1messages = [
2 {
3 "role": "system",
4 "content": """You are an expert tutor designed to help students understand and excel in their studies.
5...
6Teaching approach:
7- Start with the basics and build up to complex concepts
8- Use real-world examples and analogies to explain abstract concepts
9- Break down complex problems into smaller, manageable steps
10- Encourage students and praise their efforts
11- Ask questions to check understanding
12- Adapt your explanations based on the student's level
13""",
14 },
15]

TTS tuned for instructional pacing:

1tts = SarvamTTSService(
2 api_key=os.getenv("SARVAM_API_KEY"),
3 target_language_code="en-IN",
4 model="bulbul:v3",
5 speaker="ishita",
6 pace=0.9, # Slightly slower for better understanding
7)