Downloads · 30 days
9
15% of all-time downloads
Vatho/koelsch-wav2vec2-ipa
koelsch-wav2vec2-ipa is a automatic speech recognition model from Vatho. Use it when you need speech turned into text. It is set up for transformers. The card lists the license as cc-by-nc-sa-4.0.
IPA phoneme recognition for Kölsch (Ripuarian German, Cologne). Fine-tuned from facebook/wav2vec2-xls-r-300m with a CTC head over a 48-symbol IPA inventory.
Downloads · 30 days
9
15% of all-time downloads
All-time downloads
60
Public
Parameters
315M
1.3 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors1.3 GB · 100%
From the Hugging Face model README
IPA phoneme recognition for Kölsch (Ripuarian German, Cologne). Fine-tuned from facebook/wav2vec2-xls-r-300m with a CTC head over a 48-symbol IPA inventory.
This is also the forced-alignment model. Its frame-level CTC posteriors drive torchaudio.functional.forced_align to produce Praat TextGrids with word and phone tiers — see notebook 9 in the repository.
Trained during the CIF Tandem Fellowship at IfL-Phonetik, University of Cologne, on Alles Kölsch (Bhatt & Lindlar 1998) — 4,670 utterances, 4.5 hours of spontaneous Cologne dialect speech from 105 speakers aged 10–88 across 49 neighbourhoods.
Kölsch is Ripuarian German. It has no public speech dataset and no standardised
spelling: 94.1 % of Kölsch word tokens are out of vocabulary against the
152,766-word german_mfa dictionary. It is not German text.
import torch, librosa
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
proc = Wav2Vec2Processor.from_pretrained("Vatho/koelsch-wav2vec2-ipa")
model = Wav2Vec2ForCTC.from_pretrained("Vatho/koelsch-wav2vec2-ipa").eval()
wav, _ = librosa.load("clip.wav", sr=16000)
with torch.inference_mode():
ids = model(proc(wav, sampling_rate=16000,
return_tensors="pt").input_values).logits.argmax(-1)
print(proc.batch_decode(ids)[0])
# -> ɪ ç v ə l ə s ɔ χ n ɪ t m iː v ɪ d ɐ d ʊ n
Full pipeline, notebooks and the alignment tooling: https://github.com/chemvatho/Koelsch-Phoneme-Recognition
python tools/try_models.py align clip.wav # TextGrid + plot
| PER | 15.7 % |
| substitutions / deletions / insertions | 1,299 / 941 / 446 |
467 held-out utterances, 17,122 reference phones, recomputed from the stored test predictions. Scored over the full token stream, which also contains a word-separator symbol that is not a phone, the rate is 15.3 % over 21,463 tokens; the phone-only figure is reported here because a phone error rate over non-phones is not one.
For context, an off-the-shelf multilingual Wav2Vec2Phoneme used zero-shot scores about 33 % PER on comparable German-dialect material, so this fine-tune more than halves it — but that is a zero-shot baseline, and the test split here is not speaker-disjoint, so it is not a like-for-like win.
These numbers are optimistic and it is worth knowing why. The test split is not speaker-disjoint — 103 of its 105 speakers also appear in training. So they measure how well the model transcribes voices it has already heard, which is a different and easier question than generalisation. Treat them as an upper bound. A speaker-held-out re-split is on the project roadmap.
09_alignment/ before taking any duration from a TextGrid this produces.The code in the repository is MIT. These weights are released for research use under CC-BY-NC-SA-4.0. The underlying Alles Kölsch corpus is not redistributed here and is not covered by either: it belongs to the Akademie för uns kölsche Sproch, who should be contacted for corpus access.
@misc{chem2026koelsch,
author = {Chem, Vatho and R\"ossig, Simon and Greisbach, Reinhold},
title = {K\"olsch Phoneme Recognition: an open pipeline from a printed
dialect corpus to phoneme recognition and forced alignment},
year = {2026},
note = {CIF Tandem Fellowship, IfL-Phonetik, University of Cologne},
howpublished = {\url{https://github.com/chemvatho/Koelsch-Phoneme-Recognition}}
}