Как стать автором
Обновить

Синтез эмоций. Модель вдох-выдох

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров3.6K

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

Все началось, когда я решил сделать простой 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

Теги:
Хабы:
Всего голосов 20: ↑20 и ↓0+29
Комментарии3

Публикации

Истории

Работа

Python разработчик
130 вакансий
Data Scientist
84 вакансии

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн