Anva for Pipecat

Give your Pipecat agent a face.

Drop one service into the pipeline you already have. Anva takes the audio your TTS produces and returns the avatar's video and voice as ordinary Pipecat frames — on Daily, LiveKit, or any transport that sends video.

Two lines in the pipeline you already have

pip install pipecat-anva

A Pipecat pipeline with an Anva avatar
from pipecat_anva import AnvaVideoService

anva = AnvaVideoService(api_key=os.environ["ANVA_API_KEY"], avatar_id="av_...")

pipeline = Pipeline([
    transport.input(),
    stt,
    context_aggregator.user(),
    llm,
    tts,
    anva,                    # after the TTS, before the transport
    transport.output(),
    context_aggregator.assistant(),
])

# Daily: enable video out at the avatar's size
DailyParams(video_out_enabled=True, video_out_width=480, video_out_height=480, ...)

How it works

  1. It sits after your TTS. AnvaVideoService takes the audio your TTS produces instead of letting it go straight to the transport, so you never hear the line twice.
  2. The avatar comes back as ordinary frames. Video arrives as OutputImageRawFrame and the voice as TTSAudioRawFrame, in sync — so Daily, LiveKit, WebRTC or any transport with video out just works.
  3. Interruptions stop the face mid-sentence. An InterruptionFrame cancels what is playing and drops what was queued. Sending is paced by playback reports, so a long answer is never front-loaded.

Common questions

Does this only work with Daily?
No. The service returns plain Pipecat frames, so it works with any transport that can send video out — Daily, LiveKit, WebRTC, or your own.
Do I have to change my STT, LLM or TTS?
No. Anva adds a face to the speech your pipeline already produces. Everything else stays exactly as it is.
What size is the video?
Anva renders 480×480 at 25 fps by default. Set your transport’s video_out_width and video_out_height to match, or let the transport scale it.
How is it billed?
At the Avatar Only rate, per connected minute, on the Developer plan or above. Nothing is billed until the session is connected.

Give it a face

The full reference — session options, webhooks, the events socket and every error code — is in the documentation.