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 PyPIInstallation
This is a community-maintained package distributed separately frompipecat-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
synthesizeror pre-recordedcache - Writable working directory: clips are cached in
.clip_cache/by default. Delete that directory after changing voice.
prewarm() at application start to move that cost out of the request path.
Configuration
Constructor arguments forBackchannel. Every default works unconfigured; each
argument replaces one part of that default.
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 theparams 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: