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

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

Теоретически исследовать, какие свойства PCM и речевого сигнала мы можем гарантированно измерять во времени и частоте, прежде чем проектировать новый генератор.

Контекст

Сейчас не строим новый синтезатор и не пытаемся сразу распознавать буквы/фонемы. Цель этапа — понять фундаментально, что именно мы можем гарантированно измерять из записи микрофона, какими способами и с какой временной/частотной точностью.

Рабочая гипотеза: сначала нужно построить хороший 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 самых сильных полос.

Более осмысленная схема:

  1. посчитать все полосы;
  2. убрать значения ниже адаптивного noise floor/threshold;
  3. найти локальные максимумы;
  4. объединить соседние активные полосы в спектральные группы;
  5. связать похожие группы между соседними временными окнами.

Так из фиксированных сенсорных дорожек получаются плавающие 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 по динамическим сигнатурам.


Экспериментальный план

Сначала работать только с микрофоном и известным произносимым материалом.

Порядок:

  1. Записывать короткие фрагменты 0.5–1.5 s.
  2. Произносить известные звуки/слоги/слова.
  3. Строить временные и частотные метрики.
  4. Визуально искать устойчивые сигнатуры.
  5. Проверять те же сигнатуры в других словах и соседних контекстах.
  6. Проверять различимость близких классов (С/Ш, П/Т/К, voiced/unvoiced и т.п.).
  7. Не называть паттерн «буквой», пока он не переносится между разными контекстами.
  8. Добиваться высокой различимости сначала для одного человека, одного микрофона и контролируемых условий.
  9. Только после этого проектировать обратный generator.

Decoder должен стать измерительным прибором и затем автоматическим тестом генератора:

human audio -> decoder -> mechanism signature

synthetic audio -> decoder -> mechanism signature

Сравнение проводится в пространстве измеримых признаков, а не только субъективно «похоже/не похоже».


Главный критерий текущего этапа

Не распознавание текста и не синтез речи.

Нужно понять:

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

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

Ворклоги

Промежуточный итог: текущий эксперимент провален

На текущем этапе ни один из реализованных/предложенных сенсоров не дал хоть сколько-нибудь полезной, визуально устойчивой или интерпретируемой информации для различения речевых звуков.

Это важно зафиксировать как отрицательный результат, а не пытаться «дожимать» эксперимент оптимистичными эвристиками.

Что пробовали

Обсуждались и/или предлагались сенсоры по временной области:

  • RMS / средняя энергия;
  • peak amplitude;
  • zero crossing rate;
  • mean |Δx|;
  • max |Δx|;
  • autocorrelation / periodicity;
  • pitch estimate.

Затем была попытка построить грубый sibilanceSensor для С/Ш через:

  • высокочастотную энергию;
  • spectral centroid;
  • разделение энергии ниже/выше условной границы;
  • spectral concentration.

После этого предложен грубый frequency-band sensor с 12 логарифмическими полосами примерно от 60 Hz до 14 kHz.

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


Основные причины провала

1. ИИ слишком рано начал «проектировать решение» вместо измерительного эксперимента

Главная ошибка — преждевременный переход от вопроса «что мы реально видим в данных?» к вопросу «какой сенсор должен детектить С/Ш?».

В результате появились эвристики вроде условной границы 5.5 kHz, sibilance-presence, набора заранее выбранных frequency bands и ожидаемых графиков до того, как была получена хоть одна подтверждающая серия реальных измерений.

Это повторяет уже наблюдавшуюся проблему: код выглядит правдоподобно, но основание под ним не доказано экспериментом.

2. Признаки сами по себе измеримы, но их диагностическая ценность не доказана

RMS, ZCR, |Δx|, autocorrelation и спектральные метрики действительно вычисляются корректно как свойства waveform. Но из этого не следует, что они полезны для различения фонем/механизмов речи в конкретной записи.

Например два разных звука могут иметь очень похожие RMS/ZCR, а один и тот же звук — сильно менять эти значения в зависимости от громкости, расстояния до микрофона и контекста.

3. Нормализация может уничтожать именно ту информацию, которую мы пытаемся увидеть

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

Для сравнения сибилянтов и несибилянтов абсолютная шумовая энергия сама может быть важным признаком.

Нельзя заранее решать, какие компоненты сигнала являются «мешающим масштабом», пока мы не проверили их экспериментально.

4. Слишком грубые временные окна

Фиксированное окно 20–40 ms удобно технически, но разные речевые механизмы живут на разных масштабах:

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

Один масштаб окна неизбежно скрывает часть событий.

5. Слишком грубые частотные полосы

12 полос типа 2.5–4 kHz, 4–6.3 kHz, 6.3–10 kHz могут быть настолько широкими, что реальные локальные спектральные различия внутри них просто исчезают.

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

6. Нет эталонной экспериментальной процедуры

Пока отсутствует строгий набор сравнительных записей:

  • одинаковый микрофон;
  • одинаковое расстояние;
  • одинаковая громкость;
  • несколько повторов одного звука;
  • несколько разных звуков;
  • сохранённые исходные PCM;
  • одинаковая обработка;
  • возможность наложить/сравнить метрики между повторами.

Без этого невозможно отличить устойчивый признак фонемы от случайной вариации записи.

7. Пока анализируется «одна запись», а не статистика повторов

Один график почти ничего не доказывает.

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

  • внутриклассовая вариативность;
  • межклассовое расстояние;
  • устойчивость во времени;
  • чувствительность к громкости и микрофону.

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

8. Слишком ранняя привязка к буквам

С, Ш, Ф — полезные тестовые классы, но сенсор не должен начинаться с предположения о букве.

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

9. Возможные проблемы с самим исходным audioData

До дальнейших выводов необходимо отдельно проверить:

  • что именно содержит audioData;
  • действительно ли это PCM с микрофона;
  • тип данных (Uint8, Float32, другое);
  • корректный center/DC offset;
  • реальный sampleRate;
  • нет ли до анализа браузерной/микрофонной обработки: AGC, noise suppression, echo cancellation;
  • не является ли audioData уже результатом AnalyserNode с ограниченной/изменённой семантикой.

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

10. Визуализация тоже может скрывать различия

Если каждый sensor сам выбирает normalized 0..1, визуально любые маленькие различия могут выглядеть значительными, а большие абсолютные различия — одинаково.

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


Что считаем правильным следующим шагом

Не писать очередной «умный сенсор».

Сначала построить минимальную экспериментальную инфраструктуру:

  1. сохранять несколько коротких сырых записей с известной меткой;
  2. гарантированно знать формат PCM и sampleRate;
  3. уметь рисовать сам waveform без преобразований;
  4. уметь строить обычную подробную спектрограмму/STFT без попытки классификации;
  5. сравнивать несколько повторов одного звука рядом;
  6. только после визуального обнаружения устойчивого различия выделять его в отдельный sensor-helper;
  7. оценивать sensor по статистике повторов, а не по одному удачному графику.

Главный вывод текущего этапа:

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