Klon din egen stemme lokalt: slik lager du voiceover uten skytjenester

En praktisk guide til å lage voiceover med en KI-klonet versjon av din egen stemme, alt kjørende på din egen maskin.

Klon din egen stemme lokalt: slik lager du voiceover uten skytjenester
Slik tar du IKKE opp stemmen din. / Kreditt: Midjourney

Lokal stemmekloning!

Den 11. juni hadde vi Bytes and Bagels her med IT-eliten i Helgeland. Nasjonalbiblioteket sto for presentasjonen denne gangen, og vi fikk et godt innblikk i deres satsning på KI og egenutviklede modeller.

Det som fanget min interesse var at de holder på å syntetisere norske stemmer med to skuespillere for naturlig tale på norsk.

Dette fikk meg til å tenke: hvordan kan jeg gjenskape noe av dette? Jeg sitter ikke på hardware til å trene modeller lokalt. Jeg kan, etter min forståelse, ikke ta ned en kopi av OpenAIs Whisper-modell for så å legge et datasett oppå.

Men det viser seg at noe kan jeg gjøre med min egen stemme, og lokalt.

KI-klonen – generert lokalt med oppskriften i denne guiden · --:--
Den ekte stemmen min – samme tekst, samme lydbehandling · --:--

Samme sammendrag, lest to ganger. Hvor nært kom klonen?

Denne guiden viser hvordan du setter opp det samme selv. Den er praktisk og inneholder terminalkommandoer, men du trenger ikke være utvikler – du trenger å være nysgjerrig, utforskende og kunne lime inn kommandoer.

Og et tips før du starter: kommandoene kan kjøres akkurat som de står, men du kan også la en KI-agent i terminalen kjøre dem for deg – for eksempel Claude Code eller Codex CLI. Da har du med deg en assistent som fanger opp skrivefeil, tolker kryptiske feilmeldinger og resonnerer seg gjennom problemene sammen med deg når noe ikke virker på første forsøk. Terskelen for å gjennomføre en guide som denne har aldri vært lavere.

Alt skjer lokalt: stemmen din forlater aldri maskinen, og det koster ingenting per generering.

Først: en viktig avgrensning

Teknologien i denne guiden kloner stemmer fra korte lydklipp. Det betyr at den også kan klone stemmer som ikke er din. Ikke gjør det. Klon din egen stemme, eller stemmen til noen som har gitt deg et tydelig og informert ja. I Norge er stemmen din en personopplysning, og misbruk av andres stemme kan ramme både personvern og åndsverk – i tillegg til at det rett og slett er ufint og dårlig gjort. Skjerp deg!

Modellen vi bruker legger for øvrig inn et uhørbart vannmerke i alt den genererer, slik at lyden kan identifiseres som syntetisk i ettertid. Og det, det er en god ting i dagens samfunn.

Hva du trenger

  • En vanlig datamaskin. Du trenger ikke GPU – alt i denne guiden kjører på CPU. Regn med 30–60 sekunder genereringstid per setning, så en 30-sekunders voiceover tar noen minutter. Helt greit for artikkellyd, for tregt for sanntid.
  • Python, helst via miniconda, så installasjonen ikke roter til resten av maskinen.
  • ffmpeg til lydbehandling (brew install ffmpeg på Mac, eller pakkebehandleren din på Linux/Windows).
  • 10–12 sekunder rent opptak av din egen stemme. Mer om det under.

Steg 1: velg modell

Vi bruker Chatterbox, en åpen talesyntesemodell fra Resemble AI som klarer stemmekloning fra korte referanseklipp. Chatterbox finnes i en offisiell flerspråklig variant som på papiret støtter norsk, men her kommer dagens første ærlige innrømmelse: da jeg testet den med language_id="no", fikk jeg noe som hørtes ut som en svenske som har bodd tre år i Danmark. Teknisk sett norsk. I praksis ikke.

Løsningen ble en norsk finjustering av modellen som ligger åpent på Hugging Face: akhbar/chatterbox-tts-norwegian. Den er trent videre på norsk tale og leverer faktisk bokmål som låter som bokmål. Det er den vi setter opp.

Steg 2: lag stemmereferansen

Modellen lærer stemmen din fra ett enkelt lydklipp – og kvaliteten på det klippet betyr mer enn noe annet i hele oppsettet. Du trenger:

  • 10–12 sekunder sammenhengende tale (modellen bruker bare de første ti)
  • Rolig, naturlig lesing – ikke dramatisering
  • Så lite romklang og bakgrunnsstøy som mulig

Har du en podkast, en YouTube-kanal eller et gammelt foredragsopptak, er det gull. Hvis ikke: les inn et par setninger på mobilen i et rom med tepper og gardiner. Konverter og rens klippet med ffmpeg:

ffmpeg -i opptak.wav -ss 00:00:02 -t 12 -ac 1 -ar 24000 \
  -af "highpass=f=80,afftdn=nf=-30,loudnorm=I=-20" stemme.wav

Kommandoen klipper ut tolv sekunder, gjør lyden mono i 24 kHz (det modellen forventer), fjerner lavfrekvent rumling og støy, og jevner ut nivået. Resultatet, stemme.wav, er stemmen din i konsentrert form.

Steg 3: installer verktøyene

Lag et eget Python-miljø og installer Chatterbox:

conda create -n chatterbox python=3.11
conda activate chatterbox
pip install chatterbox-tts "setuptools<81"

Den siste biten – "setuptools<81" – er viktig. Nyere versjoner av setuptools knekker vannmerke-komponenten i Chatterbox, og feilmeldingen du får sier ingenting om hvorfor. Denne ene linjen sparte meg for en kveld med feilsøking, så nå sparer den forhåpentligvis deg.

Første gang du genererer noe, laster modellen ned rundt 3 GB med vekter fra Hugging Face. Det skjer bare én gang.

Steg 4: generer talen

To ting må på plass før du trykker på knappen. Det første er teksten: skriv for øret, ikke for øyet. Korte setninger. Tall skrevet slik de uttales («rundt tre tusen kroner», ikke «ca. kr 3 000,-»). Og del teksten i setninger på maks 25 ord – modellen begynner å slite på lange strekk.

Det andre er innstillingene. Med standardverdiene fikk jeg en versjon av meg selv som sa «ehh» og «øhh» mellom setningene – modellen hallusinerte rett og slett nøling. Løsningen er å senke temperaturen (hvor mye modellen «improviserer») og heller skru opp exaggeration (hvor mye liv det er i leveringen):

import torch, torchaudio
from pathlib import Path
from chatterbox.tts import ChatterboxTTS
from huggingface_hub import hf_hub_download

REPO = "akhbar/chatterbox-tts-norwegian"
for fil in ["ve.safetensors", "t3_cfg.safetensors",
            "s3gen.safetensors", "tokenizer.json", "conds.pt"]:
    lokal = hf_hub_download(repo_id=REPO, filename=fil)

model = ChatterboxTTS.from_local(Path(lokal).parent, device="cpu")

setninger = [
    "Hei, dette er stemmen min – generert på min egen maskin.",
    "Ingen sky, ingen abonnement, ingen data på avveie.",
]

pause = torch.zeros(1, int(0.25 * model.sr))
biter = []
for s in setninger:
    lyd = model.generate(
        s,
        audio_prompt_path="stemme.wav",
        temperature=0.45,      # standard 0.8 gir "ehh"-venteord
        exaggeration=0.55,     # litt liv i leveringen
    )
    biter += [lyd, pause]

torchaudio.save("voiceover.wav", torch.cat(biter[:-1], dim=1), model.sr)

Lagre som syntese.py, kjør python syntese.py, og hent kaffe mens CPU-en jobber.

Steg 5: engelske ord må omstaves

Her er guidens viktigste triks, og det ingen dokumentasjon forteller deg: modellen leser alt som norsk. Engelske navn og lånord blir grøt. I min første test var «Starpath», «Alien» og «Iron Gate» nesten umulige å høre – de ble uttalt bokstav for bokstav, på norsk.

Løsningen er å omstave engelske ord fonetisk i teksten du sender til modellen – skriv det en nordmann ville lest høyt for å treffe den engelske uttalen:

SkrevetSend til modellen
StarpathStarpæth
AlienEilien
Iron GateEiern Gæit
SteamStiim
gaminggeiming

Pass på norske leseregler i omstavingen: g foran ei, i og y leses som j, så «Gate» kan ikke bli «Geit» (det blir «jeit» – og dessuten en geit). «Gæit» beholder den harde g-en.

Behold originalskrivemåten i tekstene du publiserer – omstavingen gjelder bare det modellen får servert.

Steg 6: mastering

Råoutputen fra modellen låter som om noen snakker inne i en kopp. Det fikser vi med en ffmpeg-kjede som kutter det boksete mellomtoneområdet, løfter diskanten, komprimerer lett og normaliserer til -16 LUFS – standarden for talelyd på nett:

ffmpeg -i voiceover.wav -af "highpass=f=90,\
equalizer=f=350:t=q:w=1.0:g=-6,\
equalizer=f=600:t=q:w=1.5:g=-3,\
equalizer=f=3000:t=q:w=1.5:g=4,\
treble=g=6:f=5500,\
acompressor=threshold=-20dB:ratio=3:attack=8:release=120:makeup=3dB,\
loudnorm=I=-16:TP=-1.5:LRA=11,\
atempo=1.07" -b:a 128k voiceover.mp3

Legg merke til atempo=1.07 på slutten: modellen leser litt tregere enn naturlig tale, og en forsiktig hastighetsøkning (uten pitch-endring) strammer samtidig inn småpauser som ellers kan virke ulogiske. Resultatet er en ferdig mp3 klar for nettsiden din.

Fallgruvene jeg møtte

Skal jeg være ærlig, tok det seks genereringer før jeg hadde en voiceover jeg ville publisere. Dette er det som gikk galt underveis, så du slipper å oppdage det selv:

  • Venteordene. Med standardinnstillinger sa den syntetiske utgaven av meg «ehh» og «øhh» – overbevisende nok til å være pinlig. Temperatur ned til 0.45 fjernet det.
  • Engelske ord ble uforståelige helt til jeg begynte å omstave dem fonetisk (steg 5).
  • Løpske setninger. Av og til løper modellen løpsk og drar en setning ut i det absurde – min rekord var 23 sekunder på en setning med 14 ord, fylt med utstrukne vokaler og gjentakelser. Det skjer tilfeldig og uforutsigbart. Den praktiske løsningen er en enkel vaktpost i scriptet: regn ut et tidsbudsjett per setning (et halvt sekund per ord pluss et par sekunder slingringsmonn), og generer setningen på nytt hvis resultatet bommer grovt. Tre forsøk holder – behold det korteste.
  • Den rå lyden er ikke publiserbar. Uten mastering låter alt dumpt og fjernt. EQ-kjeden i steg 6 er ikke pynt, den er nødvendig.

Forvent iterasjon. Første generering blir ikke den du publiserer – og det er helt normalt.

Hva betyr dette i praksis?

Den ferdige mp3-en kan du legge rett inn på nettsiden din med en enkel <audio>-spiller – hos meg ligger den som et valgfritt lydsammendrag øverst i artikkelen, generert fra et kort, godkjent sammendrag av saken.

Men det interessante er prinsippet. Stemmekloning har til nå vært synonymt med skytjenester: du laster opp stemmen din til noen andres server, betaler per generert minutt, og håper vilkårene ikke endrer seg. Med en åpen modell på egen maskin eier du hele kjeden selv. Stemmen din blir liggende der den hører hjemme – hos deg – og marginalkostnaden per voiceover er null.

Det betyr ikke at skytjenestene er overflødige. De er raskere, krever null oppsett, og har kommet lenger på flerspråklighet. Men for norsk tale, med din egen stemme, til ditt eget innhold? Det klarer du nå helt fint på kjøkkenbordet.

Klar for å teste dette i praksis? Book en strategisk samtale, så skisserer vi et løp som passer for teamet ditt.