{"slug": "automated-youtube-pipeline-python-edge-tts-and-moviepy", "title": "Automated YouTube Pipeline: Python, edge-tts, and MoviePy", "summary": "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.", "body_md": "# Automated YouTube Pipeline: Python, edge-tts, and MoviePy\n\nZero 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.\n\n## The Tech Stack\n\n**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.\n\n## The Workflow\n\n1. **Capturing Visuals**\n\nI didn't want static mockups, so I used Puppeteer to screenshot the actual site.\n\n``` js\nconst puppeteer = require('puppeteer');\nconst browser = await puppeteer.launch();\nconst page = await browser.newPage();\nawait page.setViewport({ width: 1920, height: 1080 });\nawait page.goto('https://whaletrack.app');\nawait page.screenshot({ path: 'screenshots/home.png' });\n```\n\n*Pro tip: If your package.json is set to \"type\": \"module\",*`require()`\n\nwill crash. Just name your file `.cjs`\n\nto avoid the headache.2. **Generating Audio**\n\nThe `edge-tts`\n\nlibrary is a hidden gem for this.\n\n``` python\nimport edge_tts\ncomm = edge_tts.Communicate(script, voice='en-US-AndrewNeural', rate='+8%')\nawait comm.save('audio.mp3')\n```\n\n3. **Adding Movement (Ken Burns Effect)**\n\nStatic images kill retention. I wrote a helper function to add a slow zoom and pan, making the screenshots feel like dynamic b-roll.\n\n``` python\ndef apply_ken_burns(img, progress, zoom_from, zoom_to, pan_from, pan_to):\n    zoom = zoom_from + (zoom_to - zoom_from) * progress\n    iw, ih = img.size\n    crop_w, crop_h = int(iw / zoom), int(ih / zoom)\n    ox = int(pan_from[0] + (pan_to[0] - pan_from[0]) * progress) * (iw - crop_w)\n    oy = int(pan_from[1] + (pan_to[1] - pan_from[1]) * progress) * (ih - crop_h)\n    return img.crop((ox, oy, ox + crop_w, oy + crop_h)).resize((1920, 1080), Image.LANCZOS)\n```\n\n4. **Final Assembly**\n\nI used MoviePy to glue the generated audio and the animated frames together.\n\n``` python\nfrom moviepy.editor import VideoClip, AudioFileClip\n\ndef make_frame(t):\n    progress = t / duration\n    frame = apply_ken_burns(bg_image, progress, 1.0, 1.12, (0,0), (0.03,0.02))\n    return np.array(frame)\n\nclip = VideoClip(make_frame, duration=duration)\nclip = clip.set_audio(AudioFileClip('audio.mp3'))\n```\n\nThe 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.\n\n[Next World-Model-Optimizer: Cutting LLM Costs via Distillation →](/en/threads/3913/)\n\n## All Replies （3）\n\nG\n\nHave 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.\n\n0\n\nJ\n\nDid something similar with a news bot, but moviepy can be a pain with memory leaks.\n\n0\n\nM\n\nhow are you handling the subtitles? moviepy usually makes those a nightmare to align.\n\n0", "url": "https://wpnews.pro/news/automated-youtube-pipeline-python-edge-tts-and-moviepy", "canonical_source": "https://promptcube3.com/en/threads/3922/", "published_at": "2026-07-27 01:01:08+00:00", "updated_at": "2026-07-27 13:10:39.415974+00:00", "lang": "en", "topics": ["developer-tools", "artificial-intelligence", "ai-tools"], "entities": ["Microsoft", "WhaleTrack", "edge-tts", "MoviePy", "Puppeteer", "Pillow", "ffmpeg"], "alternates": {"html": "https://wpnews.pro/news/automated-youtube-pipeline-python-edge-tts-and-moviepy", "markdown": "https://wpnews.pro/news/automated-youtube-pipeline-python-edge-tts-and-moviepy.md", "text": "https://wpnews.pro/news/automated-youtube-pipeline-python-edge-tts-and-moviepy.txt", "jsonld": "https://wpnews.pro/news/automated-youtube-pipeline-python-edge-tts-and-moviepy.jsonld"}}