★★★★★ Anbefalt av kundene våre · 100% av kundene fikk større bunnlinje · 100% resultatbasert
Gratis guide · Hele oppskriften

Slik lager vi motion-annonser med AI.

Norsk voiceover, musikk og animasjon, uten designer, uten filming og uten After Effects. Dette er den nøyaktige arbeidsflyten vi bruker, med malene vi kopierer fra hver gang. Hver regel her finnes fordi noe gikk galt første gang.

Av Victor Skretteberg, Arcads 29. september 2026 Ca. 12 minutter
8steg fra idé til ferdig video
6maler du kan kopiere
10feil vi har gjort, så du slipper
Den gamle måten
Rapportenerfullavklikkogvisninger.
Visninger og klikk, uke for uke
Rapport full av klikk og visninger
Énside.Baretallenesombetyrnoe.
Nye leads
Kostnad per lead
Salg fra annonsene
Annonser som betaler for seg selv.
arcads.no
f 000 / 360
Alt i videoen er en funksjon av bildenummeret, akkurat som i Remotion. Dra i linja for å se hver frame.
Verktøyene

Seks verktøy. Ingen av dem krever at du kan designe.

Claude Code
Regissør og utvikler

Skriver manus, planlegger scenene og koder hele animasjonen.

Remotion
Video fra kode

Gjør React-kode om til MP4. Én fil gir både 9:16 og 1:1.

ElevenLabs tale
Voiceover

Norsk stemme med tidsstempel for hver eneste bokstav.

ElevenLabs Music
Musikk

Et spor laget til nøyaktig lengde og stemning, ingen lisensjakt.

ElevenLabs Scribe
Kontroll

Tale til tekst. Sjekker at stemmen faktisk sa det som står i manus.

ffmpeg
Lyd og kontroll

Riktig lydnivå, stillbilder til kontroll og siste finpuss.

Hovedtrikset

Stemmen lages først, med tidsstempler. Så låses hver eneste animasjon til ordet den hører til. Det er derfor tekst, bilde og lyd treffer helt presist, uten at noen sitter og justerer i et redigeringsprogram.

Del 1

Arbeidsflyten i åtte steg

Rekkefølgen er viktig. Mange starter med animasjonen og legger på stemme til slutt. Vi gjør det motsatt, fordi stemmen bestemmer tempoet i alt annet.

01

Brief og vinkel

Bestem først om det er en annonse for kald trafikk eller en merkevarefilm. Pen typografi på en tom bakgrunn stopper ingen i feeden.

  • En annonse for kald trafikk trenger noe konkret i første 1,5 sekund: et ekte produkt, et ekte skjermbilde, en situasjon folk kjenner seg igjen i, eller et tall.
  • Hent alle påstander fra bedriftens egen nettside. Ikke finn på tall.
  • Bruk ekte skjermbilder og produktbilder. Tegnede mockups ser ut som de er laget i et script.
  • Vis aldri en person som ikke er den som snakker.
02

Manus

  • Skriv få, lange setninger bundet sammen med komma, «og», «for» og «så».
  • Generer hele manuset i ett kall. Aldri setning for setning.
  • Forkortelser skrives med bindestrek, som «C-R-M». Ellers blir de ofte uttalt som ett ord.
  • Skriv ut valuta og tegn: «200 kroner», ikke «200 kr».
  • Rundt 20 sekunder tale for en vanlig annonse, 40 til 45 sekunder for problem og løsning.

Hvorfor: Mange korte setninger får AI-stemmen til å starte tonefallet på nytt hver gang. Det er det som gjør at den høres hakkete ut, ikke pausene.

03

Stemme

  • Modell eleven_v4 med språkkode «no». Den eldre multilingual-modellen glir over i dansk på norsk tekst.
  • Bruk endepunktet with-timestamps. Da vet du nøyaktig når hvert ord starter.
  • Lag 3 til 6 versjoner og velg på målinger: kjør tale til tekst på hver, sjekk at alle ord er riktige, og velg den med jevnest tempo.
  • For treg? Øk speed til 1,05 til 1,15, eller kort ned manuset.
  • Hør alltid på stemmen selv før du publiserer.

Hvorfor: Vi prøvde å speede opp lydfila i etterkant én gang. Alle hørte det med en gang, selv om ingen kunne si hva som var galt.

04

Musikk

  • Generer musikken til nøyaktig samme lengde som videoen.
  • Har annonsen et vendepunkt, be om to deler: urolig og i moll før, varm og i dur etter.
  • Unngå generisk «inspirerende bedriftsmusikk». Det er det første folk scroller forbi.

Hvorfor: Når musikken skifter i samme øyeblikk som løsningen kommer, føles hele annonsen gjennomtenkt. Seeren merker det uten å vite hvorfor.

05

Storyboard og timing

  • Lag en scenetabell i frames (30 per sekund) der hver scene starter på et bestemt ord i stemmen.
  • Noe nytt skal skje minst hvert 1,5 til 3 sekund.
  • Start med et forsprang på ca. 0,4 sekunder før stemmen.
06

Animasjon i Remotion

  • Én komponent per annonse. Samme kode gir 9:16 og 1:1.
  • Inn-animasjoner 15 til 20 frames, ut-animasjoner kortere, 10 til 15 frames.
  • Overskrifter kommer inn ord for ord, i takt med stemmen.
  • Én stor visuell hendelse slår ti små ikoner i hjørnet.
  • Rolig og nordisk: luft, tynne linjer, dempede farger. Ingen konfetti, spinnende stjerner eller store SALE-merker.

Sikker sone i 9:16. All tekst ligger mellom y=400 og y=1520 på en 1080×1920-video. Reels, Stories og TikTok dekker toppen og bunnen med knapper og tekst. Bakgrunn og bilder kan gå helt ut, og teksten skal være 25 til 30 prosent større enn i 1:1.

07

Lydmiks

Stemmen skal alltid ligge over. Musikken er et teppe.

Stemme
0.95
Musikk aleneuten stemme
0.55
Musikk, utgangspunkti video med stemme
0.30
Musikk på sluttbildet
0.16
Musikk under stemmenjevnt, hele veien
0.09

Hvorfor jevnt: Senker du musikken for hver setning, pumper den opp i hver lille pause. Da virker stemmen hakkete selv om den ikke er det. Til slutt normaliseres hele videoen til -15 LUFS.

08

Render og kontroll

  • Render 9:16 og 1:1 fra samme komponent.
  • Ta ut stillbilder på nøkkelpunkter og sjekk at teksten ligger innenfor sikker sone.
  • Gå gjennom sjekklisten før noe publiseres.
Del 2

Formatet som funker best: problem og løsning, speilet

Av alt vi har testet er dette formatet det som har fått best respons. Rundt 45 sekunder, bygget slik:

1

Scener, ikke ikoner

Ikke «dårlig kommunikasjon», men chatten som flommer over til den viktige beskjeden forsvinner ut av skjermen. Ikke «tidkrevende», men klokka som går fra 21:47 til 23:12.

2

Speilet 1:1

Problem 3 får løsning 3. Seeren trenger ikke tenke, bare kjenne igjen.

3

Det gamle strøket over

Over hver løsning står problemet med rød strek: rapport full av klikk. Da ser man direkte hva som er fikset.

Del 3

Malene. Kopier, lim inn, bytt ut det i klammer.

Dette er de samme malene vi selv starter fra. Du trenger en ElevenLabs-konto og en Mac eller PC med Node og Python.

Prompt til Claude CodeStart her. Resten av malene bruker Claude selv underveis.
Lag en motion graphic-annonse i Remotion for [bedrift].
Målgruppe: [hvem]. Tilbud: [hva]. Nettside: [url].
Hent alle påstander fra nettsiden, ikke finn på tall.

Format: problem og løsning, ca. 45 sekunder, 30 fps, 9:16 og 1:1 fra samme komponent.
- 5 konkrete problemer som små scener (ikke ikonlister), deretter et vendepunkt
  der logoen tegner seg, deretter 5 løsninger i samme rekkefølge.
  Over hver løsning: det gamle problemet strøket over i rødt.
- Manus: få, sammenhengende setninger. Forkortelser med bindestrek. Valuta skrevet ut.
- Stemme: ElevenLabs eleven_v4, language_code "no", endepunktet with-timestamps.
  Lag 4 takes, sjekk hver med tale til tekst mot manus,
  velg den med riktig tekst og jevnest tempo.
- Musikk: ElevenLabs Music i to halvdeler (urolig moll, så varm dur),
  skiftet på vendepunktet.
- Bygg en scenetabell i frames øverst i fila, låst til ordtidene fra stemmen.
- All tekst i 9:16 mellom y=400 og y=1520.
- Lydmiks: stemme 0.95, musikk 0.30 senket jevnt til 0.09 under hele stemmen.
- Render begge formater og normaliser til -15 LUFS.

Vis meg manus og scenetabell før du genererer stemme.
StemmeinnstillingerPOST /v1/text-to-speech/{voice_id}/with-timestamps
{
  "model_id": "eleven_v4",
  "language_code": "no",
  "voice_settings": {
    "stability": 0.5,
    "similarity_boost": 0.78,
    "style": 0.0,
    "use_speaker_boost": true,
    "speed": 1.0
  }
}
Fra tidsstempler til framesPython. Gir words.json med start og slutt for hvert ord.
import json, base64

r = json.load(open("resp.json"))
open("vo.mp3", "wb").write(base64.b64decode(r["audio_base64"]))

a = r.get("alignment") or r["normalized_alignment"]
chars = a["characters"]
starts = a["character_start_times_seconds"]
ends = a["character_end_times_seconds"]

words, cur, t0, prev = [], "", None, 0
for c, s, e in zip(chars, starts, ends):
    if c.strip() == "":
        if cur:
            words.append({"word": cur, "start": round(t0 * 30), "end": round(prev * 30)})
        cur, t0 = "", None
    else:
        if t0 is None:
            t0 = s
        cur += c
    prev = e
if cur:
    words.append({"word": cur, "start": round(t0 * 30), "end": round(prev * 30)})

json.dump(words, open("words.json", "w"), ensure_ascii=False, indent=1)
MusikkpromptElevenLabs Music. Bytt lengde og tidspunkt for vendepunktet.
{
  "prompt": "Instrumental bed for a 47 second Scandinavian software ad in two halves. First 20 seconds: sparse, slightly tense and restless, muted plucked strings and a ticking clock-like pulse, minor key, unresolved. Then at 20 seconds a clear warm turn: soft felt piano and gentle brushed percussion, major key, hopeful, calm, building subtly to a clean resolved ending. 96 BPM, no vocals, no drops, understated.",
  "music_length_ms": 47000,
  "force_instrumental": true
}
Fade inn og utRemotion. Brukes på nesten alle elementer.
import { Easing, interpolate } from "remotion";

const clamp = { extrapolateLeft: "clamp", extrapolateRight: "clamp" } as const;

// Synlig fra frame a til b: 16 frames inn, 14 frames ut
export const inOut = (f: number, a: number, b: number, fi = 16, fo = 14) =>
  Math.min(
    interpolate(f, [a, a + fi], [0, 1], { ...clamp, easing: Easing.out(Easing.exp) }),
    interpolate(f, [b - fo, b], [1, 0], clamp)
  );
Lydnivå til -15 LUFSPython og ffmpeg, to runder. Kjør: python3 ln.py inn.mp4 ut.mp4
import json, subprocess, sys

src, dst = sys.argv[1], sys.argv[2]
o = subprocess.run(
    ["ffmpeg", "-hide_banner", "-i", src, "-af",
     "loudnorm=I=-15:TP=-1.5:LRA=11:print_format=json", "-f", "null", "-"],
    capture_output=True, text=True).stderr
d = json.loads(o[o.rindex("{"):o.rindex("}") + 1])
af = (f"loudnorm=I=-15:TP=-1.5:LRA=11:measured_I={d['input_i']}:measured_TP={d['input_tp']}"
      f":measured_LRA={d['input_lra']}:measured_thresh={d['input_thresh']}"
      f":offset={d['target_offset']}:linear=true")
subprocess.run(["ffmpeg", "-y", "-i", src, "-c:v", "copy", "-af", af,
                "-ar", "48000", "-c:a", "aac", "-b:a", "192k", dst], check=True)
+

Bonus: bytt stemme uten å bygge animasjonen på nytt

Har du laget hele animasjonen og vil teste en annen stemme? Match ordene i gammel og ny versjon, lagre to lister med frame-tall (OLD og NEW), og la komposisjonen oversette hver frame til «gammel tid». Da flytter hele animasjonen seg ord for ord etter den nye stemmen. Vi tester flere stemmer på samme video på noen minutter på denne måten.

TidsforskyvningRemotion. OLD og NEW er like lange lister med ord-starttider i frames.
import { interpolate, useCurrentFrame } from "remotion";

const extend = { extrapolateLeft: "extend", extrapolateRight: "extend" } as const;
const toOld = (f: number) => interpolate(f, NEW, OLD, extend);

// Bruk denne i stedet for useCurrentFrame() i hele komposisjonen
export const useWarpedFrame = () => toOld(useCurrentFrame());
Del 4

Sjekkliste før du publiserer

0 av 7 sjekket

Del 5

10 feil vi har gjort, så du slipper

01Tekst og lyd var ute av synkTidsstempler fra stemmen, aldri anslåtte tider
02Stemmen hørtes hakkete utLange, flytende setninger og jevn musikkdemping
03Stemmen ble speedet opp i etterkantSpeed-innstillingen, eller kortere manus
04Norsk ble uttalt som danskeleven_v4 med språkkode «no»
05Forkortelsen ble uttalt som ett ordBindestrek mellom bokstavene
06Musikken var for høy0.30 som utgangspunkt, 0.09 under stemmen
07Tegnet animasjon ble avvistEkte skjermbilder og produktbilder i bunn
08Teksten havnet under Reels-knappeneSikker sone y=400 til 1520
09Stemmen ble laget setning for setningHele manuset i ett kall
10Pen typografi-intro stoppet ingenNoe konkret i første 1,5 sekund
Victor Skretteberg

Hei, Victor her. Dette er den samme oppskriften vi bruker når vi lager motion-annonser for kundene våre. Den blir oppdatert hver gang vi lærer noe nytt, så lagre lenken.

Vil du heller at vi lager annonsene for deg? Send oss nettsiden din nederst på siden, så får du et gratis forslag.

Noen av dem vi jobber med
Utvendigrenhold Veldigrent.no Rask Flytting Mokki Badstugutta Frifor.app
Før / etter

Før og etter Arcads.

Tallene er hentet fra kundenes egne annonsekontoer.

Se også: Google Ads-byrå · Meta Ads-byrå · Performance marketing-byrå · Hva er UGC? · Google Ads-byrå Oslo

Spørsmål og svar.

Trenger jeg å kunne kode for å bruke dette?+
Nei, men det hjelper å være komfortabel med å kjøre kommandoer. Claude Code skriver koden, og du styrer med vanlig tekst. Du trenger Node og Python installert, en ElevenLabs-konto og tilgang til Claude Code.
Hvor lang tid tar det å lage én annonse?+
Første gang går det med en del tid på oppsett. Når malene er på plass, går mesteparten av tiden til manus, å lytte på stemmen og finjustere, ikke til selve animasjonen.
Fungerer norsk voiceover fra AI godt nok til annonser?+
Med riktig modell og riktig manus, ja. Bruk eleven_v4 med språkkode no, skriv få og flytende setninger, lag flere versjoner og hør alltid selv før du publiserer. Den eldre multilingual-modellen glir over i dansk på norsk tekst.
Hvilket format fungerer best for motion-annonser?+
Av det vi har testet: problem og løsning, speilet. Fem konkrete problemer som små scener, et vendepunkt, og fem løsninger i samme rekkefølge der det gamle problemet står strøket over.
Hva er sikker sone i en 9:16-video?+
På en 1080×1920-video bør all tekst ligge mellom y=400 og y=1520. Reels, Stories og TikTok dekker toppen og bunnen med profilnavn, knapper og tekst.
Gratis & uforpliktende

Vil du heller at vi lager annonsene for deg?

Send oss nettsiden din, så lager vi et konkret forslag til annonser og landingsside for bedriften din, slik det ville sett ut med din merkevare. Du får det på e-post innen et par dager, og det er ditt uansett.

Victor og Jona, Arcads
Victor og Jona lager forslaget selv. Annonser og landingsside slik de ville sett ut for deg. For etablerte bedrifter med 30 000 kr+ i månedlig annonsebudsjett. Ingen pitch, ingen forpliktelser.

Gratis · ingen binding · vi deler aldri infoen din

Vil du heller ta praten direkte? Book 30 minutter i kalenderen → · victor@arcads.no