cd /news/developer-tools/automated-youtube-pipeline-python-ed… · home topics developer-tools article
[ARTICLE · art-75368] src=promptcube3.com ↗ pub= topic=developer-tools verified=true sentiment=↑ positive

Automated YouTube Pipeline: Python, edge-tts, and MoviePy

A developer built a zero-cost automated YouTube pipeline using Python, Microsoft's edge-tts neural TTS, and MoviePy 1.0.3 to create faceless videos for the SaaS product WhaleTrack, turning live site data into 1080p videos without a production budget. The workflow uses Puppeteer for live screenshots, edge-tts with the 'Andrew' voice for audio, and a custom Ken Burns effect for dynamic visuals, all assembled via MoviePy.

read2 min views1 publishedJul 27, 2026
Automated YouTube Pipeline: Python, edge-tts, and MoviePy
Image: Promptcube3 (auto-discovered)

Zero cost and one day of coding is all it took to build a faceless YouTube channel for my SaaS, WhaleTrack. Instead of messing with Premiere or hiring a designer, I just scripted the whole thing to turn live site data into videos.

The Tech Stack #

edge-tts: Microsoft's neural TTS. I used the 'Andrew' voice—it's free, doesn't need an API key, and sounds surprisingly human.** moviepy 1.0.3**: For the heavy lifting of video assembly.** Pillow**: Handles the image processing.** Puppeteer**: Used to grab high-res screenshots of the live site.** ffmpeg**: The engine under the hood.

The Workflow #

  1. Capturing Visuals

I didn't want static mockups, so I used Puppeteer to screenshot the actual site.

const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
await page.goto('https://whaletrack.app');
await page.screenshot({ path: 'screenshots/home.png' });

Pro tip: If your package.json is set to "type": "module",require()

will crash. Just name your file .cjs

to avoid the headache.2. Generating Audio

The edge-tts

library is a hidden gem for this.

import edge_tts
comm = edge_tts.Communicate(script, voice='en-US-AndrewNeural', rate='+8%')
await comm.save('audio.mp3')
  1. Adding Movement (Ken Burns Effect)

Static images kill retention. I wrote a helper function to add a slow zoom and pan, making the screenshots feel like dynamic b-roll.

def apply_ken_burns(img, progress, zoom_from, zoom_to, pan_from, pan_to):
    zoom = zoom_from + (zoom_to - zoom_from) * progress
    iw, ih = img.size
    crop_w, crop_h = int(iw / zoom), int(ih / zoom)
    ox = int(pan_from[0] + (pan_to[0] - pan_from[0]) * progress) * (iw - crop_w)
    oy = int(pan_from[1] + (pan_to[1] - pan_from[1]) * progress) * (ih - crop_h)
    return img.crop((ox, oy, ox + crop_w, oy + crop_h)).resize((1920, 1080), Image.LANCZOS)
  1. Final Assembly

I used MoviePy to glue the generated audio and the animated frames together.

from moviepy.editor import VideoClip, AudioFileClip

def make_frame(t):
    progress = t / duration
    frame = apply_ken_burns(bg_image, progress, 1.0, 1.12, (0,0), (0.03,0.02))
    return np.array(frame)

clip = VideoClip(make_frame, duration=duration)
clip = clip.set_audio(AudioFileClip('audio.mp3'))

The result is a full 1080p video produced entirely by a Python script. It's a solid AI workflow for anyone wanting to scale content without a production budget.

Next World-Model-Optimizer: Cutting LLM Costs via Distillation →

All Replies (3) #

G

Have you considered how render determinism will affect this? Live screenshots are honest, but a tiny CSS tweak could break tomorrow's video. I prefer using saved screenshot fixtures in the pipeline, then running a separate refresh-assets step only when intentional site changes happen.

0

J

Did something similar with a news bot, but moviepy can be a pain with memory leaks.

0

M

how are you handling the subtitles? moviepy usually makes those a nightmare to align.

0

── more in #developer-tools 4 stories · sorted by recency
── more on @microsoft 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/automated-youtube-pi…] indexed:0 read:2min 2026-07-27 ·