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

14 сент. 2026 г., 16:25:51

Web Speech API / SpeechSynthesis как отдельный класс решения

В рамках поиска существующих реализаций проверен встроенный браузерный SpeechSynthesis.

Минимальный пример:

const utterance = new SpeechSynthesisUtterance('Привет, это синтез речи!');
utterance.lang = 'ru-RU';
const voices = speechSynthesis.getVoices();
utterance.voice = voices.find(v => v.lang === 'ru-RU');
speechSynthesis.speak(utterance);

Этот код показывает важный факт: современный браузер уже умеет воспроизводить вполне нормальную человеческую речь по тексту без нашей собственной DSP-реализации.

Но архитектурно это совсем другой класс системы и для нашей основной задачи он не подходит.

Что реально делает API

SpeechSynthesisUtterance принимает текст и настройки вроде языка/голоса, после чего передаёт их встроенному speech engine браузера/операционной системы.

Условная схема:

text
→ SpeechSynthesisUtterance
→ language / voice selection
→ hidden TTS engine
→ audio

Для пользователя доступен результат, но не внутренняя программа формирования звука.

Критичное ограничение 1. Нет прямого управления самим звуком

API принимает текст, а не артикуляционную или акустическую траекторию.

Например:

мама

обычно произносится нормально.

Но попытка написать:

ммммммааамама

не означает для движка:

удерживать /м/
→ плавно перейти в /а/
→ продолжить слог

Движок интерпретирует строку как текст и может начать читать её примерно как последовательность названий букв или слогов:

эм-эм-эм-эм... а... ма-ма...

Аналогично:

шшшшшшшш

может превращаться в что-то вроде:

ша-ша-ша-ша...

То есть через этот API нельзя надёжно задать:

  • длительность конкретного согласного;
  • удержание фонемы;
  • плавный переход между звуками;
  • форму артикуляционного перехода;
  • отдельную временную траекторию шума, voicing, формант и других параметров.

Поэтому API практически не пригоден для экспериментов вида:

М ─────────→ А

где именно сам переход является объектом исследования.

Критичное ограничение 2. Пение и произвольная временная структура

Поскольку входом является текст, а не звуковой сценарий, нельзя свободно задавать:

  • растягивание отдельных звуков;
  • произвольные длительности слогов;
  • мелодическую траекторию каждого звука;
  • вокальные переходы;
  • нестандартную ритмику;
  • нормальное «пение» через прямое управление фонемами.

Изменение общей rate или pitch не решает эту проблему: оно меняет поведение всего utterance, а не даёт управление внутренними звуковыми событиями.

Критичное ограничение 3. Языковая привязка

SpeechSynthesisUtterance опирается на lang и конкретный voice.

Это означает, что движок ожидает текст в рамках некоторой языковой системы.

Проблемными становятся:

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

Даже если движок пытается что-то произнести, он делает это через собственные правила интерпретации текста, а не как универсальный генератор произвольного звука.

Критичное ограничение 4. Ограничение языковой моделью произношения

Корректнее говорить не только о «словаре» в буквальном смысле, а о более широком ограничении:

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

То есть неизвестную строку он может попытаться прочитать, но это всё равно будет интерпретация как текста, а не прямое воспроизведение заданного акустического объекта.

Для нашей задачи это принципиально важно.

Нам нужен механизм уровня:

sound scenario
→ exact parameter trajectories
→ sound

а здесь используется:

text
→ hidden linguistic interpretation
→ hidden TTS model
→ sound

Критичное ограничение 5. Чёрный ящик

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

Нет доступного представления вида:

initial state
+ timeline
+ source parameters
+ noise parameters
+ resonances
+ transitions

Поэтому SpeechSynthesis не помогает решить центральную задачу исследования:

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

Он демонстрирует только способность системы воспроизводить хорошую речь из текста.

Почему это всё равно полезно зафиксировать

Несмотря на архитектурную непригодность для нашей задачи, SpeechSynthesis полезно рассматривать как отдельный готовый вариант для других проектов.

Если задача звучит просто как:

текст → нормальная речь

то браузерный API может полностью закрыть её без собственного синтезатора.

Он особенно полезен там, где:

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

Итог для нашего проекта

SpeechSynthesis показывает, что качественная речь в браузере как конечный результат доступна уже сейчас.

Но он не подходит нам архитектурно, потому что:

  1. вход — текст, а не звуковой сценарий;
  2. нет точного управления внутренней временной структурой звука;
  3. нет нормального управления длительностью отдельных фонем;
  4. плохо подходит для пения и произвольных вокальных траекторий;
  5. зависит от языка и конкретного voice engine;
  6. не является универсальным генератором произвольных звуков;
  7. не раскрывает внутреннее представление;
  8. не решает обратную задачу sound → scenario.

Поэтому для нашей исследовательской задачи это не конкурент VoiceScenario, а отдельный готовый TTS-инструмент для гораздо более узкого класса задач.

13.09.2026

Найти и изучить браузерные проекты и DSP-подходы, которые программно воспроизводят хотя бы несколько человеческих слогов или голосовых звуков с высоким качеством, без генеративного TTS и без привязки ядра к буквам/слогам.