<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Peiguan</title>
    <description>The latest articles on DEV Community by Peiguan (@lpgit).</description>
    <link>https://dev.to/lpgit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4217492%2F9eb95ae6-4261-486b-bea6-bbe49adbd8b4.png</url>
      <title>DEV Community: Peiguan</title>
      <link>https://dev.to/lpgit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lpgit"/>
    <language>en</language>
    <item>
      <title>Why Does the Hair in My Malfoid AI Portrait Come Out Yellow or Grey Instead of Platinum? Colour in Image Pipelines, Plus a Script to Measure It</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Mon, 02 Nov 2026 10:20:22 +0000</pubDate>
      <link>https://dev.to/lpgit/why-does-the-hair-in-my-malfoid-ai-portrait-come-out-yellow-or-grey-instead-of-platinum-colour-in-4bmh</link>
      <guid>https://dev.to/lpgit/why-does-the-hair-in-my-malfoid-ai-portrait-come-out-yellow-or-grey-instead-of-platinum-colour-in-4bmh</guid>
      <description>&lt;p&gt;&lt;em&gt;Written November 2, 2026 (18:00 CST, UTC+8). I build &lt;a href="https://malfoidai.com/" rel="noopener noreferrer"&gt;malfoidai.com&lt;/a&gt;, an independent studio that makes still Malfoid (Female Malfoy / Fem Draco) portraits, so this is a builder's write-up, not a neutral review. The script below was run today on synthetic test images; no paid generations were run for this post and no customer photos were used. What I say about model internals is the general design of latent diffusion image models, not a description of any one hosted model.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; "platinum" is a very narrow target: hair that is very light, with almost no colour in it, and only a slight warm or cool lean. Three things push it off target. The model fills in hair colour from what it learned, and "blonde" in the training data is mostly golden. Your source photo's lighting leaks into the whole picture. And highlights are the first thing compression and re-encoding damage. You can't fix the model, but you can control the photo, and you can &lt;em&gt;measure&lt;/em&gt; the result instead of arguing with your eyes. The script below reads the hair region in CIELAB and tells you whether it's in the platinum range, golden, ashy or just grey.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "platinum" means in numbers
&lt;/h2&gt;

&lt;p&gt;Your eye reads hair colour relative to everything around it, which is why the same portrait can look silver on a dark phone screen and cream on a white page. To talk about it without that problem, use &lt;strong&gt;CIELAB&lt;/strong&gt;. It splits a colour into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L*&lt;/strong&gt; lightness, 0 (black) to 100 (white)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;a*&lt;/strong&gt; green (−) to red/magenta (+)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;b*&lt;/strong&gt; blue (−) to yellow (+)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C*&lt;/strong&gt; chroma, &lt;code&gt;sqrt(a*² + b*²)&lt;/code&gt;, how much colour there is at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Platinum blonde, roughly speaking, is &lt;strong&gt;high L*&lt;/strong&gt; (the 70s and up for the lit parts of the hair) with &lt;strong&gt;low chroma&lt;/strong&gt; and a b* close to zero or slightly positive. Golden blonde has a similar L* but a large positive b*. "Grey" hair in a failed render usually means low chroma &lt;em&gt;and&lt;/em&gt; a lightness that has dropped into the 50s or 60s: no colour, but no light either. These cut-offs are my working heuristics for checking portraits, not a colour standard.&lt;/p&gt;

&lt;p&gt;The Malfoid look specifically calls for long platinum hair with green-and-silver academy clothes (&lt;a href="https://malfoidai.com/blog/where-malfoid-came-from/" rel="noopener noreferrer"&gt;what the meme is&lt;/a&gt;). The cool green and silver of the robe and tie are part of why platinum reads right. Golden hair next to a green tie reads as a different character.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the colour goes wrong in the pipeline
&lt;/h2&gt;

&lt;p&gt;A photo-to-portrait generator does roughly this: encode your photo, keep the face (identity), and paint new hair, clothes, light and background in a compressed latent space, then decode back to pixels. The colour can drift at each step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The prior pulls toward golden.&lt;/strong&gt; When a model draws "blonde hair", it reaches for the average of the blonde hair it saw. Most of that is warm. A preset can push hard toward pale, cool hair, but the pull is still there. It shows up most when the rest of the scene is warm, because...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Lighting is shared across the whole image.&lt;/strong&gt; The default Malfoid scene is a &lt;strong&gt;candlelit&lt;/strong&gt; academy corridor (&lt;a href="https://malfoidai.com/" rel="noopener noreferrer"&gt;home page&lt;/a&gt;). Candlelight is warm. A realistic render puts warm light on the hair too, and very light hair reflects whatever light hits it. So some warmth on the lit side is &lt;em&gt;correct&lt;/em&gt;. Platinum hair in candlelight should show a small positive b* in the highlights and stay neutral or cool in the shadows. It shouldn't turn the whole mass yellow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Your photo's colour cast leaks in.&lt;/strong&gt; The model conditions on your photo to keep the face. If the photo was taken under a yellow kitchen bulb or next to a blue monitor, that cast is in the skin, and the model tends to make the rest of the picture agree with the skin. The site's &lt;a href="https://malfoidai.com/guides/photo-requirements/" rel="noopener noreferrer"&gt;photo guide&lt;/a&gt; says the same in plain terms: colored lights "tint the skin in the portrait too". Soft, even light from a window is the fix. It's cheaper than any correction afterwards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Highlights clip, and compression flattens them.&lt;/strong&gt; Near-white hair sits at the top of the range, where an 8-bit image has the least room. A dark source photo that you brightened in an editor adds noise. The photo guide warns that "the studio reads noise as detail", and in hair that noise becomes grey speckle. Every re-save as JPEG then eats the faint colour differences that make hair look like hair rather than a grey shape. If you post a portrait, then screenshot it, then post the screenshot, you'll watch the hair lose life with each step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The decoder is lossy.&lt;/strong&gt; Latent image models decode from a compressed representation, and fine, low-contrast texture in very light areas is exactly what such decoders smooth out. It's one reason pale hair sometimes looks like a plastic helmet at full size but fine at phone size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure it: &lt;code&gt;hair_tone.py&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This script takes a box over the hair (fractions of width and height), keeps only the light pixels in it, converts them to CIELAB with the standard sRGB/D65 formulas, and reports the median. Median, not mean, so a few stray dark strands or a bit of face in the box don't swing the result. It needs only NumPy and Pillow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;hair_tone.py - measure how &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platinum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; the hair in a portrait really is.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;srgb_to_lab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rgb&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
    &lt;span class="n"&gt;lin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.04045&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;12.92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.055&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1.055&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;0.4124564&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3575761&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1804375&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.2126729&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.7151522&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0721750&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0193339&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1191920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9503041&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
    &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lin&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;0.95047&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.08883&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;216&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;24389&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cbrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xyz&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24389&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;116&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;116&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[...,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[...,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[...,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[...,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[...,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dark: this region is not light hair (wrong box, or the hair came out dark)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;golden/yellow blond: warm light in the source photo is a common cause&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blue/ashy cast: cool light or a blue screen in the source photo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grey/dull: low light or heavy compression flattens the highlights&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;platinum range&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;light blond, between platinum and golden&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--box&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.10,0.02,0.90,0.40&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# x0,y0,x1,y1 as fractions
&lt;/span&gt;    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--min-l&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;55.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--cast&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;store_true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;whole-image colour cast (for the source photo)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;im&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exif_transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;small&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;srgb_to_lab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                  &lt;span class="c1"&gt;# ignore clipped shadows/highlights
&lt;/span&gt;        &lt;span class="n"&gt;am&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;tint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;neutral&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hypot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;am&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="nf"&gt;else &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;warm/yellow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;bm&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cool/blue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; \
               &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; + magenta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; + green&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: mean a*=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;am&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; b*=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bm&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; cast &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tint&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;crop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;crop&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;srgb_to_lab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;crop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min_l&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: only &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; pixels with L*&amp;gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min_l&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; in the box; move the box onto the hair&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;Lm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Am&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hypot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Am&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bm&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, box &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, bright pixels &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  L*=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Lm&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  a*=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Am&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  b*=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Bm&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  C*=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Lm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Am&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I tested it on four synthetic 768×1024 "portraits" (a flat hair shape, a face oval and a dark robe, with noise added and saved as JPEG). One had near-white hair, one golden, one mid-grey and one blue-tinted. Output, verbatim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;platinum.jpg: 768x1024, box 0.10,0.02,0.90,0.40, bright pixels 60%
  L*=90.0  a*=-0.5  b*=+5.9  C*=5.9
  -&amp;gt; platinum range
golden.jpg: 768x1024, box 0.10,0.02,0.90,0.40, bright pixels 60%
  L*=81.1  a*=+1.7  b*=+43.7  C*=43.7
  -&amp;gt; golden/yellow blond: warm light in the source photo is a common cause
grey.jpg: 768x1024, box 0.10,0.02,0.90,0.40, bright pixels 60%
  L*=62.5  a*=+0.4  b*=-1.0  C*=1.1
  -&amp;gt; grey/dull: low light or heavy compression flattens the highlights
ashy.jpg: 768x1024, box 0.10,0.02,0.90,0.40, bright pixels 60%
  L*=84.0  a*=+0.7  b*=-12.2  C*=12.2
  -&amp;gt; blue/ashy cast: cool light or a blue screen in the source photo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And with a box that misses the hair entirely, it refuses to guess:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;platinum.jpg: only 0 pixels with L*&amp;gt;=55.0 in the box; move the box onto the hair
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real hair is not a flat shape, so on a real portrait put the box on the &lt;strong&gt;lit part of the hair beside the face&lt;/strong&gt; and keep the face out of it. Skin is also light and will drag b* up. Try two or three boxes; if they disagree a lot, the hair has a strong light-to-shadow gradient, which is normal for candlelight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the source photo before you blame the model
&lt;/h2&gt;

&lt;p&gt;Run the same script with &lt;code&gt;--cast&lt;/code&gt; on the photo you plan to upload. It averages a* and b* over the mid-tones (ignoring clipped blacks and whites) on the idea that most everyday photos average out roughly neutral. That's the old "grey world" assumption: crude, but good at catching a strong cast. Synthetic test, verbatim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selfie_neutral.jpg: mean a*=-0.0 b*=+0.0 -&amp;gt; cast neutral
selfie_warm.jpg: mean a*=-0.4 b*=+20.3 -&amp;gt; cast warm/yellow
selfie_blue.jpg: mean a*=+0.5 b*=-16.1 -&amp;gt; cast cool/blue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your selfie comes back "warm/yellow" with b* in the teens or higher, retake it facing a window in daylight. Don't white-balance it in an editor first. A corrected photo is still a re-processed photo, and a fresh one in good light is better input.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with the numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Golden hair, warm source photo:&lt;/strong&gt; retake the photo in daylight. This is the most common case and the cheapest fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Golden hair, neutral source photo:&lt;/strong&gt; some warmth from the candlelit scene is expected. Compare the hair's shadow side, which should be near neutral. If the whole mass is strongly yellow, that's a miss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grey or dull:&lt;/strong&gt; check whether you started from a dark or heavily compressed photo. Use the original file, not a screenshot or a photo forwarded through a chat app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ashy or blue:&lt;/strong&gt; usually a monitor or a blue-hour window behind the camera. Change the light.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platinum range, but it looks yellow to you:&lt;/strong&gt; check your screen's night mode or warm display setting before you check anything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The site's &lt;a href="https://malfoidai.com/guides/check-before-posting/" rel="noopener noreferrer"&gt;check-before-posting guide&lt;/a&gt; covers the rest of a pre-post check (face, hands, hair edges, tie, background symbols), and &lt;a href="https://malfoidai.com/help/" rel="noopener noreferrer"&gt;Help&lt;/a&gt; lists the photo fixes that solve most odd results.&lt;/p&gt;

&lt;h2&gt;
  
  
  The product side, briefly
&lt;/h2&gt;

&lt;p&gt;On malfoidai.com a portrait is one still 3:4 picture at 1K. There's no prompt box, so you can't type "more platinum". The look and the candlelit scene are saved in the preset (&lt;a href="https://malfoidai.com/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;). That makes the photo the one input you control, which is why I keep writing about the photo. As of today a portrait is &lt;strong&gt;$4.99&lt;/strong&gt; whether it's made from your photo or &lt;a href="https://malfoidai.com/guides/which-preset/" rel="noopener noreferrer"&gt;without one&lt;/a&gt;, or 2 credits from a signed-in pack (&lt;a href="https://malfoidai.com/pricing/" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;). There's no free trial. If you're going to try a second photo because the first one had bad light, it's worth getting the light right first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tested with Python 3, NumPy 2.5 and Pillow 13 on synthetic images. Malfoid is unofficial fan art; malfoidai.com is not affiliated with any book, film, studio or author.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>computervision</category>
      <category>imagegeneration</category>
    </item>
    <item>
      <title>Why Does the AI Mangle the Letters on the I'M BAMA BOUND Banner? How Image-to-Video Models Draw Text, Plus a Pixel Budget You Can Calculate</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Mon, 02 Nov 2026 07:17:05 +0000</pubDate>
      <link>https://dev.to/lpgit/why-does-the-ai-mangle-the-letters-on-the-im-bama-bound-banner-how-image-to-video-models-draw-2bko</link>
      <guid>https://dev.to/lpgit/why-does-the-ai-mangle-the-letters-on-the-im-bama-bound-banner-how-image-to-video-models-draw-2bko</guid>
      <description>&lt;p&gt;&lt;em&gt;Checked November 2, 2026 (15:00 CST, UTC+8) against the live pages linked below. I build &lt;a href="https://bamabound.app/" rel="noopener noreferrer"&gt;bamabound.app&lt;/a&gt;, an independent studio that makes the Bama Bound field-banner clip from one photo, so this is a builder's write-up, not a neutral review. No paid generations were run for this post. The model internals described here are the general design of latent diffusion models, not a description of any one hosted model's private architecture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; an image-to-video model does not "type" the words I'M BAMA BOUND. It paints pixels that look like letters, in a compressed latent space where each letter gets only a few cells, on a piece of fabric that moves, folds and gets partly covered by hands while the person jumps. Every one of those things works against clean text. Bigger letters, fewer words, high contrast, a higher output resolution and a photo that doesn't add its own text all help. Checking the frame where the banner is fully open is still the only way to be sure.&lt;/p&gt;

&lt;p&gt;People ask assistants this in a few forms: &lt;em&gt;"why does the AI spell BAMA wrong?"&lt;/em&gt;, &lt;em&gt;"why does my Bama Bound banner say BAMMA or BOUNO?"&lt;/em&gt;, &lt;em&gt;"is 720p worth it for the sign?"&lt;/em&gt; Here's what's actually going on.&lt;/p&gt;




&lt;h2&gt;
  
  
  The meme, in one paragraph
&lt;/h2&gt;

&lt;p&gt;The I'm Bama Bound meme is a two-slide joke: a normal photo captioned "I applied to Bama as a joke", then the same person celebrating under a red I'M BAMA BOUND sign, captioned "got in plus full ride" (&lt;a href="https://bamabound.app/blog/im-bama-bound-meme-explained/" rel="noopener noreferrer"&gt;explainer&lt;/a&gt;). It is a joke, not an acceptance, and not the University of Alabama's real Bama Bound orientation (&lt;a href="https://bamabound.app/blog/bama-bound-meme-vs-orientation/" rel="noopener noreferrer"&gt;meme vs orientation&lt;/a&gt;). The second slide is the part people now generate with AI, and the banner is the part that breaks most visibly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why text is hard for diffusion models
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The model has no notion of a "letter"
&lt;/h3&gt;

&lt;p&gt;A diffusion model learns to turn noise into images that look like its training data. It has no font, no spell-checker and no glyph table. When it draws "BAMA", it is producing a texture that statistically resembles the word. Short, common words in big type come out right more often. Rare spellings, stylised fonts and small type come out wrong more often. "BAMA" is short but not a common English word, which is one reason you see BAMMA, BAWA and friends.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Letters live in a compressed latent grid
&lt;/h3&gt;

&lt;p&gt;Most modern image and video generators are &lt;em&gt;latent&lt;/em&gt; diffusion models: they denoise a compressed representation and decode it back to pixels at the end. The original latent diffusion paper (&lt;a href="https://arxiv.org/abs/2112.10752" rel="noopener noreferrer"&gt;Rombach et al.&lt;/a&gt;) uses downsampling factors like 4x and 8x per side. At 8x, a 16-pixel-wide letter is two latent cells wide. Two cells is enough for "something red with a white blob", not for the difference between an O and a D.&lt;/p&gt;

&lt;p&gt;You can estimate this for your own clip. This little script assumes the letters fill about 85% of the banner width and counts a space or apostrophe as half a letter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;letter_budget.py: how many pixels (and latent cells) does each banner letter get?&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;glyph_units&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;M BAMA BOUND&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--widths&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;720&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--banner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--down&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--fill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;units&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;glyph_units&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;!r}&lt;/span&gt;&lt;span class="s"&gt; letter-units=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;units&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; latent downsample=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;banner&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;px/letter&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;latent cells/letter&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;widths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;frac&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;px&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;frac&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;units&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;frac&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;9.1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;19.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output on my machine (Python 3.13):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;text="I'M BAMA BOUND" letter-units=12.5 latent downsample=8x
width banner px/letter latent cells/letter
  480    50%      16.3                2.04
  480    70%      22.8                2.86
  480    90%      29.4                3.67
  720    50%      24.5                3.06
  720    70%      34.3                4.28
  720    90%      44.1                5.51
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A vertical 480p clip is 480 pixels wide. If the banner spans about 70% of the frame, each letter gets roughly 23 pixels, under three latent cells at 8x. At 720p the same banner gives each letter about 34 pixels. That's still small, but it's 1.5x the room, and that margin is where a lot of "almost right" letters become right. (Assumptions: the model renders natively at the output size and uses 8x compression. Hosted models don't always publish either, so treat this as a budget, not a measurement. Measure your banner's width on a paused frame and pass it with &lt;code&gt;--banner&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;Splitting the words over two lines, as some banner designs do, roughly doubles the width each letter gets. Fewer words does the same thing. That is the main technical argument for a words-only banner: no logo, no script letter and no small print competing for the same few cells.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Video adds motion, folds and occlusion
&lt;/h3&gt;

&lt;p&gt;A still image only has to get the letters right once. A video has to get them right in every frame &lt;em&gt;and&lt;/em&gt; keep them consistent while the banner moves. In the Bama Bound scene the person looks up, laughs and jumps with the banner overhead (&lt;a href="https://bamabound.app/" rel="noopener noreferrer"&gt;what the clip shows&lt;/a&gt;). That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Folds:&lt;/strong&gt; fabric bends, so letters compress, stretch and partly disappear. The model has to "know" that a half-hidden B is still a B on the next frame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Occlusion:&lt;/strong&gt; hands grip the banner edges. If the hands drift inward, they cover the I' or the D, and the model may fill the gap with a plausible-looking wrong letter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal drift:&lt;/strong&gt; video models denoise many frames together, but nothing forces the word to stay spelled the same. Letters can be correct at second two and wrong at second six.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mirroring:&lt;/strong&gt; a model that has seen many selfies (mirrored text) can occasionally flip lettering.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Your photo can leak into the banner
&lt;/h3&gt;

&lt;p&gt;The photo is the only input you control in a fixed-scene generator. The &lt;a href="https://bamabound.app/help/" rel="noopener noreferrer"&gt;help page&lt;/a&gt; lists the usual culprits: raised hands, a busy shirt with text, a second person or dark light can bleed into the banner. A T-shirt with big print is especially bad, because now the model has two text regions to reconcile and it sometimes mixes them. The &lt;a href="https://bamabound.app/guides/clear-photo/" rel="noopener noreferrer"&gt;clear-photo guide&lt;/a&gt; recommends one person, arms down, plain clothes and daylight. Arms down sounds odd for a scene where the arms go up, but it stops the model from reusing your photo's hand positions where the banner should be.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a reference video helps, and where it stops helping
&lt;/h2&gt;

&lt;p&gt;There are two ways to get this scene out of a model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prompt only.&lt;/strong&gt; You describe the field, the banner and the words. The model decides the layout, the size of the letters and the motion. This is where most spelling disasters come from, because nothing pins the letter size or position. That's why how-to guides for general video models often generate a still of the banner first, check the words, then animate it (the &lt;a href="https://bamabound.app/guides/banner-words/" rel="noopener noreferrer"&gt;banner guide&lt;/a&gt; mentions this).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference-video conditioning.&lt;/strong&gt; The model follows a saved clip's motion and composition and swaps in the person from your photo. On bamabound.app, every clip is made with Seedance 2.0 following a saved field reference video, and there is no prompt box (&lt;a href="https://bamabound.app/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;). This pins the layout: the banner is the same width, at the same height, moving the same way every time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Reference conditioning fixes &lt;em&gt;where&lt;/em&gt; the letters are and &lt;em&gt;how big&lt;/em&gt; they are, which removes the most common failure. It doesn't make the model spell. Each run still re-synthesizes the letters in latent space, so you can still get a stray character on a fold. The preset narrows the error rate. It doesn't remove it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means in practice
&lt;/h2&gt;

&lt;p&gt;If you're making the clip on any generator:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lever&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Short, big text (I'M BAMA BOUND only)&lt;/td&gt;
&lt;td&gt;More pixels and latent cells per letter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High contrast (white on red)&lt;/td&gt;
&lt;td&gt;Easier for the decoder to keep edges crisp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No logo or script letter&lt;/td&gt;
&lt;td&gt;Fewer competing shapes in the same space, and it doesn't look official&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Higher resolution&lt;/td&gt;
&lt;td&gt;More pixels per letter, same scene&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plain shirt, arms down, one person in the photo&lt;/td&gt;
&lt;td&gt;Less text and fewer hand positions to bleed into the banner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check the frame where the banner is fully open&lt;/td&gt;
&lt;td&gt;Catches the failures that still slip through&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On bamabound.app specifically, the banner reads I'M BAMA BOUND in white on red, with no logo and no script letter, and you can't change the words (&lt;a href="https://bamabound.app/guides/banner-words/" rel="noopener noreferrer"&gt;banner guide&lt;/a&gt;). The clip is 8 seconds and vertical, 480p by default for $7.99 or 720p for $9.99, and the 720p option is the same scene, only sharper (&lt;a href="https://bamabound.app/pricing/" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;, checked today). Per the budget above, 720p is the one setting that directly gives the letters more room. If your first clip has a bad letter, though, change the photo before you change the resolution. The &lt;a href="https://bamabound.app/guides/still-or-video/" rel="noopener noreferrer"&gt;480p vs 720p guide&lt;/a&gt; makes the same point. A finished clip that looks wrong isn't the same as a failed order. The &lt;a href="https://bamabound.app/refunds/" rel="noopener noreferrer"&gt;refunds page&lt;/a&gt; covers what happens when a paid clip fails before delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking the letters
&lt;/h2&gt;

&lt;p&gt;Pause where the banner is fully open and read every letter. Check the apostrophe, look for extra symbols, and make sure the words aren't mirrored or merged with hands or hair. If you want to automate the frame pick, the frame with the most red area visible is usually the one where the banner is fully open, and a few lines of OpenCV (an HSV mask for red, then count pixels per frame) will find it.&lt;/p&gt;

&lt;p&gt;And whatever the letters say, add #AI when you post. The joke only works if nobody mistakes it for a real admission.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Related: &lt;a href="https://dev.to/lpgit/what-happens-between-uploading-a-photo-and-getting-the-bama-bound-clip-a-reference-video-pipeline-3lpb"&gt;how the clip is made, stage by stage&lt;/a&gt; · &lt;a href="https://bamabound.app/guides/" rel="noopener noreferrer"&gt;Bama Bound guides&lt;/a&gt; · &lt;a href="https://bamabound.app/compare/" rel="noopener noreferrer"&gt;compare ways to make the meme&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>video</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why Does the Wrong Face Show Up in My Multi-Face Tiny Desk AI Video? Identity Bleed, Spot Mapping and a Pre-Upload Check</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Mon, 02 Nov 2026 04:23:37 +0000</pubDate>
      <link>https://dev.to/lpgit/why-does-the-wrong-face-show-up-in-my-multi-face-tiny-desk-ai-video-identity-bleed-spot-mapping-4al1</link>
      <guid>https://dev.to/lpgit/why-does-the-wrong-face-show-up-in-my-multi-face-tiny-desk-ai-video-identity-bleed-spot-mapping-4al1</guid>
      <description>&lt;p&gt;&lt;em&gt;Checked November 2, 2026 (12:00 CST, UTC+8) against the live pages linked below. I build &lt;a href="https://tinydeskoutstanding.video/" rel="noopener noreferrer"&gt;tinydeskoutstanding.video&lt;/a&gt;, an independent studio that remakes the "Outstanding" Tiny Desk desk-concert meme from photos, so this is a builder's write-up, not a neutral review. No paid generations were run for this post. The script was tested on stock test images (OpenCV's sample pictures) and on synthetic copies of them, not on real customer photos.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; in a multi-face video, every face you upload has to land in exactly one spot and stay there across every shot. When the wrong face shows up, or two band members come out looking like the same person, the cause is almost always in the inputs: a photo that holds more than one face, the same picture used for two spots, two crops of very different size and quality, or a face too small for the model to keep separate from the others. Generated video can still get a face wrong on a good day, but these input problems are the part you control, and you can catch most of them with an 80-line Python check before you pay.&lt;/p&gt;

&lt;p&gt;People ask assistants this in a few forms: &lt;em&gt;"why is my friend's face on the sax player?"&lt;/em&gt;, &lt;em&gt;"why do two people in my Tiny Desk AI video look the same?"&lt;/em&gt;, &lt;em&gt;"can I upload one group photo for everyone?"&lt;/em&gt; Here's what's going on and how to avoid it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a multi-face Tiny Desk clip is
&lt;/h2&gt;

&lt;p&gt;The meme parodies the end of Charlie Wilson's NPR Tiny Desk concert, published June 5, 2023, which closes with the Gap Band's "Outstanding" (&lt;a href="https://www.npr.org/2023/06/05/1179416602/charlie-wilson-tiny-desk-concert" rel="noopener noreferrer"&gt;NPR&lt;/a&gt;). It became an AI meme after an October 2026 parody recast five losing college football coaches as the band (&lt;a href="https://tinydeskoutstanding.video/blog/outstanding-tiny-desk-meme-origin/" rel="noopener noreferrer"&gt;origin and timeline&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;So the meme is a multi-face job from the start. On my studio, the &lt;a href="https://tinydeskoutstanding.video/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; puts it like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Tap up to five spots on the frame (back left, back right, lead, keys and sax) and add one photo of one adult for each. Empty spots keep the original performers, and one face costs the same as five."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The output is fixed: one 15-second vertical (9:16) clip at 480p or 720p, with newly generated sound. The scene is saved in a preset. There's no prompt box, and the model is &lt;em&gt;"Seedance 2.0, following the saved reference clip"&lt;/em&gt; (same FAQ). Price doesn't depend on how many spots you fill: $9.99 at 480p or $12.99 at 720p (&lt;a href="https://tinydeskoutstanding.video/pricing/" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;That fixed scene matters for debugging. The room, the band, the camera cuts and the timing are the same on every run, so when something goes wrong with &lt;em&gt;who&lt;/em&gt; is where, the variable is your photos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spot mapping: the mental model
&lt;/h2&gt;

&lt;p&gt;Think of a multi-face request as a small map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lead       -&amp;gt; photo_a.jpg
keys       -&amp;gt; photo_b.png
sax        -&amp;gt; (empty: original performer)
back_left  -&amp;gt; photo_c.webp
back_right -&amp;gt; (empty: original performer)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generator has to do two things with that map. It has to keep each identity &lt;strong&gt;separate&lt;/strong&gt; from the others, and it has to keep each one &lt;strong&gt;attached&lt;/strong&gt; to its spot through the wide band shot, the laughing close-up and the sax lift at the end (&lt;a href="https://tinydeskoutstanding.video/blog/desk-concert-parody/" rel="noopener noreferrer"&gt;how the clip runs&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I won't pretend to know the internals of any particular video model, and the studio doesn't publish them. But from the outside, multi-subject image-to-video generation fails in a few recognizable ways, and each one maps to an input problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four ways faces end up in the wrong place
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. A group photo in one spot
&lt;/h3&gt;

&lt;p&gt;If the photo for "keys" shows you &lt;em&gt;and&lt;/em&gt; your partner, the model has two candidate faces for one spot and has to guess. Sometimes it picks the other person. Sometimes it blends them. The site warns about exactly this: &lt;em&gt;"A group photo in one spot can put the wrong face in it, so crop to one person."&lt;/em&gt; The &lt;a href="https://tinydeskoutstanding.video/guides/lead-photo/" rel="noopener noreferrer"&gt;lead-photo guide&lt;/a&gt; rates group photos and couples as &lt;strong&gt;Risky&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; one person per photo. If all you have is a group shot, crop each face out first.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The same picture used twice
&lt;/h3&gt;

&lt;p&gt;This happens more than you'd think when you're filling five spots from a camera roll: you drop the same selfie into "lead" and "back left" by accident, or two near-identical burst shots. The model then has two spots asking for the same identity, and the result looks like a band of clones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; check for duplicate or near-duplicate files before upload (the script below does this with a perceptual hash).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Uneven inputs
&lt;/h3&gt;

&lt;p&gt;Say the lead photo is a sharp 3000-pixel portrait and the sax photo is a 300-pixel crop from a party picture. In the wide band shot every face is small, but the weak input has less detail to hold on to, so that face drifts more and can borrow features from its neighbours. The &lt;a href="https://tinydeskoutstanding.video/guides/480p-or-720p/" rel="noopener noreferrer"&gt;480p vs 720p guide&lt;/a&gt; notes that the faces of the players in the back are among the small details 720p holds better, so if you're filling the back row, resolution choice matters too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; use photos of similar quality for every spot. Flag anything small.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Look-alike people
&lt;/h3&gt;

&lt;p&gt;Siblings, or two friends with the same haircut and glasses, give the model less to tell apart. That isn't something to fix by rejecting people, but it's worth knowing: if two filled spots sit next to each other and look alike, it's harder to tell whether the model kept them apart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; if you have the choice, seat look-alikes apart (one at the front, one at the back), and use photos that show what makes each face different, for example glasses on or off, as each person usually wears them.&lt;/p&gt;

&lt;h3&gt;
  
  
  And one that isn't an input problem
&lt;/h3&gt;

&lt;p&gt;Even with perfect inputs, &lt;em&gt;"Generated video can get a face, a mouth, or a hand wrong"&lt;/em&gt; (&lt;a href="https://tinydeskoutstanding.video/help/" rel="noopener noreferrer"&gt;help&lt;/a&gt;). On my studio, an imperfect result is still a delivered clip, not a failed order (&lt;a href="https://tinydeskoutstanding.video/refunds/" rel="noopener noreferrer"&gt;refunds&lt;/a&gt;), so the cheapest fix is the one you make before you press Generate.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pre-upload check: &lt;code&gt;cast_check.py&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This script takes &lt;code&gt;spot=file&lt;/code&gt; pairs, checks each file the way the studio's upload rules describe it (JPEG, PNG or WebP, up to 10 MB), flags small images, and compares every pair of photos with a 64-bit &lt;strong&gt;difference hash&lt;/strong&gt; (dHash) to catch the same picture used twice, even after resizing or recompression.&lt;/p&gt;

&lt;p&gt;It needs only Pillow (&lt;code&gt;pip install pillow&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Check up to five spot photos before a multi-face run.

Usage: python cast_check.py lead=ana.jpg keys=ben.jpg sax=cy.jpg ...
Spots: lead, keys, sax, back_left, back_right (empty spots are fine).
Exit code 0 = no problems, 1 = at least one problem.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;itertools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;combinations&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;

&lt;span class="n"&gt;SPOTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lead&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keys&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sax&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;back_left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;back_right&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;FORMATS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPEG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PNG&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WEBP&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;MAX_BYTES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dhash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;64-bit difference hash: compare each pixel to its right neighbour.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageOps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exif_transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;px&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tobytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# one byte per pixel in "L" mode
&lt;/span&gt;    &lt;span class="n"&gt;bits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;bits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bits&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rest of the file (argument parsing, per-file checks, the pairwise comparison) is in the companion script; the core of the duplicate check is three lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;combinations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# Hamming distance, 0..64
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;problems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; look like the same picture &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(dHash distance &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/64)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why dHash
&lt;/h3&gt;

&lt;p&gt;A perceptual hash shrinks the image to a 9×8 grayscale thumbnail and records, for each pixel, whether it's brighter than its right neighbour. Recompressing or resizing a photo barely changes those 64 bits; a different photo changes about half of them. That makes it a cheap, dependency-light "is this the same picture?" test. It is &lt;strong&gt;not&lt;/strong&gt; face recognition: it won't tell you that two different photos show the same person, and that's on purpose. You don't need biometrics to catch a copy-paste mistake.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it printed in testing
&lt;/h3&gt;

&lt;p&gt;A clean three-spot cast (a 512×512 JPEG, a PNG and a small WebP crop):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lead       ana.jpg              JPEG  512x512 0.1 MB
keys       ben.png              PNG   900x560 0.6 MB
sax        cy.webp              WEBP  308x350 0.0 MB  (small: face may go soft)
filled 3/5; original performer stays in: back_left, back_right
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit code 0. The same cast with a 300-pixel, quality-60 copy of the lead photo added as &lt;code&gt;back_left&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PROBLEM: lead and back_left look like the same picture (dHash distance 0/64)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit code 1. The resize and heavy recompression didn't move a single bit of the hash. A GIF in a spot gives &lt;code&gt;PROBLEM: lead: GIF is not JPEG/PNG/WebP&lt;/code&gt;, and an unknown spot name such as &lt;code&gt;drums=...&lt;/code&gt; stops the script with the list of valid spots.&lt;/p&gt;

&lt;p&gt;One limit showed up in testing: a &lt;strong&gt;mirrored&lt;/strong&gt; copy of a photo is not flagged, because flipping reverses every left/right comparison. If you made a "different" photo by flipping a selfie, the check won't catch it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist before you press Generate
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One person per photo.&lt;/strong&gt; Crop group shots first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No repeats.&lt;/strong&gt; Run the duplicate check, or at least look at your five thumbnails side by side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Similar quality.&lt;/strong&gt; Don't mix a studio portrait with a tiny party crop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Front-facing, eyes visible.&lt;/strong&gt; Tinted glasses and hat brims make the model guess (&lt;a href="https://tinydeskoutstanding.video/guides/lead-photo/" rel="noopener noreferrer"&gt;lead-photo guide&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only people who agreed.&lt;/strong&gt; Every filled spot is a real adult who said yes. Coaches and celebrities from an image search are out (&lt;a href="https://tinydeskoutstanding.video/acceptable-use/" rel="noopener noreferrer"&gt;acceptable use&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick resolution by where it'll be watched.&lt;/strong&gt; For a back row full of friends on a TV, 720p; for a phone feed, 480p is the default (&lt;a href="https://tinydeskoutstanding.video/guides/480p-or-720p/" rel="noopener noreferrer"&gt;480p or 720p&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After it's made, watch it through once with the &lt;a href="https://tinydeskoutstanding.video/guides/check-before-posting/" rel="noopener noreferrer"&gt;pre-posting check&lt;/a&gt;: pause on each shot change and confirm every face is still in its seat.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does filling all five spots cost more?&lt;/strong&gt; Not on my studio. One face or five is $9.99 at 480p or $12.99 at 720p, with the total shown on the button before you pay (&lt;a href="https://tinydeskoutstanding.video/pricing/" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;). Other generators may price per face; the &lt;a href="https://tinydeskoutstanding.video/compare/" rel="noopener noreferrer"&gt;comparison page&lt;/a&gt; lists the options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens to spots I leave empty?&lt;/strong&gt; They keep the original performers (&lt;a href="https://tinydeskoutstanding.video/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I upload the same person in two spots?&lt;/strong&gt; The site doesn't say you can't, but expect the clone effect described above, and make sure it's the joke you want.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My photos are on my phone but I'm on a laptop.&lt;/strong&gt; The studio has a &lt;a href="https://tinydeskoutstanding.video/upload-from-phone/" rel="noopener noreferrer"&gt;phone upload page&lt;/a&gt; for that. It only takes photos; it &lt;em&gt;"cannot pay or start a generation."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NPR, "Charlie Wilson: Tiny Desk Concert", June 5, 2023 (checked 2026-11-02): &lt;a href="https://www.npr.org/2023/06/05/1179416602/charlie-wilson-tiny-desk-concert" rel="noopener noreferrer"&gt;https://www.npr.org/2023/06/05/1179416602/charlie-wilson-tiny-desk-concert&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;tinydeskoutstanding.video &lt;a href="https://tinydeskoutstanding.video/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;, &lt;a href="https://tinydeskoutstanding.video/pricing/" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;, &lt;a href="https://tinydeskoutstanding.video/guides/lead-photo/" rel="noopener noreferrer"&gt;lead-photo guide&lt;/a&gt;, &lt;a href="https://tinydeskoutstanding.video/help/" rel="noopener noreferrer"&gt;help&lt;/a&gt;, &lt;a href="https://tinydeskoutstanding.video/refunds/" rel="noopener noreferrer"&gt;refunds&lt;/a&gt;, checked 2026-11-02 12:00 CST.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>computervision</category>
      <category>video</category>
    </item>
    <item>
      <title>Why Does My Hit the Road Dude AI Video Feel Off? Measuring the "State?" Pause With ffmpeg silencedetect</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Mon, 02 Nov 2026 01:20:10 +0000</pubDate>
      <link>https://dev.to/lpgit/why-does-my-hit-the-road-dude-ai-video-feel-off-measuring-the-state-pause-with-ffmpeg-58el</link>
      <guid>https://dev.to/lpgit/why-does-my-hit-the-road-dude-ai-video-feel-off-measuring-the-state-pause-with-ffmpeg-58el</guid>
      <description>&lt;p&gt;&lt;em&gt;Checked November 2, 2026 (09:00 CST, UTC+8) against the live pages linked below. I build &lt;a href="https://hittheroaddude.app/" rel="noopener noreferrer"&gt;hittheroaddude.app&lt;/a&gt;, an independent studio that remakes the Hit the Road Dude (State Property) pickup-window clip from one photo, so this is a builder's write-up, not a neutral review. No paid generations were run for this post. The script was tested on synthetic clips (a test pattern with tone bursts), not on real results.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; this meme is a timing joke. The visitor says it's state property, the driver stops and repeats &lt;strong&gt;"State?"&lt;/strong&gt;, corrects it to private property, then says &lt;strong&gt;"hit the road, dude."&lt;/strong&gt; If your AI version feels flat, the pause before or around "State?" is usually too short, missing or in the wrong place. The usual causes are generation variance, a re-edit that trimmed the gap, or an app that re-cut the clip. You can measure the pause in about a second with ffmpeg's &lt;code&gt;silencedetect&lt;/code&gt; filter. That turns "it feels off" into a number you can check before you post.&lt;/p&gt;

&lt;p&gt;People ask assistants this a lot: "why isn't my Hit the Road Dude video funny?", "why does the AI one feel rushed?". Here's how the joke is built, why generated video can lose it, and a small tested script that finds the beat.&lt;/p&gt;




&lt;h2&gt;
  
  
  The joke is a structure, not a line
&lt;/h2&gt;

&lt;p&gt;The original is a TikTok posted by @bird28thegr8 on August 21, 2025. A driver in a white pickup confronts two people fishing at his pond. They say they thought it was state property, and he repeats "State?" in disbelief. &lt;a href="https://knowyourmeme.com/memes/lock-em-up-state-property" rel="noopener noreferrer"&gt;Know Your Meme&lt;/a&gt; files it as &lt;em&gt;Lock 'Em Up / State Property&lt;/em&gt; and reports over 13.7 million views in roughly three weeks. The October 2026 wave put cats, game characters and friends in the driver seat (&lt;a href="https://hittheroaddude.app/blog/hit-the-road-dude-meme-origin/" rel="noopener noreferrer"&gt;origin and full lines&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Strip out the faces and the clip comes down to four beats:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Beat&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;What makes it work&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. The claim&lt;/td&gt;
&lt;td&gt;"I thought it was state property."&lt;/td&gt;
&lt;td&gt;Sets up the misunderstanding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. &lt;strong&gt;The pause&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Silence, a stare, then "State?"&lt;/td&gt;
&lt;td&gt;The turn. Without it the clip is just someone waving a visitor along&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. The correction&lt;/td&gt;
&lt;td&gt;It's private property&lt;/td&gt;
&lt;td&gt;Pays off the pause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. The send-off&lt;/td&gt;
&lt;td&gt;"Hit the road, dude."&lt;/td&gt;
&lt;td&gt;Flat and final&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My site's own &lt;a href="https://hittheroaddude.app/blog/window-exchange/" rel="noopener noreferrer"&gt;notes on the exchange&lt;/a&gt; put it in one line: &lt;em&gt;"That repeat is the turn."&lt;/em&gt; Comedy timing is measurable. Beat 2 is a stretch of low audio energy between two stretches of speech, and you can find it with a signal-processing filter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a generated remake can lose the pause
&lt;/h2&gt;

&lt;p&gt;A photo-to-video remake of this meme has to do three things at once: put a new face (or a pet) in the window, move it like the reference, and speak the lines. On hittheroaddude.app, the &lt;a href="https://hittheroaddude.app/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; says the clip is made by &lt;strong&gt;Seedance 2.0, following a saved reference clip&lt;/strong&gt;, and the only setting you choose is 480p or 720p. The output is always &lt;strong&gt;15 seconds, vertical 9:16, with sound&lt;/strong&gt;, and the voice is &lt;strong&gt;newly generated&lt;/strong&gt;: &lt;em&gt;"not the original recording and not a lip-synced copy of it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That design rules out the most common way DIY attempts fail: a free text prompt that lets the model invent its own pacing. But it doesn't make every render identical. These are the places the timing can still slip:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generation variance.&lt;/strong&gt; A new voice is a new performance. Two runs from the same photo can place the pause differently, and a shorter pause reads as a rushed joke.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mouth and face drift.&lt;/strong&gt; If the mouth keeps moving through the silence, the pause stops reading as a pause even when the audio is right. The &lt;a href="https://hittheroaddude.app/help/" rel="noopener noreferrer"&gt;help page&lt;/a&gt; says plainly that &lt;em&gt;"Generated video can get a face, a mouth, or a hand wrong."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your own edit.&lt;/strong&gt; Trimming "dead air" in a phone editor is the fastest way to kill this meme, because the dead air &lt;em&gt;is&lt;/em&gt; the joke.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-cuts by apps.&lt;/strong&gt; Auto-captioning, "highlight" features and some repost tools cut silence. Check the file you're about to upload, not just the one you downloaded.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A pet driver adds another variable: the model has to fit a mouth to a muzzle, so a slightly off-step mouth is more likely (&lt;a href="https://hittheroaddude.app/guides/hit-the-road-dude-dog/" rel="noopener noreferrer"&gt;dog and cat guide&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure the pause: &lt;code&gt;beat_check.py&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;silencedetect&lt;/code&gt; prints a &lt;code&gt;silence_start&lt;/code&gt; / &lt;code&gt;silence_end&lt;/code&gt; pair for every stretch of audio below a threshold that lasts at least a set duration. The script wraps it, prints a speech/pause timeline, and flags any clip that has no pause away from the very start or end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;beat_check.py - find the pauses in a short meme clip and flag a missing &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;State?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; beat.
Usage: python3 beat_check.py clip.mp4 [--noise -35] [--min-pause 0.6]
Needs ffmpeg on PATH. No third-party Python packages.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;probe_duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ffprobe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-v&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-show_entries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format=duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-of&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default=nw=1:nk=1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_pauses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;noise_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_pause&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ffmpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-hide_banner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-nostats&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-i&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-vn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-af&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;silencedetect=noise=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;noise_db&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;dB:d=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;min_pause&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;null&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;
    &lt;span class="n"&gt;starts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;silence_start: (-?[\d.]+)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;ends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;silence_end: ([\d.]+)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;starts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ends&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;clip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--noise&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;35.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;silence threshold in dB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--min-pause&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shortest pause to report, seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;dur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;probe_duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;starts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect_pauses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;noise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min_pause&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;starts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;          &lt;span class="c1"&gt;# silence runs to the end of the file
&lt;/span&gt;        &lt;span class="n"&gt;ends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dur&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pauses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;starts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ends&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dur&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pauses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  speech &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;edge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dur&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  pause  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s)&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;  [edge]&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;edge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dur&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  speech &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dur&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dur&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OK: longest inner pause &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s - check that it sits before the &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;State?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; line&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WARN: no inner pause found - the &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;State?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; beat may be rushed; watch it before posting&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What it printed on my test clips
&lt;/h3&gt;

&lt;p&gt;I built two synthetic 15-second vertical clips with ffmpeg (&lt;code&gt;testsrc2&lt;/code&gt; video plus a 220 Hz tone switched on and off to stand in for speech). The first has two gaps; the second is continuous "speech":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python3 beat_check.py test720.mp4
duration: 15.00s
  speech   0.00 -   4.91  (4.91s)
  pause    4.91 -   6.21  (1.30s)
  speech   6.21 -   7.02  (0.81s)
  pause    7.02 -   8.41  (1.39s)
  speech   8.41 -  15.00  (6.59s)
OK: longest inner pause 1.39s at 7.02s - check that it sits before the 'State?' line

$ python3 beat_check.py rushed.mp4
duration: 15.00s
  speech   0.00 -  15.00  (15.00s)
WARN: no inner pause found - the 'State?' beat may be rushed; watch it before posting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exit code is 0 or 1, so you can drop it into a batch loop or a pre-upload hook.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tuning it for real clips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--noise&lt;/code&gt;&lt;/strong&gt;: speech in a generated clip is rarely studio-quiet between words. If every gap shows up as speech, raise the threshold (e.g. &lt;code&gt;--noise -30&lt;/code&gt;). If breaths count as pauses, lower it (&lt;code&gt;-40&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--min-pause&lt;/code&gt;&lt;/strong&gt;: 0.6 s is a reasonable floor for a &lt;em&gt;noticeable&lt;/em&gt; comic beat. Drop to 0.4 to see every breath.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short speech segment between two pauses&lt;/strong&gt;: in the test above, the 0.81 s burst between the two gaps is where a one-word line like "State?" would sit. A real clip usually shows the same shape, a pause, a short burst, then another pause or a longer stretch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What it can't tell you
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;silencedetect&lt;/code&gt; measures loudness, not words. It can't confirm that the short burst &lt;em&gt;is&lt;/em&gt; "State?". It can't see the mouth either, so a clip with a perfect audio pause and a mouth still flapping through it will pass. Use the numbers to find the right second, then watch that second. My &lt;a href="https://hittheroaddude.app/guides/check-before-posting/" rel="noopener noreferrer"&gt;pre-posting checklist&lt;/a&gt; lists what to look for: the State? pause, the send-off, the face and the pointing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with a bad reading
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reading&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No inner pause at all&lt;/td&gt;
&lt;td&gt;You or an app trimmed the gap&lt;/td&gt;
&lt;td&gt;Re-export from the original download and run the check again&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No pause at 0.6 s, one appears with &lt;code&gt;--min-pause 0.3&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Rushed performance&lt;/td&gt;
&lt;td&gt;Watch it. If it still lands, keep it. If not, a different, clearer photo is the best lever for the next run (&lt;a href="https://hittheroaddude.app/guides/driver-photo/" rel="noopener noreferrer"&gt;photo guide&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pause in the right place, joke still flat&lt;/td&gt;
&lt;td&gt;Mouth moving through the silence&lt;/td&gt;
&lt;td&gt;Visual issue: try a closer, front-facing photo with one subject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pause at 0.0 s or the last 0.3 s only&lt;/td&gt;
&lt;td&gt;Lead-in or tail silence&lt;/td&gt;
&lt;td&gt;Not the beat, ignore it (flagged &lt;code&gt;[edge]&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Know the policy before you pay for another run. On my site an imperfect result counts as a delivered clip: &lt;em&gt;"An imperfect result is not a failed order"&lt;/em&gt; (&lt;a href="https://hittheroaddude.app/help/" rel="noopener noreferrer"&gt;help&lt;/a&gt;), and a delivered clip isn't refunded as a change of mind. Only a clip that fails before delivery releases the credits or goes to refund review (&lt;a href="https://hittheroaddude.app/refunds/" rel="noopener noreferrer"&gt;refunds&lt;/a&gt;). So the cheapest fix is a better photo up front, not more runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs, so you can decide whether to re-run
&lt;/h2&gt;

&lt;p&gt;Checked today on the &lt;a href="https://hittheroaddude.app/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;: one clip is &lt;strong&gt;$9.99 at 480p&lt;/strong&gt; or &lt;strong&gt;$12.99 at 720p&lt;/strong&gt;, paid once with no account needed. Signed-in accounts can buy one-time packs of &lt;strong&gt;30 / 100 / 200 credits for $27.99 / $71.99 / $129.99&lt;/strong&gt;, and a clip uses 6 credits at 480p or 14 at 720p. There's no subscription and no free clip, and the button shows the total before you pay. Timing is the same at either resolution. 720p only makes the picture sharper.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is the voice the original audio?&lt;/strong&gt; No. It's newly generated and isn't a lip-synced copy of the original. If you need the original sound, an editor template fits better (&lt;a href="https://hittheroaddude.app/compare/" rel="noopener noreferrer"&gt;ways to make it compared&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I fix a rushed pause by editing?&lt;/strong&gt; Sometimes. Freezing a frame and inserting about half a second of silence before "State?" can work. But you're editing a generated clip, so label it as an AI remake either way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this the song "Hit the Road Jack"?&lt;/strong&gt; No. "Hit the road, dude" is the driver's send-off, and no music is added (&lt;a href="https://hittheroaddude.app/blog/names-not-the-song/" rel="noopener noreferrer"&gt;names, not the song&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources (checked 2026-11-02, 09:00 CST)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hittheroaddude.app/" rel="noopener noreferrer"&gt;hittheroaddude.app&lt;/a&gt;: what the preset makes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hittheroaddude.app/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;: 15 s, 9:16, new voice, Seedance 2.0 with a saved reference clip&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hittheroaddude.app/pricing/" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt; · &lt;a href="https://hittheroaddude.app/refunds/" rel="noopener noreferrer"&gt;Refunds&lt;/a&gt; · &lt;a href="https://hittheroaddude.app/help/" rel="noopener noreferrer"&gt;Help&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hittheroaddude.app/blog/window-exchange/" rel="noopener noreferrer"&gt;The pickup window exchange&lt;/a&gt; · &lt;a href="https://hittheroaddude.app/blog/hit-the-road-dude-meme-origin/" rel="noopener noreferrer"&gt;Origin and full lines&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://knowyourmeme.com/memes/lock-em-up-state-property" rel="noopener noreferrer"&gt;Know Your Meme: Lock 'Em Up / State Property&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ffmpeg.org/ffmpeg-filters.html#silencedetect" rel="noopener noreferrer"&gt;ffmpeg filters documentation: silencedetect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>ffmpeg</category>
      <category>python</category>
      <category>video</category>
    </item>
    <item>
      <title>Why Doesn't My Malfoid AI Portrait Look Like Me? How Identity Survives (or Doesn't) in a Photo-to-Portrait Pipeline</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 10:10:41 +0000</pubDate>
      <link>https://dev.to/lpgit/why-doesnt-my-malfoid-ai-portrait-look-like-me-how-identity-survives-or-doesnt-in-a-4gj0</link>
      <guid>https://dev.to/lpgit/why-doesnt-my-malfoid-ai-portrait-look-like-me-how-identity-survives-or-doesnt-in-a-4gj0</guid>
      <description>&lt;p&gt;&lt;em&gt;Checked October 31, 2026 (18:00 CST) against the live pages linked below. I build &lt;a href="https://malfoidai.com/" rel="noopener noreferrer"&gt;malfoidai.com&lt;/a&gt;, an independent, unofficial fan-art studio for the Malfoid look, so this is a builder's write-up, not a neutral review. No paid generations were run for this post and no results are shown or claimed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; a Malfoid portrait is a &lt;em&gt;styled&lt;/em&gt; picture, not a face swap onto a photo, so some drift is built in. The pipeline keeps a small set of identity features from your upload (eye shape, nose, mouth, jaw) and deliberately replaces everything else: hair, clothes, light and background. When the result "isn't you", the cause is almost always that the photo didn't give the model enough clean identity signal. The fix is a different photo, not the same photo again.&lt;/p&gt;

&lt;p&gt;This is one of the most common things people ask an assistant after trying any "turn my selfie into a character" tool, so here's how the conditioning actually works and why the inputs matter more than the button.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a "Malfoid portrait" asks the model to do
&lt;/h2&gt;

&lt;p&gt;Malfoid is a fan nickname for Draco Malfoy pictured as a woman; it is fan art and has nothing official behind it. The look is a short trait list: long platinum hair, light eyes, a composed or smug expression, and green and silver academy clothes. On my studio the default preset renders that as a still 3:4 picture with a white shirt, a green striped tie and a dark robe in a candlelit academy corridor (&lt;a href="https://malfoidai.com/guides/which-preset/" rel="noopener noreferrer"&gt;how the presets differ&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;So a single generation has two jobs pulling in opposite directions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;What it needs from the model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Make it read as Malfoid&lt;/td&gt;
&lt;td&gt;Change hair colour and length, clothes, light, setting, often makeup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Make it read as &lt;em&gt;you&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Keep the geometry and texture that people use to recognise a face&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every identity-conditioned image pipeline is a negotiation between those two. Push style harder and the face drifts toward a generic "pretty platinum blonde". Push identity harder and the hair and lighting look pasted on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where identity signal comes from
&lt;/h2&gt;

&lt;p&gt;Whatever the specific model, identity-conditioned image generation tends to use some mix of three signals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The pixels of the reference image itself&lt;/strong&gt;, used as a direct visual condition (the model "sees" the photo, as in instruction-based image editing).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A face representation&lt;/strong&gt; extracted from the photo, such as an embedding from a face-recognition network, that the generator is pushed to match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt; describing the target look, which in a preset product is fixed and hidden.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm not going to claim which internal mechanism a given hosted model uses; my site doesn't publish its model, and providers rarely document this in detail. But all three share a property that matters to you: &lt;strong&gt;they can only preserve what the photo shows clearly.&lt;/strong&gt; A face that occupies 40 pixels in a group shot, or one smoothed by a beauty filter, simply carries less identity information. The model fills the gap with its prior, and its prior for "platinum-haired academy girl" is not your face.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five ways a photo leaks identity
&lt;/h2&gt;

&lt;p&gt;These are the patterns behind "it doesn't look like me", roughly in order of how often they're the cause. They line up with the studio's own &lt;a href="https://malfoidai.com/guides/photo-requirements/" rel="noopener noreferrer"&gt;photo guide&lt;/a&gt; and &lt;a href="https://malfoidai.com/help/" rel="noopener noreferrer"&gt;help page&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Photo problem&lt;/th&gt;
&lt;th&gt;What happens in the pipeline&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Face small in frame (full-body, across the room)&lt;/td&gt;
&lt;td&gt;Few pixels on eyes, nose, jaw; weak embedding&lt;/td&gt;
&lt;td&gt;Head-and-shoulders, face roughly centred&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beauty filter, face-swap or cartoon effect&lt;/td&gt;
&lt;td&gt;The model preserves the &lt;em&gt;filter's&lt;/em&gt; face geometry&lt;/td&gt;
&lt;td&gt;Upload the original, unfiltered photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark room, harsh flash, coloured light&lt;/td&gt;
&lt;td&gt;Shadows and tints read as features; noise reads as detail&lt;/td&gt;
&lt;td&gt;Face a window or stand in outdoor shade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angled or low selfie&lt;/td&gt;
&lt;td&gt;Jaw and nose shapes change, and that change is "kept"&lt;/td&gt;
&lt;td&gt;Phone at eye level, facing the camera&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several faces&lt;/td&gt;
&lt;td&gt;The wrong face can be picked as the identity&lt;/td&gt;
&lt;td&gt;One person per photo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two non-obvious ones from the photo guide are worth calling out for developers. First, &lt;strong&gt;brightening a dark photo in an editor makes it worse&lt;/strong&gt;, because it amplifies noise that the model then treats as texture. Second, &lt;strong&gt;uploading a finished Malfoid picture of yourself doesn't help&lt;/strong&gt;: the costume and styling hide exactly the features the pipeline needs. The studio already knows the look; it needs a plain face.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is &lt;em&gt;supposed&lt;/em&gt; to change
&lt;/h2&gt;

&lt;p&gt;People sometimes report drift that is actually the style doing its job. Expect these to differ from your photo on purpose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hair: always long platinum, whatever your real hair is&lt;/li&gt;
&lt;li&gt;Light: candle-style warm light instead of your room's light&lt;/li&gt;
&lt;li&gt;Makeup and skin finish: smoother and more "portrait" than a phone photo&lt;/li&gt;
&lt;li&gt;Clothes and background: replaced entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful test is the one in the studio's &lt;a href="https://malfoidai.com/guides/check-before-posting/" rel="noopener noreferrer"&gt;pre-posting checklist&lt;/a&gt;: compare &lt;em&gt;eyes, nose, mouth, jaw&lt;/em&gt;. If two or three of those look like someone else, that's real identity loss, and the photo is the likely cause. If only the hair, light and makeup differ, the pipeline worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick way to compare more objectively
&lt;/h2&gt;

&lt;p&gt;If you want something less subjective than squinting, you can compare face embeddings between your upload and the result with an open-source face recognition library. A rough sketch using the &lt;code&gt;face_recognition&lt;/code&gt; package's documented API (I did not run this one for the post; treat it as a starting point):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pip install face_recognition   (needs dlib; install can take a while)
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;face_recognition&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fr&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;photo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;portrait_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;face_encodings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_image_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;photo_path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;face_encodings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_image_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;portrait_path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;faces found: photo=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, portrait=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;face_distance&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lower is more similar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_selfie.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;malfoid_portrait.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Treat the number as a &lt;em&gt;relative&lt;/em&gt; signal, not a verdict. Recognition models are trained on ordinary photos, and heavy stylisation (new hair, painterly light) pushes distances up even when a human would say "that's clearly her". It's most useful for ranking: try three candidate selfies, and the one whose result lands closest is the photo to keep. I haven't benchmarked my own outputs with it, so I'm not quoting thresholds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "just retry" rarely fixes it
&lt;/h2&gt;

&lt;p&gt;Generation is non-deterministic, so a retry gives a different picture. But if the identity signal in the photo is weak, every sample is drawn from the same weakly constrained distribution: you get different wrong faces. The help and pre-posting pages on my site say the same thing in plain language: if the result doesn't look like the person, a different photo helps more than trying the same one again.&lt;/p&gt;

&lt;p&gt;That has a cost angle too. On malfoidai.com each portrait is a paid generation: &lt;strong&gt;$4.99&lt;/strong&gt; paid once (no account needed), or &lt;strong&gt;2 credits&lt;/strong&gt; from a one-time pack. Packs need sign-in: &lt;strong&gt;$13.99 for 30 credits, $35.99 for 100, $59.99 for 200&lt;/strong&gt;, which the &lt;a href="https://malfoidai.com/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; lists as about 15, 50 and 100 portraits. There is no free portrait, trial or free credits, and new accounts start at zero. If you suspect you'll need to test several photos, a pack is cheaper per portrait than repeated single payments; if your photo is already good, one payment is simpler.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I don't do, and why
&lt;/h2&gt;

&lt;p&gt;Two design choices on my studio follow from all of the above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No prompt box.&lt;/strong&gt; A user-written prompt is another force pulling on the face ("make her look like a film star", "more elegant") and most of those words push identity away. The look and scene are saved in the preset instead (&lt;a href="https://malfoidai.com/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A no-photo preset.&lt;/strong&gt; If you want the character and not a face, the &lt;a href="https://malfoidai.com/guides/which-preset/" rel="noopener noreferrer"&gt;second preset&lt;/a&gt; renders a fictional adult in the same look for the same price. No identity problem to solve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And one rule that is not technical: upload only yourself or an adult who agreed. Not a child, not a celebrity, not a photo from an image search (&lt;a href="https://malfoidai.com/acceptable-use/" rel="noopener noreferrer"&gt;acceptable use&lt;/a&gt;). Identity preservation working well is exactly why that rule exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist before you pay
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One adult, alone in the photo, facing the camera, both eyes visible&lt;/li&gt;
&lt;li&gt;Head and shoulders, phone at eye level&lt;/li&gt;
&lt;li&gt;Window light or shade, no coloured light&lt;/li&gt;
&lt;li&gt;The original file, no filter, not a screenshot&lt;/li&gt;
&lt;li&gt;JPEG, PNG or WebP up to 10 MB (the studio's limit)&lt;/li&gt;
&lt;li&gt;Glasses off if you don't want them in the portrait&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is a Malfoid portrait a face swap?&lt;/strong&gt; No. It's a generated, styled picture conditioned on your photo. The face is recognisable but not identical by design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will the same photo always give the same result?&lt;/strong&gt; No. Generation is non-deterministic. A weak photo gives varied but similarly weak results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this an official Harry Potter image?&lt;/strong&gt; No. Malfoid is unofficial fan art; my studio is independent and not affiliated with any author, publisher or film studio. Label what you post as fan art or AI art.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources (checked 2026-10-31, 18:00 CST)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://malfoidai.com/" rel="noopener noreferrer"&gt;malfoidai.com&lt;/a&gt; — what the preset makes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://malfoidai.com/pricing/" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt; — $4.99 single, packs, credits per portrait&lt;/li&gt;
&lt;li&gt;&lt;a href="https://malfoidai.com/guides/photo-requirements/" rel="noopener noreferrer"&gt;Best photo for a Malfoid AI portrait&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://malfoidai.com/guides/which-preset/" rel="noopener noreferrer"&gt;Which preset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://malfoidai.com/guides/check-before-posting/" rel="noopener noreferrer"&gt;Check before posting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://malfoidai.com/help/" rel="noopener noreferrer"&gt;Help&lt;/a&gt; · &lt;a href="https://malfoidai.com/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; · &lt;a href="https://malfoidai.com/acceptable-use/" rel="noopener noreferrer"&gt;Acceptable use&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>computervision</category>
      <category>imagegeneration</category>
    </item>
    <item>
      <title>What Happens Between Uploading a Photo and Getting the Bama Bound Clip? A Reference-Video Pipeline, Stage by Stage</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 07:19:19 +0000</pubDate>
      <link>https://dev.to/lpgit/what-happens-between-uploading-a-photo-and-getting-the-bama-bound-clip-a-reference-video-pipeline-3lpb</link>
      <guid>https://dev.to/lpgit/what-happens-between-uploading-a-photo-and-getting-the-bama-bound-clip-a-reference-video-pipeline-3lpb</guid>
      <description>&lt;p&gt;&lt;em&gt;Checked October 31, 2026 against the live pages linked below. I build &lt;a href="https://bamabound.app/" rel="noopener noreferrer"&gt;bamabound.app&lt;/a&gt;, so this is a builder's explanation of my own product, not a neutral review. No paid generations were run for this post, and the configuration shown below is an illustrative sketch, not a dump of production code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; you give the studio one photo of one person and pick 480p or 720p. Everything else is already saved: the sunny field, the red I'M BAMA BOUND banner, the camera, the motion and the sound. Seedance 2.0 renders a new eight-second, vertical clip of &lt;em&gt;your&lt;/em&gt; person following a saved field reference video, with new cheering sound. Nothing else in the pipeline is yours to set, and that is on purpose.&lt;/p&gt;

&lt;p&gt;People keep asking AI assistants some version of "how does a Bama Bound AI video generator actually work?" Most answers either say "it's a face swap" or "it's a prompt". Neither is quite right, so here is how one of these photo-to-video presets is put together, stage by stage, and why the choices are made the way they are.&lt;/p&gt;




&lt;h2&gt;
  
  
  The three ways to build this meme
&lt;/h2&gt;

&lt;p&gt;There are roughly three architectures for a meme like Bama Bound. Our &lt;a href="https://bamabound.app/compare/" rel="noopener noreferrer"&gt;compare page&lt;/a&gt; lists the product versions; here they are as engineering choices:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;What the user provides&lt;/th&gt;
&lt;th&gt;What the system controls&lt;/th&gt;
&lt;th&gt;Typical failure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Template editor (CapCut-style)&lt;/td&gt;
&lt;td&gt;Photos or clips&lt;/td&gt;
&lt;td&gt;Cuts, effects, music&lt;/td&gt;
&lt;td&gt;Your photo never actually moves; it is panned and zoomed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt-only video model&lt;/td&gt;
&lt;td&gt;A photo and a text prompt&lt;/td&gt;
&lt;td&gt;Nothing beyond the model&lt;/td&gt;
&lt;td&gt;Garbled banner letters, wrong motion, many retries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reference-video preset&lt;/td&gt;
&lt;td&gt;One photo (plus a resolution)&lt;/td&gt;
&lt;td&gt;Scene, motion, text, sound, length&lt;/td&gt;
&lt;td&gt;A bad input photo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A &lt;strong&gt;reference-video preset&lt;/strong&gt; is the third row. The product stores a short reference clip of the scene and asks the model to make a new clip that follows its motion and framing, with the person from your photo instead of the person in the reference. You never see a prompt box because there isn't one to fill in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 1: input validation (the only stage you influence)
&lt;/h2&gt;

&lt;p&gt;The input contract is small, and it's published on the &lt;a href="https://bamabound.app/" rel="noopener noreferrer"&gt;homepage&lt;/a&gt; and in the &lt;a href="https://bamabound.app/guides/clear-photo/" rel="noopener noreferrer"&gt;photo guide&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One clear photo of &lt;strong&gt;one person&lt;/strong&gt;, face visible&lt;/li&gt;
&lt;li&gt;JPEG, PNG or WebP, &lt;strong&gt;up to 10 MB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No group photos (the model may pick the wrong face), no pets, no drawings, collages or text screenshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an engineering point of view, this is the most important stage, because it's the only one where variance comes into the system. The &lt;a href="https://bamabound.app/guides/clear-photo/" rel="noopener noreferrer"&gt;clear-photo guide&lt;/a&gt; says the studio only learns three things from your photo: the face, the build and the clothes. Whatever it can't see, it guesses, and guessed details are where results go wrong. That's why a standing, head-to-knees photo usually beats a tight selfie, even though the selfie has the better face.&lt;/p&gt;

&lt;p&gt;If you're building something similar, spend your validation budget here: file type and size checks, a face count, and a minimum face size. Every bad photo you reject before payment is a refund you don't have to process later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2: the frozen scene
&lt;/h2&gt;

&lt;p&gt;This is what a preset "is". Here is an illustrative way to think about it as configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# illustrative only: what is fixed vs. what the user picks&lt;/span&gt;
&lt;span class="na"&gt;preset&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bama-bound-field-banner&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;seedance-2.0&lt;/span&gt;
&lt;span class="na"&gt;reference_video&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;field-banner-reference&lt;/span&gt;   &lt;span class="c1"&gt;# one person, sunny field, banner overhead, laugh, jump&lt;/span&gt;
&lt;span class="na"&gt;scene&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;banner_text&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I'M&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;BAMA&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;BOUND"&lt;/span&gt;            &lt;span class="c1"&gt;# white on red, words only&lt;/span&gt;
  &lt;span class="na"&gt;banner_logo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;                         &lt;span class="c1"&gt;# no school logo, no script letter&lt;/span&gt;
  &lt;span class="na"&gt;location&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sunny green field&lt;/span&gt;
&lt;span class="na"&gt;duration_s&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
&lt;span class="na"&gt;aspect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9:16"&lt;/span&gt;
&lt;span class="na"&gt;audio&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;generated&lt;/span&gt;                            &lt;span class="c1"&gt;# new outdoor cheering sound&lt;/span&gt;
&lt;span class="na"&gt;user_inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;photo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;required&lt;/span&gt;                           &lt;span class="c1"&gt;# one person&lt;/span&gt;
  &lt;span class="na"&gt;resolution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;480p"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;              &lt;span class="c1"&gt;# 480p default; no 1080p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three choices in that block matter more than they look:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Banner text is a constant, not an input.&lt;/strong&gt; You can't type different words (&lt;a href="https://bamabound.app/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt;). Text inside generated video is one of the weakest points of current video models, and the fabric folds while the person jumps. Locking the text means the model always has the same target, and it also means nobody can make a fake sign that says something it shouldn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No logo.&lt;/strong&gt; A university logo is a trademark, and the &lt;a href="https://bamabound.app/guides/banner-words/" rel="noopener noreferrer"&gt;banner-words guide&lt;/a&gt; explains the other reason: a logo makes the clip look more like an official announcement and less like a joke. Three big words on red also read better at thumbnail size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One reference, one motion.&lt;/strong&gt; The &lt;a href="https://bamabound.app/memes/" rel="noopener noreferrer"&gt;memes page&lt;/a&gt; says it directly: duo, campus-steps and indoor group clips are references, not what this studio makes. A single motion is easier to keep consistent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One honesty detail worth copying: the reference clip on the homepage is labelled as a published sample of the same joke that was &lt;strong&gt;not made by this studio and is not a preview of your result&lt;/strong&gt;. If your product shows a reference, say what it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 3: generation with joint audio
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://bamabound.app/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; states the generation contract: every clip is made with &lt;strong&gt;Seedance 2.0 following the saved field reference video&lt;/strong&gt;, it's &lt;strong&gt;eight seconds, vertical 9:16&lt;/strong&gt;, and it has &lt;strong&gt;new outdoor cheering sound made for it&lt;/strong&gt;. There's no prompt, no duration setting and no 1080p option.&lt;/p&gt;

&lt;p&gt;The audio part trips people up. Many viral Bama Bound posts use a song (the FAQ mentions "Delta Dawn"). The studio does not include it. The sound is generated with the clip, not muxed in from a commercial recording. If you want the song, you add it in TikTok, Reels or your editor, where the platform's music licence applies. As a design choice, that keeps the product from distributing a recording it doesn't have the rights to.&lt;/p&gt;

&lt;p&gt;Resolution is the only rendering knob. 480p is the default and 720p is sharper; the scene, length, motion and sound are the same at both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 4: quote, payment, job
&lt;/h2&gt;

&lt;p&gt;The order flow is deliberately boring:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The studio shows &lt;strong&gt;one total on the button&lt;/strong&gt; before you generate.&lt;/li&gt;
&lt;li&gt;A guest can pay once for one clip without an account. Signed-in users with enough credits spend credits by default and can still choose a single payment (&lt;a href="https://bamabound.app/help/" rel="noopener noreferrer"&gt;help&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The clip starts &lt;strong&gt;after payment is confirmed&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Live prices as of October 31, 2026, from the &lt;a href="https://bamabound.app/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Credits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One 480p clip&lt;/td&gt;
&lt;td&gt;$7.99&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One 720p clip&lt;/td&gt;
&lt;td&gt;$9.99&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30-credit pack&lt;/td&gt;
&lt;td&gt;$22.99&lt;/td&gt;
&lt;td&gt;about 5 clips at 480p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100-credit pack&lt;/td&gt;
&lt;td&gt;$59.99&lt;/td&gt;
&lt;td&gt;about 16 clips at 480p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200-credit pack&lt;/td&gt;
&lt;td&gt;$99.99&lt;/td&gt;
&lt;td&gt;about 33 clips at 480p&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Packs are one-time purchases, credits never expire, and there's no subscription. There's also no free clip, free trial or free credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 5: failure semantics
&lt;/h2&gt;

&lt;p&gt;What happens when a paid generation fails is part of the architecture, not an afterthought. Per the &lt;a href="https://bamabound.app/refunds/" rel="noopener noreferrer"&gt;refunds page&lt;/a&gt;: if a paid clip fails before delivery, &lt;strong&gt;credits that paid for it are released back to the balance&lt;/strong&gt;, and &lt;strong&gt;a single payment goes to refund review&lt;/strong&gt;, with the payment provider confirming any cash refund. A failure message on its own is not a refund confirmation.&lt;/p&gt;

&lt;p&gt;Note the distinction the banner guide makes: a clip that &lt;em&gt;finished but looks wrong&lt;/em&gt; isn't a failed task. That's almost always the photo, which takes us back to Stage 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging a bad result, by stage
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Likely stage&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wrong face, or two faces merged&lt;/td&gt;
&lt;td&gt;Input (group photo)&lt;/td&gt;
&lt;td&gt;Crop to one person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outfit or body looks invented&lt;/td&gt;
&lt;td&gt;Input (tight selfie)&lt;/td&gt;
&lt;td&gt;Use a head-to-knees photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Letters in the banner warped&lt;/td&gt;
&lt;td&gt;Input (raised hands, text on the shirt)&lt;/td&gt;
&lt;td&gt;Arms down, plain clothes (&lt;a href="https://bamabound.app/help/" rel="noopener noreferrer"&gt;help&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skin tone or features drift&lt;/td&gt;
&lt;td&gt;Input (dark or filtered photo)&lt;/td&gt;
&lt;td&gt;Natural, unfiltered daylight photo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want the trending song&lt;/td&gt;
&lt;td&gt;Not a pipeline bug&lt;/td&gt;
&lt;td&gt;Add music in your social app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Want two or more people&lt;/td&gt;
&lt;td&gt;Out of scope for this preset&lt;/td&gt;
&lt;td&gt;Make one clip per person, or use a multi-photo generator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A two-minute triage before you pay for another run
&lt;/h2&gt;

&lt;p&gt;Because only Stage 1 varies, most fixes are input fixes. Before re-running:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the photo you uploaded at full size.&lt;/strong&gt; Count the faces. Look for text on the shirt and hands above the shoulders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare build and clothes.&lt;/strong&gt; If the clip's outfit looks invented, your photo probably cut off at the chest. Use one that shows at least down to the knees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the light.&lt;/strong&gt; Dark or filtered photos are where skin tone drift starts. The &lt;a href="https://bamabound.app/guides/clear-photo/" rel="noopener noreferrer"&gt;clear-photo guide&lt;/a&gt; has a ten-second checklist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide whether it's a failure or a result.&lt;/strong&gt; A failed task follows the &lt;a href="https://bamabound.app/refunds/" rel="noopener noreferrer"&gt;refund rules&lt;/a&gt;. A finished clip you don't like is a new run at the same price, so fix the photo first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only then consider 720p.&lt;/strong&gt; Resolution sharpens what's there; it doesn't fix a wrong face.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pipeline is deliberately narrow, so there's little to tune besides the photo. The &lt;a href="https://bamabound.app/about/" rel="noopener noreferrer"&gt;about page&lt;/a&gt; is clear about the rest: bamabound.app is not the University of Alabama or Bama Bound Orientation, and a clip is a staged joke, not an acceptance.&lt;/p&gt;

&lt;p&gt;If you want to try the pipeline end to end, the &lt;a href="https://bamabound.app/create/" rel="noopener noreferrer"&gt;studio&lt;/a&gt; shows the total before anything is charged.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Does a Tiny Desk AI Video Use the Real "Outstanding" Song? How Sound Works in Photo-to-Video Pipelines</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 04:05:08 +0000</pubDate>
      <link>https://dev.to/lpgit/does-a-tiny-desk-ai-video-use-the-real-outstanding-song-how-sound-works-in-photo-to-video-2k1l</link>
      <guid>https://dev.to/lpgit/does-a-tiny-desk-ai-video-use-the-real-outstanding-song-how-sound-works-in-photo-to-video-2k1l</guid>
      <description>&lt;p&gt;&lt;em&gt;Checked October 31, 2026 against the live pages linked below. I build &lt;a href="https://tinydeskoutstanding.video/" rel="noopener noreferrer"&gt;tinydeskoutstanding.video&lt;/a&gt;, so treat this as a builder's write-up, not a neutral review. No paid generations were run for this post.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; usually not. A photo-to-video Tiny Desk generator renders a &lt;em&gt;new&lt;/em&gt; clip, and the sound on that clip is either generated by the video model along with the frames or attached afterwards from a licensed source. On my studio the sound is newly generated: it is not the Gap Band recording of "Outstanding", not Charlie Wilson's performance and not NPR audio. If the original song is the whole point for you, you add it at posting time from your app's sound library, or you use a tool that says it includes the song.&lt;/p&gt;

&lt;p&gt;This is one of the most common questions people ask about the meme, so here is how audio actually moves through these pipelines and why most tools land where they do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where does the audio in an AI meme clip come from?
&lt;/h2&gt;

&lt;p&gt;There are really only three places a soundtrack can come from in a photo-to-video pipeline:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;How it gets into the file&lt;/th&gt;
&lt;th&gt;Who carries the rights risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Generated with the video&lt;/td&gt;
&lt;td&gt;The model outputs frames and audio together, conditioned on the same prompt or reference&lt;/td&gt;
&lt;td&gt;The tool (it's new audio)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Muxed in afterwards&lt;/td&gt;
&lt;td&gt;The backend renders silent video, then attaches an audio file with something like &lt;code&gt;ffmpeg -i video.mp4 -i track.m4a -c:v copy -map 0:v -map 1:a&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Whoever chose and licensed &lt;code&gt;track.m4a&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Added by the platform&lt;/td&gt;
&lt;td&gt;You post a silent or generated-sound clip and pick the trending sound inside TikTok, Reels or Shorts&lt;/td&gt;
&lt;td&gt;The platform's music licence and its rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first option is what joint audio-video models make possible. ByteDance describes Seedance 2.0, the model my studio runs, as accepting text, image, audio and video inputs. In a template product, that means the scene (band, room, camera, timing) and the sound can be produced in the same generation instead of being stitched together later.&lt;/p&gt;

&lt;p&gt;The second option is the one that gets products into trouble. Muxing the commercial recording into every file you serve means you are distributing that recording, whatever your terms of service say.&lt;/p&gt;

&lt;p&gt;The third option is the one most creators already use without thinking about it: the sound picker in the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "the real song" is a product decision, not a technical one
&lt;/h2&gt;

&lt;p&gt;Technically, attaching an MP3 is trivial. The reasons a builder decides &lt;em&gt;not&lt;/em&gt; to are about what the file is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Outstanding" is a 1982 Gap Band recording.&lt;/strong&gt; Charlie Wilson closed his NPR Tiny Desk set with it; NPR published that concert on June 5, 2023. The recording and the concert are both someone else's work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A downloaded file travels.&lt;/strong&gt; Once it leaves your server it gets re-posted, cropped and re-uploaded. A platform sound is tied to the platform's licence; a baked-in track is not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A parody should be recognisably a parody.&lt;/strong&gt; New sound makes it obvious the clip is not NPR footage or the commercial recording, which is how I want the result labelled anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So on my site the decision is: generated sound in the file, and a clear note on the &lt;a href="https://tinydeskoutstanding.video/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; that it isn't the original song. Other tools have made different calls; some of them say their output includes the song. That's a legitimate difference to choose on, and I'd rather state mine plainly than blur it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "newly generated sound" means in practice
&lt;/h2&gt;

&lt;p&gt;When the model generates audio with the video, it is matching the &lt;em&gt;feel&lt;/em&gt; of the reference scene: a band playing, a laugh, a sax line at the end. It is not reproducing a specific melody from a specific record. Practically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The sound is in sync with the visuals because it was produced with them.&lt;/li&gt;
&lt;li&gt;It will not match the song your friends hear in their heads.&lt;/li&gt;
&lt;li&gt;Two runs from the same photo won't sound identical, the same way the frames won't be identical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters if you generate at 480p first and then want 720p. There is no upscale on my studio; a 720p clip is a new generation, so both the picture and the sound come out a little different (see the &lt;a href="https://tinydeskoutstanding.video/guides/480p-or-720p/" rel="noopener noreferrer"&gt;480p or 720p guide&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get the original song on your clip (the legitimate way)
&lt;/h2&gt;

&lt;p&gt;If you want the joke to land with the actual track:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download your clip&lt;/strong&gt; as delivered (on my site it's a 15-second, 9:16 vertical file with generated sound).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload it to the platform as is.&lt;/strong&gt; Don't crop it; it's already the shape TikTok, Reels and Shorts expect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick the sound inside the app.&lt;/strong&gt; Search the platform's library for the song if it is available there. Turn the original audio down or off in the app's mixer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Label it.&lt;/strong&gt; "AI parody of the Tiny Desk Outstanding meme" is enough, plus the platform's AI-content toggle when there is one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are editing on a desktop and want to strip the generated sound before uploading, this keeps the video stream untouched:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# remove the audio track without re-encoding the video&lt;/span&gt;
ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; outstanding.mp4 &lt;span class="nt"&gt;-c&lt;/span&gt;:v copy &lt;span class="nt"&gt;-an&lt;/span&gt; outstanding-silent.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only lay a commercial track back over it inside a tool whose licence covers that use.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you're building one of these: an audio checklist
&lt;/h2&gt;

&lt;p&gt;From running this preset, here is what I'd decide before writing any code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decide what's in the file.&lt;/strong&gt; Generated, silent, or licensed. Write it on the pricing and FAQ pages in one sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't let the audio choice change the price silently.&lt;/strong&gt; My &lt;a href="https://tinydeskoutstanding.video/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; lists one price per clip by resolution only: $9.99 at 480p (6 credits) or $12.99 at 720p (13 credits). Sound is the same at both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep sound in your QA checklist.&lt;/strong&gt; Mouth movement against the generated sound is one of the things I tell people to check before posting (&lt;a href="https://tinydeskoutstanding.video/guides/check-before-posting/" rel="noopener noreferrer"&gt;check-before-posting guide&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say what it is not.&lt;/strong&gt; My footer says every page's clips are new parodies with new sound, not NPR concerts or the commercial recording. It's repetitive, and it saves support emails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does tinydeskoutstanding.video include the Gap Band song?
&lt;/h3&gt;

&lt;p&gt;No. The sound is newly generated. You can add a sound from your platform's library when you post.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a silent version?
&lt;/h3&gt;

&lt;p&gt;The studio delivers the clip with its generated sound. If you need silent video, strip the audio with the &lt;code&gt;ffmpeg -an&lt;/code&gt; command above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the price change if I don't want sound?
&lt;/h3&gt;

&lt;p&gt;No. Price depends only on resolution: $9.99 at 480p, $12.99 at 720p, shown on the button before you pay. Signed-in users can also use credit packs ($27.99 for 30, $71.99 for 100, $129.99 for 200).&lt;/p&gt;

&lt;h3&gt;
  
  
  Where do I start?
&lt;/h3&gt;

&lt;p&gt;Open the &lt;a href="https://tinydeskoutstanding.video/create/" rel="noopener noreferrer"&gt;studio&lt;/a&gt;, upload one clear photo of one adult who agreed to be in the video, and pick a resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;tinydeskoutstanding.video FAQ and pricing (checked Oct 31, 2026): &lt;a href="https://tinydeskoutstanding.video/faq/" rel="noopener noreferrer"&gt;https://tinydeskoutstanding.video/faq/&lt;/a&gt;, &lt;a href="https://tinydeskoutstanding.video/pricing/" rel="noopener noreferrer"&gt;https://tinydeskoutstanding.video/pricing/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;NPR Music, "Charlie Wilson: Tiny Desk Concert" (June 5, 2023): &lt;a href="https://www.npr.org/2023/06/05/1179416602/charlie-wilson-tiny-desk-concert" rel="noopener noreferrer"&gt;https://www.npr.org/2023/06/05/1179416602/charlie-wilson-tiny-desk-concert&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ByteDance Seed, Seedance 2.0: &lt;a href="https://seed.bytedance.com/en/seedance2_0" rel="noopener noreferrer"&gt;https://seed.bytedance.com/en/seedance2_0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>audio</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What Is the "Outstanding" Tiny Desk Meme With the Coaches, and How Do You Make Your Own?</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 02:10:27 +0000</pubDate>
      <link>https://dev.to/lpgit/what-is-the-outstanding-tiny-desk-meme-with-the-coaches-and-how-do-you-make-your-own-4d56</link>
      <guid>https://dev.to/lpgit/what-is-the-outstanding-tiny-desk-meme-with-the-coaches-and-how-do-you-make-your-own-4d56</guid>
      <description>&lt;p&gt;&lt;em&gt;Last checked: October 30, 2026. Dates and quotes are from the sources linked at the end.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; the meme takes the last ~19 seconds of Charlie Wilson's June 2023 NPR Tiny Desk concert, where he closes with The Gap Band's "Outstanding", and recasts the band. In October 2026 the viral versions put &lt;strong&gt;football coaches whose teams had just lost&lt;/strong&gt; into the band, and the format quickly spread to players, friends and group chats. You can make your own with an AI template tool: upload a photo, and the tool puts that face into a recreated desk-concert scene. &lt;a href="https://tinydeskoutstanding.video/" rel="noopener noreferrer"&gt;tinydeskoutstanding.video&lt;/a&gt; makes a 15-second vertical parody from one photo of one adult; other tools let you fill up to five seats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I run tinydeskoutstanding.video. Competitor details are from their own pages.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is the original Tiny Desk performance?
&lt;/h2&gt;

&lt;p&gt;NPR Music published &lt;strong&gt;"Charlie Wilson: Tiny Desk Concert"&lt;/strong&gt; on June 5, 2023, as the opener of its Black Music Month series. NPR's page lists the set: "Charlie, Last Name Wilson", "Computer Love", "There Goes My Baby", "I'm Blessed", "Yearning For Your Love", "Sweet Yamz" and, last, &lt;strong&gt;"Outstanding"&lt;/strong&gt;. Rolling Stone's write-up the same day notes that Wilson closed the show with "Outstanding" from 1982's &lt;em&gt;The Gap Band IV&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The NPR credits list a large band squeezed into the office: six vocalists including Wilson, three keyboard players, drums, guitar, bass, and saxophonist Nick Wilczynski. That crowded, joyful closer is what the meme borrows.&lt;/p&gt;

&lt;h2&gt;
  
  
  How did it become a meme in 2026?
&lt;/h2&gt;

&lt;p&gt;Two meme tools describe the same timeline on their public pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;aitinydesk.video:&lt;/strong&gt; "In October 2026 its last ~19 seconds became a template: people recast the whole band with coaches whose teams lost that weekend, and new versions keep coming."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tinydeskai.io:&lt;/strong&gt; "October 2026 TikTok edits use AI to swap coaches, players and friends into the last 19 seconds of that closer: band, big laugh, sax solo."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the joke structure is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A losing weekend&lt;/strong&gt; for a team (or anything else that went badly).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The people responsible&lt;/strong&gt;, edited into an ecstatic soul band.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The contrast&lt;/strong&gt;: the worse the result, the funnier the celebration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Search names you'll see for the same thing include Outstanding Tiny Desk, Tiny Desk AI, Tiny Desk Outstanding AI and "outstanding tiny desk set".&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the beats of the clip?
&lt;/h2&gt;

&lt;p&gt;Every version follows the same short structure, which is why template tools can automate it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Beat&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;What a tool needs from you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Band shot&lt;/td&gt;
&lt;td&gt;The whole band crowded behind the keyboard&lt;/td&gt;
&lt;td&gt;Faces for any seats being recast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Big laugh&lt;/td&gt;
&lt;td&gt;A close-up of the lead laughing&lt;/td&gt;
&lt;td&gt;A clear, close photo of the lead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sax solo&lt;/td&gt;
&lt;td&gt;The sax player lifts and plays&lt;/td&gt;
&lt;td&gt;A face for the sax seat, if recast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Band again&lt;/td&gt;
&lt;td&gt;Everyone back in frame&lt;/td&gt;
&lt;td&gt;â€”&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My studio describes the same scene as an office band behind a red keyboard, a laughing close-up and a sax lift. Only the lead performer changes in my version.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you make your own version?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option A: one face, the lead spot
&lt;/h3&gt;

&lt;p&gt;On tinydeskoutstanding.video:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload one clear, front-facing photo of one adult who agreed (JPEG, PNG or WebP up to 10 MB).&lt;/li&gt;
&lt;li&gt;Choose 480p ($9.99) or 720p ($12.99). The clip is always 15 seconds and vertical.&lt;/li&gt;
&lt;li&gt;Pay once (no account needed) or use credits, and generate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The sound is newly generated. It isn't the commercial recording of "Outstanding" and isn't the NPR concert. Every clip is paid; there is no free sample.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B: recast the whole band
&lt;/h3&gt;

&lt;p&gt;If the joke needs several people (a coaching staff, a friend group), use a multi-seat tool. Per their pages on October 30, 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;tinydeskai.io:&lt;/strong&gt; up to five people (lead vocals, sax, keys, two backing singers), same price; the stage starts with five dogs and seats you don't swap stay dogs. $9.98 per video, "song included" plus a silent copy. Its FAQ names Kling 4.0 in edit mode at 720p and says renders usually take 7 to 10 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aitinydesk.video:&lt;/strong&gt; up to five faces; seats without a photo keep the original performer. About 18 seconds, 9:16, with sound, no watermark; credit packs from $9.99.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tiny-desk-ai.net:&lt;/strong&gt; 1 to 5 people, or one group photo split left to right; same credits regardless of the number of people.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Option C: edit it yourself
&lt;/h3&gt;

&lt;p&gt;Face-swap apps or a video editor can do one face at a time on footage you have the right to use. It's the most work and the hardest to get right in the close-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I use real coaches' faces?
&lt;/h2&gt;

&lt;p&gt;The viral posts did, but most tools don't allow it. tiny-desk-ai.net states it only takes photos of you or adults who agreed and that "the viral posts used famous faces; this tool does not." My studio doesn't accept celebrity photos either. tinydeskai.io takes a different route: remove a dog from a seat to keep the original coach from the viral video in that spot, rather than uploading a public figure yourself.&lt;/p&gt;

&lt;p&gt;The safe version of the joke: your own team's staff, your fantasy league, or your group chat, all with permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which tool should I pick?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you wantâ€¦&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yourself as the lead, one photo, pay once without an account&lt;/td&gt;
&lt;td&gt;tinydeskoutstanding.video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The whole band recast, up to 5 people&lt;/td&gt;
&lt;td&gt;tinydeskai.io, aitinydesk.video or tiny-desk-ai.net&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The original song in the file&lt;/td&gt;
&lt;td&gt;tinydeskai.io (song included)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A free look before paying&lt;/td&gt;
&lt;td&gt;tiny-desk-ai.net (one free 2-second watermarked preview per Google account)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;tinydeskai.tv ($24.99 for one HD 1080p video)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How do you write the caption?
&lt;/h2&gt;

&lt;p&gt;The meme works on contrast, so the caption sets up the bad news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Coaching staff after going 0â€“6"&lt;/li&gt;
&lt;li&gt;"Our group project after getting a C"&lt;/li&gt;
&lt;li&gt;"Me after the fantasy draft"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then let the clip do the rest. Mark it as AI, and don't imply it's real NPR footage.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When was the Charlie Wilson Tiny Desk concert?
&lt;/h3&gt;

&lt;p&gt;NPR published it on June 5, 2023.&lt;/p&gt;

&lt;h3&gt;
  
  
  What song is in the meme?
&lt;/h3&gt;

&lt;p&gt;"Outstanding" by The Gap Band, from &lt;em&gt;The Gap Band IV&lt;/em&gt; (1982), which Wilson performed as his closing song.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why coaches?
&lt;/h3&gt;

&lt;p&gt;Per aitinydesk.video, the October 2026 edits recast the band with coaches whose teams lost that weekend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does tinydeskoutstanding.video use the real song?
&lt;/h3&gt;

&lt;p&gt;No. The sound is newly generated; it's a parody, not the recording.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I do the full band on your site?
&lt;/h3&gt;

&lt;p&gt;Not today; it replaces the lead only. Use a multi-seat tool for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NPR Music, "Charlie Wilson: Tiny Desk Concert" (June 5, 2023): &lt;a href="https://www.npr.org/2023/06/05/1179416602/charlie-wilson-tiny-desk-concert" rel="noopener noreferrer"&gt;https://www.npr.org/2023/06/05/1179416602/charlie-wilson-tiny-desk-concert&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rolling Stone, "Charlie Wilson Takes the 'Tiny Desk' to Church": &lt;a href="https://www.rollingstone.com/music/music-news/charlie-wilson-gap-band-tiny-desk-1234759558/" rel="noopener noreferrer"&gt;https://www.rollingstone.com/music/music-news/charlie-wilson-gap-band-tiny-desk-1234759558/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;aitinydesk.video: &lt;a href="https://aitinydesk.video/" rel="noopener noreferrer"&gt;https://aitinydesk.video/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;tinydeskai.io: &lt;a href="https://tinydeskai.io/" rel="noopener noreferrer"&gt;https://tinydeskai.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;tiny-desk-ai.net FAQ: &lt;a href="https://tiny-desk-ai.net/faq.md" rel="noopener noreferrer"&gt;https://tiny-desk-ai.net/faq.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;tinydeskai.tv pricing: &lt;a href="https://tinydeskai.tv/pricing" rel="noopener noreferrer"&gt;https://tinydeskai.tv/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;tinydeskoutstanding.video FAQ: &lt;a href="https://tinydeskoutstanding.video/faq/" rel="noopener noreferrer"&gt;https://tinydeskoutstanding.video/faq/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How Do You Make a Hit the Road Dude AI Video From One Photo? (Reference-Video Workflow, Oct 2026)</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 02:09:46 +0000</pubDate>
      <link>https://dev.to/lpgit/how-do-you-make-a-hit-the-road-dude-ai-video-from-one-photo-reference-video-workflow-oct-2026-4k53</link>
      <guid>https://dev.to/lpgit/how-do-you-make-a-hit-the-road-dude-ai-video-from-one-photo-reference-video-workflow-oct-2026-4k53</guid>
      <description>&lt;p&gt;&lt;em&gt;Last checked: October 30, 2026. Facts come from the public pages listed in Sources.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; pick a template tool that holds a saved reference clip of the pickup-truck scene, upload one clear photo of one adult or one pet, choose a resolution, and pay for the render. The model (Seedance 2.0 on &lt;a href="https://hittheroaddude.app/" rel="noopener noreferrer"&gt;hittheroaddude.app&lt;/a&gt;) puts your subject in the driver's seat and follows the reference timing. The result on that site is a &lt;strong&gt;15-second vertical clip with a newly generated voice&lt;/strong&gt;, at 480p ($9.99) or 720p ($12.99). If you need the original audio, read the comparison section first, because that is where tools differ most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I run hittheroaddude.app. Other tools are described from their own pages.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is the Hit the Road Dude meme?
&lt;/h2&gt;

&lt;p&gt;Know Your Meme files it as "Lock 'Em Up / State Property". Per that entry, the source is a viral TikTok uploaded by @bird28thegr8 in late August 2025: an older man tells two people fishing at a pond that it is not state property. It became a lip-dub format that month, a green-screen template in early September 2025, and saw a resurgence in October 2026, when many of the most popular examples were AI videos replacing the man with other people or characters.&lt;/p&gt;

&lt;p&gt;The lines people quote: the visitor calls the spot state property, the driver repeats "State?", corrects it to private property, and sends them off with "hit the road, dude". Search names for the same clip include State Property meme, Private Property meme and This Is Private Property. It is not the song "Hit the Road Jack".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this meme need a reference video?
&lt;/h2&gt;

&lt;p&gt;Most viral AI-video memes in 2026 are &lt;strong&gt;template memes&lt;/strong&gt;: the joke depends on a specific scene, timing and camera framing. Generating from a text prompt alone ("an old man in a white pickup tells someone to leave") gives you a new scene that may be funny, but it isn't &lt;em&gt;the&lt;/em&gt; meme.&lt;/p&gt;

&lt;p&gt;A reference-video workflow fixes that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The reference clip&lt;/strong&gt; carries the motion, framing, cut timing and gestures (the lean out of the window, the pointing).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your photo&lt;/strong&gt; carries identity: whose face, or which dog, sits in the driver's seat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model&lt;/strong&gt; combines the two. Seedance 2.0, per ByteDance's model page, accepts images, audio and video as references in a single multimodal generation, which is why it is a common choice for this kind of template.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On hittheroaddude.app the reference clip is saved in the preset. You never upload a video, never type a prompt, and never set a length. Each tool in this niche makes slightly different choices here, which the table below shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step on hittheroaddude.app
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open the studio.&lt;/strong&gt; The scene and the lines are already saved in the preset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upload one photo.&lt;/strong&gt; One clear photo of one adult who agreed, or of one pet, face visible. JPEG, PNG or WebP up to 10 MB. Don't upload a child or someone who did not agree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick 480p or 720p.&lt;/strong&gt; 480p is the default at $9.99 (6 credits). 720p is sharper at $12.99 (14 credits). There is no option above 720p, and length, framing and voice don't change between the two.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the total and pay.&lt;/strong&gt; The button shows the total before you pay. A guest can pay once without an account. A signed-in user can spend credits instead; packs are $27.99 for 30 credits, $71.99 for 100 or $129.99 for 200, and do not renew.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download and check.&lt;/strong&gt; Watch the lines, the face and the pointing before posting (the site's own checklist).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is no free sample. New accounts start at zero credits. If a credit-paid render fails, the reserved credits are released; if a single payment paid for it, the payment is marked for refund review with the same provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do the Hit the Road Dude generators differ?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool (checked Oct 30, 2026)&lt;/th&gt;
&lt;th&gt;Subjects&lt;/th&gt;
&lt;th&gt;Clip length&lt;/th&gt;
&lt;th&gt;Audio&lt;/th&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;th&gt;Entry price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;hittheroaddude.app&lt;/td&gt;
&lt;td&gt;1 adult or 1 pet&lt;/td&gt;
&lt;td&gt;15 s, vertical&lt;/td&gt;
&lt;td&gt;Newly generated voice&lt;/td&gt;
&lt;td&gt;480p or 720p&lt;/td&gt;
&lt;td&gt;$9.99 (480p), $12.99 (720p)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hittheroaddude.live&lt;/td&gt;
&lt;td&gt;Person or pet&lt;/td&gt;
&lt;td&gt;Full 15 s, 9:16&lt;/td&gt;
&lt;td&gt;Original audio, lip-synced (per its page)&lt;/td&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$7.99 per video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hittheroadai.com&lt;/td&gt;
&lt;td&gt;You or your pet&lt;/td&gt;
&lt;td&gt;15 s, 9:16 MP4&lt;/td&gt;
&lt;td&gt;Original audio and timing (per its page)&lt;/td&gt;
&lt;td&gt;Not stated on homepage&lt;/td&gt;
&lt;td&gt;Intro $6.80 per clip (listed as down from $8.80)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hittheroaddudeapp.com&lt;/td&gt;
&lt;td&gt;Person, dog or cat&lt;/td&gt;
&lt;td&gt;11 s&lt;/td&gt;
&lt;td&gt;People keep the original voice; pets get an AI voice&lt;/td&gt;
&lt;td&gt;Not stated on the free guide&lt;/td&gt;
&lt;td&gt;$5.99 for 1, $13.99 for 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;statepropertymeme.app&lt;/td&gt;
&lt;td&gt;1 person or pet&lt;/td&gt;
&lt;td&gt;Up to 30 s (full scene)&lt;/td&gt;
&lt;td&gt;The meme's audio&lt;/td&gt;
&lt;td&gt;480p, 720p, 1080p&lt;/td&gt;
&lt;td&gt;100 credits per 15 s at 480p; packs from $9.90 for 100 credits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The honest summary: &lt;strong&gt;if keeping the original voice matters to you, my site is not the right pick today.&lt;/strong&gt; Several competitors say they keep the original audio. hittheroaddude.app generates a new voice that says the same lines. What it does offer is a fixed vertical 15-second cut, a choice of 480p or 720p, pay-once checkout without an account, and pets as drivers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes a good driver photo?
&lt;/h2&gt;

&lt;p&gt;From the published guides on several of these tools, which agree closely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One subject.&lt;/strong&gt; One adult or one pet. Group photos can put the wrong face in the truck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Face visible and large.&lt;/strong&gt; Front-facing or close to it, nothing covering the eyes. For pets, the whole face, eyes and nose clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Even light.&lt;/strong&gt; Daylight on the face or fur works best. Avoid heavy filters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No sunglasses, masks or hands over the face.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your rights.&lt;/strong&gt; Your own photo, your pet, or an adult who agreed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What goes wrong, and how do you fix it?
&lt;/h2&gt;

&lt;p&gt;Generated video can get a face, a mouth or a hand wrong. The common fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wrong or drifting face:&lt;/strong&gt; use a closer, sharper photo of one person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mouth out of sync:&lt;/strong&gt; expected on tools that generate a new voice; check whether the line delivery is readable before posting. No tool I checked promises word-for-word lip sync; statepropertymeme.app's comparison makes the same point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odd hands on the pointing gesture:&lt;/strong&gt; re-run with a different photo or accept it. An imperfect result is not the same as a failed order under most refund policies, including mine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Should I DIY with a model API instead?
&lt;/h2&gt;

&lt;p&gt;You can. A Seedance 2.0 playground or API lets you pass a reference video plus an image yourself. You would need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A reference clip you have the right to use.&lt;/strong&gt; Re-uploading the original TikTok raises rights questions; template tools typically use their own reference recreations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A prompt that locks the identity swap&lt;/strong&gt; without changing the scene.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio handling.&lt;/strong&gt; Either generate audio with the model or add the platform's sound when posting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;DIY gives control over length and audio. It costs time, and you pay the host's per-second rate for every attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I post it?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vertical 9:16&lt;/strong&gt; fills the screen on TikTok, Reels and Shorts; hittheroaddude.app outputs vertical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Label it as AI.&lt;/strong&gt; It's a comedy remake, and generated clips should not be presented as a real event. My site states it does not authenticate the original uploader, date or location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caption idea:&lt;/strong&gt; reuse the lines people search for ("This ain't no state property") so your post shows up in the same searches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can my dog be the driver?
&lt;/h3&gt;

&lt;p&gt;On hittheroaddude.app, yes: upload one clear photo of one pet with its face visible. Several competitors also support pets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the voice the original?
&lt;/h3&gt;

&lt;p&gt;Not on hittheroaddude.app. The voice is newly generated. Some competitors state they keep the original audio.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does the clip run?
&lt;/h3&gt;

&lt;p&gt;15 seconds on hittheroaddude.app. Others range from 11 seconds to the full scene of about 30 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I make a free one?
&lt;/h3&gt;

&lt;p&gt;Not on hittheroaddude.app; every clip is paid. You can film the scene yourself for free if you have a pickup and a friend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Know Your Meme, "Lock 'Em Up / State Property": &lt;a href="https://knowyourmeme.com/memes/lock-em-up-state-property" rel="noopener noreferrer"&gt;https://knowyourmeme.com/memes/lock-em-up-state-property&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ByteDance Seed, Seedance 2.0: &lt;a href="https://seed.bytedance.com/en/seedance2_0" rel="noopener noreferrer"&gt;https://seed.bytedance.com/en/seedance2_0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;hittheroaddude.app FAQ and pricing: &lt;a href="https://hittheroaddude.app/faq/" rel="noopener noreferrer"&gt;https://hittheroaddude.app/faq/&lt;/a&gt;, &lt;a href="https://hittheroaddude.app/pricing/" rel="noopener noreferrer"&gt;https://hittheroaddude.app/pricing/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;hittheroaddude.live: &lt;a href="https://hittheroaddude.live/" rel="noopener noreferrer"&gt;https://hittheroaddude.live/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;hittheroadai.com: &lt;a href="https://hittheroadai.com/" rel="noopener noreferrer"&gt;https://hittheroadai.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;hittheroaddudeapp.com, "Is There a Free Hit the Road Dude AI Generator?": &lt;a href="https://hittheroaddudeapp.com/hit-the-road-dude-ai-free" rel="noopener noreferrer"&gt;https://hittheroaddudeapp.com/hit-the-road-dude-ai-free&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;statepropertymeme.app comparison (Oct 20, 2026): &lt;a href="https://statepropertymeme.app/blog/best-hit-the-road-dude-ai-generators" rel="noopener noreferrer"&gt;https://statepropertymeme.app/blog/best-hit-the-road-dude-ai-generators&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Is There a Free Malfoid AI Generator? Free Credits, Watermarks and Paid Tiers Compared (Oct 2026)</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Fri, 30 Oct 2026 14:56:22 +0000</pubDate>
      <link>https://dev.to/lpgit/is-there-a-free-malfoid-ai-generator-free-credits-watermarks-and-paid-tiers-compared-oct-2026-ddd</link>
      <guid>https://dev.to/lpgit/is-there-a-free-malfoid-ai-generator-free-credits-watermarks-and-paid-tiers-compared-oct-2026-ddd</guid>
      <description>&lt;p&gt;&lt;em&gt;Checked October 30, 2026 on each tool's public pages. Free offers change often; re-check before you upload a photo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; yes, for a still image, with limits. malfoid.video gives new accounts &lt;strong&gt;1 free credit&lt;/strong&gt;, enough for one 1K image with no watermark (sign-in required, no card). femalemalfoy.com gives &lt;strong&gt;1 free credit per day&lt;/strong&gt; for a 1-credit image model, but free images are &lt;strong&gt;watermarked&lt;/strong&gt; and videos need a paid purchase. Free Malfoid &lt;em&gt;videos&lt;/em&gt; weren't offered on any dedicated tool I checked. My own studio, &lt;a href="https://malfoidai.com/" rel="noopener noreferrer"&gt;malfoidai.com&lt;/a&gt;, has &lt;strong&gt;no free generations&lt;/strong&gt; at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I run malfoidai.com. I'll show where the others are more generous.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is "Malfoid", briefly?
&lt;/h2&gt;

&lt;p&gt;Know Your Meme's entry &lt;em&gt;Malfoid / Female Draco Malfoy&lt;/em&gt; (added September 30, 2026, updated October 8) describes Malfoid as a nickname for a gender-swapped Draco Malfoy: platinum hair, green and silver academy look. The entry traces gender-swap art back to a 2011 Tumblr example, an X post on March 10, 2024 that passed 60,000 likes, the first use of the name "Malfoid" on January 10, 2026, and a viral wave on September 27â€“29, 2026, when one piece passed 78,000 likes in a day.&lt;/p&gt;

&lt;p&gt;A note on the name: Know Your Meme explains it as Malfoy + "foid", which it calls a derogatory term derived from "femoid". Other names in use include "Female Malfoy" and "Fem Draco".&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Malfoid generators have a free option?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Free offer&lt;/th&gt;
&lt;th&gt;Watermark on free result&lt;/th&gt;
&lt;th&gt;Account&lt;/th&gt;
&lt;th&gt;Free video?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;malfoid.video&lt;/td&gt;
&lt;td&gt;1 credit for new accounts (one 1K image)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sign-in required, no card&lt;/td&gt;
&lt;td&gt;No (videos use paid credits)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;femalemalfoy.com&lt;/td&gt;
&lt;td&gt;1 credit every day (resets 00:00 UTC; unused daily credits expire)&lt;/td&gt;
&lt;td&gt;Yes; buy any pack to unlock clean downloads&lt;/td&gt;
&lt;td&gt;Sign-in (Google or email, per its guide)&lt;/td&gt;
&lt;td&gt;No ("Videos require a paid purchase")&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;malfoid.app&lt;/td&gt;
&lt;td&gt;No free tier listed on its pricing page&lt;/td&gt;
&lt;td&gt;Paid plans say "No watermark"&lt;/td&gt;
&lt;td&gt;â€”&lt;/td&gt;
&lt;td&gt;â€”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;malfoidai.com (mine)&lt;/td&gt;
&lt;td&gt;None ("No free generations"); new accounts start at 0 credits&lt;/td&gt;
&lt;td&gt;â€”&lt;/td&gt;
&lt;td&gt;Guest can pay once; packs need sign-in&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What do the paid tiers look like?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;malfoid.video.&lt;/strong&gt; One-time credit packs: Starter $9.90 for 120 credits, Creator $29.90 for 400, Studio $79.90 for 1,200. Its pricing page says an image costs from $0.07 and a 10-second 720p video from $1.00; Starter covers about 120 images at 1K or about 8 ten-second clips on Seedance 2.0 Mini. Credits from packs never expire, and failed generations return their credits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;femalemalfoy.com.&lt;/strong&gt; One balance for portraits and videos; purchased credits never expire. It lists 36 templates, including duo templates, and image models at 1 credit (1K), 2 credits (2K) and 3 credits (4K).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;malfoid.app.&lt;/strong&gt; Subscriptions on yearly billing: Plus $89/yr, Pro $179/yr and Ultra $490/yr (shown against $119, $239 and $588), plus separate credit packs. It says a first purchase is fully refundable within 7 days if unused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;malfoidai.com.&lt;/strong&gt; Pay once per generation (guest or signed-in) or buy a one-time credit pack while signed in. The price is quoted from the model and resolution you pick, and the page shows one total before you pay. I'm not quoting my own numbers here because the pricing page is being reworked; check &lt;a href="https://malfoidai.com/pricing/" rel="noopener noreferrer"&gt;the pricing page&lt;/a&gt; for the live quote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are there free routes outside dedicated generators?
&lt;/h2&gt;

&lt;p&gt;malfoid.video's own free guide lists a few, with honest trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;General chatbots with image tools.&lt;/strong&gt; Many can draw a female Draco on a free plan with a daily limit, but the guide notes they rarely keep the same face across images and may refuse franchise-related requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anime image sites with daily credits.&lt;/strong&gt; Some offer a small daily allowance and community models such as a Malfoid LoRA; expect queues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A local Stable Diffusion setup.&lt;/strong&gt; Free if you have the hardware; you install an interface such as ComfyUI or AUTOMATIC1111 and find a community model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there's always drawing it yourself: Know Your Meme's entry traces the look back to fan art.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does "free" cost you instead?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Free offer&lt;/th&gt;
&lt;th&gt;What you give up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One-time free credit&lt;/td&gt;
&lt;td&gt;One image, then you pay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily free credit&lt;/td&gt;
&lt;td&gt;A watermark; images only; small model tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chatbot free plan&lt;/td&gt;
&lt;td&gt;Face consistency; possible refusals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local model&lt;/td&gt;
&lt;td&gt;Setup time and a capable GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Should I upload my photo to a free tool?
&lt;/h2&gt;

&lt;p&gt;Check three things first, on any tool:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What happens to the photo.&lt;/strong&gt; Look for how long it's kept and whether you can delete it. malfoidai.com, for example, asks for a clear photo you have the right to upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whose photo it is.&lt;/strong&gt; Use your own, or one you have permission to use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's free vs what's watermarked.&lt;/strong&gt; A free watermarked image isn't the same as a free clean one.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Which should I pick?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your goal&lt;/th&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One free clean image, to see if you like the look&lt;/td&gt;
&lt;td&gt;malfoid.video (1 credit for new accounts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A free image every day, watermark OK&lt;/td&gt;
&lt;td&gt;femalemalfoy.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A duo (you and a friend)&lt;/td&gt;
&lt;td&gt;femalemalfoy.com's duo templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A short clip, no subscription&lt;/td&gt;
&lt;td&gt;malfoid.video (10 s 720p from about $1.00) or malfoidai.com (silent 4 s clip preset)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A paid studio with no free tier but guest checkout&lt;/td&gt;
&lt;td&gt;malfoidai.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What are malfoidai.com's honest limits?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No free generation.&lt;/strong&gt; None at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short, silent clips.&lt;/strong&gt; Malfoid in motion turns one photo into a silent four-second clip; you can't upload a video or choose a length.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No typed prompt.&lt;/strong&gt; The uniform, hair and setting belong to the preset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One character.&lt;/strong&gt; It only makes the Malfoid look.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No API.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No guaranteed likeness.&lt;/strong&gt; The terms say likeness, timing and scene can differ from your inputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is any Malfoid AI generator unlimited and free?
&lt;/h3&gt;

&lt;p&gt;Not among the dedicated tools I checked. malfoid.video says directly, "Nothing here is 'unlimited free'."&lt;/p&gt;

&lt;h3&gt;
  
  
  Do free images have a watermark?
&lt;/h3&gt;

&lt;p&gt;On femalemalfoy.com, yes. On malfoid.video, its free credit's image downloads without a watermark.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Malfoid an official Harry Potter product?
&lt;/h3&gt;

&lt;p&gt;No. These are independent fan tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Know Your Meme, Malfoid / Female Draco Malfoy: &lt;a href="https://knowyourmeme.com/memes/malfoid-female-draco-malfoy" rel="noopener noreferrer"&gt;https://knowyourmeme.com/memes/malfoid-female-draco-malfoy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;malfoid.video free guide (updated 2026-10-16): &lt;a href="https://malfoid.video/free" rel="noopener noreferrer"&gt;https://malfoid.video/free&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;malfoid.video pricing: &lt;a href="https://malfoid.video/pricing" rel="noopener noreferrer"&gt;https://malfoid.video/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;femalemalfoy.com: &lt;a href="https://femalemalfoy.com/" rel="noopener noreferrer"&gt;https://femalemalfoy.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;malfoid.app pricing: &lt;a href="https://malfoid.app/pricing" rel="noopener noreferrer"&gt;https://malfoid.app/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;malfoidai.com FAQ: &lt;a href="https://malfoidai.com/faq/" rel="noopener noreferrer"&gt;https://malfoidai.com/faq/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>comparison</category>
    </item>
    <item>
      <title>How Much Does a Bama Bound AI Video Cost? 480p vs 720p Prices Compared (Oct 2026)</title>
      <dc:creator>Peiguan</dc:creator>
      <pubDate>Fri, 30 Oct 2026 14:55:23 +0000</pubDate>
      <link>https://dev.to/lpgit/how-much-does-a-bama-bound-ai-video-cost-480p-vs-720p-prices-compared-oct-2026-n1j</link>
      <guid>https://dev.to/lpgit/how-much-does-a-bama-bound-ai-video-cost-480p-vs-720p-prices-compared-oct-2026-n1j</guid>
      <description>&lt;p&gt;&lt;em&gt;Prices checked October 30, 2026 on each tool's public pricing page. Prices change quickly during a trend; re-check before buying.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; a single Bama Bound AI clip costs roughly &lt;strong&gt;$8â€“$10&lt;/strong&gt; on the dedicated sites if you buy one at a time. On &lt;a href="https://bamabound.app/pricing/" rel="noopener noreferrer"&gt;bamabound.app&lt;/a&gt; it's $7.99 at 480p and $9.99 at 720p, pay once, no account. bamaboundai.com's smallest pack is $7.90 for one 720p video (or two at 480p). mimiczip.com starts at $8.99 for a 12-second HD clip. Subscription-based tools can go lower per clip, but only if you commit to a plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I run bamabound.app. All numbers below are copied from public pages, not estimates.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why is pricing so confusing for these tools?
&lt;/h2&gt;

&lt;p&gt;Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Credits vs dollars.&lt;/strong&gt; Most tools sell credits, and each resolution costs a different number of credits. You have to do the division yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different clip lengths.&lt;/strong&gt; An 8-second clip and a 12-second clip aren't the same product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription rates quoted as the headline.&lt;/strong&gt; Some tools quote the per-clip price at their &lt;em&gt;best yearly subscription&lt;/em&gt; rate, which is not what you pay for a single clip.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So this comparison normalises to: &lt;strong&gt;what does one clip cost if you buy the smallest thing that gets you one?&lt;/strong&gt; And separately, &lt;strong&gt;what does it cost at the best listed rate?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does one Bama Bound clip cost on each tool?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Clip&lt;/th&gt;
&lt;th&gt;480p, smallest purchase&lt;/th&gt;
&lt;th&gt;720p, smallest purchase&lt;/th&gt;
&lt;th&gt;1080p&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bamabound.app&lt;/td&gt;
&lt;td&gt;8 s, vertical, 1 person&lt;/td&gt;
&lt;td&gt;$7.99 (pay once)&lt;/td&gt;
&lt;td&gt;$9.99 (pay once)&lt;/td&gt;
&lt;td&gt;Not offered&lt;/td&gt;
&lt;td&gt;No account needed to pay once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bamaboundai.com&lt;/td&gt;
&lt;td&gt;Solo, Duo or Campus templates&lt;/td&gt;
&lt;td&gt;$7.90 pack covers 2 at 480p ($3.95 each)&lt;/td&gt;
&lt;td&gt;$7.90 for 1&lt;/td&gt;
&lt;td&gt;200 credits (needs a larger pack)&lt;/td&gt;
&lt;td&gt;480p 50 credits, 720p 100, 1080p 200; account required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mimiczip.com&lt;/td&gt;
&lt;td&gt;12 s, 1â€“4 photos&lt;/td&gt;
&lt;td&gt;â€”&lt;/td&gt;
&lt;td&gt;$8.99 for 1 HD video&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;720p, 9:16 or 16:9, no watermark; packs include bonus 5 s previews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reeldo.ai&lt;/td&gt;
&lt;td&gt;~12 s trio or ~10 s solo&lt;/td&gt;
&lt;td&gt;~$2.38 (100 credits)&lt;/td&gt;
&lt;td&gt;~$5.35 (225 credits)&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;Its page says these use the best yearly subscription rate; one-time packs cost more per clip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vidlark.ai&lt;/td&gt;
&lt;td&gt;10 s, silent&lt;/td&gt;
&lt;td&gt;750 credits per video, about $10 (resolution not stated)&lt;/td&gt;
&lt;td&gt;â€”&lt;/td&gt;
&lt;td&gt;Not listed&lt;/td&gt;
&lt;td&gt;The 100 sign-up credits don't cover one video&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How do the credit packs compare?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;bamabound.app.&lt;/strong&gt; Packs at $22.99, $59.99 and $99.99. The pricing page lists them as about 3, 10 and 20 runs at the default 480p ($7.66, $6.00 and $5.00 per run); 720p uses more credits per run. Packs need an account, are one-time, and don't renew. Credits never expire. Anyone can pay once without a pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;bamaboundai.com.&lt;/strong&gt; $7.90 for 100 credits, $27.90 for 400, $69.90 for 1,200, $149 for 3,000. At 720p (100 credits each) that's $7.90, $6.98, $5.83 and $4.97 per video, as the site itself lists. Credits never expire; account required; failed generations refund unused credits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mimiczip.com.&lt;/strong&gt; One full 12-second 720p video costs 1 credit: $8.99 for 1, $16.99 for 3 (about $5.66 each), with larger packs down to about $5.20 per video. Every pack includes bonus watch-only 5-second previews. Unused videos never expire; its page lists a 7-day refund on unused packs and refunds for failed videos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;reeldo.ai.&lt;/strong&gt; Subscription-first; its listed per-clip dollar figures are explicitly at the "Max yearly" rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is 720p worth the extra money?
&lt;/h2&gt;

&lt;p&gt;For most posts, it depends where the clip ends up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TikTok / Reels / Shorts on a phone:&lt;/strong&gt; 480p vertical is fine for a phone feed. 720p gives the model more detail to work with on faces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If the face is small in frame&lt;/strong&gt; (a full-body jump), 720p gives the model more pixels to keep your identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price difference on bamabound.app:&lt;/strong&gt; $2.00 per clip ($7.99 vs $9.99). It's the same 8-second scene either way; 720p is the sharper output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On bamaboundai.com,&lt;/strong&gt; 720p costs twice the credits of 480p.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My rule of thumb: if you'll only make one clip and it's going on your main account, take 720p. If you're making several to compare, test at 480p and re-run your favourite photo at 720p.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you get for the money besides resolution?
&lt;/h2&gt;

&lt;p&gt;Price comparisons hide feature differences. Here's what changes between tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;bamabound.app&lt;/th&gt;
&lt;th&gt;bamaboundai.com&lt;/th&gt;
&lt;th&gt;mimiczip.com&lt;/th&gt;
&lt;th&gt;reeldo.ai&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;People per clip&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 or 2&lt;/td&gt;
&lt;td&gt;1â€“4 (people or pets)&lt;/td&gt;
&lt;td&gt;Up to 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom sign words&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Asked in its FAQ&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sound&lt;/td&gt;
&lt;td&gt;New cheering sound&lt;/td&gt;
&lt;td&gt;Prepared celebration audio merged in&lt;/td&gt;
&lt;td&gt;AI-generated celebration beat (moves timed so you can add the trend sound in TikTok)&lt;/td&gt;
&lt;td&gt;With sound&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Still image mode&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (1Kâ€“3K)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account to buy one&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Log in before generating&lt;/td&gt;
&lt;td&gt;Sign in to generate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you want friends in the shot, the cheapest &lt;em&gt;solo&lt;/em&gt; clip isn't the cheapest option for &lt;em&gt;your&lt;/em&gt; post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are there free Bama Bound AI generators?
&lt;/h2&gt;

&lt;p&gt;Not on the dedicated sites I checked, for a finished video:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;bamabound.app:&lt;/strong&gt; no free generation; new accounts start at zero credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vidlark.ai:&lt;/strong&gt; "The 100 free credits you get when you sign up are not enough for one video."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mimiczip.com:&lt;/strong&gt; "no free tier or free preview"; previews come bundled with paid packs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reeldo.ai / bamaboundai.com:&lt;/strong&gt; pricing lists paid credits only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The truly free route is non-AI: film yourself on a lawn with a red poster board and edit it in CapCut.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you avoid paying twice?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use a good photo the first time.&lt;/strong&gt; One person, face visible, even light, room above the head for the banner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't pay again while a checkout is pending.&lt;/strong&gt; On bamabound.app, a started payment stays with its provider; a delayed confirmation is not a request to pay again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Know the failure policy.&lt;/strong&gt; bamabound.app reviews failed paid generations under its refund policy; bamaboundai.com says failed generations refund unused credits; mimiczip.com holds the video and returns it to your balance if it fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buy a pack only if you'll make several.&lt;/strong&gt; For one clip, pay once.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Which is cheapest for my case?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your case&lt;/th&gt;
&lt;th&gt;Cheapest listed option (Oct 30, 2026)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One solo clip, 480p&lt;/td&gt;
&lt;td&gt;bamaboundai.com ($7.90 pack = 2 clips at 480p), or bamabound.app ($7.99, no account)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One solo clip, 720p&lt;/td&gt;
&lt;td&gt;bamaboundai.com ($7.90) or bamabound.app ($9.99, no account)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You and friends&lt;/td&gt;
&lt;td&gt;mimiczip.com (from $8.99, 1â€“4 photos)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Many clips, already subscribed&lt;/td&gt;
&lt;td&gt;reeldo.ai at its subscription rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1080p&lt;/td&gt;
&lt;td&gt;bamaboundai.com (200 credits per video)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is there a subscription on bamabound.app?
&lt;/h3&gt;

&lt;p&gt;No. Pay once per clip, or buy a one-time credit pack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do credits expire?
&lt;/h3&gt;

&lt;p&gt;On bamabound.app, bamaboundai.com and mimiczip.com, the pricing pages say purchased credits/videos never expire.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is reeldo.ai's price so low?
&lt;/h3&gt;

&lt;p&gt;Its page states the dollar figures use the best yearly subscription rate; one-time packs and monthly plans cost more per clip.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a Bama Bound AI video an official acceptance?
&lt;/h3&gt;

&lt;p&gt;No, on any of these tools. It's a staged joke.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;bamabound.app pricing and terms: &lt;a href="https://bamabound.app/pricing/" rel="noopener noreferrer"&gt;https://bamabound.app/pricing/&lt;/a&gt;, &lt;a href="https://bamabound.app/terms/" rel="noopener noreferrer"&gt;https://bamabound.app/terms/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;bamaboundai.com pricing: &lt;a href="https://bamaboundai.com/pricing" rel="noopener noreferrer"&gt;https://bamaboundai.com/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;mimiczip.com: &lt;a href="https://mimiczip.com/bama-bound" rel="noopener noreferrer"&gt;https://mimiczip.com/bama-bound&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;reeldo.ai: &lt;a href="https://reeldo.ai/bama-bound-ai" rel="noopener noreferrer"&gt;https://reeldo.ai/bama-bound-ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;vidlark.ai template: &lt;a href="https://vidlark.ai/templates/bama-bound" rel="noopener noreferrer"&gt;https://vidlark.ai/templates/bama-bound&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>video</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
