Transkribera och korrigera med AI
Lästid: ca 10 min
Vad du lär dig
Det här är kärnan i processen. Vi kommer att använda två olika AI-modeller. Först KB-Whisper för att utföra själva tal-till-text-omvandlingen på våra ljudfiler. Därefter använder vi en textkorrigeringsmodell för att automatiskt lägga till interpunktion (punkt, komma) och korrekta versaler, vilket gör texten mycket mer läsbar.
Grunderna: Tvåstegsraketen
- Transkribering:
KBLab/kb-whisper-largelyssnar på ljudet och skriver ner orden den hör. Resultatet är en rå, o-punkterad text med tidsstämplar. - Punktuering:
sdadas/byt5-text-correctionläser den råa texten och använder sin förståelse för grammatik och meningsstruktur för att lägga till punkter, kommatecken och stora bokstäver.
Så här gör vi: Skripten som gör jobbet
Steg 1: Transkribera segmenten (transcribe.py)
Skapa filen transcribe.py i din projektmapp och klistra in koden nedan. Koden laddar KB-Whisper-modellen till ditt grafikkortsminne (om du har ett) och matar den sedan med en ljudfil i taget.
import os, warnings
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
import torch
warnings.filterwarnings("ignore", message=".*deprecated.*")
# --- Inställningar ---
MODEL = "KBLab/kb-whisper-large"
DEVICE = "cuda:0" if torch.cuda.is_available() else "cpu"
DTYPE = torch.float16 if torch.cuda.is_available() else torch.float32
DIR = "chunks"
OUTFILE = "transcript_with_timestamps.txt"
CHUNK_DURATION_S = 30
# Ladda modellen och processorn
print(f"Laddar modell {MODEL} till {DEVICE}...")
model = AutoModelForSpeechSeq2Seq.from_pretrained(MODEL, torch_dtype=DTYPE, use_safetensors=True).to(DEVICE)
processor = AutoProcessor.from_pretrained(MODEL)
asr_pipeline = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
device=DEVICE,
torch_dtype=DTYPE
)
# Hjälpfunktion för att formatera tid
def format_time(seconds):
h, r = divmod(seconds, 3600)
m, s = divmod(r, 60)
return f"{int(h):02d}:{int(m):02d}:{int(s):02d}"
# Hämta och sortera ljudfilerna
files = sorted([f for f in os.listdir(DIR) if f.endswith(".wav")])
# Öppna en fil att skriva resultatet till
with open(OUTFILE, "w", encoding="utf-8") as out:
for filename in files:
chunk_index = int(filename.split("_")[1].split(".")[0])
start_time = chunk_index * CHUNK_DURATION_S
end_time = start_time + CHUNK_DURATION_S
filepath = os.path.join(DIR, filename)
print(f"Transkriberar {filename}...")
result = asr_pipeline(filepath, generate_kwargs={"language": "sv"})
text = result["text"].strip()
out.write(f"[{format_time(start_time)} - {format_time(end_time)}]\n{text}\n\n")
print(f"Transkribering klar! Resultat sparat i: {OUTFILE}")
Steg 2: Lägg till punktering och versaler (punctuate.py)
Skapa filen punctuate.py. Det här skriptet läser den råa textfilen, skickar textblocken till korrigeringsmodellen och skriver sedan en ny, renare textfil.
import re
from transformers import pipeline
# --- Inställningar ---
INPUT_FILE = "transcript_with_timestamps.txt"
OUTPUT_FILE = "transcript_punctuated.txt"
MODEL = "sdadas/byt5-text-correction"
BATCH_SIZE = 8 # Bearbeta 8 textblock åt gången för effektivitet
# Funktion för att säkerställa stor bokstav efter punkt.
def capitalize_sentences(text):
parts = re.split(r'([.?!]\s*)', text)
return "".join(p.capitalize() for p in parts)
print(f"Laddar punktueringsmodell {MODEL}...")
punctuation_pipeline = pipeline(
"text2text-generation",
model=MODEL,
tokenizer=MODEL,
device=0, # Använd första GPU:n
batch_size=BATCH_SIZE
)
# Läs in den råa texten
with open(INPUT_FILE, 'r', encoding='utf-8') as f:
lines = f.read().splitlines()
# Separera tidsstämplar från text som ska bearbetas
timestamps, texts_to_process = [], []
for line in lines:
if line.startswith("[") or not line.strip():
timestamps.append(line)
else:
timestamps.append(None) # Markör för text
texts_to_process.append(line)
print(f"Korrigerar {len(texts_to_process)} textsegment...")
corrected_texts = punctuation_pipeline(texts_to_process)
# Sätt ihop den slutgiltiga texten
output_lines = []
text_index = 0
for ts in timestamps:
if ts is not None:
output_lines.append(ts)
else:
# Hämta korrigerad text och applicera versalisering
corrected_text = corrected_texts[text_index]['generated_text'].strip()
final_text = capitalize_sentences(corrected_text)
output_lines.append(final_text)
text_index += 1
with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
f.write("\n".join(output_lines))
print(f"Punktuering klar! Resultat sparat i: {OUTPUT_FILE}")
Så här kör du skripten
Se till att din virtuella miljö är aktiv (source .venv/bin/activate). Kör sedan skripten i ordning:
Kör transkriberingen:
python transcribe.pyDet här kan ta en stund beroende på din dators kraft och längden på ljudfilen.
Kör punktueringen:
python punctuate.pyDet här går oftast mycket snabbare.
Du har nu en fil som heter transcript_punctuated.txt med en ren och tidsstämplad utskrift.
Nästa steg
Texten är klar! Men att ha den i en .txt-fil är inte alltid det mest användbara formatet. I det sista momentet lär vi oss att konvertera vår text till snygga dokument i format som Markdown, Word (.docx) och HTML.

