Задача: Создать визуальную лабораторию временных сценариев VoiceSynthesizer
Создать визуальную лабораторию временных сценариев VoiceSynthesizer
Интерактивный многодорожечный редактор для ручного экспериментирования с параметрами синтезатора во времени, циклического прослушивания и поиска интересных звучаний.
Цель
Создать новый визуальный интерфейс не для косметического редактирования уже готового VoiceScenario, а как экспериментальную лабораторию синтеза речи.
Основная задача интерфейса — дать возможность вручную исследовать:
- какие параметры синтезатора;
- в какой последовательности;
- в какие моменты времени;
- с какими значениями и законами изменения
дают тот или иной слышимый результат.
Мы заранее НЕ предполагаем, что знаем правильный сценарий для конкретного звука. Интерфейс нужен именно для поиска: пользователь двигает временные точки и параметры, слушает результат, а найденные интересные звучания затем можно сохранять и отдавать вместе с логами/сценарием на последующий анализ.
Общая модель интерфейса
Интерфейс должен быть организован как многодорожечная временная диаграмма, логически похожая одновременно на:
- automation lanes в DAW;
- keyframe editor;
- диаграмму Ганта только в смысле общей временной оси и синхронизации событий.
Это НЕ классический Gantt и не список set/animate команд.
Координаты
Для каждой дорожки:
- горизонтальная ось = время;
- вертикальная ось = значение параметра;
- параметр задаётся набором редактируемых точек
(time, value); - точку можно перетаскивать горизонтально, меняя момент события;
- точку можно перетаскивать вертикально, меняя значение;
- между точками задаётся закон перехода.
UI может нормализовать вертикальную шкалу к 0..1, но физическое значение параметра должно сохранять собственный диапазон и единицы (Hz, gain и т.п.).
Отдельная общая длительность звучания
Нужен независимый параметр общей длительности сценария.
Это принципиально: управляющие параметры могут быть выставлены или изменены только в начале, но полученное состояние должно продолжать звучать долго.
Примеры смысловой модели:
- коротко выставили состояние и держим длинное
ААААА; - ранние события формируют
МА, а затем состояние долго удерживаетААААААА; - после последней keyframe-точки значение каждого control продолжает удерживаться до общей длительности сценария.
Длительность не должна автоматически обрезаться по последней управляющей точке.
Циклическое воспроизведение
Обязательно предусмотреть переключатель «Циклично».
В циклическом режиме:
- сценарий проигрывается снова сразу после окончания;
- пользователю не нужно каждый раз нажимать Play;
- изменения параметров/точек должны попадать в следующий цикл воспроизведения;
- пользователь может двигать точку или значение и за несколько повторов подряд услышать несколько вариантов результата.
Это ключевой режим именно для ручного поиска звучаний.
Дорожки параметров
На первом этапе редактор должен работать со всеми существующими параметрами VoiceControlState.
Для каждой дорожки нужно видеть:
- имя control;
- его физическое значение;
- нормализованное положение в вертикальной шкале;
- keyframe-точки;
- удержание значения между событиями;
- форму перехода между точками.
Редактор должен показывать фактическую временную траекторию параметра, а не только активные участки animate.
Типы переходов и преобразователей
Архитектуру сразу проектировать так, чтобы между точками существовал не только один вид animate.
Нужна расширяемая модель преобразователя/модулятора временного участка.
Минимально предусмотреть возможность в дальнейшем иметь разные типы:
- hold / постоянное значение;
- linear transition;
- bezier transition;
- периодический модуль;
- синусоидальная модуляция по формуле;
- импульс / burst;
- повторяющееся биение;
- шумовая или иная стохастическая модуляция;
- другие функции времени.
То есть на временную ленту в перспективе должен помещаться не только keyframe, но и преобразователь, который на заданном интервале формирует сложную траекторию параметра.
Пример смысла: параметр может иметь стабильную базу, но поверх неё на участке времени работает периодическая модуляция.
Связь с физиологией речи
Архитектуру редактора нельзя проектировать так, будто каждый control полностью независим физически.
У человека один речевой аппарат:
- один язык;
- одна конфигурация губ;
- один рот/ротовая полость;
- один голосовой тракт;
- одна система голосовых связок и воздушного потока.
Нельзя одновременно задать взаимоисключающие артикуляционные состояния так, словно существуют два независимых языка или две независимые формы рта.
Пока текущий DSP работает в акустическом пространстве (f0, periodicity, noise, resonances, gains и т.д.), но редактор должен быть спроектирован так, чтобы в будущем можно было вводить связанные физиологические/артикуляционные преобразователи, которые управляют сразу несколькими DSP controls согласованно.
Примеры смысловых преобразователей, которые могут появиться позже:
- открытие/закрытие рта;
- изменение положения языка;
- накопление и release давления;
- краткий взрывной burst;
- устойчивый поток воздуха;
- дрожание/биение артикулятора для
Р; - переход между артикуляционными состояниями.
Важно: это не требование немедленно реализовать полноценную физиологическую модель. Требование — не закрыть архитектурой такую возможность.
Особый смысл временной структуры
Редактор должен исходить из того, что звук имеет смысл только во времени.
Например, взрывной согласный — это не одно значение параметра, а последовательность фаз:
- подготовка/закрытие;
- накопление;
- release;
- burst;
- шумовой или голосовой хвост;
- переход в следующий звук.
А устойчивый звук может быть результатом стабильного состояния, которое после короткого входного перехода удерживается долго.
Поэтому пользователь должен видеть и редактировать композицию фаз во времени, а не только список чисел.
Что сохранять
Найденный эксперимент должен быть воспроизводимым.
Нужно уметь сохранить:
- общую длительность;
- все дорожки и keyframes;
- типы переходов/преобразователей;
- их параметры;
- итоговый
VoiceScenarioили компилируемое представление; - при необходимости метаданные эксперимента.
Существующий VoiceScenario можно использовать как runtime/формат исполнения, но UI не должен быть ограничен его текущей command-centric формой. Допустим отдельный экспериментальный/keyframe-формат, который компилируется в runtime-представление.
Связь с существующим runtime
Редактор должен использовать тот же общий runtime VoiceScenario, который используется синтезатором и визуализатором, после соответствующего рефакторинга.
Нельзя иметь отдельную семантику исполнения параметров только внутри UI.
Фактическое звучание и фактически отображаемые траектории должны происходить из одной state machine.
Что НЕ является целью первого этапа
Сейчас не требуется:
- автоматически угадать правильный звук;
- автоматически построить фонему;
- добавить новые акустические метрики только ради визуализации;
- сразу построить полноценную физиологическую модель речевого аппарата;
- заменить decoder.
Первая прикладная цель — максимально упростить ручное экспериментирование:
- быстро расставить временные точки;
- менять значения;
- слышать результат в цикле;
- понимать последовательность собственных действий;
- сохранять удачные варианты;
- отдавать найденный сценарий и его логи на дальнейший анализ.
Критерий результата
Пользователь может открыть лабораторию, задать общую длительность, включить Циклично, расставлять и двигать keyframe-точки нескольких параметров по общей временной шкале и непрерывно слышать, как изменения влияют на звучание.
Интерфейс должен помогать именно искать неизвестные заранее звучания, а не требовать заранее понимать, какой JSON нужно написать.
Ворклоги
Подробный прогресс по визуальной лаборатории временных сценариев
Что уже реализовано
Создан отдельный новый экспериментальный синтезатор и визуальный редактор, намеренно не связанный с прежним VoiceSynthesizer и его накопившейся сложной DSP-моделью.
Это важное архитектурное решение было сделано сознательно: цель текущего этапа — не сохранять совместимость со старыми сценариями и не воспроизводить прошлые эксперименты, а получить максимально чистый лабораторный стенд для ручного исследования звука.
Текущая структура включает:
- многодорожечный редактор временных параметров;
- keyframe-точки на общей временной шкале;
- drag-and-drop по времени и по значению;
- Play / Pause / Stop;
- режим Loop;
- независимую общую длительность сценария;
- seek по timeline;
- отображение текущих значений параметров;
- типы переходов
hold,linear,bezier,sine,burst,noise; - отдельный новый аудиосинтез на Web Audio API;
- минимальную акустическую модель на базе
sawtooth + noise + formant filters + gain.
В UI сейчас представлены основные экспериментальные дорожки:
- F0 / Pitch;
- Periodicity;
- Noise;
- Formant 1;
- Formant 2;
- Formant 3;
- Gain.
Интерфейс визуально получился удачным как лабораторный инструмент: временная ось читается, события видны, параметры можно быстро менять, а общая длительность не привязана к последней точке. Это позволяет строить длинные удерживаемые звуки и последовательности состояний.
Важное уточнение постановки
Новый редактор НЕ должен сейчас быть интерфейсом к старому DSP.
Он задуман как независимый чистый эксперимент:
простые источники + простые фильтры + временные траектории -> слышимый результат.
Основной исследовательский вопрос:
Можно ли вообще вручную, методом контролируемого перебора и прослушивания, найти хоть какие-то узнаваемые речеподобные звуки?
То есть текущая задача — не воспроизводимость старых VoiceScenario, а поиск самой минимальной работающей акустической модели.
Почему выбран отдельный новый синтезатор
Предыдущая ветка синтеза накопила много взаимозависимых экспериментов и параметров. Сейчас сложно понять, где именно ошибка, и изменение одного механизма легко может сломать другой.
Поэтому чистый стенд нужен как контролируемая среда, где каждый новый механизм добавляется осознанно и его эффект можно услышать отдельно.
Принцип дальнейшей работы:
минимальный движок -> ручной поиск -> наблюдение -> обнаружение недостающего механизма -> добавить только его -> повторить эксперимент.
Что показала первая практическая проверка
По словам разработавшего агента набор возможностей выглядит завершённым, но фактическая проверка результата показала, что отчёт был слишком оптимистичным.
На текущем этапе:
- большинство подготовленных звуков/пресетов практически не слышны или не дают ожидаемого результата;
- отчёт агента сам по себе нельзя считать доказательством работоспособности;
- из простых узнаваемых эффектов пока фактически слышен в основном шипящий звук, близкий к
С; - полноценные
А,М,Р,Ти другие звуки ещё не получены вручную и не подтверждены слухом.
Это не считается провалом эксперимента. Напротив, стенд теперь позволяет выяснять, какие именно механизмы минимально необходимы для появления конкретных классов звуков.
Текущая практическая ценность лаборатории
Практическая ценность редактора пока не доказана окончательно.
Сейчас проверяется более базовая вещь:
- Есть ли слышимая причинная связь между конкретным параметром и результатом.
- Можно ли двигая одну или несколько точек вручную получать предсказуемо меняющееся звучание.
- Можно ли найти устойчивые акустические классы:
- гласноподобный;
- шумовой/фрикативный;
- взрывной;
- носовой;
- периодический/дрожащий;
- другие речеподобные классы.
- Можно ли сохранить найденную конфигурацию как воспроизводимый рецепт.
Если эти пункты подтверждаются, лаборатория уже полезна как исследовательский инструмент, даже если качество звука пока далеко от человеческой речи.
Важный концептуальный вывод
Не нужно заранее строить сложную физиологическую модель речи.
Правильнее сначала искать минимальные акустические механизмы вручную.
Например:
- если
Рневозможно получить без периодического модулятора, это станет экспериментальным основанием добавить такой механизм; - если
Ттребует последовательностиsilence -> burst -> noise tail, это тоже должно вытекать из ручного эксперимента; - если определённый тип гласного требует устойчивого
F0 + F1/F2/F3, это должно быть найдено и подтверждено слухом.
То есть новые возможности добавляются не по предположению, а по наблюдаемому дефициту текущей модели.
Текущие ограничения и вопросы
- Нужно проверить каждый существующий control отдельно и в минимальных комбинациях.
- Нужно понять, какие из текущих transition types реально полезны, а какие пока декоративны.
burst,sine, повторяющиеся колебания и шумовые модуляции концептуально могут оказаться не просто интерполяциями, а отдельным классом временных модуляторов. Возможно, позже стоит разделить:- envelope / keyframes;
- modulators поверх базовой траектории.
- Нужно проверить, насколько корректно организованы физические диапазоны параметров и их нулевые состояния.
- Нужно добавить удобное сохранение удачных звучаний и сценариев, когда появятся действительно интересные результаты.
- Спектрограмма и другие способы анализа результата могут понадобиться позже, но сейчас приоритет — слуховой ручной поиск и причинная понятность интерфейса.
Критерий ближайшего успеха
Не «синтезатор уже умеет говорить» и не «пресеты совпадают с буквами».
Ближайший критерий успеха намного проще:
Пользователь может включить Loop, двигать keyframe-точку или параметр, слышать несколько вариантов подряд и устойчиво находить хотя бы некоторые узнаваемые речеподобные звучания, понимая, какое изменение к ним привело.
После нахождения интересных звучаний сценарий и логи будут использоваться для последующего анализа и для принятия решений о том, какие новые механизмы действительно стоит добавлять.
Краткий прогресс: текущую реализацию требуется переписать с нуля
Фактическая проверка показала, что текущий компонент нельзя считать пригодной основой для дальнейших экспериментов со звуком.
Основные проблемы:
- Аудиоархитектура принципиально не подходит для качественного синтеза. Параметры порциями обновляются через Web Audio nodes во время воспроизведения, тогда как для контролируемого экспериментального синтеза логичнее заранее вычислять PCM/массив sample-значений по всей временной логике и уже готовый буфер отдавать AudioContext на воспроизведение.
- Текущий DSP сам по себе устроен неудачно: sawtooth проходит через три последовательно включённых узких bandpass-formant фильтра, что почти уничтожает периодическую часть; шум при этом идёт отдельным прямым трактом.
- UI timeline и audio timeline фактически имеют разные часы. Loop, seek, pause/play и реальное аудиовремя не являются одной state machine.
- Управление звуком через
requestAnimationFrame(~60 Hz) непригодно для коротких акустических событий, burst и быстрых переходов; дополнительное сглаживание ещё сильнее размывает события. - Lifecycle аудиоисточников содержит race conditions и несогласованные состояния: повторный Play работает нестабильно, Stop способен приводить к неожиданному возобновлению звука, старые callbacks/source refs могут переживать смену состояния.
- В UI/UX слишком много независимых refs/states/hooks, отвечающих за части одного playback-состояния. Вместо этого нужен единый
useReducer/finite state machine с явными состояниямиstopped/playing/pausedи детерминированными переходами. - Отчёт о реализации оказался значительно оптимистичнее фактического поведения: интерфейс визуально выглядит как готовая лаборатория, но базовые пользовательские сценарии Play/Stop/Replay и сами звуковые результаты ненадёжны.
Вывод: точечное исправление текущей реализации нецелесообразно. Компонент нужно переписать с нуля, сохранив только общую идею визуальной лаборатории: timeline, дорожки параметров, keyframes, loop и ручной поиск звучаний. Новая версия должна строиться вокруг единой машины состояния и предварительного вычисления аудиобуфера из сценария.
