Skip to main content

Overview

Backchannel makes your bot sound like it’s listening while the user is still talking. It plays short continuers (“mhm”, “yeah”, “right”) on pauses that the turn model reads as incomplete, so the user gets a live-sounding call instead of silence until they finish. A backchannel takes no turn: every frame passes through unchanged, and nothing reaches the LLM context, so the bot’s conversation history has no record that it happened. Clips are recorded once from your own TTS service and cached on disk, so they come out in the bot’s voice and cost no LLM call and no network round trip at playback time.

Source Repository

Source code, examples, and issues for the Backchannel integration

PyPI Package

The pipecat-backchannel package on PyPI

Installation

This is a community-maintained package distributed separately from pipecat-ai:

Prerequisites

No account or API key of its own. Clips are recorded through the TTS service already in your pipeline, so whichever keys that service needs are the only ones involved.
  • Pipecat 1.6.0 or later: pipecat-ai>=1.6.0,<2
  • A TTS service in the pipeline: used once to record the clips, unless you pass your own synthesizer or pre-recorded cache
  • Writable working directory: clips are cached in .clip_cache/ by default. Delete that directory after changing voice.
The first session records the clips and is held in startup while it does. Call prewarm() at application start to move that cost out of the request path.

Configuration

Constructor arguments for Backchannel. Every default works unconfigured; each argument replaces one part of that default.
BackchannelParams
default:"None"
Timing and frequency of the gate. See Params below.
Mapping[str, Sequence[str]]
default:"None"
The clip inventory, grouped by conversational function (continuer, agreement, hesitation, surprise). Give each group at least two clips, or it repeats itself.
ClipSelector
default:"None"
Which clip to play at a given moment. Defaults to HeuristicClipSelector.
Callable[[], BaseTurnAnalyzer]
default:"None"
Builds the end-of-turn classifier for each pipeline. Defaults to shared_turn_analyzer, giving each pipeline its own analyzer over one process-wide ONNX model.
ClipSynthesizer
default:"None"
Produces clips instead of recording them from the pipeline’s TTS service. Only needed to use a different voice than the bot’s own.
ClipCache
default:"None"
Where clips are kept between runs. Defaults to FileClipCache(".clip_cache").
float
default:"0.6"
How loud clips play, relative to the recording. Below 1.0 by default, because a backchannel belongs underneath the person who still has the floor.
AutoPlacement
default:"None"
How the processors find their positions in the pipeline.

Params

Runtime tuning passed via the params constructor argument using BackchannelParams(...).
The integration runs its own VAD and turn analyzer, separate from the pipeline’s: pause timing needs the opposite settings from turn-taking. Expect roughly 2x that inference while the user speaks, and measure before a large deployment. See the source repository for the authoritative, up-to-date list of parameters and defaults.

Usage

Backchannel is a wrapper around your processor list, not a service you place yourself. It inserts its processors for you and returns a new list:
Record the clips at application startup so the first caller doesn’t wait:
Some stretches of a call want a silent listener: a dictated card number, or a form where each pause belongs to a field. Pull the gate out of the returned list and flip it at any time:

Compatibility

Tested with Pipecat v1.6.0. Check the source repository for the latest tested version and changelog.