---
title: "Scripted Presenter Daily — talking-head segments, one call per beat"
tier: hero
format: video
theme: presenter | daily | scripted
persona: creator, marketer, comms
duration: "~10–20 min"
budget_usd: "~$6–$18 ($0.315 per second of speech — the script IS the bill)"
caps: ["avatar-x-t2v", "avatar-x-ref2v", "ffmpeg-concat", "ffmpeg-burn-subtitles", "ffmpeg-export"]
skills: ["avatar-x", "cinematography", "finishing-quality"]
showcases: ["/chapters/scripted-presenter-daily-example.html"]
status: "live"
reliability: 3.6 # 5/5 across both endpoints at registration; slow (~316s) and priced per second of speech
---

# Scripted Presenter Daily — agent playbook

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code.
> Livepeer Agent turns a script into a presenter segment — voice and performance in
> one call, no separate TTS and no lip-sync pass — then cuts it for the platform.
>
> **Read the constraint first:** you choose an actor, and the actor's own setting
> comes with them. The stock library is UGC/selfie-framed rooms, not sets — there
> is no way to art-direct the background, framing or wardrobe. This playbook makes
> creator-style pieces to camera, NOT a studio news desk. If you need a specific
> location, generate the scene and put a talking head on it instead.

## What you'll get

- **A presenter reading your script**, in the voice that comes with the avatar
- **A second voice** for a guest beat, if the brief has one
- **Burned captions** and a platform export
- **A per-beat cost line**, because the script length *is* the bill

## Why one call, not three

The usual route is `chatterbox-tts` → `talking-head`: generate the voice, then
animate a still to it. Two billable steps, two failure points, and the lip-sync is
only as good as the alignment.

Avatar X does it in one: you give it words and an actor, it returns a person
saying them. That is the entire reason to reach for it.

## Tell the agent about the segment

```yaml
segment_title:      # e.g. "Monday Update"
beats:              # one per shot. KEEP EACH UNDER ~40 WORDS — see the gates.
  - avatar: Jasmine
    script: "Good evening. Tonight on the desk: …"     # 50–1500 chars
  - avatar: Michael
    script: "Thanks. From the engineering side, …"
guest_audio_url:    # OPTIONAL. A real VO track to drive a face instead of a script.
guest_face_url:     # OPTIONAL. The still or clip that VO should drive (ref2v).
aspect: follows_avatar   # NOT settable — each actor has a 16:9 variant, pick that
captions: true
max_spend_usd: 20.00
output_slug:        # kebab-case filename prefix
```

## Conventions (how the agent must run)

1. **`script`, never `prompt` — and no art direction at all.** Avatar X has no
   prompt field and rejects one outright (`extra_forbidden`). If the brief reads
   like a visual description ("a woman at a news desk"), say plainly that this
   capability chooses neither the set nor the framing: you pick an actor from 21
   and get their room. Offer the alternative (generate the scene +
   `talking-head` / `veed-lipsync-v2`) rather than rendering something that will
   not match the brief.
2. **Length gate — the important one.** Output runs as long as the speech, billed
   at **$0.315/s**. Measured: **230 characters produced 13.48s of video** (~17
   chars per second of speech) for **$4.25**, and took **~316 seconds to render**. State the per-beat dollar figure and the
   expected wait BEFORE rendering. Refuse to exceed `max_spend_usd`. Push back on
   any single beat over ~40 words: split it.
3. **Warn about the wait.** ~5 minutes per beat. Tell the user it is running;
   do not promise a time.
4. **Aspect is not a parameter.** It follows the avatar: bare names are 9:16
   portrait, so choose the `(16:9)` variant when the deliverable is landscape.
   Passing `aspect_ratio` does nothing.
5. **No fallback.** If a beat fails, report it — do not substitute a different
   avatar or a stock clip. The user chose the presenter.

## Steps

### 1 — Render each beat

```jsonc
run_capability({
  capability: "avatar-x-t2v",
  inputs: { script: "<beat.script>", avatar: "<beat.avatar>" }
})
```

Show each beat as it lands, with its cost. **STOP** after the first beat for
approval before rendering the rest — a wrong avatar or tone is cheaper to catch
once than five times.

### 2 — The guest beat, if there is one

When the brief supplies real audio (a recorded VO, a clip from an interview),
drive a face with it instead of a script:

```jsonc
run_capability({
  capability: "avatar-x-ref2v",
  inputs: { audio_url: "<guest_audio_url>", image_reference_url: "<guest_face_url>" }
})
```

Output length equals the audio's, and audio can be 180s upstream — at $0.315/s
that is ~$56.70, so check the track's duration first and say the number.

### 3 — Assemble, caption, export

```jsonc
create_media({ action: "generate", model_override: "ffmpeg-concat",
  inputs: { clips: ["<beat 1>", "<beat 2>", "…"] } })

create_media({ action: "generate", model_override: "ffmpeg-burn-subtitles",
  inputs: { video_url: "<assembled>", granularity: "word" } })

create_media({ action: "generate", model_override: "ffmpeg-export",
  inputs: { video_url: "<captioned>", width: 1080, height: 1920, mode: "cover" } })
```

## Deliver

- the assembled segment, plus each beat on its own so a single line can be redone
- **cost**: per beat and total, with the per-second rate so tomorrow's script can
  be priced before it is written
- one honest line on whether the delivery suited the copy — this model reads a
  script, it does not act a brief

## When to use something else

| If… | Use |
|---|---|
| you already have finished video and only need new audio | `veed-lipsync-v2` — ~4× cheaper, built for dubbing |
| you have one still to make speak | `talking-head`, or `sync-lipsync-v3` for illustrated characters |
| you need a specific real person's likeness | `heygen-twin` (15s of training footage) |
| the segment is mostly b-roll with narration over it | generate the video, then `ffmpeg-mux` the VO — far cheaper |
| the brief specifies a set, location or wardrobe | generate the scene, then `talking-head` / `veed-lipsync-v2` |
