> For clean Markdown of any page, append `.md` to the page URL.
> For a complete documentation index, see https://docs.sarvam.ai/llms.txt.
> For full documentation content in one file, see https://docs.sarvam.ai/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.sarvam.ai/_mcp/server.

# EdTech Voice Tutors

> Architecture, model configuration, and pitfalls for building voice-based tutoring agents with Sarvam AI.

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](/api/cookbook/example-voice-agents/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:

#### 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.

#### 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.

#### 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.

#### 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.

## Recommended models & params

| Layer      | Setting                                                                                                                      | Why                                                                                                                                                                                                                                                     |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| STT        | `saaras:v3`, `mode="transcribe"`, `language="unknown"`                                                                       | Students code-mix (Hinglish, Tanglish) constantly, especially when discussing technical terms in English within a regional-language conversation                                                                                                        |
| LLM        | `sarvam-105b`; raise `reasoning_effort` for problem-solving and explanations, `reasoning_effort=None` for quick fact lookups | Step-by-step math/science reasoning benefits from deeper reasoning, and session pacing is more forgiving of latency here than in a live phone call                                                                                                      |
| LLM params | `wiki_grounding=True` for factual/general-knowledge questions                                                                | Reduces hallucination on "explain X" questions. See [Improve response factual accuracy](/api/api-guides-tutorials/chat-completion/how-to/improve-response-factual-accuracy)                                                                             |
| TTS        | `bulbul:v3`, WebSocket streaming, `pace=0.9`, `temperature=0.6`                                                              | Matches the "EdTech Narration" preset in [TTS Best Practices](/api/api-guides-tutorials/text-to-speech/best-practices#11-use-case-quick-reference): slightly slower than the conversational default, natural enough to hold a young learner's attention |
| Speaker    | A clear, articulate voice (e.g. `ishita`) rather than one optimized purely for warmth                                        | Intelligibility 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, set `reasoning_effort=None` to keep the interaction snappy. Save the extra latency budget for genuinely hard problems.

## Pitfalls

#### Hallucinated facts

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.

#### Pace too fast for the content

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.

#### No check for understanding

The [Tutor Agent](/api/cookbook/example-voice-agents/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 mode left on for every turn

`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.

#### Ignoring the student's level

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](/api/cookbook/example-voice-agents/tutor-agent) guide has the complete, runnable code (Pipecat-based). The teaching-approach portion of the system prompt:

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

TTS tuned for instructional pacing:

```python
tts = SarvamTTSService(
    api_key=os.getenv("SARVAM_API_KEY"),
    language_code="en-IN",
    model="bulbul:v3",
    speaker="ishita",
    pace=0.9,  # Slightly slower for better understanding
)
```