Silero TTS v5 теперь умеет и в эмфазы, и в вопросы и восклицания. silero.. silero. tts.. silero. tts. вопросы.. silero. tts. вопросы. восклицания.. silero. tts. вопросы. восклицания. нейросети.. silero. tts. вопросы. восклицания. нейросети. русский язык.. silero. tts. вопросы. восклицания. нейросети. русский язык. синтез речи.. silero. tts. вопросы. восклицания. нейросети. русский язык. синтез речи. синтезатор речи.. silero. tts. вопросы. восклицания. нейросети. русский язык. синтез речи. синтезатор речи. эмфазы.
Да, я знаю, что этот жест на самом деле в Италии особо не используется и значит другое, но мем сам себя не сделает

Да, я знаю, что этот жест на самом деле в Италии особо не используется и значит другое, но мем сам себя не сделает

Не так давно мы писали про обнову нашего публичного синтеза, silero-tts. В прошлый раз мы завезли постановку вопросов.

В этот раз доехало аж несколько новых фич:

  • Поддержка восклицаний;

  • Эмфазы (то есть конструкция, когда говорящий выделяет конкретное **слово** в предложении);

  • Новый релиз нашей библиотеки для простановки ударений (и в обычных словах, и в омографах).

Основные текущие фичи

 Если просуммировать основные текущие фичи:

  • Поддержка SSML;

  • Высокая скорость (до 100x на 4 потоках процессора);

  • Автоматическая простановка ударений и омографов (новая версия);

  • Установка через torch.hub, pip и просто локально через торч;

  • Доступны голоса aidar, baya, kseniya, xenia, eugene;

  • Поддержка восклицательных предложений;

  • Поддержка эмфаз: эта булочка **очень** вкусная! ;

  • Поддержка 4 типов вопросов: специальные (с вопросительным словом), общие (с выделением какого-либо слова), альтернативные (“ты любишь рыбу или мясо?”) и вопросы-хвостики (“не так ли?”).

И всё это счастье работает на 1 потоке CPU и для этого не нужна видеокарта за несколько миллионов рублей!

Примеры звучания

Эмфазы:

Как работают эмфазы в русском языке

Видим паузу перед эмфазой и значительное удлинение первого согласного в ней.

Видим паузу перед эмфазой и значительное удлинение первого согласного в ней.

Коротко говоря, эмфаза – это когда определенное слово во фразе произносится «с нажимом», чтобы слушатель обратил на него внимание. Одна и та же фраза может звучать по-разному: например, можно сказать «Я завтра уезжаю» (а не послезавтра!) или «Я завтра уезжаю» (а не остаюсь на праздник) и таким образом указать собеседнику на то, что важнее.

Кажется, что выделить слово = просто сказать его погромче, но на самом деле в русском языке громкость для эмфазы значит меньше всего. Главное – это темп: эмфаза в первую очередь выражается замедлением, которое начинается на предударных слогах и сильнее всего проявляется на ударном гласном. Другой заметный признак – пауза перед выделяемым словом: чем заметнее говорящий «притормаживает» перед ним, тем сильнее выделение. Изменение интонационного контура и интенсивности (громкости) тоже добавляет выделенности эмфазам, но в меньшей степени.

Итого: эмфатическое выделение в русском языке – явление комплексное и сложное для синтеза, потому что в тексте эмфазы выделяются в лучшем случае курсивом или жирным шрифтом (или вообще никак не выделяются).

Как использовать новую фичу?

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

  • Для эмфаз просто выделить нужное слово двойными звёздочками: эта булочка **очень** вкусная!;

  • Для восклицаний достаточно использовать восклицательный знак в конце предложения;

  • Если вопрос общий, то для максимальной выразительности следует выделить интонационный центр одинарными звёздочками. Для альтернативных, специальных или вопросов-хвостиков можно не указывать интонационный центр (если указать, будет получше звучать).

На практике, вот примеры как это использовать:

texts = [
  'Организаторы прислали нам электронные билеты!',
  '**Организаторы** прислали нам электронные билеты.',
  'Организаторы **прислали** нам электронные билеты.', 
  'Организаторы прислали нам **электронные** билеты.', 
  'Организаторы прислали нам электронные **билеты**.', 
  '*Организаторы прислали нам электронные билеты?',
  'Организаторы *прислали* нам электронные билеты?',
  'Организаторы прислали *нам* электронные билеты?',
  'Организаторы прислали нам *электронные* билеты?',
  'Организаторы прислали нам электронные *билеты*?'
]

for i, text in enumerate(texts):
    audio = model.apply_tts(text=text, speaker='xenia')

Пакет pip и примеры запуска

Мы уже писали про pip-пакет, pip install silero. Если использовать его, то минимальный код запуска выглядит уже совсем лаконично:

!pip install silero
from silero import silero_tts
model, example_text = silero_tts(language='ru',
                                 speaker='v5_6_ru')
audio = model.apply_tts(text=example_text)

Полный код запуска, например с использованием torch.hub со всеми флагами уже выглядит вот так (подробнее можно потыкать в интерактивном ноутбучке):

import torch

language = 'ru'
model_id = 'v5_6_ru'
device = torch.device('cpu')
model, example_text = torch.hub.load(repo_or_dir='snakers4/silero-models',
                                     model='silero_tts',
                                     language=language,
                                     speaker=model_id)
model.to(device)  # gpu or cpu
sample_rate = 48000
speaker = 'xenia'
put_accent=True
put_yo=True
put_stress_homo=True
put_yo_homo=True

example_text = 'Меня зовут Лева Королев. Я из готов. И я уже готов открыть все ваши замки любой сложности!'

audio = model.apply_tts(text=example_text,
                        speaker=speaker,
                        sample_rate=sample_rate,
                        put_accent=put_accent,
                        put_yo=put_yo,
                        put_stress_homo=put_stress_homo,
                        put_yo_homo=put_yo_homo)

ssml_sample = """
              <speak>
              <p>
                  Когда я просыпаюсь, <prosody rate="x-slow">я говорю довольно медленно</prosody>.
                  Потом я начинаю говорить своим обычным голосом,
                  <prosody pitch="x-high"> а могу говорить тоном выше </prosody>,
                  или <prosody pitch="x-low">наоборот, ниже</prosody>.
                  Потом, если повезет – <prosody rate="fast">я могу говорить и довольно быстро.</prosody>
                  А еще я умею делать паузы любой длины, например, две секунды <break time="2000ms"/>.
                  <p>
                    Также я умею делать паузы между параграфами.
                  </p>
                  <p>
                    <s>И также я умею делать паузы между предложениями</s>
                    <s>Вот например как сейчас</s>
                  </p>
              </p>
              </speak>
              """

audio = model.apply_tts(ssml_text=ssml_sample,
                        speaker=speaker,
                        sample_rate=sample_rate)

Вместо вывода

Мы, наконец-то, собрали весь набор фич, к которому стремились долгое время. Ещё неплохо было бы добавить управление субъективной громкостью речи, но пока предметно руки не дошли за это взяться.

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

Не секрет, что мы давно готовим большое обновление именно акустического звучания синтеза речи, но тут пока не будем забегать вперёд, есть очевидные и более простые правки таких моделей как v5_cis_base, например.

Автор: snakers4

Источник