Use this Skill to process oral history recordings: Whisper transcription with timestamps, pyannote speaker diarization, OHMS metadata XML, and speaker anonymization.
Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.
Quelldateien prüfen
Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Ein direkter Befehl überspringt den Prüf-Prompt. Prüfen Sie die Quelle, bevor Sie ihn ausführen.
Use this Skill to process oral history recordings: Whisper transcription with timestamps, pyannote speaker diarization, OHMS metadata XML, and speaker anonymization.
Oral History Processing: Transcription, Diarization, and OHMS Export
TL;DR — Transcribe oral history recordings with OpenAI Whisper (word-level timestamps),
assign speakers via pyannote.audio 3.x diarization, export OHMS-compatible XML cuepoints,
and anonymize PII before archival deposit.
When to Use
Use this Skill when you need to:
Transcribe long-form oral history interviews (30 min – 4+ hours) with accurate timestamps
Identify who is speaking at each moment in multi-speaker recordings
Generate OHMS (Oral History Metadata Synchronizer) XML for AV archives
Anonymize interviewee names and contact details before sharing transcripts
Export transcripts as Markdown, SRT subtitles, or WebVTT for online publication
Do not use this Skill for:
Real-time live captioning (use specialized streaming ASR services)
Music or non-speech audio classification (use librosa or Essentia)
Large-scale production pipelines requiring GPU clusters (use WhisperX on SLURM)
Background
OpenAI Whisper is a transformer-based ASR model available in five sizes (tiny → large-v3).
The word_timestamps=True option produces per-word start/end times via dynamic time
warping alignment against the hidden states.
pyannote.audio 3.x provides an end-to-end speaker diarization pipeline (segmentation +
embedding clustering). It requires a HuggingFace token and acceptance of the model's
terms of use.
Combining Whisper and pyannote requires timestamp alignment: for each Whisper word
(start, end), find which diarization segment (speaker, seg_start, seg_end) the word
falls inside, and assign that speaker label.
OHMS (Oral History Metadata Synchronizer) is an open-source tool used by oral history
archives. Its XML schema stores interview metadata, keyword index, and time-coded cuepoints
that synchronize a transcript with an AV file.
Component
Purpose
Whisper large-v3
Best accuracy for accented speech and historical vocabulary
Step 1 — Whisper Transcription with Word Timestamps
import whisper
import numpy as np
from pathlib import Path
deftranscribe_with_whisper(
audio_path: str,
model_size: str = "large-v3",
language: str = None,
initial_prompt: str = None,
) -> dict:
"""
Transcribe an audio file with Whisper, returning word-level timestamps.
Model sizes and VRAM requirements:
tiny (~39M params, ~1 GB VRAM, fastest, lowest accuracy)
base (~74M params, ~1 GB VRAM)
small (~244M params, ~2 GB VRAM)
medium (~769M params, ~5 GB VRAM)
large-v3 (~1.55B params, ~10 GB VRAM, best accuracy)
Args:
audio_path: Absolute path to the audio file (MP3, WAV, M4A, FLAC).
model_size: Whisper model to use (see above).
language: ISO 639-1 language code, e.g. "en", "de".
None = auto-detect.
initial_prompt: Optional context string to improve accuracy on domain vocabulary
(e.g. names, technical terms) — max ~224 tokens.
Returns:
Dict with keys: text (full transcript), segments (list of segment dicts),
words (flat list of word dicts with start/end/probability),
language (detected language code).
"""
model = whisper.load_model(model_size)
transcribe_kwargs = {
"word_timestamps": True,
"verbose": False,
}
if language:
transcribe_kwargs["language"] = language
if initial_prompt:
transcribe_kwargs["initial_prompt"] = initial_prompt
result = model.transcribe(audio_path, **transcribe_kwargs)
# Flatten word-level data from segments
words = []
for seg in result["segments"]:
for word_data in seg.get("words", []):
words.append({
"word": word_data["word"].strip(),
"start": round(float(word_data["start"]), 3),
"end": round(float(word_data["end"]), 3),
"probability": round(float(word_data["probability"]), 4),
})
return {
"text": result["text"],
"segments": result["segments"],
"words": words,
"language": result.get("language", "unknown"),
"audio_path": audio_path,
}