Теперь silero-tts v5 на русском языке умеет задавать вопросы. silero.. silero. tts.. silero. tts. вопросы.. silero. tts. вопросы. нейросети.. silero. tts. вопросы. нейросети. омографы.. silero. tts. вопросы. нейросети. омографы. русский язык.. silero. tts. вопросы. нейросети. омографы. русский язык. синтез речи.. silero. tts. вопросы. нейросети. омографы. русский язык. синтез речи. синтезатор речи.. silero. tts. вопросы. нейросети. омографы. русский язык. синтез речи. синтезатор речи. ударение.
Созрел вопрос

Созрел вопрос

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

В этот раз мы хотим вас порадовать особенной фичей, которая в большинстве случаев стабильно не работает даже в гигантских моделях синтеза, которые требуют для своей работы на 3-4 порядка больше вычислительных ресурсов и современные серверные видеокарты (наш синтез запускается даже на слабых процессорах).

Как вы догадались, эта фича — это постановка вопросов. Если просуммировать основные текущие фичи:

  • Высокая скорость;

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

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

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

  • Доступны голоса aidarbayakseniyaxenia (eugeneв модель с вопросами доедет чуть позже);

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

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

Послушаем примеры

Илья, общие вопросы:

Ксения, вопросы-хвостики:

Ксения, общие вопросы:

Например, вот эти аудио сгенерированы вот таким кодом:

Скрытый текст
import IPython.display as ipd

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

for i, text in enumerate(texts):
    audio = model.apply_tts(text=text, speaker='xenia')
    ipd.display(ipd.Audio(audio, rate=48000))

Ксения, частные вопросы:

Про вопросы в русском языке

Интонация в общем вопросе на примере

Интонация в общем вопросе на примере

В русском языке существует три основные стратегии маркировки вопросов: грамматическая (порядок слов), лексическая (вопросительные слова, частицы) и просодическая (интонация).

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

Лексическая стратегия (через вопросительное слово и конструкции вроде “не так ли?” или “или”) — самая простая для синтеза, поскольку вопрос однозначно определяется на уровне текста, а просодический контур в целом не слишком отличается от повествовательного.

Однако эта стратегия не используется в общих вопросах (“Ты дома?”), которые в корпусах составляют примерно половину от всей массы вопросов. Просодическая стратегия является самой главной в русском языке и самой сложной для TTS: интонационный акцент может ставиться практически на любое слово, вне зависимости от его позиции или части речи, и от позиции акцента зависит смысл высказывания:

  • Он ПРИШЁЛ? (да, явился наконец-то);

  • ОН пришёл? (нет, пришла его кошка).

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

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

Просто скачайте новую модель и пишите вопросы как обычно. Если вопрос общий, то для максимальной выразительности следует выделить интонационный центр звёздочками.

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

Также добавился параметр intensity=3, отвечающий за “силу” интонации. Но мы рекомендуем его оставить по-умолчанию, то есть всегда 3. В будущем значение по-умолчанию может поменяться, как и сила выразительности. Сейчас 3 соответствует скорее нормальной интонации.

На практике, самые “сложные” общие вопросы (с интонационным центром) выглядят вот так:

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_4_ru')
audio = model.apply_tts(text=example_text)

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

import torch

language = 'ru'
model_id = 'v5_4_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)

Про омографы, скорость и размер модели можно подробнее прочитать в прошлой статье.

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

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

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

Автор: snakers4

Источник

Rambler's Top100