🔀

AI Video Generation Pipeline

Hard6 tools

End-to-end AI-powered video generation from text prompts to polished videos.

ClaudeElevenLabsRunway Gen-2D-IDFFmpegCapCut API

Workflow Steps

  1. 1

    Script Generation Agent creates engaging video scripts with visual direction

  2. 2

    Voice Generation Agent produces natural-sounding narration

  3. 3

    Visual Generation Agent creates video clips from prompts

  4. 4

    Lip-Sync Agent generates avatar videos with synchronized speech

  5. 5

    Video Assembly Agent combines clips, audio, and effects into final video

Download

Documentation

AI Video Generation Pipeline

Overview

An end-to-end AI-powered video generation workflow that transforms text prompts, scripts, or articles into polished videos. This pipeline combines multiple AI tools for script refinement, voice generation, visual creation, and video assembly — enabling creators to produce professional videos without traditional video editing skills.

The workflow is designed for content creators, marketers, and educators who need to produce videos at scale. It automates the entire production pipeline from concept to final export, reducing production time from hours to minutes.

Difficulty

Hard — Requires coordination of multiple AI services and careful quality control at each stage.

Tools Required

ToolPurpose
Claude / GPT-4Script writing and refinement
ElevenLabsNatural-sounding voice generation
Runway / PikaAI video generation from prompts
D-ID / HeyGenAI avatar and lip-sync generation
FFmpegVideo assembly and editing
CapCut APIAutomated video editing and effects

Workflow Steps

Step 1: Script Generation and Refinement

import anthropic

client = anthropic.Anthropic()

def generate_video_script(topic: str, duration: str = "60s") -> str:
    """Generate a video script optimized for the target duration."""
    response = client.messages.create(
        model="claude-3-5-sonnet-latest",
        max_tokens=2000,
        messages=[
            {"role": "user", "content": f"""Write a engaging video script about: {topic}

Requirements:
- Duration: {duration} (approximately 150-180 words)
- Hook in the first 5 seconds
- Clear structure: hook → problem → solution → call to action
- Natural, conversational tone
- Include visual direction notes in [brackets]

Format:
[VISUAL: description]
NARRATOR: dialogue text

[VISUAL: description]
NARRATOR: dialogue text"""}
        ]
    )
    return response.content[0].text

Step 2: Voice Generation

import requests

def generate_voice(script: str, voice_id: str = "21m00Tcm4TlvDq8ikWAM") -> bytes:
    """Generate voice audio from script using ElevenLabs."""
    url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
    
    headers = {
        "xi-api-key": "YOUR_ELEVENLABS_API_KEY",
        "Content-Type": "application/json"
    }
    
    data = {
        "text": script,
        "model_id": "eleven_monolingual_v1",
        "voice_settings": {
            "stability": 0.5,
            "similarity_boost": 0.75
        }
    }
    
    response = requests.post(url, json=data, headers=headers)
    return response.content  # MP3 audio data

Step 3: Visual Generation

def generate_visuals(script_sections: list) -> list[str]:
    """Generate video clips for each script section."""
    visuals = []
    
    for section in script_sections:
        visual_prompt = extract_visual_prompt(section)
        
        # Use Runway Gen-2 or Pika
        response = requests.post(
            "https://api.runwayml.com/v1/generate",
            headers={"Authorization": f"Bearer {RUNWAY_API_KEY}"},
            json={
                "prompt": visual_prompt,
                "model": "gen-2",
                "duration": 4,  # seconds
                "aspect_ratio": "16:9"
            }
        )
        
        video_url = response.json()["video_url"]
        visuals.append(download_video(video_url))
    
    return visuals

def extract_visual_prompt(section: str) -> str:
    """Extract visual direction from script section."""
    # Parse [VISUAL: description] from script
    import re
    match = re.search(r'\[VISUAL: (.+?)\]', section)
    return match.group(1) if match else "cinematic shot"

Step 4: Lip-Sync Generation (Optional)

def generate_avatar_video(script: str, avatar_id: str) -> str:
    """Generate video with AI avatar lip-syncing to script."""
    # Using D-ID API
    response = requests.post(
        "https://api.d-id.com/talks",
        headers={
            "Authorization": f"Basic {D_ID_API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "source_url": "https://example.com/avatar.png",
            "script": {
                "type": "text",
                "provider": {"type": "microsoft", "voice_id": "en-US-AriaNeural"},
                "input_text": script
            },
            "config": {
                "aspect_ratio": "16:9",
                "result_format": "mp4"
            }
        }
    )
    
    talk_id = response.json()["id"]
    
    # Poll for completion
    while True:
        status = requests.get(
            f"https://api.d-id.com/talks/{talk_id}",
            headers={"Authorization": f"Basic {D_ID_API_KEY}"}
        )
        if status.json()["status"] == "done":
            return status.json()["result_url"]
        time.sleep(5)

Step 5: Video Assembly

import subprocess

def assemble_video(voice_audio: str, visuals: list[str], output_path: str):
    """Assemble final video using FFmpeg."""
    
    # Create concat file
    with open("concat_list.txt", "w") as f:
        for i, video in enumerate(visuals):
            f.write(f"file '{video}'\n")
    
    # Generate timeline with FFmpeg
    # This creates a video with voiceover and matching visuals
    cmd = [
        "ffmpeg", "-y",
        "-i", "concat_list.txt",
        "-i", voice_audio,
        "-filter_complex", "[0:v]scale=1920:1080[v];[1:a]aresample=48000[a]",
        "-map", "[v]", "-map", "[a]",
        "-c:v", "libx264", "-preset", "medium", "-crf", "23",
        "-c:a", "aac", "-b:a", "192k",
        output_path
    ]
    
    subprocess.run(cmd, check=True)
    return output_path

Example Usage

# Full pipeline
def create_video(topic: str, output_file: str = "output.mp4"):
    # Step 1: Generate script
    script = generate_video_script(topic, duration="60s")
    print(f"Script:\n{script}")
    
    # Step 2: Parse script into sections
    sections = parse_script_sections(script)
    
    # Step 3: Generate voice
    voice_audio = generate_voice(script, voice_id="Rachel")
    with open("voiceover.mp3", "wb") as f:
        f.write(voice_audio)
    
    # Step 4: Generate visuals
    visuals = generate_visuals(sections)
    
    # Step 5: Assemble video
    assemble_video("voiceover.mp3", visuals, output_file)
    print(f"Video saved to {output_file}")
    
    return output_file

# Run it
create_video("The Future of AI in Healthcare")

Pros

  • ✅ Dramatically reduces video production time
  • ✅ No video editing skills required
  • ✅ Consistent quality across outputs
  • ✅ Scalable for high-volume production
  • ✅ Supports multiple languages and voices
  • ✅ Cost-effective compared to traditional production

Cons

  • ❌ Initial setup complexity
  • ❌ Multiple API costs add up
  • ❌ Quality varies by prompt and tool
  • ❌ Limited creative control vs human editors
  • ❌ AI-generated visuals may lack coherence
  • ❌ Requires good script writing skills

When to Use

  • Social media content — High-volume short-form videos
  • Marketing videos — Product demos, explainers
  • Educational content — Course videos, tutorials
  • News summaries — Daily briefings, news clips
  • Personal branding — Thought leadership content

Resources