Решил попробовать написать несколько статей о синтезе речи с поддержкой эмоций.

Все началось, когда я решил сделать простой MVP для улучшения разговорного иностранного языка на базе нейронок, онлайн-репетитор. Так как сам испытываю сложности с его изучением.

Но в процессе реализации, я использовал разные модели. Начиная от Fastpitch и Tocatron2 до Bark от Suno. Когда я тестировал свой первый MVP, то при длительном прослушивании синтетического голоса у меня начинала болеть голоса и возникало раздражение. Это особенно сильно возникало, когда озвучка голоса не соответствовала контексту. Возникал аналог эффекта "зловещей долины", но только для звука.

Это заставило меня попытаться найти решения, которое сделает голос более эмоциональным. Здесь я опишу, как я начинал переносить биологическую модель, на синтез сеток.

Первым моим шагом, была разработка модели "вдоха-выдоха". Идея заключалась в том, что 99,999% человек говорит исключительно на выдохе (это касается и животных).

Модель вдох-выдох
Модель вдох-выдох

Модель сводится к:

  • разбиению предложения на фразы, соответствующие выдоху. Я тогда считал, что максимальное кол-во слов, которое может сказать человек равно 7 (это недалеко от правды, хотя от данного подхода в будущем я отказался) + пунктуация.

  • расчет длины вдоха, на тот момент считался как рандом в определенном диапазоне, который зависел от синтезируемой эмоции

  • расчет выдоха, зависел от кол-ва фонем и силы эмоции. Синтезировали фразу длиной 3 секунды, а время выдоха 2.5 секунды. Значит надо ускорить или наоборот растянуть. Где сила эмоции [0,1], она и ускоряла и замедляла эти 2.5 сек

  • для каждой эмоции (а у меня была палитра около 30 эмоций), были рассчитаны своя нормальная длины выдоха. Знак силы эмоций и расчет, тоже зависел от эмоции (усиливающее, тормозящие).

  • есть время синтезированного аудио(Ta) и расчетного на фонемах времени (Tn).
    если Ta > Tn, то ускоряем аудио на Ta / Tn
    если Ta < Tn, то значит мы можем громче сказать (у нас больше воздуха на короткий выдох). Громкость повышаем на Tn / Ta

  • так же на громкость и тон влияет эмоция и ее сила. Например для усиливающих эмоций было так

        # базовое значение тона эмоции при спокойном состоянии
        pitch = emotion_pitch[em_name]
        # дальше шел расчет громкости и тона
        # emotion_volume максимальная громоксть эмоции, 
        # считалось, что чем быстрее говорим, 
        # тем сильнее эмоция и значит громче говорим
        volume = emotion_volume[em_name] / Ta
        # дальше усиливали или ослабевали кромкость и тон, исходя из силы эмоции
        volume = (em_score - 0.5 + random.uniform(-0.1, 0.1)) * volume
        pitch = (em_score - 0.5 + random.uniform(-0.1, 0.1)) * pitch

Таким образом на громкость влияла скорость вдоха-выдоха и сила эмоции.

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

Для примера, данная модель наложенная на Silero:

Пример текст эмоции "сконфуженность", без модели вдох-выдох

Пример текст эмоции "сконфуженность", с моделью вдох-выдох

Пример текст эмоции "страх", без модели вдох-выдох

Пример текст эмоции "страх", с моделью вдох-выдох

Итоговый вариант на базе данной модели.

PS: посмотрим. будет ли интерес к продолжению описания, как развивалась данная модель до моделей "легкие-кислород", "сердце-легкие", "речевой тракт".
Здесь можно посмотреть и решить, к чему я веду и стоит ли мне продолжать цикл статей.

Hidden text

Когда я делал модель, и там в комментариях примеры: https://t.me/greenruff/1741
Описание примера: https://t.me/greenruff/1792

Комментарии (3)


  1. shares-caisson
    14.07.2024 08:48
    +2

    Интересно. Я не большой знаток TTS, но не помню чтобы кто-то моделировал потребление кислорода человеком для генерации речи :)


  1. whickma
    14.07.2024 08:48
    +1

    Забавно, на картинке модели вдох-выдох, я подумал это же интонации предложения. ИИ меня убивает равным тоном, произнося предложения, содержащие разные эмоции.
    Чего мне не хватает в ИИ озвучках так именно правильно расставленных ударений в словах и фразах. Чтобы не получалось построения вопроса в "кавказском" варианте: "Ты идёшь. Да?" Ровный утвердительный текст и отдельно вопрос. Например, как здесь описано https://zvukogram.com/node/vopros-akcent/
    Если можно будет обучить модель за счет пауз и "силы выдоха" скорее всего ИИ озвучка станет намного качественней. Респект в начинании.


  1. iowathe3rd
    14.07.2024 08:48

    Супер интересный пост, моя специализация от ии далека, но с каждым таким постом подумываю уйти в mlops…