Tjugo språk på två dagar. Inte en rad skriven för hand.

Det började med en 64 minuter lång guide på YouTube. Idag finns den på 20 språk utöver Johans engelska original. Byt spår, och du hör hans egen klonade röst prata obehindrad thailändska, persiska eller tyska – i exakt synk med det som händer på skärmen. Resultatet är 21 timmar färdigt ljud, och hela arbetet tog två dagar.

Problemet var att det inte fanns någon färdig produkt för detta. Det finns dubbningstjänster, men ingen av dem läser manuset med en specifik röst, klipper ljudet exakt efter undertexternas tidkoder och låter oss styra varje enskild replik. Så vi fick bygga maskineriet från grunden. Dag ett skrev GPT-5.6 i Codex den första versionen. Dag två lät vi Anthropic Fable 5 i Claude Code felsöka och bygga om allt, efter att vi fått feedback från tittarna. Det här är historien om hur vi löste pusslet, och vad som hände när allt inte lät som det skulle.

Dubbade språk
20
Filmlängd per språk
64 min
Genererade repliker
12 550
Färdigt dubbat ljud
21 h
Från start till uppladdning
2 dagar
Rader skrivna för hand
0

02

Block för block blir rappakalja

Första problemet hade inget med ljudet att göra. Undertexterna var redan översatta, men de hade hanterats som undertexter brukar hanteras: maskinellt, block för block. När GPT-5.6 skannade texten inför dubbningen fick den persiska versionen rött ljus. Texten gick helt enkelt inte att läsa in. När vi tittade närmare såg vi samma mönster överallt.

Ett undertextblock är ju bara det som ryms på skärmen i stunden, inte en komplett tanke. Av filmens 580 blockbrytningar kapade 457 stycken texten mitt i en mening. Att översätta dem ryckta ur sitt sammanhang var att be om trubbel. I det tyska spåret fanns till exempel ett block som slutade med ordet "To". Maskinen översatte det rakt av till "Um", och upprepade sedan samma sak i nästa block. De två tyska blocken hann dessutom byta tilltal från det informella "du" till det formella "Sie" – eftersom de saknade kontext.

Språk efter språk led av samma brister: hängande bisatser, halva produktnamn och i värsta fall meningar som sa raka motsatsen till originalet.

Den tyska installationspassagen i tre versioner: det engelska originalet, översättningen block för block och den nya översättningen i hela meningar.
Den tyska installationspassagen i tre versioner: det engelska originalet, översättningen block för block och den nya översättningen i hela meningar.

Tjugo översättningar fick skrotas och göras om. Att läsa in ett trasigt manus med en mänsklig röst skulle bara göra bristerna smärtsamt tydliga.

03

Fyrtio agenter och en gemensam ordlista

Så vi backade från språket och tittade på strukturen. Vi lät ett skript läsa in de 580 engelska blocken och slå ihop dem till 106 hela meningar. Varje mening taggades med rätt kapitel och en spärrlista för ord som inte fick röras. En central ordlista höll ordning: Obsidians "vault" är en arbetsyta i programmet, inte ett bankvalv. Menyer och knappar som "Settings", "Restricted mode" och "Browse" skulle heta exakt det som stod på skärmen, oavsett språk.

Sedan drog vi igång en översättaragent per språk. Instruktionerna var exakta, ner till pronomen: brasiliansk portugisiska fick använda "você", portugisiska "tu", och ukrainskan det formella "ви". Agenterna översatte mening för mening i full kontext, och delade sedan upp texten igen vid de ursprungliga blockgränserna.

Därefter tog en granskningsagent över. Den jämförde de nya, uppdelade undertexterna med den engelska källan, rad för rad. Ett skript bevakade tidkoderna och såg till att textlängden stämde: 50 tecken för språk med latinskt alfabet, 32 för japanska och bara 24 för kinesiska.

Vad de tjugo granskarna rättade, per språk.
Vad de tjugo granskarna rättade, per språk.

När granskningen var klar hade agenterna loggat 2 531 rättelser. Sju av tio handlade om segmentering – att flytta själva brytpunkten så att tittaren hinner andas där språket kräver det. Franskan och tyskan fick flest ändringar eftersom de användes som testbäddar. Persiskan fick en helt egen extrarunda i full kontext för att städa upp röran från originalöversättningen.

Först när totalt 11 600 block gick igenom testerna utan en enda varning, tryckte vi på knappen för ljudet.

04

Ett manus för ögat, ett för örat

Nu ställdes vi inför ett vägval som styrde resten av projektet. Vi var tvungna att separera texten som tittaren ser från texten som rösten läser.

Undertexter är nämligen skriftspråk. Om Johan skriver ut "Tags", "Ctrl+1" eller "/*" i filmen, måste det stå så i texten. Men matar du in "/*" i en röstmodell, så blir den oftast helt tyst. "Ctrl" riskerar att bokstaveras tecken för tecken. Därför lade vi ett separat talmanus parallellt med undertexterna för alla tjugo språk. I det lagret slogs fragmenten ihop till hela meningar, låstes mot tidkoderna och skrevs om fonetiskt.

Samma rader ur den tyska versionen i båda lagren.
Samma rader ur den tyska versionen i båda lagren.

Regeln var strikt: om översättningen var fel rättade vi båda lagren. Om det bara lät konstigt ändrade vi uttalet i tallagret. Tittaren ser "Tags". Rösten läser "Täggs".

05

Maskineriet bakom rösten

Ljudet kom från ElevenLabs flerspråkiga modell, matad med Johans klonade röst. Runt den byggde vi en pipeline i Python som skickade ett API-anrop per replik och sedan sparade ljudfilen i en cache, kopplad till en unik hash av texten och inställningarna.

Pipelinen från undertexter till färdiga spår. Den orange slingan visar att en textändring endast genererar om de repliker som påverkats.
Pipelinen från undertexter till färdiga spår. Den orange slingan visar att en textändring endast genererar om de repliker som påverkats.

Den cachen var avgörande. Om kontosaldot tog slut mitt i en generering frös systemet, redo att plocka upp tråden igen så fort kortet hade debiterats. Och om vi senare upptäckte att en enda mening lät fel kunde vi korrigera den och bara be om det specifika ljudklippet igen, tillsammans med replikerna runt omkring, så att tonfallet matchade i skarvarna. Utan den detaljstyrningen hade projektet aldrig gått i lås på två dagar.

Slutligen tog en renderare vid. Den staplade replikerna på filmens tidslinje, mätte och jämförde mot originalet. Ut kom en detaljerad rapport för varje spår: exakt längd, avvikelser mot undertexternas starttider, klipp som riskerade att överstyra, samt en analys av ljudnivåerna. Vi kompromissade inte; varje språk fick genomgå exakt samma kontroll.

06

"En sömnig robot från Quebec"

När den första versionen gick live tog det inte lång tid innan domen föll.

"Jag klarar inte att lyssna på det. Det låter som en uttråkad eller sömnig robot som pratar Quebec-franska," skrev en fransk tittare.

En tysk tittare fyllde i: "Tyskan funkar bra. Grammatiken stämmer och uttalet är bara lite träigt."

Båda kommentarerna fångade exakt samma problem. Engelskan är kompakt, så när texten översätts tar den nya repliken ofta kortare tid att läsa. Vår första version löste tidsglappet genom att helt enkelt dra ut den genererade rösten i mjukvaran tills den fyllde hela undertextfönstret.

Uppmätt ur renderingsrapporterna från den första versionen: varje språk spelades upp långsammare än naturligt tal.
Uppmätt ur renderingsrapporterna från den första versionen: varje språk spelades upp långsammare än naturligt tal.

Siffrorna talade sitt tydliga språk. Franskan spelades upp i 82 procent av sin normala hastighet. För thailändskan var läget extremt – 0,65x. En tredjedel av allt som sades i hela filmen gick bokstavligen i slow motion.

FÖRE · 0,82×
Filmens inledning på franska i den första versionen: allt tal har tänjts ut tills det fyller fönstren.
EFTER · naturlig takt
Samma inledning efter omrenderingen: naturlig hastighet, riktiga pauser och en svag rumston under tystnaderna.

07

Fixen: luften ska in mellan orden

Felet var uppenbart: vi placerade tidsglappet i fel ände. Den extra tiden ska ligga i pauserna, inte dras ut över vokalerna.

Vi drog igång Anthropic Fable 5 i Claude Code för att skriva om renderaren. I den nya versionen låstes talet vid exakt den tidpunkt som undertexten krävde. Vi tillät en hastighetsminskning på max fem procent, vilket örat knappt uppfattar. Resten av luften sköts in där vi människor faktiskt tar paus – vid punkter, kommatecken och kolon. Och eftersom ElevenLabs levererar tidsstämplar på teckennivå, kunde vi placera pauserna precis rätt.

En verklig replik ur den franska dubben: 1,28 sekunder röst saknas, och tidsglappet fördelas över replikens fyra skiljetecken i stället för att dras ut över vokalerna.
En verklig replik ur den franska dubben: 1,28 sekunder röst saknas, och tidsglappet fördelas över replikens fyra skiljetecken i stället för att dras ut över vokalerna.

Blev det ändå tid över lämnades det som ren tystnad, oftast där originalfilmen ändå tog en paus för att visa något på skärmen. För att tystnaden inte skulle bli helt död och bryta rumskänslan, lades ett svagt brus in som rumston.

Samma 75 sekunder av den franska dubben före och efter. Gapet i mitten är en demopassage där originalet också är tyst.
Samma 75 sekunder av den franska dubben före och efter. Gapet i mitten är en demopassage där originalet också är tyst.

Tack vare caching-systemet kunde vi köra hela omrenderingen av de 20 språken med befintliga ljudfiler. Uppdateringen krävde inte ett enda nytt API-anrop till röstmodellen.

08

Falska vänner slår till

Den tyska tittaren lämnade dock en kommentar till. Det gällde ordet "tags". Ibland snubblade modellen till och uttalade det engelskt, ibland som det tyska ordet för dag – "Tag". Samma stavning, två helt olika uttal.

FÖRE · »Tag«
Den tyska repliken om taggen »50 mm«, återskapad med samma inställningar som i den första versionen: modellen läser »Tag« som det tyska ordet för dag.
EFTER · »Tägg«
Samma replik med den fonetiska omstavningen i tallagret: nu låter det som engelskans tag, konsekvent.

Det fanns fler gropar i vägen. I ett kapitel om att gömma mappar klickar Johan in tecknen "/_*" och läser ut dem högt. Den tyska rösten såg bara symboler och hoppade över dem fullständigt.

FÖRE · tyst
»Ich gebe ein«: röstmodellen hoppar över tecknen helt.
EFTER · uttalat
»Ich gebe Schrägstrich, Unterstrich, Sternchen ein«: tecknen är utskrivna som ord i tallagret.

Vi tittade på ElevenLabs inbyggda uttalslexikon, men dokumentationen visade att den flerspråkiga modellen ignorerar fonetiska regler. Att göra en automatisk sök-och-ersätt för att alltid tvinga fram ett tyskt "Tägg" tar inte hänsyn till kontexten. Då hade modellen plötsligt pratat om "Tägg" även när den läste upp ett datum. Den enda vägen framåt var att justera uttalet för hand i textlagret, replik för replik.

Falska vänner som granskningen senare hittade i andra språk: italienskans pane är bröd, franskans panne är ett haveri, polskans notes är ett anteckningsblock.
Falska vänner som granskningen senare hittade i andra språk: italienskans pane är bröd, franskans panne är ett haveri, polskans notes är ett anteckningsblock.

09

Att granska språk man inte förstår

Frågan väcktes direkt: om tyskan hade det här problemet, vad dolde sig i de andra språken? Eftersom ingen av oss pratar thailändska, ukrainska eller persiska vände vi oss återigen till agenterna. Fyra granskare fick plöja igenom alla tjugo talmanus på jakt efter feluttal, språkliga kollisioner och fel som hängt med från översättningarna.

Granskningen gav resultat. Agenterna hittade att "Ctrl" bokstaverades i stort sett överallt. Siffran "15,000" uttalades som "femton komma noll" på språk där kommatecknet står för decimaler. Snedstrecket i "/Journal" var bortglömt. Thailändskan saknade mellanslag i 66 repliker där latinska ord dök upp. I turkiskan hade ordningstalen kapats på mitten av blockgränserna. Och fyra olika språk hade stelt översatt ordet "funny" till "komisk", i stället för "rolig".

Reparationsomgången per språk. Tyskan toppar med Tägg-omstavningen.
Reparationsomgången per språk. Tyskan toppar med Tägg-omstavningen.

Rättelserna gjordes i en enda körning: 966 repliker genererades om och tidslinjerna renderades på nytt. Varje enskild omstavning resulterade i ett separat litet ljudklipp för vår manuella granskning.

10

Bokslutet: två dagar i siffror

Så här såg insatsen ut. Dag ett: undertexterna översattes från grunden av fyrtio agenter. GPT-5.6 i Codex skrev hela dubbningspipelinen, rösten klonades och 20 språk genererades. Dag två: tittarna gav feedback. Anthropic Fable 5 i Claude Code byggde om renderaren för att skjuta in luft i pauserna i stället för att tänja ut ljudet. Fyra agenter dammsög talmanusen, och sedan genererades de rättade replikerna.

Slutresultatet är 20 ljudspår och drygt 21 timmars tal. Varje spår är 64 minuter och 15 sekunder långt. Spåren ligger inbakade i den publicerade filmen på YouTube, som automatiskt väljer spår utifrån tittarens språkinställning. På köpet fick originalengelskan sig en omgång: 33 små grammatikfel i det engelska originalet hittades och rättades, liksom alla de följdfel som det hade orsakat i tolv av språken.

Och den "uttråkade" franska robotrösten? Den lät helt normal när den väl spelades upp i avsedd hastighet. Det som uppfattades som ett röstproblem var egentligen bara ett matteproblem.

11

Ett kvitto på tekniken

I slutändan bevisade projektet en sak. Agentiska arbetsflöden fungerar skarpt. Och de gör det även när man sitter med ljud, exakta tidslinjer och tjugo språk som ingen i teamet förstår.

Metoden fungerade eftersom den bygger på maskinellt övervakade acceptanskriterier för längd, synk, uttal och terminologi. Ljudet cachas systematiskt så att en ändring bara kostar API-pengar för just de repliker som skrivs om. AI-agenterna gör grovjobbet och hanterar volymen, men en människa tar alltid de sista besluten.

Maskineriet drivs av standardkomponenter: undertextfiler, ett API för röstgenerering, verktyg som ffmpeg, noggrannhet och AI-modeller som skrev koden. Det är den typen av arbetsflöden vi på TokenTek bygger och automatiserar.

Vill du använda metoden på ert innehåll?

Vi använder precis samma arbetssätt när vi bygger produktionssystem åt våra kunder: en tydlig riktning, agenter som drar det tunga lasset under utvecklingen, och kvalitetskrav som följs upp konsekvent. Hör av dig, så diskuterar vi vad det kan innebära för er.