Modeldan foydalanish uchun ruxsat soʻrash
This repository is publicly accessible, but you have to accept the conditions to access its files and content.
Ushbu modeldan foydalanish muallif ruxsati bilan beriladi. Iltimos, quyidagi maʼlumotlarni toʻldiring — soʻrovingiz koʻrib chiqilgach, model fayllari sizga ochiladi.
Log in or Sign Up to review the conditions and access this model content.
Oʻzbekcha streaming nutqni tanish modeli — tinish belgilari bilan
Oʻzbek tili (lotin yozuvi) uchun real vaqtda ishlaydigan nutqni matnga aylantirish (STT/ASR) modeli.
Matnni tinish belgilari bilan (. , ?) chiqaradi.
Model ONNX formatida, sherpa-onnx kutubxonasi bilan ishlatiladi.
assalomu alaykum hammaga. ovoz, video yaxshi borayotgan boʻlsa, plyus qoʻyib yuborsanglar tekshirib olamiz, keyin boshlaymiz.
WER: 17,74 % (IT mavzusidagi nutq) · 18,10 % (yangiliklar) · 19,78 % (umumiy) — soʻzlar boʻyicha
- Tinish belgilari: nuqta, vergul va soʻroq belgisini model oʻzi qoʻyadi — alohida model kerak emas
- Streaming: odam gapirayotgan paytda matn paydo boʻlib boradi, kechikish ≈ 320 ms
- Tez: bitta CPU yadrosida real vaqtdan 25 barobar tez (RTF 0,04), 4 ta yadroda 32 barobar (int8)
- Yengil: ~70 MB (int8) — kompyuter, server, Android, iOS va brauzerda (WebAssembly) ishlaydi
- Koʻp diktorli: ~400 soatlik tabiiy oʻzbekcha YouTube nutqi asosida oʻqitilgan (IT, yangiliklar, podkastlar)
Natijalar
Soʻzlarni tanish
| Test qismi | WER (soʻz xatosi) |
|---|---|
| IT mavzusidagi nutq | 17,74 % |
| Yangiliklar | 18,10 % |
| Umumiy | 19,78 % |
Tinish belgilari hisobga olinmaydi (salom, = salom). Tinish belgilari bilan hisoblanganda
(salom, ≠ salom) umumiy WER — 26,34 %.
Tinish belgilari
| Belgi | Precision (qoʻyilganining toʻgʻriligi) | Recall (topilgani) | F1 |
|---|---|---|---|
Nuqta . |
76,9 % | 72,3 % | 74,5 % |
Soʻroq ? |
75,7 % | 59,3 % | 66,5 % |
Vergul , |
67,3 % | 56,0 % | 61,1 % |
Natijalar real vaqt (streaming) rejimida, 320 ms kechikish bilan olingan. Dev va test qismlari xuddi shu YouTube manbalaridan tasodifiy ajratilgan (diktorlar boʻyicha ajratilmagan). Boshqa sohalarda (telefon qoʻngʻiroqlari, shovqinli audio, oʻqilgan matn) natija farq qilishi mumkin.
Tezlik
int8 model, Intel Core i9-14900K, GPU'siz, 10,8 daqiqalik audio (60 ta fayl), audio 100 ms li boʻlaklarda uzatilgan:
CPU oqimlari (num_threads) |
RTF | Real vaqtdan | 100 ms audioni qayta ishlash (oʻrtacha / p95) |
|---|---|---|---|
| 1 | 0,040 | 25 barobar tez | 3,8 ms / 12,9 ms |
| 2 | 0,034 | 29 barobar tez | 3,3 ms / 10,9 ms |
| 4 | 0,032 | 32 barobar tez | 3,0 ms / 10,2 ms |
- RTF (real time factor) = hisoblash vaqti ÷ audio davomiyligi. RTF 0,04 da 1 daqiqalik audio ~2,4 soniyada qayta ishlanadi.
- Model xotiraga ~1,6 soniyada yuklanadi.
- Natijalar CPU'ga bogʻliq: oddiyroq protsessorlarda yoki telefonlarda sekinroq boʻladi.
Fayllar
| Fayl | Tavsif |
|---|---|
encoder-epoch-35-avg-10-chunk-16-left-128.int8.onnx |
Encoder — modelning asosiy qismi, audioni "eshitadi" |
decoder-epoch-35-avg-10-chunk-16-left-128.int8.onnx |
Decoder — yozilgan matnni eslab turadi |
joiner-epoch-35-avg-10-chunk-16-left-128.int8.onnx |
Joiner — ikkalasini birlashtirib, keyingi tokenni tanlaydi |
tokens.txt |
500 ta token roʻyxati (tinish belgilari ham alohida token) |
Ishlatish uchun 3 ta ONNX fayl va tokens.txt kerak.
Har bir ONNX faylning ikki varianti bor:
.int8.onnx(~70 MB) — CPU uchun: kichikroq va tezroq. Koʻp hollarda shuni ishlating..onnx(fp32, ~265 MB) — GPU uchun (provider="cuda"); int8 GPU'da samarali ishlamaydi.
Ishlatish (Python)
pip install sherpa-onnx soundfile numpy
import numpy as np
import sherpa_onnx
import soundfile as sf
name = "epoch-35-avg-10-chunk-16-left-128.int8.onnx"
recognizer = sherpa_onnx.OnlineRecognizer.from_transducer(
encoder=f"encoder-{name}",
decoder=f"decoder-{name}",
joiner=f"joiner-{name}",
tokens="tokens.txt",
num_threads=4,
sample_rate=16000,
feature_dim=80,
decoding_method="greedy_search",
)
audio, sr = sf.read("audio.wav", dtype="float32", always_2d=True)
audio = audio[:, 0] # bitta kanal; istalgan chastota avtomatik 16 kHz ga oʻtkaziladi
stream = recognizer.create_stream()
chunk = sr // 10 # mikrofondagidek, har safar 100 ms dan uzatamiz
for i in range(0, len(audio), chunk):
stream.accept_waveform(sr, audio[i:i + chunk])
while recognizer.is_ready(stream):
recognizer.decode_stream(stream)
print("\r" + recognizer.get_result(stream), end="") # oraliq natija
stream.accept_waveform(sr, np.zeros(sr // 2, dtype=np.float32)) # oxirgi soʻzlar chiqishi uchun
stream.input_finished()
while recognizer.is_ready(stream):
recognizer.decode_stream(stream)
print("\r" + recognizer.get_result(stream))
Mikrofon bilan ishlatish: sounddevice.InputStream(samplerate=16000) orqali 100 ms li boʻlaklarni oʻqib,
xuddi shu tarzda uzating. enable_endpoint_detection=True qoʻshsangiz, matn pauzalarda gaplarga boʻlinadi.
Natija koʻrinishi
- Kichik harflar bilan, tinish belgilari:
.,?(!nuqta,:va;vergul sifatida oʻrganilgan) - Bosh harf kerak boʻlsa — gap boshida va
./?dan keyin oddiy qoida bilan qoʻyish mumkin oʻ,gʻva tutuq belgisi uchun U+02BBʻbelgisi ishlatiladi- Raqamlar soʻz bilan yoziladi (
yigirma besh), raqam koʻrinishida emas
Cheklovlar
- Vergul eng qiyin belgi (F1 61 %): model ba'zan vergulni tushirib qoldiradi.
- Jonli suhbat va shevalarda (masalan, Toshkent shevasidagi podkastlar) WER yuqoriroq — taxminan 25 %.
- Faqat YouTube nutqida oʻqitilgan: telefon (8 kHz), juda shovqinli yoki uzoqdan yozilgan audioda sifat pasayadi.
- Raqamli gaplar traindan chiqarilgan, shuning uchun sana, summa va raqamlar kamroq aniqlik bilan taniladi.
- Nutqdagi ruscha va inglizcha soʻzlar faqat transkripsiyalarda uchragan darajada taniladi.
- Faqat lotin yozuvi; kirill yozuvidagi oʻzbekcha qoʻllab-quvvatlanmaydi.
Evaluation results
- Test WER, soʻzlar (streaming, 320 ms, greedy) on Oʻzbekcha YouTube nutqi (it + news + podcasts), test qismiself-reported19.780
- Test WER, tinish belgilari bilan (streaming, 320 ms, greedy) on Oʻzbekcha YouTube nutqi (it + news + podcasts), test qismiself-reported26.340