--- language: - kk - ru pipeline_tag: automatic-speech-recognition tags: - asr - stt - kazakh - russian - nemo - fastconformer - rnnt - tdt - speech-recognition license: cc-by-nc-4.0 library_name: nemo private: true --- # KK/RU ASR TDT Accuracy Accuracy-focused Kazakh and Russian ASR/STT model packaged as a NeMo `.nemo` checkpoint. This model is intended for high-quality offline or server-side transcription where accuracy is prioritized over minimum latency. ## Files - `kk_ru_asr_tdt_accuracy.nemo` - NeMo ASR checkpoint. - `examples/offline_asr.py` - batch/file transcription example. - `examples/serve_fastapi.py` - minimal HTTP service example. - `metadata/eval.json` - evaluation summary. ## Model Characteristics - Task: automatic speech recognition / speech-to-text. - Languages: Kazakh (`kk`) and Russian (`ru`). - Format: NVIDIA NeMo `.nemo`. - Decoder: RNNT/TDT. - Recommended decoding for best accuracy: RNNT beam search with beam size 4. - Fast decoding option: RNNT greedy or beam size 2. - Input audio: mono 16 kHz PCM WAV or another format supported by your NeMo audio stack. This is not a TTS model, not a diarization model, and not a cache-aware streaming checkpoint. ## Evaluation WER/CER on held-out local evaluation sets: | Decode | Set | Overall WER | Overall CER | KK WER | RU WER | RTF | |---|---:|---:|---:|---:|---:|---:| | Greedy | clean | 3.321% | 0.680% | 2.351% | 5.719% | 0.0019 | | Greedy | original/noisy | 10.549% | 6.481% | 13.221% | 5.719% | 0.0020 | | Beam 2 | clean | 3.257% | 0.656% | 2.308% | 5.602% | 0.0047 | | Beam 2 | original/noisy | 10.468% | 6.454% | 13.156% | 5.607% | 0.0048 | | Beam 4 | clean | 3.197% | 0.644% | 2.229% | 5.588% | 0.0121 | | Beam 4 | original/noisy | 10.430% | 6.443% | 13.107% | 5.588% | 0.0121 | Recommended deployment default: - Use `beam_size=4` when accuracy is the priority. - Use `beam_size=2` when latency/cost matters. - Use greedy only for maximum throughput. ## Install Use an environment with NVIDIA NeMo ASR support and CUDA-enabled PyTorch. ```bash pip install "nemo_toolkit[asr]" huggingface_hub soundfile fastapi uvicorn python-multipart ``` ## Download ```python from huggingface_hub import hf_hub_download model_path = hf_hub_download( repo_id="nur-dev/kk-ru-asr-tdt-accuracy", filename="kk_ru_asr_tdt_accuracy.nemo", token=True, ) print(model_path) ``` ## Offline Inference ```bash python examples/offline_asr.py \ --model kk_ru_asr_tdt_accuracy.nemo \ --audio /path/to/audio.wav \ --strategy beam \ --beam-size 4 ``` Python: ```python from nemo.collections.asr.models import EncDecHybridRNNTCTCBPEModel from omegaconf import OmegaConf model = EncDecHybridRNNTCTCBPEModel.restore_from("kk_ru_asr_tdt_accuracy.nemo") model.freeze() decoding_cfg = OmegaConf.create(OmegaConf.to_container(model.cfg.decoding, resolve=True)) decoding_cfg.strategy = "beam" decoding_cfg.beam.beam_size = 4 decoding_cfg.beam.return_best_hypothesis = True model.change_decoding_strategy(decoding_cfg=decoding_cfg, decoder_type="rnnt") text = model.transcribe(["/path/to/audio.wav"], batch_size=1, return_hypotheses=False)[0] print(text) ``` ## Serve With FastAPI ```bash MODEL_PATH=kk_ru_asr_tdt_accuracy.nemo \ ASR_STRATEGY=beam \ ASR_BEAM_SIZE=4 \ uvicorn examples.serve_fastapi:app --host 0.0.0.0 --port 8000 ``` Request: ```bash curl -X POST "http://localhost:8000/transcribe" \ -F "file=@/path/to/audio.wav" ``` Response: ```json {"text": "..."} ``` ## Best Practices - Resample incoming audio to mono 16 kHz before inference. - Use beam size 4 for final transcription. - Use beam size 2 or greedy for interactive previews. - Batch multiple files for throughput-oriented jobs. - Do not use this checkpoint as a diarizer; combine it with a separate diarization model for speaker labels. - For audio with many speakers or heavy overlap, use diarization and segment-level transcription before merging the final transcript. ## Evaluation (independently measured) Held-out public test sets, measured directly — **not** self-reported (seed 42, uniform multilingual-Whisper normalization). FLEURS test = 500 utterances/language; ISSAI KSC2 test = 1000 utterances (in-domain Kazakh, spanning crowd/parliament/podcasts/radio/talkshow). | Test set | Lang | WER (%) | CER (%) | |---|:--|--:|--:| | FLEURS `kk_kz` | kk | 11.48 | 6.04 | | FLEURS `ru_ru` | ru | 12.75 | 6.99 | | FLEURS `en_us` | en | 100.47 | 90.47 | | ISSAI KSC2 | kk | 9.75 | 3.50 | Macro WER (kk/ru/en): **41.57%** (unweighted mean; penalises models that do not cover all three languages). > **Note.** The card reports author clean-set KK 2.35 / RU 5.72. On held-out data: FLEURS kk 11.48 and KSC2 9.75 — still the best Kazakh in this account and robust across broadcast domains. It has no English: English audio is transcribed as Cyrillic phonetics, so EN WER exceeds 100%. ## License & commercial use **Non-commercial use only** (CC BY-NC 4.0). For commercial licensing or other inquiries, please reach out to the author, **Nurgali Kadyrbek**, on LinkedIn: https://www.linkedin.com/in/nurgali-kadyrbek-504260231/