Speech recognition model of the ufakzeka family

ufakzeka-kulak

It writes Turkish speech out as text, with capital letters and punctuation, and writes numbers out in words. It was trained from scratch on 4,977 hours of speech whose licences allow commercial use, and it runs offline on a CPU.

  • 31,564,935parameters
  • 0.0921word error rate, FLEURS Turkish test
  • 0.0916word error rate, Common Voice 27.0 Turkish test
  • Apache-2.0licence
What it does2outputs on one encoder

Speech in, text out

The model reads 80 log-mel features from mono audio at 16,000 Hz and writes out one utterance at a time. Its encoder is a FastConformer of 16 layers and hidden size 256, and it feeds two outputs, the default token-and-duration transducer (TDT) decoder and a CTC head. The vocabulary is a SentencePiece BPE of 1,024 pieces.

Capitals and punctuation

The model writes capital and lower-case letters. For punctuation it writes only the full stop, the comma, the question mark, the apostrophe and the hyphen inside words.

Numbers as words

The model writes “iki bin yirmi ikide”, not “2022’de”. An application that needs digits has to convert them itself. Circumflex letters are written without the circumflex.

One utterance at a time

The model is not a streaming model. Long recordings have to be cut into utterances with voice activity detection first, as the demo does. Keep a few hundred milliseconds of audio around each utterance; a segment cut tight to the speech can come out without capitals or punctuation.

Files5runtimes, in one repository on Hugging Face

Runtimes

RuntimeVersionPath in the repoPrecision
NeMo3.0.0ufakzeka-kulak.nemofloat32
transformers5.20.1transformers-tdt/, transformers-ctc/float32
sherpa-onnx1.13.8sherpa-onnx-tdt/, sherpa-onnx-ctc/float32, int8
parakeet.cpp (GGUF)v0.6.1gguf/f32, q8_0
parakeet-mlx (MLX)0.5.3mlx/float32 weights, run at bfloat16

The NeMo file is the reference. Every other file was compared with NeMo on the Common Voice and FLEURS development sets, and only files whose normalised WER stayed within 0.0050 of NeMo's on both sets, with no failed utterance, are released. The sherpa-onnx files are used with the samples multiplied by 8, and the CTC file with zeros appended to the audio. The MLX folder ships its own feature function, since parakeet-mlx computes its features differently from NeMo. The model card has the details and the examples for the other runtimes.

python
from nemo.collections.asr.models import ASRModel

model = ASRModel.from_pretrained("ufakai/ufakzeka-kulak")
print(model.transcribe(["speech.wav"])[0].text)

model.change_decoding_strategy(decoder_type="ctc")  # the CTC head
print(model.transcribe(["speech.wav"])[0].text)
Release gatepassedtest sets scored once

Test results

The training recipe, the checkpoint and the released files were chosen on development sets, and the test sets were scored once, for one model. The model was to ship only if it beat Whisper base on both FLEURS Turkish test and Common Voice 27.0 Turkish test, each by a paired interval lying wholly below zero. It passed on both.

SetUtterancesHoursufakzeka-kulak WERWhisper base WERDifference to Whisper baseDifference to Whisper small
FLEURS Turkish test7432.60.0921 [0.0792, 0.1055]0.2461 [0.2303, 0.2628]-0.1541 [-0.1653, -0.1430]-0.0421 [-0.0506, -0.0340]
Common Voice 27.0 Turkish test11,87414.50.0916 [0.0873, 0.0958]0.3287 [0.3190, 0.3380]-0.2372 [-0.2440, -0.2302]-0.0885 [-0.0930, -0.0843]
Real-TurnTurk, conversational, not gating1,5321.70.3807 [0.3270, 0.4640]0.7242 -0.3435 [-0.4258, -0.3080]-0.1367

Values in square brackets are 95 percent intervals from a blockwise bootstrap; the interval of a difference between two models is paired. A difference is ufakzeka-kulak's WER minus the Whisper model's, so a negative value means fewer errors. Decoding is greedy, with the TDT decoder. Whisper base and Whisper small (MIT; their maker does not fully disclose their training data) were scored by us with the same Turkish normaliser, on each set with the better of greedy decoding and the Whisper package's decoding settings (beam search of 5 with temperature fallback). Whisper large-v3 (greedy) scores 0.0604 on FLEURS test and 0.0767 on Common Voice test, lower than ufakzeka-kulak; its difference was not tested. Real-TurnTurk has only 6 speakers, so its interval is wide.

The released int8 sherpa-onnx TDT file reaches a WER of 0.0921 on FLEURS test (difference to NeMo 0.0000) and 0.0932 on Common Voice test (+0.0016); the int8 CTC file reaches 0.1128 (+0.0207) and 0.1200 (+0.0284).

Data4,977hours of speech

Training data

The licence of every training source allows commercial use. The sources are Mozilla Common Voice, antalia-voice-corpus and ISSAI's Turkish Speech Corpus, and 4,696 of the 4,977 hours are YouTube audio collected by ESPnet's YODAS and YODAS v3, whose authors say they took only videos published under a Creative Commons licence; they release the audio under CC BY 3.0. On YouTube the one Creative Commons licence an uploader can choose is the Creative Commons Attribution licence (CC BY). The YODAS v3 audio was cut along the spans of Alania Turkish Speech Style Captions (CC BY 4.0). Automatic captions were not used as training text. The training text of each YODAS utterance is the uploader's subtitle where it agrees with the Whisper large-v3-turbo transcript; otherwise it is the Whisper large-v3-turbo transcript, checked by Omnilingual ASR CTC 7B v2. Whisper large-v3-turbo is under MIT and Omnilingual ASR CTC 7B v2 under Apache-2.0; their makers do not fully disclose their training data. 432 training utterances that matched the evaluation sets by text or audio were removed, and the 2 MediaSpeech clips that matched training audio were left out of its evaluation. The full list of sources and their attribution is in the ATTRIBUTION.md file of the model repository.

Limitations7also in the card

Where it is weak

  • It is trained for Turkish only; other languages, and Turkish mixed with them, were not measured.
  • Its word error rate was not measured by speaker gender, age or regional accent.
  • It is weak on conversational speech. On Real-TurnTurk, conversations of 6 speakers, its WER is 0.3807.
  • It does not tell speakers apart and gives no word timestamps that were checked.
  • For 4,327 of the 4,696 hours of YODAS recordings, no uploader subtitle agreed with the transcript, so one speech recognition model wrote the training text and a second checked it; errors on which the two agreed remain in the training text.
  • The input gain used with the sherpa-onnx files is a workaround that holds at normal recording levels; on the FLEURS copy made 30 dB quieter the error rate rises more than with the NeMo file.
  • The MLX files were checked on mlx’s CPU backend under Linux only, not on Apple silicon.