Задача: Исследовать обратный дешифратор: звук → VoiceScenario
Исследовать обратный дешифратор: звук → VoiceScenario
Проверить, можно ли автоматически восстанавливать сценарий генератора из записанного звука, сначала на собственных синтетических примерах с известным ground truth, затем на человеческой речи.
Цель
Проверить гипотезу о практической обратимости нашей параметрической модели:
VoiceScenario → генератор → звук
и обратно:
звук → дешифратор → VoiceScenario.
Ключевой принцип проверки
Начинать не с человеческой речи, а с собственных сценариев, где правильный ответ заранее известен.
Для сценария S:
S → G(S) = X
затем:
X → D(X) = S'
Первый строгий критерий:
если дешифратор не способен стабильно восстанавливать исходные сценарии из звуков, которые создал наш собственный генератор, говорить о дешифровке реальной речи преждевременно.
Проверять нужно на всём доступном наборе разных сценариев, а не на одном удачном кейсе.
Этап 1. Синтетический ground truth
Собрать набор существующих и новых сценариев:
- устойчивые голосовые звуки;
- шумовые;
- взрывные;
- переходы;
- слоги/фрагменты;
- короткие слова.
Для каждого хранить:
- исходный JSON;
- точный сгенерированный звук;
- подробный аналитический лог;
- результат дешифратора;
- различия между исходным и восстановленным сценарием;
- результат повторного синтеза из восстановленного сценария.
Нужно понять, какие параметры восстанавливаются устойчиво, какие неоднозначны и какое разрешение логов необходимо.
Этап 2. Проверка повторного синтеза
Недостаточно получить похожий JSON. Восстановленный сценарий нужно снова проиграть:
S → X → D(X)=S' → G(S')=X'
И сравнить:
- структуру сценариев;
- аналитические признаки
XиX'; - восприятие человеком на слух.
Этап 3. Перенос на человеческую речь
Только после стабильной работы на собственных синтетических данных перейти к записи человека.
Цель здесь уже не обязательно восстановить некий «истинный» физический сценарий человека, которого у нас нет. Практический критерий:
дешифратор создаёт такой
VoiceScenario, который при воспроизведении даёт узнаваемый и достаточно близкий человеческий звук.
Главный открытый вопрос
Насколько пространство человеческой речи покрывается текущим пространством звуков нашего генератора.
AudioContext технически способен воспроизвести любой цифровой waveform, если дать ему полный массив отсчётов. Но наша система намеренно заменяет тысячи отсчётов компактным структурным описанием.
Поэтому исследуем не возможность воспроизведения вообще, а границу:
какая минимальная сложность структурного представления достаточна для приемлемого качества человеческой речи?
Возможное развитие модели
Если текущего VoiceScenario недостаточно, не считать это автоматическим опровержением подхода. Исследовать постепенное увеличение выразительности:
- более богатый source model;
- дополнительные резонансы/антирезонансы;
- turbulence/noise;
- локальные спектральные детали;
- более плотные временные управляющие точки;
- при необходимости короткие residual-компоненты.
В пределе представление может приближаться к waveform. Практическая цель — найти точку, где качество уже достаточно, а описание всё ещё существенно компактнее и структурнее массива samples.
Связь с редактором
Даже несовершенный дешифратор может быть полезен, если выдаёт хороший черновой сценарий:
запись → черновой VoiceScenario → визуальный редактор/ИИ → человек доводит на слух.
Критерии успеха
- Дешифратор устойчиво восстанавливает собственные сценарии хотя бы на ограниченном наборе классов звука.
- Повторный синтез из восстановленного сценария perceptually близок к исходному синтетическому звуку.
- Понятно, какие данные теряются при текущем анализе и нужно ли уменьшать сжатие логов.
- На реальных записях получаются хотя бы полезные стартовые сценарии.
- Можно оценить зависимость
качество ↔ сложность/размер представленияи приблизиться к практической границе системы.
Ворклоги
Прогресс по визуализации и обратному декодированию
Перепроверена семантика VoiceScenario по фактической реализации synthesizeScenario.
Что подтверждено
animate.toпосле окончанияdurationНЕ сбрасывается. После завершения automationstate[param] = to, сама automation удаляется, но новое значение остаётся активным до следующей команды.setтакже меняет состояние постоянно, пока параметр не будет изменён снова.- Новая
animateначинается от фактического текущего значения параметра на момент команды. - Для массива сценариев
initialиспользуется только у первого сценария, последующие продолжают текущее состояние без reset.
Найденная проблема визуализатора
Старый ScenarioVisualizer отображал только активные участки animate, из-за чего исходный сценарий визуально выглядел "рваным". Это не соответствовало реальному состоянию синтезатора.
Визуализатор перепроектирован на отображение полного VoiceControlState(t): значения идут непрерывно от начала до конца сценария, включая удержание последнего to после окончания duration, set, прерывание старых automation и продолжение состояния между составными сценариями.
Архитектурный вывод
Логика исполнения сценария (prepareScenario, evaluateBezier, updateAutomations, executeCommand) не должна дублироваться между синтезатором и визуализатором. Создана отдельная задача на вынос общего runtime-модуля, чтобы DSP и визуализатор использовали одну state machine.
Вывод по текущему декодеру
Даже после исправления визуализации видно, что текущий лог и сценарий находятся на разных уровнях представления. Сценарий содержит управляющие параметры, а лог содержит наблюдаемые акустические признаки. Прямое соответствие вида RMS -> sourceLevel, dominantFrequency -> f0Hz и т.п. в общем случае некорректно.
Также подтверждено, что исходный сценарий имеет существенно больше управляющих параметров, чем текущий лог акустических метрик, поэтому обратимость Scenario -> Sound -> Log -> Scenario в текущей архитектуре физически недоопределена.