moss-transcribe/
dev_runs/
afm_advanced_audio_audit/
afm_audio_audit/
batch_50_eval/
batch_50b_eval/
batch_50b_eval_w1/
gemini35_komparatistik_10/
profile_40658/
profile_41109/
batch_50b_eval_w1.log
batch_50b_eval_w2.log
batch_50b_eval_w3.log
inqua_126_gesamtaudit_report.pdf
inqua_126_gesamtaudit_report.typ
inqua_126_gesamtaudit_summary.json
local_model_test.json
docs/
moss_orchestrator_guide.pdf
moss_orchestrator_guide.typ
kontor/
domains/
learning_history.jsonl
lexikon.json
linguistic.md
speaker_registry.json
styles.yaml
vocabulary.json
models/
MOSS-Transcribe-Diarize/
samples/
event_2025_10_21b_90s.json
event_2025_10_21b_90s.orchestrator.json
event_2025_10_21b_90s.orchestrator.md
event_2025_10_21b_90s.orchestrator.srt
event_2025_10_21b_90s.orchestrator.vtt
event_2025_10_21b_90s.orchestrator.xml
event_2025_10_21b_90s.wav
event_2025_10_21b_90s_orchestrator.json
event_2025_10_21b_90s_orchestrator.md
event_2025_10_21b_90s_orchestrator.srt
event_2025_10_21b_90s_orchestrator.vtt
event_2025_10_21b_90s_orchestrator.xml
event_2025_10_21b_90s_stream.json
event_2025_10_21b_90s_studio.json
event_2025_10_21b_full.json
agent.py
audit_gate.py
audit_register.json
audit_register.jsonl
batch_eval_50.py
batch_merge.py
corpus_miner.py
domain_manager.py
generate_126_report.py
learning_loop.py
learning_plan.md
orchestrator.py
partitur.yaml
PROJECT.yaml
Speaker-diarised transcription and editorial smoothing of audio recordings using the 0.9B MOSS-Transcribe-Diarize model on Apple Silicon Metal (mlx_audio). The system runs a 4-stage AI-orchestrator Partitur: (A) transcription + diarisation, (B) speaker mapping from Kontor bundles, (C) text correction and style transformation, (D) continuous learning loop via Gemini diff extraction. The breakthrough development (August 2026) is a fully operational learning loop with domain-specific Kontor bundles, an audit gate, and a Gemini comparison runner — making it the most sophisticated local-model transcription pipeline in the platform.
Success criteria:| Code | /Users/friedrichstr/ai-mac-studio/development/moss-transcribe |
| Docs | /Users/friedrichstr/ai-mac-studio/development/moss-transcribe/docs |
| Pilot runs | /Users/friedrichstr/ai-mac-studio/development/moss-transcribe/dev_runs |
| Check | Path | Status | Detail |
|---|---|---|---|
| code | /Users/friedrichstr/ai-mac-studio/development/moss-transcrib | ✓ ok | 30 items, last_modified=2026-08-24 |
| docs | /Users/friedrichstr/ai-mac-studio/development/moss-transcrib | ✓ ok | 2 items, last_modified=2026-08-23 |
| pilot_runs | /Users/friedrichstr/ai-mac-studio/development/moss-transcrib | ✓ ok | 22 items, last_modified=2026-08-23 |
Sprecherdiarisierte Transkription und redaktionelle Glättung mit dem 0,9B-Modell MOSS-Transcribe-Diarize
von OpenMOSS-Team (GitHub: OpenMOSS/MOSS-Transcribe-Diarize),
ausgeführt über die mlx_audio-Bibliothek auf Apple Silicon Metal via Nativ.app.
partitur.yaml) ┌─────────────────────────────────────────────────────────────┐
│ (A) Stage A: Transkription & Diarisierung (MOSS 0.9B MLX) │
│ • Metal GPU Beschleunigung │
│ • 4-Bit/8-Bit Quantisierung & 8192 Prefill-Step │
│ • Exakte Zeitstempel & Sprechermarken ([S01], [S02]) │
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ (B) Stage B: Kontext-Injektion & Sprecher-Mapping │
│ • Auflösung S01/S02 -> "Josias Strelow", "Gerd Graßhoff"│
│ • Automatische Rollen-Invariante (1. vs. 2. Person) │
│ • Kontor-Registry / Explicit CLI Flags / Heuristiken │
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ (C) Stage C: Textkorrektor & Stil-Transformation │
│ • Bereinigung von Versprechern, Füllwörtern & Stottern │
│ • Gesteuert via linguistic.md & vocabulary.json │
│ • Zielformat-Schema: Gemini 3.7 Flash XML, JSON, MD, SRT│
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ (D) Stage D: Continuous Learning Loop (Gemini Diff Extractor│
│ • Automatisches Lernen aus Gemini-Vergleichsläufen │
│ • Synchronisation in lexikon.json, vocabulary & rules │
│ • Kontinuierlicher Qualitätsgewinn ohne Feintraining │
└─────────────────────────────────────────────────────────────┘
moss-transcribe/
partitur.yaml Formale AI-Orchestrator Partitur-Spezifikation (4 Stufen)
orchestrator.py Hauptengine: Stage A + Stage B + Stage C
run_orchestrator.sh Produktions-Launcher für den Orchestrator
audit_gate.py Lokales Qwen3.8 Audit-Gate für Rollen- & Fakten-Invariante
learning_loop.py Automatische Lernschleife aus Gemini-Komparationsläufen
run_learning_loop.sh Launcher für die kontinuierliche Lernschleife
batch_eval_50.py Großevaluations- & Batch-Runner für 50+ Profile
transcribe.py Basis-Wrapper für MOSS über Nativ mlx_audio
run.sh Basis-Launcher für reine Transkription
kontor/
lexikon.json Strukturiertes Weltwissen- & Domänenlexikon
vocabulary.json Fachbegriffe & phonetische Autokorrekturen (Prompt-Bias)
linguistic.md Linguistische Satzbau-Direktiven & Few-Shot Regeln
speaker_registry.json Sprecher-Register und Rollenzuweisungen
styles.yaml Stilprofile (gemini_polished, verbatim_timestamps, etc.)
learning_history.jsonl Fortlaufend wachsende Lernhistorie
docs/
moss_orchestrator_guide.typ Typst-Handbuch im lettreai Theme
moss_orchestrator_guide.pdf Kompilierte PDF-Dokumentation
samples/ Referenztranskripte und Test-Audiodateien
README.md Dokumentation & Benchmarks
# Produktionslauf mit 4-Bit-Quantisierung, Sprecher-Mapping und Gemini 3.7 Flash XML Ausgabe
./moss-transcribe/run_orchestrator.sh <audio.m4a> \
--speakers S01="Klient (K)" S02="Interviewer (I)" \
-s gemini_polished \
-f all \
-q 4
# Batch-Lernlauf über alle vorhandenen Komparationsprofile
./moss-transcribe/run_learning_loop.sh --batch-dir dev_runs/batch_50_eval/profiles
# Einzel-Paar Lernen (MOSS XML vs. Gemini XML)
./moss-transcribe/run_learning_loop.sh --moss audio_moss.xml --gemini audio_gemini.xml
python3 moss-transcribe/audit_gate.py audio_moss.xml --profile-id <ID>
./moss-transcribe/run_orchestrator.sh
./moss-transcribe/run_orchestrator.sh
### 2. Parameterübersicht Orchestrator
| Parameter | Werte | Beschreibung |
|:--|:--|:--|
| `-s, --style` | `gemini_polished`, `verbatim_timestamps`, `meeting_memo`, `broadcast_subtitles` | Stilprofil für die Textkorrektur |
| `-q, --quantize` | `4`, `8` (oder `--fp16`) | On-the-fly Quantisierung des LLM-Decoders |
| `--prefill-step-size` | `8192`, `4096`, `16384` | Prefill-Blockgröße für Metal-GPU |
| `--speakers` | `S01="Name1" S02="Name2"` | Explizite Zuordnung der Sprecher-Labels |
| `-f, --format` | `xml`, `json`, `md`, `srt`, `vtt`, `all` | Ausgabeformat (XML = Gemini 3.7 Flash Schema) |
| `--no-xml-timestamps` | Flag | Deaktiviert Zeitstempel-Attribute im XML |
| `--registry` | Pfad | Eigene `speaker_registry.json` einbinden |
| `--vocabulary` | Pfad | Eigene `vocabulary.json` mit Terminologie nutzen |
## Funktionsweise
- **Modellladung:** `mlx_audio.stt.utils.load_model` lädt das HF-Repo
`OpenMOSS-Team/MOSS-Transcribe-Diarize` (FP16, 1,83 GB). Die Modellklasse
`moss_transcribe_diarize` ist in Nativs `mlx_audio` (v0.5.0) enthalten; ihre
`sanitize()`-Methode konvertiert die HF-Gewichte (Conv-Transpose,
`vq_adwaptor`→`vq_adaptor`) in das MLX-Layout.
- **Ein-Durchgang-Transkription:** MOSS verarbeitet die gesamte Audiodatei in
einem Prompt (Audio-Tokens bei 12,5 Token/s Audio) und generiert danach in
einem Durchgang den Transkripttext mit eingebetteten Zeitstempeln und
Sprechermarken: `[start][Sxx] text [end]`.
- **Streaming:** `stream=True` liefert jeden Token einzeln, so dass der
Fortschritt sichtbar wird (prefill der Audio-Tokens kann bei langen Dateien
über eine Minute dauern).
## Voraussetzungen
- **Nativ.app** installiert (`/Applications/Nativ.app`) — liefert `mlx`,
`mlx_audio`, `transformers` und den Python3-Interpreter.
- `ffmpeg` (für Audio-Konvertierung, falls nötig).
- Speicher: ~2,5 GB für kurze Dateien; ~10 GB Spitze für 45-Min-Audio (KV-Cache
skaliert mit Audiolänge). Auf 16-GB-Macs für Dateien bis ~90 Min ausreichend.
## Verwendung
```bash
# Kurze Datei
./moss-transcribe/run.sh <audio.m4a> -o <ausgabebasis> -f json
# Maximale Geschwindigkeit mit 4-Bit-Quantisierung & optimiertem Prefill (8192)
./moss-transcribe/run.sh <audio.m4a> -q 4 --prefill-step-size 8192 -f json
# 8-Bit-Quantisierung für optimale Balance aus Qualität und Speicherbandbreite
./moss-transcribe/run.sh <audio.m4a> -q 8 -f json
# Volle Kontrolle über den Nativ-Python3
NATIV_PYTHON=/Applications/Nativ.app/.../python3 \
./moss-transcribe/transcribe.py <audio> --max-tokens 24000 -q 4 -f srt
# Hotwords zur Biasierung seltener Begriffe
./moss-transcribe/run.sh <audio> --hotwords "Kontor" "Valentino Faldon" "Redis"
Ausgabeformate: json (mit speaker_id pro Segment), srt, vtt, txt.
Ohne -o heißt die Ausgabe <audio_stem>.moss.<format>.
Getestet auf event_2025_10_21b.m4a (45:40 Min, 2 Sprecher) aus
agents/communication/ai-reporter/example/ — dort liegt eine Referenztranskription
von gemini-3-flash-preview.
| Kennzahl | MOSS (Mac mini 16 GB) | MOSS (Mac Studio M1 Ultra 128 GB) | Gemini-3-flash (Referenz) |
|---|---|---|---|
| Modellgröße | 0,9B, lokal, FP16 | 0,9B, lokal, FP16 | cloud-API |
| Durchlauf | ein Durchgang, keine Stückelung | ein Durchgang, keine Stückelung | 3 Chunks |
| Segmente | 527 | 519 | ~50 Sprecher-Blöcke |
| Sprecher | 2 (S01, S02) | 2 (S01, S02) | 2 (speaker1, speaker2) |
| Text | 47.427 Zeichen | 47.225 Zeichen | ~33.000 Zeichen |
| Zeitstempel | pro Segment (Start/Ende) | pro Segment (Start/Ende) | pro Sprecherblock |
| Zeitstempel-Abdeckung | bis 2.736 s (volles Audio) | bis 2.736 s (volles Audio) | bis ~2.740 s |
| Prefill-Zeit | 103,8 s | 43,1 s (2,4× schneller) | n/a |
| Generierungszeit | 1.739,7 s (29,0 Min) | 768,0 s (12,8 Min, 2,3× schneller) | API-Seitenlauf |
| Gesamtlaufzeit | 30,7 Min | 13,5 Min (2,3× Gesamtspeedup) | n/a |
| Token-Rate | 11,5 Tok/s (Durchschnitt) | 25,8 Tok/s (bis zu 41,5 Tok/s Peak) | n/a |
S01 ↔ speaker1, S02 ↔ speaker2 — konsistent über die gesamte Datei.
Gemini:
speaker1: Wir sind alle seit einigen Tagen krank. Das erschwert die Arbeit erheblich.
speaker2: Mich hatte es letzte Woche erwischt. Ich bin hoffentlich über den Berg.
speaker1: Das ist gut. Mich hat letzte Woche in der Schule erneut eine Corona-Variante erwischt.
MOSS (mit Zeitstempeln):
[38.0-42.7] S01: Ja, ja, bin jetzt, bin jetzt seit, wir alle sind jetzt ein paar Tagen krank.
[43.7-46.4] S01: Es erschwert die Arbeit ganz schön, aber.
[46.5-54.0] S02: Ja, da hatte mich das ja letzte Woche erwischt. Jetzt bin ich hoffentlich über dem Berg.
[55.2-63.4] S01: Ja, das ist gut. Ja, ich hatte, ich habe dann letzte Woche in der Schule noch mal erwischt ...
Beide Modelle treffen dieselben inhaltlichen Aussagen; MOSS liefert zusätzliche wortnahe Zeitstempel und feinere Segmentgrenzen, hat aber gelegentlich kleine ASR-Fehler (z.B. „Achtung zu halten" statt „Abstand zu halten").
Prefill: 43,1 s (34.250 Audio-Tokens, ~795 Tok/s)
Generierung: 768,0 s (19.846 Tokens, 25,8 Tok/s)
Gesamtlaufzeit: 13,5 Min (811,1 s)
Spitzenspeicher: ~10 GB (problemlos im 128-GB-Pool)
Prefill: 103,8 s (34.250 Audio-Tokens, ~330 Tok/s)
Generierung: 1.739,7 s (20.018 Tokens, 11,5 Tok/s)
Gesamtlaufzeit: 30,7 Min (1.843,5 s)
Spitzenspeicher: ~10 GB (nahe an Speichergrenze bei 16 GB)
Die Generierungsrate sinkt leicht mit wachsendem KV-Cache (16 → 11,5 Tok/s),
bleibt aber stabil. Das Modell beendet die Generierung per EOS-Token, sobald
das gesamte Audio transkribiert ist — max_tokens ist nur eine obere Schranke
(8.192 reichen für ~20 Min, 24.000 für die volle 45-Min-Datei).
vanch007/mlx-MOSS-Transcribe-Diarize-4bit)
ausweichen oder die Datei stückeln.S01, S02, … — die Zuordnung zu
echten Namen muss wie bei Gemini über ein Sprecher-Register
(ai-reporter-Kontor) erfolgen.--language-Parameter ist
nur Metadaten, keine Steuerung.