Задача: Разработать собственный пайплайн озвучки вьетнамского языка и словарь аудио

Разработать собственный пайплайн озвучки вьетнамского языка и словарь аудио

19.09.2026vietnamguru.ru

Отказаться от зависимости от browser speechSynthesis для вьетнамского и реализовать управляемую генерацию, проверку и хранение озвучек через OpenRouter + Google Gemini.

Контекст

Первичное исследование показало, что полагаться на браузерный speechSynthesis для вьетнамского языка нельзя.

Почему browser speechSynthesis не подходит

  • В браузере голос для вьетнамского не удаётся надёжно установить.
  • Доступный путь установки через Reading Mode неудобен для обычного пользователя: открыть режим чтения → настройки → языки → добавить вьетнамский → дождаться загрузки голосов.
  • На практике после включения вьетнамского появляется Downloading voices ..., после чего загрузка может зависать бесконечно.
  • Официальная документация не даёт прозрачной гарантии поддержки конкретного вьетнамского голоса.
  • В исходниках Chromium язык может быть заявлен, но сам Chromium не содержит конечные голосовые словари: наличие и качество голоса зависит от конкретного поставщика браузера/сервиса, в нашем случае Google.
  • Даже если голос доступен у разработчика, нельзя требовать от пользователя устанавливать дополнительные системные или браузерные словари ради работы курса.

Вторая проблема: качество

Разработчик не является носителем вьетнамского языка и не может самостоятельно гарантировать фонетическую корректность, естественность тонов и качество синтеза. Поэтому нужен контролируемый пайплайн генерации и последующая проверка носителем языка.

Решение

Реализовать собственный пайплайн озвучки через OpenRouter + Google Gemini.

Озвучку не генерировать при каждом пользовательском запросе. Вместо этого создать постоянный словарь аудио.

Базовая модель

  1. В системе появляется сущность/словарь единиц для озвучки: буква, слог, слово, фраза или другой учебный элемент.
  2. Для отсутствующей озвучки запускается генерация через OpenRouter + Google Gemini.
  3. Полученный аудиофайл сохраняется в файловом хранилище.
  4. Метаданные и связь с учебной единицей сохраняются в базе.
  5. При следующих обращениях используется уже сохранённый файл.
  6. Должна быть возможность перегенерации конкретной озвучки без изменения самой учебной единицы.
  7. Носитель языка позднее проверяет качество и отмечает подходящие/неподходящие варианты.

Что нужно продумать

  • структуру сущности аудио в БД;
  • типы озвучиваемых объектов: буква, звук, слог, слово, фраза;
  • хранение исходного текста и параметров генерации;
  • провайдера/модель и версию модели;
  • формат и место хранения аудиофайлов;
  • кеширование и повторное использование;
  • статусы: сгенерировано / требует проверки / подтверждено носителем / отклонено;
  • перегенерацию и версионность;
  • различия северного и южного произношения, если понадобится несколько голосовых вариантов;
  • массовую генерацию для букваря и словаря;
  • возможность вручную загрузить эталонную запись носителя;
  • интерфейс проверки качества.

Первый практический этап

Сначала обеспечить качественные озвучки для букваря:

  • базовые гласные;
  • согласные и сочетания;
  • шесть тонов на одинаковом/сопоставимом слоге;
  • основные дифтонги и трифтонги;
  • примеры слов.

После подтверждения качества расширить тот же механизм на весь словарь курса.

Критерий результата

Пользователь получает озвучку без установки каких-либо системных голосов или словарей. Один и тот же учебный элемент воспроизводится из заранее сгенерированного и сохранённого аудио, а качество может быть независимо проверено и подтверждено носителем языка.

Ворклоги

Проблема с озвучкой одиночных букв через 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 полностью независимых классов, а как комбинацию двух факторов:

  1. качество гласного: a / ă / â;
  2. тон: 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, потому что он стабильно работает на минимальных входах и умеет озвучивать отдельные буквы/графемы.

Даже если позднее другой движок окажется качественнее на длинной речи, возможность надёжно синтезировать минимальные единицы — отдельный критичный критерий для нашего проекта.

Вся методическая рамка проекта собрана в концепте «Вьетнамский язык: система и методика изучения», а практическая разработка курса ведётся в задаче «Разработать систему изучения вьетнамского языка для взрослой аудитории».