ai-podcast — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ai-podcast (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Create multi-person talking head podcast videos using the inference.sh pipeline: portrait generation → TTS audio → avatar video → merge. Supports real humans (via Phota), 3D mascots, illustrated characters, and mixed casts.
Use when the user wants to create a podcast, talking head video, demo reel, promotional conversation, or any multi-speaker video content.
Characters (images) → TTS (audio per turn) → Avatar (video per turn) → Merge (final video)#### Step 1: Character Creation
Choose the right tool per character type:
| Character Type | Tool | Notes |
|---|---|---|
| Real human (new) | pruna/p-image | 16:9, prompt_upsampling: true. Quick, no training needed, but identity won't be consistent across multiple generations. |
| Real human (consistent ID) | phota/generate with [[profile_id]] | Consistent identity across all shots. Requires a trained Phota profile first (see below). |
| Brand mascot / logo character | google/gemini-3-pro-image-preview | Pass logo + character sheet as reference images |
| Illustrated / stylized | google/gemini-3-pro-image-preview | Pass style reference as input image |
Training a Phota identity (optional but recommended for humans):
If you need a real human character with consistent identity across multiple angles and shots, train a Phota profile first:
infsh app run phota/train --input '{
"images": ["url1.jpg", "url2.jpg", ...],
"wait": true
}' --save profile.jsonwait: trueprofile_id you then use in phota/generate as [[profile_id]] in promptsIf you don't need cross-shot consistency (e.g. single-speaker video, one angle only), pruna/p-image is simpler and cheaper.
Character sheets first, podcast frames second:
For branded characters (logo on clothing):
phota/edit with the logo as a second reference image to add the logo#### Step 2: Alternate Angles
Generate at least 2 angles per character for visual variety:
| Angle | When to use |
|---|---|
| Front/medium | Establishing shots, opening, closing |
| Close-up | Reactions, emotional moments, punchy lines |
For close-ups, prompt for "tight framing, chest up, shallow depth of field" — not "turned to the side" (which just makes them look away).
Identity consistency rules:
phota/generate or phota/edit for new angles — Gemini does not preserve facial identity and will produce a different personpruna/p-image, or consider training a Phota profile if you need many shotsFraming rule: Use tight framing on individual speakers. Wide shots with multiple seats show empty chairs when only one person is on screen.
#### Step 3: QA Frames
Before proceeding, visually inspect all frames for:
Fix issues before generating video — re-rendering video is the most expensive step in the pipeline.
#### Step 4: Write the Script
Rules for natural conversation:
Duration guide:
| Target | Words |
|---|---|
| 15s | ~38 words |
| 30s | ~75 words |
| 60s | ~150 words |
#### Step 5: Generate TTS Audio
Use inworld/text-to-speech-2 for each turn.
infsh app run inworld/text-to-speech-2 --input '{
"text": "...",
"voice_id": "...",
"speaking_rate": 1.05,
"audio_encoding": "MP3"
}' --save output.jsonVoice selection:
inworld/text-to-speech-2:voices to list all available voicesSpeaking rate:
All TTS turns can run in parallel (cheap, fast ~2-8s each).
#### Step 6: Generate Video Clips
Use pruna/p-video-avatar for each turn.
infsh app run pruna/p-video-avatar --input '{
"image": "<character_frame_url>",
"audio": "<tts_audio_url>",
"resolution": "720p",
"video_prompt": "..."
}' --save output.jsonCritical: Run clips SEQUENTIALLY, not in parallel. Parallel runs hit the same GPU and cause CUDA OOM failures. Each clip takes 15-90s depending on audio length.
Angle assignment plan: Alternate between front and close-up shots across turns for visual variety. Example for 6 turns:
T1: Speaker A — front
T2: Speaker B — front
T3: Speaker C — front (or close-up)
T4: Speaker A — close-up
T5: Speaker B — close-up
T6: Speaker A — front#### Step 7: Merge
Use infsh/media-merger to stitch all clips into the final video.
# Build input JSON
{
"media_files": [
{"file": "<clip1_url>"},
{"file": "<clip2_url>"},
...
],
"fps": 24,
"output_format": "mp4"
}
infsh app run infsh/media-merger --input merger_input.json --save final.jsonMerger is free and takes 2-6 minutes depending on total duration.
| App | Purpose |
|---|---|
pruna/p-image | Generate portraits from text |
phota/train | Train identity profile from 30-50 face images |
phota/generate | Generate images with trained identity via [[profile_id]] |
phota/edit | Edit images preserving identity of known subjects |
google/gemini-3-pro-image-preview | Image gen/edit, mascots, style transfer |
inworld/text-to-speech-2 | Text to speech, 100+ languages, voice steering |
pruna/p-video-avatar | Portrait + audio → talking head video |
infsh/media-merger | Concatenate video clips into one video |
Use belt task cost <task-id> to check the cost of any individual task.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.