<?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: Marita P</title>
    <description>The latest articles on DEV Community by Marita P (@marita_pang_0302f784f7ea3).</description>
    <link>https://dev.to/marita_pang_0302f784f7ea3</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%2F4159801%2F599677f2-5d4d-466d-bd3f-6170f8b31c79.jpg</url>
      <title>DEV Community: Marita P</title>
      <link>https://dev.to/marita_pang_0302f784f7ea3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marita_pang_0302f784f7ea3"/>
    <language>en</language>
    <item>
      <title>Topview T1 vs Seedance 2.5: the 62% Discount Is a Ceiling, Not a Floor</title>
      <dc:creator>Marita P</dc:creator>
      <pubDate>Sat, 24 Oct 2026 08:36:17 +0000</pubDate>
      <link>https://dev.to/marita_pang_0302f784f7ea3/topview-t1-vs-seedance-25-the-62-discount-is-a-ceiling-not-a-floor-l8k</link>
      <guid>https://dev.to/marita_pang_0302f784f7ea3/topview-t1-vs-seedance-25-the-62-discount-is-a-ceiling-not-a-floor-l8k</guid>
      <description>&lt;p&gt;Topview shipped its first in-house video model on 21 October 2026, with a headline aimed directly at the model it has been reselling: &lt;strong&gt;"Built to rival Seedance 2.5 1080P quality at 62% lower cost."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a big number, and it is roughly right on the vendor's own arithmetic — T1 is listed at 38% of Seedance's official price. But if you are the person wiring a video model into a product, the number that matters is not 62%. It is the number you get when you plug &lt;em&gt;your&lt;/em&gt; shot mix into it. For most pipelines that number is meaningfully smaller, and for one common workload it is negative.&lt;/p&gt;

&lt;p&gt;Here is what I could verify, and the gotchas that only show up after you have committed credits.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;T1 is priced at roughly &lt;strong&gt;$0.22/s at 1080p&lt;/strong&gt; against roughly &lt;strong&gt;$0.585/s&lt;/strong&gt; for Seedance 2.5, per third-party records. Topview bills in credits, so recompute from your own invoice before you plan anything.&lt;/li&gt;
&lt;li&gt;An independent 10-challenge head-to-head puts T1 ahead on &lt;strong&gt;lip-sync, character consistency and cinematic color&lt;/strong&gt;, behind on &lt;strong&gt;complex physics, fight choreography, fast action, on-screen text and prompt adherence&lt;/strong&gt;. Dance and choreography still go to Seedance 2.5.&lt;/li&gt;
&lt;li&gt;The 62% is a &lt;strong&gt;ceiling&lt;/strong&gt;. A 65/35 split across shot types lands closer to 41%.&lt;/li&gt;
&lt;li&gt;The "30 days unlimited" tier is &lt;strong&gt;720p, standard queue, web-only&lt;/strong&gt;, and explicitly excluded from API/MCP. If you ship on the API, it does not touch your cost of goods.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What actually shipped
&lt;/h2&gt;

&lt;p&gt;Topview is a Singapore-based company behind an agent-style video workspace — Canvas, Drama Studio, a 3D shot composer, character swap — that routes requests across several third-party models. T1 is its first proprietary model. No architecture details have been published.&lt;/p&gt;

&lt;p&gt;The detail that reframes the announcement: &lt;strong&gt;Topview already resells Seedance 2.5.&lt;/strong&gt; T1 is not just another model in the picker; it is a vendor shipping a cheaper substitute for something it currently pays another company for. The 62% is a margin structure being rewritten, which is why it is worth reading carefully rather than adopting on day one. The launch post itself pulled 280K views and ranked 1,362 of 2,071 AI launches in the directory that tracks these — enough to be argued about, not enough to call it a default.&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;Reported 1080p rate&lt;/th&gt;
&lt;th&gt;vs Seedance 2.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Topview T1&lt;/td&gt;
&lt;td&gt;~$0.22 / second&lt;/td&gt;
&lt;td&gt;−62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;td&gt;~$0.585 / second&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two caveats on that table, both material. The per-second figure comes from third-party review records, one of which flags its own pricing as un-re-verified since 23 October — Topview does not publish a clean $/second. And because billing runs through credits that are discounted differently per plan and resolution, the same clip can cost very different amounts depending on whether you are on Plus, Business or Ultra annual. Treat every $/second number, including mine, as an estimate to be replaced by your invoice.&lt;/p&gt;

&lt;p&gt;For reference, the plans as listed: Plus $18/month, Business $44/month, Ultra $50/month, Team $56 per seat, all on annual billing. No free tier is documented for T1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it wins and where it loses
&lt;/h2&gt;

&lt;p&gt;One independent comparison ran T1 and Seedance 2.5 across ten challenges — lip-sync, dialogue, physics, fight scenes, dancing, prompt adherence among them — self-funded despite a past sponsorship relationship with the company. The result is not a wash, and it is not a T1 victory lap:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Better model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lip-sync, including non-English&lt;/td&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character consistency across a scene&lt;/td&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cinematic color, camera movement&lt;/td&gt;
&lt;td&gt;T1 (crisper, more saturated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex physics (e.g. glass shattering)&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fight choreography&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast action (T1 blurs)&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-screen text / signage&lt;/td&gt;
&lt;td&gt;Seedance 2.5 (T1 renders it illegible)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt adherence&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dance and choreography&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern is not noise. &lt;strong&gt;T1 is strongest when the camera is calm and a face is doing something human; it is weakest when a body has to do something physically unlikely and land it.&lt;/strong&gt; That split is the whole decision. If your workload is talking-head ads, product b-roll, dialogue scenes, avatar explainers — the discount is real and you keep almost all the quality. If your workload is dance clips, trend remakes, fight beats, or anything where a contact point has to be believable, the cheaper model is a downgrade with a smaller invoice, and you will spend the difference on retries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that bite after you commit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Unlimited is 720p, and the headline is 1080p.&lt;/strong&gt; The pricing page line item reads &lt;em&gt;Topview T1, 720P, 30 Days Unlimited&lt;/em&gt; on Ultra annual. Nothing wrong with that — but if you benchmarked the 1080p comparison and then budgeted on the unlimited tier, you are planning two different products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Unlimited does not reach your pipeline.&lt;/strong&gt; Topview's terms state that unlimited and free generations on plans are available only on the website and are &lt;strong&gt;not accessible via API, MCP, CLI or other automation&lt;/strong&gt;. Unlimited also means credit-free, not priority — it runs in the standard queue, and wait times vary with demand and recent usage. Fine for a research window. Not something to put an SLA on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The credit wallets are not interchangeable.&lt;/strong&gt; Plus and Business plan credits can pay for API calls. Ultra and Team credits cannot. Monthly credits don't roll over. Top-up packs live longer. On a hobby project this is trivia; in production it is the difference between a plan that funds your pipeline and one that only funds your browser tab.&lt;/p&gt;

&lt;p&gt;Net effect: the unlimited offer is an excellent &lt;strong&gt;trial&lt;/strong&gt;, and it is not a cost-of-goods reduction. The discounted surface and the surface you actually pay for are different line items.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do the math for your own mix
&lt;/h2&gt;

&lt;p&gt;The headline assumes you move everything to T1. You won't, because some of your shots need the other model. So compute the blend.&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;Blended video-generation cost for a mixed shot list.

RATE: your own effective $/second from your invoice, not a blog post.
MIX:  (shot_type, share_of_usable_seconds, model). Shares must sum to 1.0.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;RATE&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;t1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seedance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.585&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;          &lt;span class="c1"&gt;# $/s at 1080p, reported 2026-10-24
&lt;/span&gt;
&lt;span class="n"&gt;MIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&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;dialogue / lip-sync&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;# T1 wins lip-sync
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b-roll / product&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;        &lt;span class="c1"&gt;# calm camera, low physics risk
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dance / choreography&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seedance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# T1 loses here
&lt;/span&gt;    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fast action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seedance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="c1"&gt;# T1 blurs
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;TAKES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;                 &lt;span class="c1"&gt;# generations per usable shot — your reroll rate
&lt;/span&gt;&lt;span class="n"&gt;USABLE_SECONDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;      &lt;span class="c1"&gt;# finished seconds you actually keep per month
&lt;/span&gt;
&lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;USABLE_SECONDS&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;TAKES&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;generated seconds/month: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;generated&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;model&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&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;seedance&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;all-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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="n"&gt;generated&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;RATE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&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;7&lt;/span&gt;&lt;span class="p"&gt;,.&lt;/span&gt;&lt;span class="mi"&gt;0&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="n"&gt;blended&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;share&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;RATE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model&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;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;MIX&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;solo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;RATE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;seedance&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;blended mix  $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;blended&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;7&lt;/span&gt;&lt;span class="p"&gt;,.&lt;/span&gt;&lt;span class="mi"&gt;0&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;saving vs seedance-only: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;blended&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;solo&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output on that mix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generated seconds/month: 2400
all-t1        $    528
all-seedance  $  1,404
blended mix  $    835
saving vs seedance-only: 41%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;41%, not 62%.&lt;/strong&gt; That gap is not a trick — it is what routing looks like. And note which way the error runs: 62% is the best case you can only reach by sending &lt;em&gt;every&lt;/em&gt; shot to the cheaper model, including the ones it is bad at. The headline number is a ceiling on your saving, never a floor.&lt;/p&gt;

&lt;p&gt;Change &lt;code&gt;TAKES&lt;/code&gt; to 12 and the absolute numbers triple, but the percentage barely moves — reroll rate scales both sides equally. What actually moves the percentage is the &lt;strong&gt;mix&lt;/strong&gt;, which is why the next table matters more than the pricing page.&lt;/p&gt;

&lt;h2&gt;
  
  
  A routing table you can steal today
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shot type&lt;/th&gt;
&lt;th&gt;Route to&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lip-sync dialogue, talking head&lt;/td&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;td&gt;Its clearest win, including non-English&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product b-roll, slow push-ins&lt;/td&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;td&gt;Calm camera, no physics to fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cinematic establishing shots&lt;/td&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;td&gt;Color and camera are its strength&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dance, choreography, trend remakes&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;td&gt;Explicitly the weaker model here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fights, falls, collisions&lt;/td&gt;
&lt;td&gt;Seedance 2.5&lt;/td&gt;
&lt;td&gt;Fails on contact points and physics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anything with readable on-screen text&lt;/td&gt;
&lt;td&gt;Seedance 2.5, or composite the text in post&lt;/td&gt;
&lt;td&gt;T1 renders signage illegible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is worth internalising: if your video needs legible words baked in, that is a compositing problem, not a model problem. Overlay it after generation and you stop paying for a capability neither model reliably has.&lt;/p&gt;

&lt;h2&gt;
  
  
  A one-hour bench before you switch anything
&lt;/h2&gt;

&lt;p&gt;Five prompts is enough to find the edge, and you should run them on your own footage rather than anyone's highlight reel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One calm dialogue shot, face in frame, one line of speech.&lt;/li&gt;
&lt;li&gt;One dance or choreography shot with a full-body subject.&lt;/li&gt;
&lt;li&gt;One fast action shot with a hard stop or impact.&lt;/li&gt;
&lt;li&gt;One product rotation with a reflective surface.&lt;/li&gt;
&lt;li&gt;One shot containing a legible sign or label.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For each, look at the same five things: hands, contact points, text legibility, identity drift across the full duration, and whether the action &lt;em&gt;completes&lt;/em&gt; or decays in the last second. Then compare blended cost against the routing table above. You will get roughly the same verdict as the independent test, and you will have your own evidence instead of mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually took away
&lt;/h2&gt;

&lt;p&gt;Per-second generation price is converging on zero — T1 at 38% of the official rate, Wan 3.0 marketed as near-Seedance-2.5 at 30% of the price, MiniMax H3 near-Seedance-2.0 at 30% of the cost. Within a year the per-second number will be the least interesting figure in any model comparison.&lt;/p&gt;

&lt;p&gt;What stays expensive is everything around it: the rerolls of shots you should not have generated, the latency tax of a shared queue you cannot prioritise, and the work of deciding which shots your product actually needs. A 62% discount on the cheapest line item is welcome. It is not the line item that decides whether the product ships.&lt;/p&gt;

&lt;p&gt;So: benchmark your own five prompts, route by shot type, and recompute the blend from your invoice. That gets you most of the discount and none of the regressions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources, so you can check the numbers rather than take them: the launch claim and reach figures come from the launch post as tracked by Doomers; plan pricing and the unlimited-model terms from Topview's own pricing page; the per-second comparison from The AI Dude's review, which flags its pricing as un-re-verified since 23 October; the ten-challenge head-to-head from Art of Smart's writeup of a self-funded comparison; the credit and API wallet rules from TechPilot's reading of Topview's pricing on 18 October. The 62% is Topview's claim. The quality comparison is contested and rests on a small number of independent tests rather than a public benchmark — including mine, which is arithmetic, not measurement.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>product</category>
    </item>
    <item>
      <title>Two Photos In, One Scream-and-Swap Out: What Actually Matters When Picking an AI Dance-Video Tool</title>
      <dc:creator>Marita P</dc:creator>
      <pubDate>Fri, 23 Oct 2026 04:40:57 +0000</pubDate>
      <link>https://dev.to/marita_pang_0302f784f7ea3/two-photos-in-one-scream-and-swap-out-what-actually-matters-when-picking-an-ai-dance-video-tool-4h30</link>
      <guid>https://dev.to/marita_pang_0302f784f7ea3/two-photos-in-one-scream-and-swap-out-what-actually-matters-when-picking-an-ai-dance-video-tool-4h30</guid>
      <description>&lt;h2&gt;
  
  
  The dumbest-sounding constraint is often the whole product
&lt;/h2&gt;

&lt;p&gt;A few weeks ago I watched a friend lose an entire evening to a trend he could not join. The video everyone was posting was a specific thing: one face screams into the camera, another person dances behind them, the two swap places, and then they both sprint toward the lens together. The choreography is fixed. The music is fixed. The only real input is &lt;em&gt;who the two people are&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;He had two photos and no way in. The tools he tried wanted a prompt. They wanted a script. They wanted him to describe the dance, the lighting, the camera move. He didn't know how to describe a dance. He just wanted to put his face — and his cat's face — into a video everyone would recognize instantly.&lt;/p&gt;

&lt;p&gt;That constraint — &lt;strong&gt;two photos in, no prompt, one very specific output&lt;/strong&gt; — is a genuinely interesting engineering boundary. It's also the thing nobody writes about, because "pick two photos, get a 21-second vertical 720p video of a scream-and-swap dance" sounds too silly to take seriously. But the constraint is exactly why it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "no prompt" is a feature, not a shortcut
&lt;/h2&gt;

&lt;p&gt;A general-purpose video model is a blank canvas. That's its strength and its tax. The moment you ask a general model for a dance video, you inherit a thousand hidden decisions: what choreography, what camera angle, what song, what length, what happens when two identities start to drift mid-frame. Most people solve zero of these and then blame the tool.&lt;/p&gt;

&lt;p&gt;A template-based generator inverts the problem. It hardcodes the choreography, the timing, the music, and the camera — and leaves you exactly one free variable: the two faces. When the output space is small, the model can be tuned for that specific output. Face consistency across a 21-second swap, the moment the two people change places, the final sprint — those stop being "creative choices" and become a pipeline you can actually optimize.&lt;/p&gt;

&lt;p&gt;This is the same logic behind why the best developer tools feel boring on the surface. A constrained interface is a product decision, not a limitation. It's the difference between a text field and a well-typed function signature.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two axes that actually matter for selection
&lt;/h2&gt;

&lt;p&gt;When I compare the "two photos → dance video" tools that have popped up around this trend, the ones that hold up tend to win on two axes and lose on a third.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Axis one: identity preservation under a swap.&lt;/strong&gt; The hard part isn't rendering two people. It's rendering two people who &lt;em&gt;stay themselves&lt;/em&gt; while they swap places. When the model swaps the roles, the cheap implementations drift — hairline changes, eye color shifts, the second face starts to look like a blend of both. This is why the underlying model matters. Tools built on a stronger base model (the current crop runs on things like Seedance 2.5) do measurably better at keeping each face locked while the bodies move past each other. Ask any of these tools what their base model is before you pay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Axis two: pets, and "unexpected combinations."&lt;/strong&gt; Here's a thing I did not expect to be a real feature: cats. And dogs. And cat-plus-dog. A dedicated cat dance is not a joke — it's a signal that the tool treats its subjects as &lt;em&gt;more than human faces&lt;/em&gt;. A human face has a lot of high-level semantic structure the model can latch onto. A cat is mostly low-level texture. If a tool handles a cat without drifting into a weird chimera, it usually means the identity pipeline is genuinely robust, not just tuned for one face shape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Axis three, where everyone loses: consent.&lt;/strong&gt; This is the one no tool can reliably solve, and you should be suspicious of any that claims it can. None of these generators can verify that you have permission to use the second person's face. That check lives entirely with the person holding the photos. The honest tools say so. &lt;strong&gt;Before you put someone else's face — a friend, an ex, a colleague, a stranger — into a video, get their consent out loud.&lt;/strong&gt; "It's just a joke" is not a rule. A technical pipeline will never be able to automate that for you, so don't let a product's marketing imply otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pricing tells you the real model
&lt;/h2&gt;

&lt;p&gt;One thing that reliably separates the serious tools from the trend-chasing copies is how they handle failure.&lt;/p&gt;

&lt;p&gt;A one-off purchase with a credit system — say, ten credits for one standard video — plus a refund when a generation fails, is a &lt;em&gt;cost model&lt;/em&gt;, and it's usually a sign the operator actually knows what their GPU bill looks like. Every failed render is real money for them, so a tool that refunds failed generations is admitting that failure happens, and paying for it rather than making you pay for it. A tool that charges you for garbage output is either unaware of its own failure rate or indifferent to it.&lt;/p&gt;

&lt;p&gt;The same logic applies to the "no watermark" question. A watermark isn't just branding — it's often a licensing and cost signal. A tool that lets you download a clean file and post it straight to TikTok or Reels is treating the output as &lt;em&gt;yours&lt;/em&gt;, which is the whole point of a one-time purchase. A tool that locks the clean export behind a subscription is selling you the file, not the video.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd check before paying
&lt;/h2&gt;

&lt;p&gt;If you're evaluating one of these tools, here's the short list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What's the base model?&lt;/strong&gt; "Seedance 2.5" or a comparable current model is a good sign; a vague "AI-powered" is not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it handle pets cleanly?&lt;/strong&gt; It's a surprisingly good proxy for identity robustness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it refund failed generations?&lt;/strong&gt; This tells you the operator's real confidence, not their marketing copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there a watermark, and can you download clean?&lt;/strong&gt; One-time purchase tools should hand you a clean, shareable file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it ask you — in plain language — to get consent first?&lt;/strong&gt; If a tool pretends the ethics problem doesn't exist, treat everything else it says with more skepticism.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The trend itself will fade; it always does. But the underlying pattern — &lt;strong&gt;shrink the output space to one recognizable thing, and optimize a pipeline until that one thing is bulletproof&lt;/strong&gt; — is exactly how a lot of genuinely useful AI tooling gets built. The silly 21-second dance is a decent case study in a very serious design principle.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The tool I've been describing here is Smalltown Boy AI (&lt;a href="https://smalltownboyai.app/" rel="noopener noreferrer"&gt;https://smalltownboyai.app/&lt;/a&gt;), a two-photos-to-vertical-video generator for the scream-and-swap "Smalltown Boy" dance trend. I'm not affiliated with it — I just find its constraints more interesting than most of the blank-canvas generators people throw at this kind of video.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>product</category>
      <category>tools</category>
    </item>
    <item>
      <title>Feeding Two Faces to a Diffusion Model: What Makes a Two-Person (or Two-Pet) Video Come Out Clean</title>
      <dc:creator>Marita P</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:15:29 +0000</pubDate>
      <link>https://dev.to/marita_pang_0302f784f7ea3/feeding-two-faces-to-a-diffusion-model-what-makes-a-two-person-or-two-pet-video-come-out-clean-1n5a</link>
      <guid>https://dev.to/marita_pang_0302f784f7ea3/feeding-two-faces-to-a-diffusion-model-what-makes-a-two-person-or-two-pet-video-come-out-clean-1n5a</guid>
      <description>&lt;h2&gt;
  
  
  The Input Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Most of the conversation around AI video generation focuses on the output — how realistic the motion looks, whether fingers melt, if the lips sync. Almost nobody talks about the input. But when a video has to reconstruct &lt;strong&gt;two distinct identities at once&lt;/strong&gt;, the quality of your two source photos matters more than any prompt you could write.&lt;/p&gt;

&lt;p&gt;This is the engineering reality behind the "scream-and-swap" dance videos currently flooding short-form feeds: one face screams into the camera in close-up while a second subject dances behind, then they swap. It's a single 21-second, portrait, 720p clip, generated from exactly two photos — or one photo of two people. No prompt. No timeline editing.&lt;/p&gt;

&lt;p&gt;For developers who want to understand &lt;em&gt;why&lt;/em&gt; those videos look clean or broken, the answer lives almost entirely in how the two identities are encoded and how they survive a swap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Identities Are Harder Than Two Times One
&lt;/h2&gt;

&lt;p&gt;A single-subject generator only has to hold one face embedding consistent across frames. Add a second subject and you immediately hit the problems that make two-person generation feel like a different product entirely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identity drift.&lt;/strong&gt; Two faces in close proximity are the classic failure mode. The model bleeds features between them — one person's jawline creeps onto the other, eye colors swap mid-frame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Occlusion.&lt;/strong&gt; The front subject occludes the rear one. The model has to &lt;em&gt;remember&lt;/em&gt; the hidden subject through the occlusion window, not just paint what's visible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order matters.&lt;/strong&gt; The "scream then swap" structure means each identity has to occupy both roles across the clip: close-up foreground &lt;em&gt;and&lt;/em&gt; background dancer. A model that can hold face A in the foreground may still smear it when A moves to the back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical takeaway: two-person output is not "single-person, twice." It's roughly a 2–3× harder consistency problem, and most of the work happens before a single frame is rendered.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Good" Input Photos Actually Look Like
&lt;/h2&gt;

&lt;p&gt;Because there's no prompt to lean on, the photos &lt;em&gt;are&lt;/em&gt; the prompt. Here's what separates a clean swap from a smear, based on what the underlying pipelines (Seedance-class video diffusion models) tolerate well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Match the lighting.&lt;/strong&gt; Two photos shot under wildly different light — one warm indoor, one cool daylight — force the model to reconcile two color temperatures. The identity embedding fights the lighting reconciliation, and you get a face that looks pasted on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match the angle, roughly.&lt;/strong&gt; A full-frontal face and a three-quarter profile give the model two conflicting notions of the same skull. Faces facing the camera, with both eyes visible, reconstruct far more reliably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear separation in a two-person photo.&lt;/strong&gt; If you feed a single group shot, the two faces should be distinct and unoccluded. If they're cheek-to-cheek, the model can't cleanly attribute features to each identity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharp and high-res.&lt;/strong&gt; Crops that are blurry or downscaled starve the encoder of the high-frequency detail (eye shape, lip line) that identity preservation depends on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The reason these rules matter more than "write a better prompt" is architectural: in a no-prompt tool, there &lt;em&gt;is&lt;/em&gt; no textual handle to disambiguate the two people. Everything rides on the visual embedding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Pets Work, and Why That's a Clue
&lt;/h2&gt;

&lt;p&gt;One of the more surprising things about this format is how well it handles cats, dogs, and even a cat-plus-dog combo — there's a dedicated cat-dance variant, and a cat with a dog swapping roles. That's not a gimmick; it's a signal about the model.&lt;/p&gt;

&lt;p&gt;Diffusion models reconstruct identities from low-level visual features (fur texture, ear geometry, muzzle shape) more than from the high-level semantic features we care about as humans. A cat's face has strong, distinctive, low-level texture, so identity holds well. It's the same reason a person's face holds best when the eyes and lip line are crisp rather than when the &lt;em&gt;pose&lt;/em&gt; is flattering.&lt;/p&gt;

&lt;p&gt;If you're building or tuning a two-subject pipeline, that's a useful diagnostic: when identity breaks, ask whether you lost low-level texture (motion blur, occlusion, resizing) before you blame the model's "understanding."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Consent Question, Revisited as a Constraint
&lt;/h2&gt;

&lt;p&gt;A tool that turns any two photos into a dancing, screaming clip also turns "any two photos" into a real risk. It is trivially easy to use a face that isn't yours. From a builder's perspective, consent isn't just ethics — it's a design constraint. Watermark-free, downloadable output (meant for TikTok and Reels) amplifies whatever you generate.&lt;/p&gt;

&lt;p&gt;So the rule I hold, and would bake into any similar product: &lt;strong&gt;get explicit consent from anyone whose face you generate before you publish.&lt;/strong&gt; It costs nothing at generation time and saves everything later. Treat it as a first-class input validation, not an afterthought.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Minimal Check Before You Generate
&lt;/h2&gt;

&lt;p&gt;If you're evaluating or building a two-subject video tool, here's a short pre-flight list that catches most of the bad output before you waste a render:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are both faces front-facing and well-lit?&lt;/li&gt;
&lt;li&gt;Do the two photos share a similar lighting temperature?&lt;/li&gt;
&lt;li&gt;Is each face sharp, with eyes and lip line clearly resolved?&lt;/li&gt;
&lt;li&gt;In a group photo, are the two faces clearly separated and unoccluded?&lt;/li&gt;
&lt;li&gt;Have I confirmed consent from every face in the frame?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most "broken" AI videos aren't a model failure. They're an input failure. Get the two photos right and the swap mostly takes care of itself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Smalltown Boy AI: The Scream-and-Swap Dance Trend, Explained (and How to Make Your Own)</title>
      <dc:creator>Marita P</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:45:08 +0000</pubDate>
      <link>https://dev.to/marita_pang_0302f784f7ea3/smalltown-boy-ai-the-scream-and-swap-dance-trend-explained-and-how-to-make-your-own-n8</link>
      <guid>https://dev.to/marita_pang_0302f784f7ea3/smalltown-boy-ai-the-scream-and-swap-dance-trend-explained-and-how-to-make-your-own-n8</guid>
      <description>&lt;h2&gt;
  
  
  What is the Smalltown Boy AI trend?
&lt;/h2&gt;

&lt;p&gt;You've probably seen it already: two people taking turns screaming straight into the camera, then swapping places and dancing together like they've rehearsed for years. A grandma and her grandson. Two best friends. A man and a deeply unimpressed cat. That's the Smalltown Boy dance, and it's everywhere right now.&lt;/p&gt;

&lt;p&gt;The name comes from "Smalltown Boy," a 1984 Bronski Beat synth-pop classic about a young man leaving his small town behind. The song never really disappeared, but it recently came roaring back in a very specific form: a short, funny format where one character leans dramatically into the lens while the other dances in the background — then they switch.&lt;/p&gt;

&lt;p&gt;The twist is that almost nobody in these videos actually filmed anything. The faces are real. The dancing bodies were never there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this works now
&lt;/h2&gt;

&lt;p&gt;For years, "AI video" meant heavy tools, prompt engineering, and a lot of trial and error to keep a face recognizable across frames. Photo-to-video models have crossed a threshold in the last year or so where they can hold two specific identities while driving a full-body performance — the exact thing a two-character dance format needs. Tools like the &lt;a href="https://smalltownboyai.app/" rel="noopener noreferrer"&gt;Smalltown Boy AI generator&lt;/a&gt; (built on Seedance 2.5) turn that into a three-step flow: two portraits in, one 21-second vertical clip out, no prompt required.&lt;/p&gt;

&lt;p&gt;The interesting part isn't the tech, though. It's what the tech deleted. Old viral dance challenges — the Harlem Shake, the Mannequin Challenge, every TikTok dance ever — all demanded three things from you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skill&lt;/strong&gt;, or the willingness to fake it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Courage&lt;/strong&gt; — the willingness to put your face and body on the internet and be bad at something in public.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup&lt;/strong&gt; — a camera, space, time, a second person, and enough takes to land one good shot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a huge number of people, courage was the wall. Not the dancing. The "what if I look stupid" part. The Smalltown Boy trend quietly removes that wall: you never go on camera, and the only skill required is picking two photos.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to make your own in three steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pick your duo.&lt;/strong&gt; Two separate portraits, or one clear photo with both characters. Front-facing, well-lit, faces visible, no sunglasses, no heavy filters. Similar face sizes make the pair easier to read.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the order.&lt;/strong&gt; Photo A takes the first screaming close-up while Photo B dances behind — then they switch. Put the more dramatic person (or the cat) in whichever slot is funnier. This single choice drives the whole joke.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate and review.&lt;/strong&gt; You get a 21-second, 720p vertical clip. Watch the full thing and check both faces before sharing, then download (no display watermark) and post to TikTok, Reels, or Shorts.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the entire barrier to entry: do you have two photos you're allowed to use?&lt;/p&gt;

&lt;h2&gt;
  
  
  The pet version is its own genre
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://smalltownboyai.app/smalltown-boy-cat-dance" rel="noopener noreferrer"&gt;cat dance&lt;/a&gt; deserves its own mention. Two cats — or a cat and a dog — doing the same absurd scream-and-swap is somehow funnier than the human version. The practical advice: pick photos with distinct faces and coat patterns, keep bodies visible, and check the pet's anatomy and markings carefully in the result. AI still gets animal bodies wrong more often than human faces.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing that has nothing to do with the tool
&lt;/h2&gt;

&lt;p&gt;The technology got here before the manners did. The entire point of this format is putting real, specific faces onto bodies doing things those people never did — and that's both the magic and the risk. A face is consent you can give and take away.&lt;/p&gt;

&lt;p&gt;So before you generate a video of someone else's face — a friend, a partner, a kid, a coworker — ask. Not after, not "they'll love it." Ask. The surprise is never worth more than the consent underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The more the machine handles the dancing, the more the only thing that matters is &lt;em&gt;whose faces are in the frame&lt;/em&gt;. The skill was never the point, and neither was the courage — those were just tolls you paid to reach the actual joke: &lt;em&gt;look, it's us, and it's ridiculous.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The moves are now free. The reason to want two specific faces in the frame is still yours, and it turns out that was the only part anyone was ever watching for.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aivideo</category>
      <category>tutorial</category>
      <category>generativeai</category>
    </item>
    <item>
      <title>Keeping Two Faces From Swapping Mid-Verse: Identity Preservation in AI Music Videos</title>
      <dc:creator>Marita P</dc:creator>
      <pubDate>Sun, 11 Oct 2026 01:25:29 +0000</pubDate>
      <link>https://dev.to/marita_pang_0302f784f7ea3/keeping-two-faces-from-swapping-mid-verse-identity-preservation-in-ai-music-videos-h1k</link>
      <guid>https://dev.to/marita_pang_0302f784f7ea3/keeping-two-faces-from-swapping-mid-verse-identity-preservation-in-ai-music-videos-h1k</guid>
      <description>&lt;h2&gt;
  
  
  The problem nobody warns you about
&lt;/h2&gt;

&lt;p&gt;You train a model to turn two photos into a short music video. The first three seconds look great. Then, around second five, the guy on the left suddenly has the other guy's jaw. By second eight, their faces have traded places entirely.&lt;/p&gt;

&lt;p&gt;If you have built any kind of face-to-video pipeline, you know this failure mode well. It has a name: identity drift. And for a two-person performance video — a rap duet, a duet cover, two friends singing at each other — it is the single hardest thing to get right.&lt;/p&gt;

&lt;p&gt;This post is about why identity drift happens, and the engineering decisions you can make to hold two faces steady across a full clip. It is not a product pitch. It is a walk through the failure modes and the levers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one face is already hard
&lt;/h2&gt;

&lt;p&gt;Single-subject face video is a solved-ish problem because the pipeline can lean on strong priors. You detect a face, you extract an identity embedding, and you condition every generated frame on that embedding so the person stays the same. Tools like &lt;code&gt;insightface&lt;/code&gt; give you a face detector and an embedding extractor that is fast and stable enough to run per-frame, and models like &lt;code&gt;inswapper&lt;/code&gt; do the face swap itself.&lt;/p&gt;

&lt;p&gt;The identity embedding is the load-bearing piece. It is a vector — a few hundred floats — that tries to encode "who this person is" while discarding "what expression they are making, what lighting they are in, what angle we are seeing." In practice those two things are not cleanly separable. That is where the drift comes from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why two people make it dramatically harder
&lt;/h2&gt;

&lt;p&gt;A duet is not two single-face problems glued together. It is one problem with a new axis of failure: attribution.&lt;/p&gt;

&lt;p&gt;Consider what the model has to decide at every frame:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Which face is which.&lt;/strong&gt; When both people are in frame, the pipeline must map "left person" and "right person" to the correct embeddings, every frame, even as heads turn and the camera moves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whose motion belongs to whom.&lt;/strong&gt; A rap duet has the two performers trading lines, leaning toward the microphone, overlapping in the frame. The model has to keep each person's gestures attached to their own identity, not bleed movement from one onto the other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sustaining it over time.&lt;/strong&gt; Thirty seconds is hundreds of frames. A tiny per-frame error compounds. By the end, two people can have converged toward a single averaged face — the classic "they merged" artifact.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you have built a single-person pipeline, point 2 is the one that will surprise you. With one face, motion is basically free — any gesture is automatically "the person's." With two faces, motion attribution becomes a hard constraint, not a freebie.&lt;/p&gt;

&lt;h2&gt;
  
  
  The levers that actually matter
&lt;/h2&gt;

&lt;p&gt;Through building and debugging this, a few decisions made the biggest difference. These are listed roughly in order of impact, not in the order you would build them.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Identity conditioning has to be per-person and explicit
&lt;/h3&gt;

&lt;p&gt;Do not pass a single "image" to the generator and hope it figures out there are two people. Pass two separate, clearly tagged identity embeddings, and keep them spatially anchored (left vs. right) for as long as the frame composition allows. When the camera changes composition, re-anchor rather than letting the model guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use a pose or layout prior, not just pixels
&lt;/h3&gt;

&lt;p&gt;For a performance video, the two people have a scripted relationship to each other — one is "talking," one is "reacting." Encoding that structure as a pose or layout signal (keypoints, or a depth/segmentation layout) stops the model from inventing plausible-but-wrong interactions. A face-detection + keypoint pass per frame is cheap and removes a whole class of swap artifacts.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Constrain the visual style, because style drift feeds identity drift
&lt;/h3&gt;

&lt;p&gt;Here is a non-obvious one. If the scene style is allowed to drift — lighting changes, camera angle wanders, background shifts — the face model gets a worse signal, and identity drift gets worse with it. Locking the style down hard (same color palette, same lighting, same framing for the whole clip) is not just an aesthetic choice. It is an identity-preservation technique. This is one reason a fixed, stylized "stage" look is so much easier to keep consistent than a free-form cinematic scene.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Accept that you are trading cost against consistency
&lt;/h3&gt;

&lt;p&gt;Full identity consistency over long clips is expensive. The cheaper the model, the sooner faces start to drift. If you want a "set it and forget it" experience — drop two photos in, get a clip out — you are implicitly making a trade: you spend more compute on identity anchoring so the user does not have to fiddle with prompts or a timeline. Knowing where that trade sits is the difference between a demo that impresses for three seconds and a product that survives a full video.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "good enough" looks like
&lt;/h2&gt;

&lt;p&gt;You will know your pipeline has crossed the line when you can watch a full clip and never once think about the faces. That is the real acceptance test. The faces just are — two distinct people, clearly themselves from the first frame to the last, even when they trade lines, lean into frame, or sing together.&lt;/p&gt;

&lt;p&gt;Reaching that point is less about any single model and more about the scaffolding around it: explicit per-person embeddings, a layout prior, a locked style, and a deliberate cost/consistency tradeoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  One thing that has nothing to do with the code
&lt;/h2&gt;

&lt;p&gt;A quick reminder before you go build something fun with this: if you are putting a real person's face into a generated video — a friend, a partner, a celebrity, anyone — get their consent first. Face-swap and identity-preservation tech is powerful, and the same pipeline that keeps two faces stable for a music video can just as easily put someone in a video they never agreed to. The technical skill is the easy part. The responsibility is on you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you hit the "they merged into one person" bug? How did you fix it — better embeddings, a pose prior, or something else? I would like to hear what worked in your pipeline.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>machinelearning</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Building a Face-Consistent Two-Person Video Generator: Architecture, Models, and a Minimal Prototype</title>
      <dc:creator>Marita P</dc:creator>
      <pubDate>Wed, 07 Oct 2026 06:10:42 +0000</pubDate>
      <link>https://dev.to/marita_pang_0302f784f7ea3/building-a-face-consistent-two-person-video-generator-architecture-models-and-a-minimal-prototype-k5l</link>
      <guid>https://dev.to/marita_pang_0302f784f7ea3/building-a-face-consistent-two-person-video-generator-architecture-models-and-a-minimal-prototype-k5l</guid>
      <description>&lt;p&gt;The "two photos in, one rap performance out" generators are everywhere right now. If you're a developer, the product is a curiosity — but the engineering underneath it is a genuinely interesting problem, and it maps onto a skill you'll reuse for a lot more than memes.&lt;/p&gt;

&lt;p&gt;This post is a build guide, not an explainer. I'll walk through the architecture, the model choices at each stage, and a minimal prototype that gets you to "a face stays the same across a moving clip" without a PhD in diffusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hard Problem, Stated Plainly
&lt;/h2&gt;

&lt;p&gt;Forget the orange stage. The core challenge in any personalized video generator is &lt;strong&gt;identity preservation&lt;/strong&gt;: keep &lt;em&gt;a specific face&lt;/em&gt; believable across dozens of frames while the body moves, the mouth animates, and the camera shifts.&lt;/p&gt;

&lt;p&gt;A generic face can drift and nobody notices. Your user's face has to stay recognizably &lt;em&gt;them&lt;/em&gt; for the whole clip, or the joke dies and the product looks broken. This is the axis everything else hangs on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pipeline, as Something You'd Actually Build
&lt;/h2&gt;

&lt;p&gt;A working prototype is five stages. Each one is a replaceable component, which matters because you'll swap models at every layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upload ──► face detect/align ──► identity embed ──► motion+scene ──► audio ──► composite/export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Face detection and alignment
&lt;/h3&gt;

&lt;p&gt;You can't feed a raw selfie to a diffusion model. First you localize the face, crop it, and normalize it to a canonical orientation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detection:&lt;/strong&gt;​ RetinaFace or SCRFD (both available via &lt;code&gt;insightface&lt;/code&gt;) are the standard picks — fast on CPU, accurate enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alignment:&lt;/strong&gt;​ fit five facial landmarks (eyes, nose, mouth corners) and apply a similarity transform to warp the face to a fixed 112×112 or 256×256 template.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;insightface.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FaceAnalysis&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FaceAnalysis&lt;/span&gt;&lt;span class="p"&gt;(&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;buffalo_l&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;providers&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;CPUExecutionProvider&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx_id&lt;/span&gt;&lt;span class="o"&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;det_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;person_a.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;faces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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="c1"&gt;# each face has .bbox, .kps, .normed_embedding
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;normed_embedding&lt;/code&gt; on each detected face is the prize — it's the identity vector you'll use downstream.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Identity embedding
&lt;/h3&gt;

&lt;p&gt;This is the step most tutorials skip. You need a compact vector that &lt;em&gt;represents&lt;/em&gt; the person, independent of pose, lighting, and expression. Face recognition models trained on large datasets (ArcFace-family backbones) give you exactly that — a 512-dim embedding where "same person" = "high cosine similarity."&lt;/p&gt;

&lt;p&gt;Keep the embedding for the &lt;em&gt;source&lt;/em&gt; face (the user's photo). In generation, you'll pull the generated face back toward this vector.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Motion and scene
&lt;/h3&gt;

&lt;p&gt;Here you have two real architectural choices, and they're not equivalent:&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;How it works&lt;/th&gt;
&lt;th&gt;Trade-off&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Face-swap over a template&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generate or reuse a fixed performance clip, then swap in the target face frame-by-frame&lt;/td&gt;
&lt;td&gt;Fast, cheap, identity locked by construction; less control over scene&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity-conditioned video diffusion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Drive a video model with the identity embedding (IP-Adapter-style injection or LoRA)&lt;/td&gt;
&lt;td&gt;More flexible scenes; harder to keep identity stable, higher compute&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a two-person rap clip, the first approach is why these tools feel instant: the expensive part (a believable performance with choreography and camera) is solved once, at build time, and reused for every user. You're not generating a scene from scratch per request — you're compositing faces into a pre-rendered one. That's a cost and latency decision, not just a convenience.&lt;/p&gt;

&lt;p&gt;If you want bespoke scenes, look at identity-injection via IP-Adapter + AnimateDiff, or a fine-tuned LoRA per recurring character. Budget 10–100× the compute.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Audio
&lt;/h3&gt;

&lt;p&gt;Don't synthesize the copyrighted reference track. Generate an original beat plus lyrics and vocals — typically a music/lyrics LLM for the bars, then a TTS or singing-vocals model (Bark, or a commercial text-to-song API) for the performance. Keep audio as a separate pass and mux it at the end; coupling it to the video model only adds failure modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Composite and export
&lt;/h3&gt;

&lt;p&gt;Stitch frames with &lt;code&gt;ffmpeg&lt;/code&gt;, mux the audio, encode for social (vertical, H.264). Nothing exotic here, but get the frame rate and aspect ratio right before you scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Minimal Face-Swap Prototype
&lt;/h2&gt;

&lt;p&gt;If you want something working in a weekend, the face-swap route is the pragmatic choice. The modern standard is &lt;code&gt;insightface&lt;/code&gt;'s inswapper model:&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;,&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;insightface.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FaceAnalysis&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;onnxruntime&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ort&lt;/span&gt;

&lt;span class="c1"&gt;# Load models once
&lt;/span&gt;&lt;span class="n"&gt;swapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;insightface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_zoo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inswapper_128.onnx&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                          &lt;span class="n"&gt;providers&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;CPUExecutionProvider&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;load_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;person_a.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&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="c1"&gt;# identity to inject
&lt;/span&gt;
&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;VideoCapture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;template_performance.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setup_writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CAP_PROP_FPS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;while&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;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&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;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&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;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;swapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&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;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paste_back&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;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a template performance with a stable face in under a hundred lines. Two people? Run the swap for each of two source identities, or use a template that already has two performers in fixed left/right positions and assign each face to its slot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Real Complexity Lives
&lt;/h2&gt;

&lt;p&gt;The prototype gets you 80% there. The last 20% is where products are won or lost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Occlusion and motion blur.&lt;/strong&gt; Hands, microphones, head turns — a raw swap breaks down. The good tools add a face-consistency loss or an identity-regularized diffusion pass on top of the swap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-face assignment.&lt;/strong&gt; Keeping face A on the left and face B on the right across 12 seconds, without drift or swap, is a tracking problem as much as a generation problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency and cost.&lt;/strong&gt; A reusable template keeps per-request cost near constant. Generating per user scales your GPU bill with your traffic — the difference between a hobby project and a dead one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build It or Use It?
&lt;/h2&gt;

&lt;p&gt;If this is your product, build the pipeline — the identity-preservation problem is a genuine moat worth owning.&lt;/p&gt;

&lt;p&gt;If you just need the &lt;em&gt;output&lt;/em&gt; — say, a shareable two-person clip for a campaign or a quick test of the format — don't re-solve a solved problem. Something like &lt;a href="https://airapduo.com/" rel="noopener noreferrer"&gt;AI Rap Duo&lt;/a&gt; already bundles the template, the identity preservation, and the original beat into a two-photo upload with no prompt. That's the right call when the goal is the video, not the architecture.&lt;/p&gt;

&lt;p&gt;Either way, the interesting engineering question is the same one that makes &lt;em&gt;any&lt;/em&gt; personalized AI product hard: keeping a real, specific face believable while everything around it moves. Nail that, and the rest is just plumbing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>videogeneration</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How AI Rap Duo Video Generators Work Under the Hood (and How to Pick One)</title>
      <dc:creator>Marita P</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:26:56 +0000</pubDate>
      <link>https://dev.to/marita_pang_0302f784f7ea3/how-ai-rap-duo-video-generators-work-under-the-hood-and-how-to-pick-one-583b</link>
      <guid>https://dev.to/marita_pang_0302f784f7ea3/how-ai-rap-duo-video-generators-work-under-the-hood-and-how-to-pick-one-583b</guid>
      <description>&lt;p&gt;The "Hotel Lobby AI" trend is everywhere right now: two photos in, a twelve-second rap performance out, with two familiar faces sharing an orange stage and a hanging microphone. If you're a developer or a curious builder, the interesting question is not &lt;em&gt;what&lt;/em&gt; these tools do — it's &lt;em&gt;how&lt;/em&gt; they do it, and which one actually fits your stack.&lt;/p&gt;

&lt;p&gt;This post breaks the pipeline down, then gives you a short framework for choosing between the main approaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pipeline, Step by Step
&lt;/h2&gt;

&lt;p&gt;Most two-photo rap duo generators run roughly the same sequence under the hood:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Face detection and alignment.&lt;/strong&gt; The tool finds the faces in your one or two uploads, crops them, and aligns them so the downstream model can work with a consistent input. If you upload two separate portraits, the left/right placement is usually fixed at this stage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity mapping.&lt;/strong&gt; This is the hard part. The model has to keep &lt;em&gt;your&lt;/em&gt; person's identity stable across dozens of frames while the body moves, mouths rap, and the camera shifts. This is typically a face-swap or identity-embedding step layered on top of a motion prior — not a raw text-to-video call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motion and scene generation.&lt;/strong&gt; The orange stage, the performer choreography, and the camera are baked in as a template, which is why these tools need no prompt. You're not describing a scene; you're selecting from a pre-built one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio generation.&lt;/strong&gt; Rather than reusing the copyrighted "HOTEL LOBBY" recording, many tools synthesize an original beat plus lyrics and vocals. The lyrics are often generated from an optional "topic" field you can fill or leave blank.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render and export.&lt;/strong&gt; Everything is composited into a short clip you can download and post.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The practical takeaway: the engineering moat is in identity preservation and audio, not in the scene. That's why the good tools feel instant — the expensive part was solved at build time, not at generation time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt or No Prompt? The Real Trade-off
&lt;/h2&gt;

&lt;p&gt;The tools split into two camps, and the choice matters more than the orange stage.&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;Input&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Two-photo rap duo generator&lt;/strong&gt; (e.g., AI Rap Duo)&lt;/td&gt;
&lt;td&gt;One or two portraits, optional topic&lt;/td&gt;
&lt;td&gt;Low — scene is fixed&lt;/td&gt;
&lt;td&gt;Fast, no-prompt clips for social&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt-driven video model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Text prompt + reference images&lt;/td&gt;
&lt;td&gt;High — every frame is yours&lt;/td&gt;
&lt;td&gt;Iterative, bespoke scenes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Editor template&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Original clip + manual edits&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Remixing the reference audio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your goal is a shareable clip in minutes, the two-photo route wins because it removes the fiddly part without removing the one decision that actually matters: &lt;em&gt;who&lt;/em&gt; is in the video. A tool like &lt;a href="https://airapduo.com/" rel="noopener noreferrer"&gt;AI Rap Duo&lt;/a&gt; takes two portraits or a single duo photo and returns a built-in Hotel Lobby–style performance with an original AI-written verse and beat — no prompt assembly required.&lt;/p&gt;

&lt;p&gt;If you need maximum control over lighting, camera, and choreography and are willing to iterate, a prompt-driven model is the fit — but budget for the extra time and the separate audio step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Identity Preservation Is the Hard Part
&lt;/h2&gt;

&lt;p&gt;The single hardest problem in this space is keeping a specific face believable across a moving, lip-syncing body. A generic face can wobble and nobody notices; &lt;em&gt;your&lt;/em&gt; face has to stay recognizably &lt;em&gt;you&lt;/em&gt; for the joke to land. That's why two-photo generators lean on face-identity embeddings and face-swap priors rather than a raw diffusion pass — and why the audio is usually generated separately from the visuals. It's also why the best tools feel instant: they pre-solved the expensive part at build time, so the per-generation cost stays low.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Selection Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Want original audio, not the reference track?&lt;/strong&gt;​ Look for generators that synthesize lyrics + vocals + beat rather than replaying a copyrighted recording.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Care about identity stability?&lt;/strong&gt;​ Prefer tools built specifically for face-to-video, not general text-to-video, since the former optimize for keeping a face consistent across frames.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need it fast?&lt;/strong&gt;​ Two-photo generators are the shortest path from idea to shareable clip.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trend is fun, but the interesting engineering problem is the same one that makes any AI video product hard: keeping a real, specific face believable while everything around it moves. The tools that nail that are the ones worth watching.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
