Rus tilidagi kitob do‘koni uchun SI yordamida audiokitob yaratish
Rus tilidagi elektron va audiokitoblar do‘koni Knigopoisk uchun raqamli nashrni ovozlashtirilgan audiokitob mahsulotiga aylantiradigan SI konveyerini qurdik: matnni ajratib olish va tozalash, xohishga ko‘ra personaj ovozlari, nutq sintezi, MP3 kodlash, teglash va katalogga chop etish. Xodimlar uni admin paneldan ishga tushiradi, bundan tashqari, mijoz hali audiofayli yo‘q audiokitob uchun to‘lov qilganda u avtomatik boshlanadi.
Birinchi qadam: rus tili TTS benchmarki
Konveyer kodini yozishdan oldin rus tilidagi nutq sintezi dvigatellarini faqat CPU’li uskunada solishtirdik, chunki 4 GB’li Quadro T2000 kattaroq modellarni GPU’da ishga tushirish uchun kichiklik qildi. Bitta qisqa ruscha namuna rus tiliga ixtisoslashgan dvigatellar (F5-TTS Russian, ESpeech, Silero v5, Vosk-TTS, Piper), ko‘p tilli modellar (CosyVoice3, Chatterbox, VibeVoice, XTTS-v2, Bark) va bulutli bazaviy variantlar, jumladan Gemini 2.5 TTS orqali o‘tkazildi; har biri uchun ovozlar, sintez vaqti va litsenziya qayd etildi.
Loyihani uchta xulosa belgilab berdi:
- Urg‘u belgilari muhim. RUAccent yordamida namunaning urg‘ulari qo‘yilgan nusxasini tayyorladik va dvigatellarni unda A/B test qildik. ESpeech to‘plamdagi
+urg‘u belgilarini ovoz chiqarib o‘qimasdan yoki e’tiborsiz qoldirmasdan, haqiqatan ham hisobga olgan birinchi dvigatel bo‘ldi. - Ovoz balandligi tekshiruvi ma’nosiz nutqni ushlamaydi. CosyVoice2 rus tilini qo‘llab-quvvatlamaydi va tasodifiy harflardan iborat «nutq» chiqaradi — daraja o‘lchagichda u oddiy ko‘rinadi; CosyVoice3 esa ishlaydi. Tushunib bo‘lmaydigan natijani ushlash uchun Vosk ASR yordamida so‘zlarni qayta tanish (word recall) bahosini qo‘shdik.
- Tezlik va litsenziyalar keskin farq qiladi. Silero va Piper namunani CPU’da taxminan besh soniyada render qildi, F5-TTS Russian’ga esa bir soatga yaqin vaqt kerak bo‘ldi; eng yaxshi eshitiladigan modellarning bir nechtasi notijorat litsenziyaga ega.
Ishlab chiqarish konveyerining arxitekturasi
Davom ettirsa bo‘ladigan generatsiya vazifalari
Har bir render — bu pending → extracting → generating → encoding → done bosqichlaridan o‘tadigan generatsiya yozuvi; Filament admin panelida jarayon va taxminiy tugash vaqti ko‘rinadi. Bitta model ortida ikkita dvigatel turadi: matnni bo‘lakma-bo‘lak xom PCM’ga sintez qilib, FFmpeg bilan bitta MP3 faylga kodlaydigan Gemini TTS yo‘li va HTTP orqali boshqariladigan, har bir bob uchun alohida MP3 chiqaradigan o‘z serverimizdagi Python render xizmati. Jarayon har bir bo‘lakdan keyin saqlanadi, uzoq ishlar navbat taymauti tugashidan oldin o‘zini qayta jo‘natadi, qayta yuborilgan vazifa esa keshlangan segmentlardan davom etadi. Butun kitob render qilinmaguncha hech narsa chop etilmaydi.
Matnni tayyorlash va ovozlarni taqsimlash
Aniq qoidalar asosidagi tozalagich sahifa raqamlari, kolontitullar, rasm osti yozuvlari, mundarija qatorlari va izoh belgilarini olib tashlaydi, so‘z bo‘linishlarini tuzatadi, xatboshilarni qayta tiklaydi va lug‘at bo‘yicha «yo» harfini (ikki nuqtali e) joyiga qaytaradi. Ixtiyoriy audit bosqichida DeepSeek’ga kitobdan kichik namuna ko‘rsatiladi va u qaytargan keraksiz matn andozalari PHP’da butun matnga qo‘llanadi — shu tufayli kitob qancha uzun bo‘lmasin, SI xarajati bitta arzon chaqiruv bilan cheklanadi. Ko‘p ovozli o‘qish uchun LLM matnni so‘zlovchilar bo‘yicha segmentlarga ajratadi, ovozlar esa aniqlangan jinsga qarab har bir personajga biriktiriladi; biror narsa ishlamay qolsa, oddiy bir ovozli o‘qishga qaytiladi.
Sifat nazorati va yetkazib berish
Jimlikka tushib qolgan yoki doimiy shovqinli variantda qolgan segmentlar har bir generatsiya bo‘yicha sanaladi, shuning uchun ogohlantirishli render boshidan oxirigacha eshitib tekshiriladi. Boblarga bo‘lingan render so‘zlar soniga nisbatan aql bovar qilmas darajada qisqa chiqsa, u kesilgan deb rad etiladi: chop etilmaydi, xaridorga xat yuborilmaydi, jamoa esa Telegram’da ogohlantirish oladi. Tayyor fayllarda ID3 teglari va muqova rasmi bo‘ladi.
Avtomatlashtirish va ishga tushirish
Buyurtma to‘langan holatga o‘tganda navbatdagi tinglovchi (listener) xaridor sotib olgan aynan o‘sha mahsulotga bog‘langan bir ovozli o‘qishni boshlaydi, tayyor bo‘lganda esa xaridorga xat yuboriladi. Har bir tekshiruv idempotent, shuning uchun bitta kirish nuqtasi to‘langan buyurtmalar tinglovchisiga ham, fayli hali yo‘q to‘langan audiokitoblarni tunda ommaviy to‘ldirishga ham, qayta urinishlarga ham, admin yordamchisiga ham xizmat qiladi. Standart sozlamada ketma-ket uch marta muvaffaqiyatsiz tugagan kitob odam ko‘rib chiqishi uchun qoldiriladi.
Ishga tushirish bosqichma-bosqich bo‘ldi. Avval ishlab chiqarishda besh generatsiyadan iborat tekshiruv partiyasi kuzatuv skripti ostida ishladi: skript navbatdagi ishlarni faqat render to‘liq audiofayl biriktirilgan holda tugagandan keyin bo‘shatardi va birinchi xatodayoq to‘xtardi. Keyin kengroq ommaviy to‘ldirish faol, tugagan va muvaffaqiyatsiz vazifalar sonini hisobot qilib boradigan va xatolar belgilangan chegaradan oshsa to‘xtaydigan monitor ostida ishladi. Har soatlik vazifa render uchun vaqtinchalik joyni saqlash muddati va hajm limiti doirasida ushlab turadi.
Tegishli ishlar
Bu konveyer Knigopoisk uchun sun’iy intellekt integratsiyasi va avtomatlashtirish bo‘yicha ishlarimizning bir qismi. Shuningdek, yirik shriftli kitoblar konveyeri va muvaffaqiyatsiz renderlar haqida xabar beradigan Telegram orqali buyurtma ogohlantirishlari bilan tanishing.



