Этой статьёй я начинаю серию, в которой хочу рассказать свой путь — от обычного словаря до голосового ассистента, с которым можно будет поговорить по-крымскотатарски. Путь не пройден до конца, и я не знаю точно, сколько он ещё займёт. Но пройденная часть уже стоит того, чтобы о ней рассказать: там есть и результаты, и довольно поучительные грабли.
А началось всё с очень простой и очень неприятной мысли: для нашего языка почти ничего нет.
Не в смысле «мало» — в смысле именно почти ничего. Нет нормального машинного перевода. Нет распознавания речи. Нет синтеза, чтобы текст можно было послушать. Нет клавиатуры, которая подсказывает крымскотатарские слова. Нет всего того, что для английского, русского или турецкого давно стало фоном, воздухом, чем-то, о чём вообще не задумываешься. А сам язык при этом числится в списках исчезающих.
Из этого выросла мысль, которую я потом уже не смог отложить: язык надо сделать доступным. Всем, кто захочет, — не только тем, кто вырос в среде и слышал его дома. Захотел человек читать, слушать, учиться, писать, спросить что-то на родном языке — и у него для этого есть чем.
Так появился план, который поначалу выглядел самонадеянно даже для меня самого: пройти весь путь целиком. От обычного словаря — до полноценного голосового ассистента. Не одну модель сделать, не один инструмент, а всю цепочку, от начала до конца, шаг за шагом.
Задним числом видно, что план вырос не на пустом месте. Сначала у меня появилась база для словаря. Потом я собрал разговорник. А когда искусственный интеллект начал становиться популярным, я взялся за то, что уже было под рукой: исправил и доработал крымскотатарский речевой датасет и сделал первую попытку получить качественный синтез речи. И датасет, и модель тогда же выложил открыто — датасет и модель лежат в общем доступе.
И вот когда всё это оказалось у меня на руках, появилась мысль сделать что-то большее.
Где мы на этом пути сейчас
Первые шаги были самые понятные и самые «бумажные»: словарь, к которому можно обратиться с телефона; перевод между нашими двумя алфавитами, кириллицей и латиницей, без которого любой крымскотатарский текст живёт в двух несовместимых версиях; словарные и справочные инструменты вокруг этого. Это уже работает, этим пользуются, и это была необходимая база — без словаря нельзя даже проверить, правильно ли ты написал слово, не говоря уже о том, чтобы научить машину его выговаривать.
Речь — следующий этап. Он оказался самым тяжёлым, и о нём эта статья.
Почему именно речь пошла раньше переводчика и ассистента, хотя ассистент — конечная цель? Две причины.
Первая — время. Книга подождёт на полке ещё двадцать лет, с ней ничего не случится. А люди, чью живую речь можно записать, не молодеют. Тут время работает против нас, и это единственная часть задачи, которую нельзя отложить на потом.
Вторая — то, что я называю маховиком. Распознавание речи (компьютер слушает и записывает текстом — по-английски ASR) превращает старые записи в текст. Текст вместе со звуком — это готовые пары для обучения синтеза речи (компьютер читает текст вслух — TTS). Синтез делает аудиокниги и озвучку, их слушают, люди говорят больше, речи становится больше, распознавание становится лучше. Круг замыкается и раскручивается сам. Для языка, у которого нет большого запаса материалов, это единственный способ выбраться из бедности своими силами, а не ждать, пока тебя заметит большая компания. Ждать можно долго и безрезультатно.
И то же самое нужно ассистенту: чтобы с ним можно было именно поговорить, нужны обе половины — он должен услышать и должен ответить голосом. Так что речь — это не отклонение от маршрута, а его середина.
По дороге же появляются вещи, полезные сами по себе: читалка, которая произносит любой крымскотатарский текст вслух и подсвечивает слова по мере чтения; аудиокниги там, где их почти нет; тренажёр произношения для тех, кто учит язык; расшифровка старых архивных записей в текст, по которому можно искать.
Отдельно скажу, потому что меня об этом спрашивают: отговаривать меня никто не пытался. Дома и в кругу тех, кто в курсе, чем я занимаюсь, идею поддержали сразу — сомнения были только у меня самого и только технические.
Один звук, с которого начался этот этап
Слово было самое обычное — qara, «чёрный». Я слушал, как его произносит готовый компьютерный голос, и он говорил «кара». Мягко, аккуратно, по-турецки. А надо «къара».
Кажется, мелочь. Не мелочь. В крымскотатарском къ и к — два разных звука, два разных смысла, и на этом звуке стоят слова, которые мы произносим каждый день: yoq, qız, vaqıt, qadar. А у соседей по языковой семье с ним вот что:
| откуда берём готовую модель | что происходит с нашим къ |
|---|---|
| турецкий | звука /q/ нет вообще, есть только одна «к» — qara возвращается как «кара» (проверено дважды) |
| азербайджанский | буква q читается как /г/ и ослабляется дальше, до придыхания |
| казахский, уйгурский, башкирский | звук есть, и у него своя отдельная буква — ҡ, қ |
То есть самый очевидный путь — «возьмите турецкую модель, языки же похожие» — ломает произношение в самых частотных словах языка. Я проверил это дважды, чтобы не спорить с собой на слух. И вот тогда стало ясно, что этап со звуком малой кровью не проскочить: чужую готовую модель просто «включить» не выйдет, придётся делать своё.
Чего у нашего языка не было
Чтобы компьютер заговорил на языке, нужны две вещи: записи речи и точный текст к ним. Много часов, вычищенных, размеченных, сведённых вместе. Такой набор называют датасетом — это «топливо» для любой модели.
Для английского таких наборов тысячи. Для крымскотатарского не было ни одного, пригодного для серьёзной работы. И это не потому, что никто не хотел, — просто у больших компаний до нас очередь дойдёт нескоро, а может и не дойти.
Поэтому вопрос стоял так: можно ли сделать это самому. Не с бюджетом лаборатории, не с серверной фермой. На одном компьютере с одной хорошей видеокартой, вечерами и ночами.
Отвечаю сразу: можно. За несколько месяцев. И сейчас я расскажу, куда на самом деле уходит это время — потому что не туда, куда все думают.
Первое правильное решение
Обычно датасет собирают так: берут аудио и распознают его машиной. У нас это не работало — хорошего распознавания для крымскотатарского не было, а плохое распознавание порождает плохой корпус, из которого получится ещё одно плохое распознавание. Замкнутый круг, только не в ту сторону.
Я перевернул задачу. У аудиокниг ведь уже есть точный текст — он напечатан. Значит, распознавать нечего. Надо просто совместить известный текст со звуком и нарезать по границам слов. Это и оказалось главным решением всего проекта: оно целиком обходит то, чего у языка не было.
А дальше пошло то, о чём обычно не рассказывают.
Одна такая сборка на семь с половиной часов записи честно отработала первые два часа, а потом молча испортила три с половиной часа аудио. Никакой ошибки на экране, никакого предупреждения. Ровные, уверенные, полностью неправильные результаты. Из семи часов пригодными остались чуть меньше двух.
Такие поломки хуже всего. Когда программа падает — это подарок, ты сразу видишь проблему. Когда она выдаёт правдоподобный мусор — ты теряешь неделю.
Починка была не в программе, а в подходе. Вместо трёх больших кусков я разбил материал на сорок глав и каждую находил в тексте отдельно, сравнивая не слова, а короткие цепочки букв. По словам совпадения не находились вообще — на паре, про которую я точно знал, что она совпадает, сходство было меньше процента. По буквам всё встало на места: тридцать восемь глав из сорока нашлись. В итоге из того же материала я вытащил больше пяти часов чистого звука — три четверти работы вместо четверти.
Пришлось искать модель, которая уже знает наш звук
Вернёмся к «къара». Прежде чем что-то менять, я проверил, в чём именно дело. Может, модель просто не видела этого звука? Нет: в моём наборе буква q встречалась в 88 % записей, чаще, чем k. Модель слышала правильное произношение тысячи раз.
Проблема была глубже. В самой основе модели, ещё до всякого обучения на нашем языке, буква q уже была «озвучена» как к — по английскому, испанскому, французскому. И моё дообучение этого не перебивало. Из чего следовал неприятный вывод: сколько данных ни добавляй, не поможет. Надо менять не количество данных, а фундамент.
Я стал искать основу по одному признаку: чтобы она уже умела произносить наш звук. Тюркские языки, где этот звук есть и записывается собственной буквой, — казахский, уйгурский, башкирский. Нашлась многоязычная модель, в обучении которой полторы тысячи часов казахского, четыреста уйгурского и двести пятьдесят башкирского — против ста двадцати пяти турецкого. То есть ровно наоборот к тому, что подсказывает здравый смысл.
Крымскотатарского в ней всё равно не было. Обошёл я это хитростью с письмом: наши къ, гъ, нъ переписываются в одиночные башкирские буквы ҡ, ғ, ң, которые модель уже знает, и с ней разговаривают как с башкирской. Одним движением решились сразу две проблемы.
Работает это или нет, было видно сразу, ещё до всякого дообучения: новая база выговаривала наш къ правильно в 88–100 % случаев. То есть я больше не учил модель новому звуку — я просто перестал ей мешать.
Казахский и башкирский варианты я довёл до конца оба. По качеству вышла ничья, до третьего знака. Выбрал башкирский — не потому, что он оказался лучше, а потому, что казахский иногда ломался: на определённом этапе обучения несколько фраз возвращались пустыми, а наш звук съезжал обратно в к. При равном результате я выбираю то, что ломается реже.
Данных стало втрое больше, а цифра не сдвинулась
Самый полезный отрицательный результат за всё время.
Корпус рос: шесть часов, одиннадцать с половиной, пятнадцать. Машина считает ошибки по буквам — доля неверно произнесённых знаков, если прочитать синтез обратно распознавалкой. Вот что вышло:
| корпус | ошибка по буквам (среднее из трёх замеров) | что говорит ухо |
|---|---|---|
| база, вообще без нашего языка | 0.173–0.198 | акцент, но читает |
| 5.9 часа | 0.136 | — |
| 11.5 часа | 0.138 | интонация заметно живее |
| 15.3 часа | 0.141 | ещё немного лучше |
Данных стало втрое больше, а цифра не только не улучшилась — она формально чуть ухудшилась. При этом разброс между повторными замерами того же самого голоса перекрывает всю эту разницу, так что честный вывод один: по этой метрике три прогона неразличимы.
А на слух каждый следующий голос был лучше предыдущего. Я сравнивал вслепую, не зная, что именно слушаю, и выбор был устойчивым.

Объяснение оказалось важным. Разборчивость — то, насколько понятно сказано, — насыщается рано, часов на шести. А интонация, живость, дыхание фразы продолжают улучшаться и дальше. Просто машинная метрика останавливается ровно там, где начинается остаток качества. Тот, кто посмотрел бы на цифру и перестал собирать данные, написал бы правду и принял неправильное решение.
Отсюда же правило, которое стоило мне нескольких вычеркнутых «побед»: одно измерение не значит ничего. Один и тот же голос при первом замере показывал одну цифру, при усреднении трёх — заметно другую. Меряй трижды.
Ошибка, которую ухо бы не поймало
Самый коварный баг за весь проект — и заметен он был только потому, что я щёлкал по отдельным предложениям.
Я слушал озвученную главу, нажал на 195-е предложение — и услышал не то. Дальше по тексту расхождение только росло, и росло ровно:
| предложение | насколько уехала разметка |
|---|---|
| 1 | 0 с |
| 49 | +10.7 с |
| 98 | +21.8 с |
| 147 | +33.0 с |
| 195 | +43.9 с |
Первая мысль была правильная по форме и неверная по сути: «модель разъезжается на длинном тексте». Проверил — нет. Голос держался ровно от первой минуты до последней (сходство с началом 0.96–0.98), темп не менялся. Со звуком всё было хорошо.
Дело было в том, что время в главе считали независимо друг от друга две части программы, и одна из них дважды учитывала паузы между фразами. Сорок три секунды — это ровно сумма этих двойных пауз по всем стыкам главы. Звук был правильный. Разметка к нему — нет.
Проверял я не чтением кода, а ножом: нарезал звук по старым и по новым отметкам и прогнал куски через распознавание. По новым — ошибка 0.008, то есть текст совпадает. По старым — 0.712, то есть это вообще другие предложения. А на самой последней строке старая отметка уехала за конец файла, и распознавалка добросовестно «услышала» в тишине свои дежурные титры.
Хуже всего то, что при сквозном прослушивании такой баг не слышен вообще: файл-то правильный. Он проявляется, только если включить одно предложение отдельно.
Слово, которое было произнесено правильно
А это самая человеческая история во всём проекте, и расследование заняло минуту.
Я слушал главу и услышал «ниже» там, где в книге «нидже». Полез разбираться — а разбираться нечего. Правило переписывания букв, то самое, с ҡ и ғ, заодно превращало дж в ж. Модели буквально подали строку «ниже». Она произнесла её безупречно.
Правило склеило разницу, которая в языке есть: дж в наших словах — джан, оджа, нидже — и ж в заимствованиях вроде «журналист». После склейки ничто дальше по цепочке уже в принципе не могло произнести их по-разному.
Таких слов в той главе было пятьдесят пять. Заметил я одно — то единственное, которое случайно упало в другое настоящее слово. Остальные пятьдесят четыре звучали «просто слегка не так», и ухо на них не спотыкалось.
Исправление почти не изменило цифры. И всё равно было правильным — это же наш язык, а не статистика.
Что есть сегодня
Распознавание речи. Компьютер слушает крымскотатарскую речь и записывает её текстом. Качество меряют долей неправильно распознанных слов и, отдельно, букв:
| ошибки в словах | ошибки в буквах | |
|---|---|---|
| модель, с которой я начинал | 34.6 % | 11.9 % |
| + дообучение (полтора часа на одной видеокарте) | 20.1 % | 9.4 % |
| + настройка того, как модель зачитывает ответ | 17.0 % | 7.0 % |
Вторая строка — это обучение. Третья — вообще без обучения: я не тронул ни одного веса, только аккуратнее попросил модель подбирать слова. Ошибок стало вдвое меньше, чем было, а весь «довесок», который я к модели дописал, занимает 126 мегабайт.

Самое трудное здесь было не обучение, а честность проверки. Одни и те же четыре аудиокниги лежали у меня в материалах дважды, нарезанные по-разному, под совершенно разными именами — по названиям файлов они не пересекались вообще. У одной из книг, на которой я собирался проверять модель, 96.9 % кусочков имели двойника в обучающем наборе. Если бы я этого не заметил, модель экзаменовалась бы по билетам, которые уже видела: я получил бы красивую цифру, и она бы ничего не значила.
Голос. Синтезированный голос прочитал целую книгу — роман Şamil Alâdin «Merdiven». Не отрывок, не одну главу для демонстрации, а всю книгу от начала до конца:
| глав | 16 |
|---|---|
| слов | 15 444 |
| звучание | 1 час 58 минут |
| работы машины | 177 минут, то есть в полтора раза дольше, чем длится сам звук |
| проверено таймингов | 100 % слов во всех шестнадцати главах |
| ошибка по главам | медиана 0.022, худшая глава 0.027, лучшая 0.015 |
Каждая глава проверялась отдельно, а не книга по одной случайной главе. Разброс между лучшей и худшей главой — меньше чем в два раза, и нет ни ухудшения к концу книги, ни зависимости от длины главы.
Отдельно я доказал измерением, а не рассуждением, что текст этой книги не попадал в обучение: ни одного совпадения по цепочкам слов против почти полутора миллионов слов корпуса. Иначе это было бы не чтение, а пересказ заученного.
Проверял я и сами тайминги, причём с контролем, который обязан провалиться: вырезал по 30 слов из каждой главы ровно по записанным отметкам и давал распознать. Совпало 447 фрагментов из 480. А те же фрагменты, сдвинутые на 0.4 секунды, совпали 4 раза из 480 — то есть проверка действительно умеет отличать правильную отметку от неправильной, и «совпало» тут не случайность.
И цена вопроса, которая мне кажется самой важной цифрой в статье: на два часа звучания уходит около трёх часов работы машины — со всем включённым: синтез, выравнивание по словам, проверки, полная обратная вычитка каждой главы. Получается, что аудиокнига на нашем языке стоит теперь одну ночь работы одного домашнего компьютера. Не студию с дикторами и не год ожидания.
Когда я впервые услышал по-настоящему качественную озвучку, я думал, что сойду с ума от радости. Хотелось поделиться с каждым встречным. Я записал отрывок и разослал друзьям и близким — тем, кто был в курсе, чем я тут занимаюсь.
Куда на самом деле ушло время
Самое честное, что я могу рассказать: обучение моделей — это часы. Полтора часа здесь, несколько часов там. Это вообще не главная статья расходов.
Месяцы ушли на другое. На сбор и выравнивание данных, с починкой того, что ломалось молча. На доказательство, что проверка честная и модель не видела заранее того, на чём её проверяют. На перемеры, потому что одно измерение не значит ничего. И на прослушивание — ушами, вслепую, по одному предложению.
Под конец я заметил вещь, которая меня самого удивила. Все найденные за проект ошибки разделились примерно пополам между приборами и живым человеком, который слушает. Приборы нашли ту минутную разъехавшуюся разметку — ухо её не поймало бы никогда, потому что при сквозном прослушивании всё звучит правильно. А человек нашёл дыхание в неположенных местах, нашёл неправильные пометки и нашёл то самое слово «нидже».
Для нашего языка самый дешёвый и самый сильный инструмент — это один носитель, пятнадцать минут и наушники. Он переигрывает любую автоматику. Из этого, кстати, следует довольно обнадёживающая вещь: чтобы участвовать в такой работе, не обязательно быть программистом. Достаточно хорошо слышать родной язык.
Это была первая статья серии. Дальше расскажу подробнее: как машину учили слышать крымскотатарскую речь; как озвучивалась книга, глава за главой; как проводить сравнения вслепую, чтобы не обманывать самого себя; и как я честно сжёг деньги на аренде чужих видеокарт, почти ничего на них не посчитав.
До ассистента ещё далеко. Но участок дороги, который считался самым непроходимым, пройден — и он оказался проходимым.
Послушать примеры голоса — https://ai.ana-yurt.dev/blog/2026-09-kak-rodilas-ideya/.
Хотите помочь? Больше всего проекту нужны носители языка: слушать, читать, подсказывать, где машина ошибается. Программировать не нужно — достаточно хорошо слышать родной язык. Пишите нам: support@ana-yurt.com.
А если хотите поддержать работу материально — это можно сделать здесь: ko-fi.com/anayurt. Каждый вклад — это часы записей, которые успеют стать данными.