erdem-asr: tiny Turkish CTC speech recognizer (research baseline)

A very small (63,955 parameters) character-level Turkish speech recognizer: a 1D convolution, a bidirectional GRU and a CTC character head over a 40-bin log-mel spectrogram.

This is an experimental research baseline, not a usable transcriber. About half of the characters it outputs are wrong and almost no words come out right. It is published to show how far a from-scratch, microcontroller sized Turkish CTC model gets on public data.

Türkçe özet: Sıfırdan eğitilmiş, çok küçük (yaklaşık 64 bin parametre) bir Türkçe konuşma tanıma modeli. Araştırma amaçlı bir başlangıç modelidir; karakterlerin yaklaşık yarısı hâlâ yanlış.

Files

File What it is
erdem_asr.keras Inference model: input (batch, frames, 40) log-mel features, output (batch, frames/2, 35) softmax
metrics.json Training and validation loss per epoch for this run

Model

  • Input: 16 kHz mono audio → mel spectrogram (n_fft=640, hop_length=320, 40 mels, power 2) → power_to_db(ref=max), shape (frames, 40). Pad with -80.0 (silence), not 0.
  • Architecture: Conv1D(48, kernel 5, stride 2) → bidirectional GRU(64) → Dense(64) → Dense(35, softmax).
  • Output alphabet (indices 0..33): " abcçdefgğhıijklmnoöpqrsştuüvwxyz'"; index 34 is the CTC blank.
  • Decoding: greedy CTC.

Usage

import librosa
import numpy as np
import tensorflow as tf

ALPHABET = " abcçdefgğhıijklmnoöpqrsştuüvwxyz'"
BLANK = len(ALPHABET)

audio, _ = librosa.load("speech.wav", sr=16000, mono=True)
mel = librosa.feature.melspectrogram(y=audio, sr=16000, n_fft=640, hop_length=320, n_mels=40, power=2.0)
features = librosa.power_to_db(mel, ref=np.max).T.astype(np.float32)

model = tf.keras.models.load_model("erdem_asr.keras", compile=False)
ids = model.predict(features[np.newaxis])[0].argmax(-1)

text, previous = [], None
for i in ids:
    if i != previous and i != BLANK:
        text.append(ALPHABET[i])
    previous = i
print("".join(text))

Results

Greedy decoding, 500 clips per test set (run v11, 2026-10-25):

Test set CER Character accuracy WER
Common Voice Turkish scripted (held-out) 45.6% 54.4% 102.0%
ISSAI Turkish Speech Corpus (test) 46.3% 53.7% 101.5%

WER above 100% means the model inserts more wrong words than the reference contains; word-level output is not usable yet.

Training

Continued over several runs, each warm-started from the previous one. The last run (v11) trained 18 epochs on 100,000 clips from Common Voice Turkish and the ISSAI Turkish Speech Corpus; best validation loss 51.66.

Training data

No personal recordings were used to train this model.

License

The model weights are released under the MIT License (see LICENSE).

Part of the training data, the ISSAI Turkish Speech Corpus, is MIT-licensed; its notice is kept in LICENSE as that license requires. If you use the ISSAI data or this model, please also cite:

@Article{info14020074,
  AUTHOR = {Mussakhojayeva, Saida and Dauletbek, Kaisar and Yeshpanov, Rustem and Varol, Huseyin Atakan},
  TITLE = {Multilingual Speech Recognition for Turkic Languages},
  JOURNAL = {Information},
  VOLUME = {14},
  YEAR = {2023},
  NUMBER = {2},
  ARTICLE-NUMBER = {74},
  URL = {https://www.mdpi.com/2078-2489/14/2/74},
  ISSN = {2078-2489}
}
Downloads last month
14
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train inviolus/erdem-asr-tr-baseline