Исследовать измеримые признаки речевого сигнала до построения нового синтезатора
Контекст
Сейчас не строим новый синтезатор и не пытаемся сразу распознавать буквы/фонемы. Цель этапа — понять фундаментально, что именно мы можем гарантированно измерять из записи микрофона, какими способами и с какой временной/частотной точностью.
Рабочая гипотеза: сначала нужно построить хороший decoder/analyzer как измерительный прибор, найти устойчивые признаки известных звуков и только потом идти в обратную сторону — строить генераторы, которые воспроизводят эти признаки.
Базовая модель сигнала
При sampleRate = 48 kHz одна секунда mono PCM — это 48 000 последовательных отсчётов.
Каждый sample — одно итоговое мгновенное значение амплитуды. После сведения внутренних источников информация о том, из каких конкретно составляющих получился отдельный sample, потеряна.
Например одинаковый итог может быть получен разными внутренними суммами. Поэтому обратное восстановление отдельных причин из одного sample невозможно.
Полезная информация появляется только при анализе траектории во времени.
Важно различать:
x[n]— текущее отклонение waveform;Δx[n] = x[n] - x[n-1]— направление и скорость изменения;Δ²x[n]— изменение скорости/резкость фронта;- длительную временную структуру;
- частотную структуру.
Один 0 не означает тишину: внутри колебания это может быть прохождение равновесия с большой скоростью. Покой — длительная последовательность около нуля без существенного изменения.
Что можно измерять прямо во временной области
До FFT уже можно гарантированно считать признаки по коротким окнам:
- RMS / общую энергию;
- peak amplitude;
- mean absolute amplitude;
- zero crossing rate;
mean(|Δx|)— среднюю скорость изменения waveform;max(|Δx|)— резкость самого сильного фронта;- вторую разность / локальную «ускоренность»;
- variance;
- crest factor;
- autocorrelation и её максимумы;
- длительность участков тишины/низкой энергии;
- onset / резкие появления энергии;
- decay / спад после события.
Эти метрики потенциально уже разделяют разные типы механики:
- длительный voiced звук;
- длительный шумовой/fricative участок;
- короткий burst/plosive;
- тишину/closure;
- периодическое дрожание.
Частотный анализ
Частота не хранится в PCM отдельным полем. Она вычисляется из повторяемости waveform.
Для окна длиной N samples можно использовать:
- Fourier/FFT — какие периодические компоненты присутствуют;
- autocorrelation — через какой лаг waveform похож на себя;
- filter bank — энергия в заранее определённых диапазонах.
Для FFT важен компромисс:
- длинное окно → хорошее частотное разрешение, плохая временная локализация;
- короткое окно → хорошая временная локализация, более грубое частотное разрешение.
Примеры:
- 1 s → примерно 1 Hz;
- 100 ms → примерно 10 Hz;
- 20 ms → примерно 50 Hz;
- 10 ms → примерно 100 Hz.
Для речи вероятно потребуется многомасштабный анализ: быстрые burst видеть на 5–10 ms, pitch/formants — на 20–50 ms, длительные стабильные структуры — на 100+ ms.
Частотные дорожки / auditory filter bank
Вместо тысяч FFT bins имеет смысл построить ограниченный набор perceptual bands, например 24–40 полос по логарифмической/ERB-подобной шкале.
Базовая идея:
PCM -> короткие окна -> FFT/filter bank -> energy каждой полосы во времени.
Получаем фиксированный набор дорожек:
Band 1 energy(t)
Band 2 energy(t)
...
Количество дорожек фиксировано, а активность в них плавает во времени.
Первый визуальный слой может быть heatmap:
- X = время;
- Y = частотная полоса;
- яркость = энергия.
Не нужно сразу кодировать много метрик толщиной/цветом одной кривой. Базовая вертикальная величина дорожки может быть просто normalized energy 0..1.
Важное различие: общая энергия и её распределение
Uint8 0..255 — формат мгновенного sample, а не «бюджет энергии» между полосами.
Для анализа полезнее разделить:
totalEnergyокна;- относительное распределение энергии по полосам.
Например:
Frame { totalEnergy, bands[] }
где при нормализации можно иметь:
sum(bands) ≈ 1.
Это позволяет отдельно видеть:
- насколько сигнал вообще сильный;
- куда по спектру ушла энергия.
Поиск спектральных групп
Не стоит жёстко брать top N самых сильных полос.
Более осмысленная схема:
- посчитать все полосы;
- убрать значения ниже адаптивного noise floor/threshold;
- найти локальные максимумы;
- объединить соседние активные полосы в спектральные группы;
- связать похожие группы между соседними временными окнами.
Так из фиксированных сенсорных дорожек получаются плавающие spectral objects:
- center frequency;
- bandwidth;
- energy;
- duration;
- stability;
- onset/decay;
- periodic/noise-like character.
Это ближе к тому, как слуховая система группирует компоненты в объекты, чем простой выбор десяти самых сильных bins.
Гипотеза о механизмах речи
Вместо десятков скалярных controls будущего синтезатора предлагается мыслить отдельными физиологически/акустически осмысленными генераторами или механизмами.
Примеры:
- frication/constriction — длительный шумовой механизм;
- plosive release — очень короткий burst после closure/pressure build-up;
- voicing — устойчивый периодический источник;
- trill — повторяющиеся квазипериодические прерывания/модуляции;
- nasal coupling — характерная спектральная структура;
- guttural mechanism — отдельный тип возбуждения/резонанса.
Ключевая идея: механизмы должны отличаться не только амплитудой, но наблюдаемыми признаками:
- характерной длительностью;
- частотным диапазоном;
- periodicity;
- onset/decay;
- спектральной шириной;
- устойчивостью;
- временной повторяемостью.
Тогда decoder потенциально сможет выделять их из общего PCM по динамическим сигнатурам.
Экспериментальный план
Сначала работать только с микрофоном и известным произносимым материалом.
Порядок:
- Записывать короткие фрагменты 0.5–1.5 s.
- Произносить известные звуки/слоги/слова.
- Строить временные и частотные метрики.
- Визуально искать устойчивые сигнатуры.
- Проверять те же сигнатуры в других словах и соседних контекстах.
- Проверять различимость близких классов (
С/Ш,П/Т/К, voiced/unvoiced и т.п.). - Не называть паттерн «буквой», пока он не переносится между разными контекстами.
- Добиваться высокой различимости сначала для одного человека, одного микрофона и контролируемых условий.
- Только после этого проектировать обратный generator.
Decoder должен стать измерительным прибором и затем автоматическим тестом генератора:
human audio -> decoder -> mechanism signature
synthetic audio -> decoder -> mechanism signature
Сравнение проводится в пространстве измеримых признаков, а не только субъективно «похоже/не похоже».
Главный критерий текущего этапа
Не распознавание текста и не синтез речи.
Нужно понять:
какие признаки мы действительно можем стабильно и воспроизводимо измерять из PCM, на каких временных масштабах, и какие из них позволяют различать устойчивые речевые механизмы.
На этом этапе важнее подтвердить измеримость и различимость, чем добавлять новые сущности в генератор.