Задача: Разработать собственный пайплайн озвучки вьетнамского языка и словарь аудио
Разработать собственный пайплайн озвучки вьетнамского языка и словарь аудио
Отказаться от зависимости от browser speechSynthesis для вьетнамского и реализовать управляемую генерацию, проверку и хранение озвучек через OpenRouter + Google Gemini.
Контекст
Первичное исследование показало, что полагаться на браузерный speechSynthesis для вьетнамского языка нельзя.
Почему browser speechSynthesis не подходит
- В браузере голос для вьетнамского не удаётся надёжно установить.
- Доступный путь установки через Reading Mode неудобен для обычного пользователя: открыть режим чтения → настройки → языки → добавить вьетнамский → дождаться загрузки голосов.
- На практике после включения вьетнамского появляется
Downloading voices ..., после чего загрузка может зависать бесконечно. - Официальная документация не даёт прозрачной гарантии поддержки конкретного вьетнамского голоса.
- В исходниках Chromium язык может быть заявлен, но сам Chromium не содержит конечные голосовые словари: наличие и качество голоса зависит от конкретного поставщика браузера/сервиса, в нашем случае Google.
- Даже если голос доступен у разработчика, нельзя требовать от пользователя устанавливать дополнительные системные или браузерные словари ради работы курса.
Вторая проблема: качество
Разработчик не является носителем вьетнамского языка и не может самостоятельно гарантировать фонетическую корректность, естественность тонов и качество синтеза. Поэтому нужен контролируемый пайплайн генерации и последующая проверка носителем языка.
Решение
Реализовать собственный пайплайн озвучки через OpenRouter + Google Gemini.
Озвучку не генерировать при каждом пользовательском запросе. Вместо этого создать постоянный словарь аудио.
Базовая модель
- В системе появляется сущность/словарь единиц для озвучки: буква, слог, слово, фраза или другой учебный элемент.
- Для отсутствующей озвучки запускается генерация через OpenRouter + Google Gemini.
- Полученный аудиофайл сохраняется в файловом хранилище.
- Метаданные и связь с учебной единицей сохраняются в базе.
- При следующих обращениях используется уже сохранённый файл.
- Должна быть возможность перегенерации конкретной озвучки без изменения самой учебной единицы.
- Носитель языка позднее проверяет качество и отмечает подходящие/неподходящие варианты.
Что нужно продумать
- структуру сущности аудио в БД;
- типы озвучиваемых объектов: буква, звук, слог, слово, фраза;
- хранение исходного текста и параметров генерации;
- провайдера/модель и версию модели;
- формат и место хранения аудиофайлов;
- кеширование и повторное использование;
- статусы: сгенерировано / требует проверки / подтверждено носителем / отклонено;
- перегенерацию и версионность;
- различия северного и южного произношения, если понадобится несколько голосовых вариантов;
- массовую генерацию для букваря и словаря;
- возможность вручную загрузить эталонную запись носителя;
- интерфейс проверки качества.
Первый практический этап
Сначала обеспечить качественные озвучки для букваря:
- базовые гласные;
- согласные и сочетания;
- шесть тонов на одинаковом/сопоставимом слоге;
- основные дифтонги и трифтонги;
- примеры слов.
После подтверждения качества расширить тот же механизм на весь словарь курса.
Критерий результата
Пользователь получает озвучку без установки каких-либо системных голосов или словарей. Один и тот же учебный элемент воспроизводится из заранее сгенерированного и сохранённого аудио, а качество может быть независимо проверено и подтверждено носителем языка.
Ворклоги
Проблема с озвучкой одиночных букв через OpenRouter
Базовая механика TTS через OpenRouter в целом реализована и работает для обычных текстовых единиц. Однако обнаружена техническая проблема на минимальных входах: если отправлять на озвучку только одну букву, OpenRouter возвращает HTTP 400.
Для vietnamguru.ru это критично, поскольку букварю нужна отдельная озвучка букв, звуков и других очень коротких фонетических единиц.
Текущее решение
Не блокировать весь TTS-пайплайн из-за этого ограничения, а отдельно исследовать локальную генерацию через собственный локальный сервер и локальную TTS-модель. Цель — получить механизм, который стабильно принимает одиночные буквы/слоги и сохраняет результат в уже предусмотренный словарь аудио.
Связанная задача
Создана дочерняя задача «Исследовать и реализовать локальную TTS-озвучку через локальный сервер», taskId cmu90kv7v0wm0qw0qnov80p68.
В ней нужно подобрать и проверить локальную модель для вьетнамского, качество тонов и коротких единиц, API локального сервера, аппаратные требования и интеграцию с существующим хранением озвучек.
Полный промежуточный итог по TTS и локальной озвучке вьетнамского
Работа относится к задаче «Разработать собственный пайплайн озвучки вьетнамского языка и словарь аудио».
Исходная проблема
Изначально рассматривались browser speechSynthesis и затем генерация через OpenRouter + Google Gemini.
Browser speechSynthesis для вьетнамского оказался непригоден как базовый механизм курса: установка голоса непрозрачна, зависит от конкретного браузера/поставщика, может зависать на Downloading voices ..., а требовать от пользователя вручную устанавливать языковые голоса нельзя.
Далее был реализован TTS-пайплайн через OpenRouter. В целом он работает для обычного текста, но на минимальных входах обнаружилось критичное ограничение: при попытке озвучить одну отдельную букву OpenRouter/Gemini возвращает HTTP 400 или не даёт пригодного результата. Для обычного TTS это может быть допустимо, но для букваря — блокирующая проблема, потому что нам нужны отдельные буквы, графемы, короткие слоги и минимальные фонетические единицы.
Из-за этого была вынесена отдельная техническая ветка: «Исследовать и реализовать локальную TTS-озвучку через локальный сервер».
Переход к локальной генерации
Локально в Docker поднят проект VieNeu-TTS.
Пока используется версия 2, с которой уже были предыдущие эксперименты; существует и более новая версия 3.
Ключевой практический результат: VieNeu-TTS стабильно и чётко умеет озвучивать отдельные вьетнамские буквы/графемы. Это принципиально отличает его от текущего Gemini-пайплайна.
Почему это важно именно для букваря
Для вьетнамского нам нужен не просто универсальный «читатель текста», а генератор минимальных учебных единиц:
- отдельные гласные;
- отдельные графемы с тонами;
- короткие слоги;
- дифтонги/трифтонги;
- минимальные контрасты;
- отдельные слова;
- затем короткие фразы.
То есть TTS должен поддерживать адресный запрос вида: «озвучь именно эту графему/слог», а не требовать контекста предложения.
На этом критерии VieNeu-TTS уже показывает существенное преимущество.
Теоретическая база по тому, какие именно единицы нужно уметь озвучивать, зафиксирована в концептах:
- Вьетнамский алфавит и орфография;
- Фонетика и звуковая система вьетнамского языка;
- Тоны вьетнамского языка;
- Структура вьетнамского слога, дифтонги и трифтонги.
Пример: 18 форм группы A
Для базовой латинской формы a во вьетнамском есть три разные гласные:
a;ă;â.
Каждая из них может нести один из шести тонов, что даёт 18 письменных форм:
a á à ả ã ạ;ă ắ ằ ẳ ẵ ặ;â ấ ầ ẩ ẫ ậ.
VieNeu-TTS способен отдельно озвучивать такие минимальные единицы.
Для курса это означает естественную структуру:
графема → сохранённая аудиозапись.
После генерации каждый вариант можно сохранить в файловое хранилище и использовать повторно без обращения к TTS на каждом воспроизведении.
Акустическая ценность синтетического набора
По спектрограмме сгенерированного набора видно, что отдельные произнесения хорошо разделяются и обладают различимой внутренней структурой.
Для дальнейшего анализа полезно рассматривать 18 вариантов не как 18 полностью независимых классов, а как комбинацию двух факторов:
- качество гласного:
a / ă / â; - тон:
ngang / sắc / huyền / hỏi / ngã / nặng.
Теоретически это позволяет анализировать признаки раздельно:
- F1/F2 и длительность → какой гласный;
- F0-контур, длительность, энергия, voicing и признаки фонации → какой тон;
- затем объединять результат в конкретную графему.
Это может быть полезно не только для генерации, но и как основа синтетического ground truth для будущих экспериментов «звук → фонетические признаки/графема».
Почему VieNeu-TTS выглядит перспективно
Проект специализирован именно на вьетнамском языке, разработан во Вьетнаме и обучался на большом объёме вьетнамской речи. По имеющейся информации, версия 2 использовала более 10 000 часов вьетнамских записей.
Это не отменяет валидацию, но делает модель гораздо более релевантной для нашей задачи, чем универсальный мультиязычный TTS.
Валидация качества
Финальное качество отдельных звуков и тонов будет проверяться с носителями языка.
Проверять нужно прежде всего:
- различимость тонов;
- корректность
hỏi/ngã; - краткость
ă/â; - естественность отдельных букв/слогов вне контекста;
- региональный акцент;
- отсутствие артефактов на очень коротких входах.
Таким образом, архитектура доверия сейчас видится так:
VieNeu-TTS = основной локальный генератор кандидатов
носители языка = валидаторы качества
наша база = хранит подтверждённые/принятые аудиозаписи
Требования к этой части системы собраны также в концепте «Озвучка и аудиослой курса вьетнамского языка».
Архитектура хранения
Озвучку не нужно генерировать каждый раз.
Для каждой учебной единицы нужно хранить:
- текст/графему/слог;
- тип единицы;
- аудиофайл;
- движок и версию модели;
- параметры генерации;
- вариант произношения/диалект при необходимости;
- статус проверки;
- возможность перегенерации;
- возможность заменить синтетическую запись живой записью носителя.
Статусы разумно оставить в духе:
generated;needs_review;approved;rejected.
Текущий практический вывод
Для Vietnamguru локальный VieNeu-TTS сейчас выглядит намного более подходящим базовым механизмом для букваря, чем Google Gemini через OpenRouter, потому что он стабильно работает на минимальных входах и умеет озвучивать отдельные буквы/графемы.
Даже если позднее другой движок окажется качественнее на длинной речи, возможность надёжно синтезировать минимальные единицы — отдельный критичный критерий для нашего проекта.
Вся методическая рамка проекта собрана в концепте «Вьетнамский язык: система и методика изучения», а практическая разработка курса ведётся в задаче «Разработать систему изучения вьетнамского языка для взрослой аудитории».