[Omnilingual ASR from Meta AI Labs – First Impressions on Kyrgyz Language]
What is it and why use it?
Speech recognition is a big topic today, especially now, when there are many note-takers and digital assistants for calls. There are surely many other uses, but it's a fact: bots for conference calls now really help project teams.
However, there are several problems that make global adoption difficult. One of the main issues is the high cost if you want to use recognition from giants like OpenAI. All your money will be spent on their APIs. That's why teams are trying to build their own models that can recognize the languages they need.
Another problem is that most note-taking tools can't recognize, for example, Georgian or Kyrgyz out of the box. They work perfectly with English, and almost all note-takers are mainly focused on it.
Training models for language recognition always runs into one problem – there aren't enough labeled datasets. But now things are easier for enthusiasts and researchers, because the team at Meta's Fundamental AI Research (FAIR) released an open model that can recognize 1,600 languages – basically, they covered everything. The team also released not just the model, but a tool you can use to recognize speech from audio files.
Now, we'll see how well these models work on a laptop using the CPU, and we’ll try recognizing speech in Kyrgyz.
What hardware was used for tests?
- Thinkpad P14s Gen4
- 64GB RAM
- AMD Ryzen 7 PRO 7840U
- Arch Linux (6.17.7-arch1-1)
We didn't test on a GPU because we wanted to see how the CPU could handle it. If you have an NVIDIA graphics card, the project supports CUDA, so you can run the models on a GPU. In our case, even if we had a card, we wouldn't have been able to test it anyway.
Setting up the virtual environment and Python version
If your computer has the latest version of Python (3.13 or 3.14), the system will not work because the ML pipeline tools are not yet ready for these versions. Everything works fine on Python 3.10, 3.11, and 3.12, so let's use 3.12.
The easiest way to set this up without breaking anything on your main system is to install pyenv, a Python version manager that lets you create virtual environments with different Python versions:
# Install pyenv
curl https://pyenv.run | bash
# Add to ~/.bashrc or ~/.zshrc:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
# Reload your shell
source .bashrcNow install the Python version you need:
# Install Python 3.12.12 (don't use 3.13 — it’s not compatible!)
pyenv install 3.12.12
# Check your installation
pyenv versionsNow, create a directory for experiments, and inside it, set up a virtual environment with the right Python version for just this directory:
# Create the project directory
mkdir meta-asr-tests
cd meta-asr-tests
# Set the local Python version
pyenv local 3.12.12
# Create a virtual environment
python -m venv venv
# Activate the venv
source venv/bin/activateThat's it, the basic preparation is done.
Cloning omnilingual-asr and installing dependencies
Now, inside your working directory, clone the repository:
# Clone omnilingual-asr
git clone https://github.com/facebookresearch/omnilingual-asr.git
cd omnilingual-asrInstall the dependencies:
# Update pip
pip install --upgrade pip
# Install PyTorch CPU version
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# Install omnilingual-asr
pip install -e .
# Check PyTorch
python -c "import torch; print(f'PyTorch {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}')"The CPU version of PyTorch should give you something like:
PyTorch 2.8.0+cpu
CUDA available: FalseJust to make sure, run the auto-tests inside the repository. Almost all of them are unit tests, so they don't take much time after you start.
# Run all tests (takes about 2 minutes)
pytest tests/ -v
# Or run specific groups of tests:
pytest tests/test_lang_ids.py -v # Language ID tests
pytest tests/test_audio_utils.py -v # Audio utility tests
pytest tests/test_audio_cropper.py -v # Audio cropper testsEverything is ready. Now you have the right virtual environment and a working library, with all dependencies installed.
Preparing audio for recognition
It’s finally time to transcribe! For this, we’ll need some audio samples, especially samples of languages that aren’t very popular.
Here are some restrictions:
- The files should be in WAV or FLAC format.
- The audio file shouldn't be longer than 40 seconds.
About the 40-second limit – the shorter the audio, the better the recognition quality. So if you give the model a 12-second clip, it should recognize it better. Soon, the project will probably support any length, but for now, keep it under 40 seconds. Most likely, they'll add a processing step to split long files into chunks, transcribe each, and then join everything together with the help of a language model.
The easiest way to get audio samples in different languages is to go to this channel, where there are short videos of people speaking their native language. For Kyrgyz, for example, here's a video. We need to download the audio from this video and trim it to 40 seconds. We can do this with yt-dlp and ffmpeg:
yt-dlp -x --audio-format wav -o "kyrgyz.wav" <url>
ffmpeg -i kyrgyz.wav -ss 00:00:00 -t 40 kyrgyz40.wavNow, we have an audio file ready for the tool, so we can get results.
First transcription and model comparison
Now we need to create a script and run it. Here's how:
from omnilingual_asr.models.inference.pipeline import ASRInferencePipeline
pipeline = ASRInferencePipeline(model_card="omniASR_CTC_300M", device="cpu")
result = pipeline.transcribe(["audio/kyrgyz40.wav"], lang=["kir_Cyrl"], batch_size=1)
print(result[0])We chose the omniASR_CTC_300M model – it's the smallest one, cut-down, but gives normal recognition on CPUs and works fast. Here's what we got:
((venv) ) puzanov@P14sG4A-arch:~/src/meta-asr-tests$ python transcribe_kyrgyz.py
салам менин атымайгүл кыркка чыксамдагы ошун сүйлөрүм мен өзүм кыргызстанынан келдим масклада жашайым бес жылдан бери ошол жерде эгектенип үйбүлө баып жүрөм кыргызстандын алтынан биргөлү ушу росияды эмгек майнатап үйгүлөлөрүн багып жүрөт ушоорошуп мендаг көп жылдын бери үйгө эки жол каттайым ошолда бактылуугун уруса үйгө кайтабыстын чоң менн үмүтүм бар р кыргзстандыктар дүйнө тарабай кайра үйгө кайтыпкесе деген чоң үмүтү баршндуктан бр
As you can see, there are some mistakes, but you can understand the meaning. If you run it through a language model, the errors will be fixed.
Let's change the model to omniASR_CTC_1B and check again. This one has 1 billion parameters, so recognition should be better. Also, note that omnilingual-asr has code to download the model automatically if you don't have it yet: the Meta AI team made it easy to use their tools without extra setup.
((venv) ) puzanov@P14sG4A-arch:~/src/meta-asr-tests$ python transcribe_kyrgyz.py
салам менин атымайгүл кыркка чыксам даы ушунтисүйлөрөм мен өзүм кыргызстандан келдим москвада жашайым беш жылдан бери ушул жердеэмгектенип үбүлөн багып жүрөм кыргызстандын алтынан бирбөйлү ушу россияда эмгек майнатап үбүлөлөрүн багып жүрө ушулор ошуп мендаы көп жылдан бери үйгө эки жолу каттайым ошо да бактылуугун бурса үйгө кайтабыздечоң менин үмүтүм бар брса кырызстандыктар дүйнө тарабай кайра үйгө кайтып келсек деген чоңүмүтүүз бар ошондуктан бурс
Looks like it got a bit better, but let's ask GPT5 to compare:

We agree with ChatGPT here. Now let's try the model with 3 billion parameters. This is what the process looks like when you start, and the model isn't stored locally yet:

Conveniently, there's nothing to download yourself. Note that the model size is almost 12 GB. You must have at least 12 GB of free RAM to run this on your machine.
((venv) ) puzanov@P14sG4A-arch:~/src/meta-asr-tests$ python transcribe_kyrgyz.py
салам менин атым айгүл кырка чыксам даы ошенү сүйлөбөрем мен өзм кыргызстандан келдим москвада жашайм беш жылдан бери ушлжерде мгектенип үбүлөн баыпжүрөрзстандын алтынан бирбөлүү ушроссияда мгек майнатап үбүлөөрүн баып жүрөшоршпменөжн берүйгө ки жолатай ааынрсаүйгөайтаыноенн үмүтүм бар урса кырызстандыктар дүнөарабай кайра үйгө айтып кесе деген чоң үмүтү барошондтан бурса
It looks like the recognition with the 3B model is much better than with 1B or 500M.
And finally, you can check the recognition on Hugging Face, where the biggest model runs on a GPU. Here is the result:
салам менин атым айгүл кыркка чыксам да ушин сүйлөй берем мен өзүм кыргызстандан келдим москвада жашайм беш жылдан бери ушул жерде эмгектенип үй-бүлөм багып жүрөм кыргызстандын алдынан бир бөлүгү ушул россияда эмгек майына таап үй-бүлөлөрүн багып жүрөт ушулар окшоп мен дагы көп жылдан бери үйгө эки жолу каттайм ушул да убактылуу болгон буйруса үйгө кайта алыстын чоң менин үмүтүм бар бұйырса кыргызстандыктар дүйнөгө тарабай кайра үйге кайтып келсек деген чоң үмүттүбүз бар ошондуктан бұйырса
Results
Recognition of Kyrgyz on CPU with model omniASR_CTC_3B works really well. On the GPU, the model omniASR_CTC_7B gives almost perfect results. If you have enough RAM, you can run 7B on CPU, but it's much slower than on a GPU.
Last, let's show the chart comparing omniASR_CTC_300M, omniASR_CTC_1B, and omniASR_CTC_3B on CPU (audio file: 40 seconds):
| MODEL | LOAD TIME | TRANSCRIBE TIME | SPEED |
|---|---|---|---|
| omniASR_CTC_300M | 0.6s | 2.3s | 5.1x |
| omniASR_CTC_1B | 1.3s | 5.4s | 2.2x |
| omniASR_CTC_3B | 4.3s | 14.0s | 1.2x |
Transcription outputs
CTC 300M:
----------------------------------------------------------------------
салам менин атымайгүл кыркка чыксамдагы ошун сүйлөрүм мен өзүм кыргызстанынан келдим масклада жашайым бес жылдан бери ошол жерде эгектенип үйбүлө баып жүрөм кыргызстандын алтынан биргөлү ушу росияды эмгек майнатап үйгүлөлөрүн багып жүрөт ушоорошуп мендаг көп жылдын бери үйгө эки жол каттайым ошолда бактылуугун уруса үйгө кайтабыстын чоң менн үмүтүм бар р кыргзстандыктар дүйнө тарабай кайра үйгө кайтыпкесе деген чоң үмүтү баршндуктан бр
CTC 1B:
----------------------------------------------------------------------
салам менин атымайгүл кыркка чыксам даы ушунтисүйлөрөм мен өзүм кыргызстандан келдим москвада жашайым беш жылдан бери ушул жердеэмгектенип үбүлөн багып жүрөм кыргызстандын алтынан бирбөйлү ушу россияда эмгек майнатап үбүлөлөрүн багып жүрө ушулор ошуп мендаы көп жылдан бери үйгө эки жолу каттайым ошо да бактылуугун бурса үйгө кайтабыздечоң менин үмүтүм бар брса кырызстандыктар дүйнө тарабай кайра үйгө кайтып келсек деген чоңүмүтүүз бар ошондуктан бурс
CTC 3B
----------------------------------------------------------------------
салам менин атым айгүл кырка чыксам даы ошенү сүйлөбөрем мен өзм кыргызстандан келдим москвада жашайм беш жылдан бери ушлжерде мгектенип үбүлөн баыпжүрөрзстандын алтынан бирбөлүү ушроссияда мгек майнатап үбүлөөрүн баып жүрөшоршпменөжн берүйгө ки жолатай ааынрсаүйгөайтаыноенн үмүтүм бар урса кырызстандыктар дүнөарабай кайра үйгө айтып кесе деген чоң үмүтү барошондтан бурса
