Turns a medspa's Instagram Reels into YouTube Shorts that speak: the Instagram music, which cannot be reused off the platform, is dropped and replaced by a narration in a clone of the practice owner's own voice, recorded by him for the purpose and disclosed to YouTube as synthetic on every upload.
U Derma Medspa and Laser in Palm Harbor, Florida, has years of treatment videos on Instagram: short Reels of lasers, injectables and body contouring, each set to a music track from Instagram's library. This project gives those videos a second life on YouTube as Shorts that speak. The music is dropped, and in its place is a narration in a clone of the practice owner's own voice. The channel was created in August 2026 and holds 137 videos, every one of them narrated and captioned.
The music is the whole problem. Instagram's licence covers Instagram only: of the first 97 videos that went to YouTube with their original tracks, 8 had already drawn label claims and regional blocks. The same music makes the Reels hard to move at all, because the Instagram Graph API lists the clinic's posts but withholds the video file for any Reel with licensed audio, 61 of 63 when measured. And search engines index spoken words, not music. So the track is dropped rather than ducked under a voice, since mixing it in would keep the claim, and the narration becomes the only audio on the file.
The voice is an ElevenLabs Instant Voice Clone of the practice owner, and he made it knowingly: a written request explained what the recording was for, he read a supplied paragraph into his phone, and the clone was built from one clean 117-second take, fingerprinted first because re-sent takes are indistinguishable by eye. He approved it over two rounds of samples. It is a clone and it is labelled as one: every narrated upload carries YouTube's altered or synthetic content disclosure.
Scripts are held to a clinic's standard. The first 132 were drafted by Claude from the Instagram caption and the matching treatment page, under a prompt that allows only facts present in those sources and rules out prices, percentages, statistics, superlatives, staff names and promises about the person in the clip. A validator with hard and soft patterns enforces the same rules in code, a failing draft is parked for editing instead of being dropped, and the client reviewed the scripts before anything was rendered. For new posts the default path now uses no model at all: the clinic's current captions are long enough that the script is the caption itself, selected and cleaned, and the validator drops the offending sentence rather than the script.
The render follows the engineering proven on 22sGems and changes what a clinic's footage needs. Pace is corrected with ffmpeg's atempo after synthesis, because the v3 model ignores the speed setting, and the owner's feedback showed that what he hears is the stretch ratio rather than the words per minute. When the voice outlasts the footage the clip loops instead of freezing, since the median clip is 15 seconds against 25 to 40 seconds of speech and Reels are cut to loop. Landscape clips are reframed onto a vertical canvas with a blurred copy behind them, so that every render is a Short. Subtitles come from ElevenLabs' character timestamps, and the phonetic respellings that fix brand names for the engine are mapped back before a human reads anything.
Nothing publishes without the owner. New posts are imported by a Cloudflare Worker on a daily cron and land as pending in an admin tool behind Cloudflare Access; approving a video is the whole rule that queues it. From there three GitHub Actions workflows run unattended: one narrates new approvals, one uploads up to 12 videos a day into per-treatment playlists, and one replaces older uploads and settles what a quota stop left unfinished. The 97 videos that first went up with music were replaced one by one between 5 and 12 September 2026, and the old ones were made private rather than deleted, for the owner to remove himself. The Shorts then come back to the clinic's site: embedded on insight pages with a transcript and VideoObject markup, listed in the video sitemap, and linked as playlists from every treatment page.
The music that makes a Reel a problem on YouTube is also what makes it undownloadable: the Graph API withheld the file for 61 of 63 videos, all of them with licensed audio. The importer was designed around that measurement, runs entirely on Cloudflare's network with no container, and never holds a credential that could post as the clinic.
Compliance is a prompt and a validator, and the validator is the same on both script paths. It works per sentence, so one bad claim costs a sentence and not the video, and a caption with nothing usable leaves the item with no script at all, which holds it rather than inventing one. Stripping '#1' from a caption once turned a hashtag into a published claim; that line is now refused as a title and dropped from the voice.
Consent was treated as scoped. Permission to show a before-and-after on the clinic's own site is not permission to publish it on YouTube, and the consent later given for YouTube was conditional on the narrated version, so the eligibility check requires both flags together.
One clip at 720 by 710 pixels, ten pixels wider than tall, was classified as a regular video and rearranged the whole channel page around itself. The fix went in at four layers - render, cache, upload and a repair pass over what was already published, reading stored dimensions because the /shorts/ URL answers 200 for any video.
Two YouTube API behaviours decide whether the AI disclosure survives: videos.insert silently drops the synthetic-media flag, and videos.update replaces the whole status object, so the flag is re-asserted after every insert and on every change of privacy. Subtitles are attached in a separate pass, after 13 of 13 inline caption uploads failed right after upload and spent half a day's quota.
The upload id is written to D1 before playlists, captions or cleanup run, state files are written to a temporary name and renamed, failures are counted with first and last dates rather than overwritten, and a replaced video is made private and never deleted - the owner gets the list and removes them himself.