Русификация речевого синтезатора espeak: Введение

Дата публикации:08.11.2010
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

Несмотря на бурное развитие средств для синтеза русской речи в мире Microsoft, создание русского Open Source синтезатора остаётся по-прежнему большой проблемой. Сегодня известно несколько разработок для среды GNU/Linux. К ним относятся:

  • перспективная разработка Ольги Яковлевой — синтезатор RHVoice;
  • закрытый синтезатор ru_tts, свобода использования которого ограничена, т. к. он не имеет опубликованных исходных текстов;
  • русский голос для синтезатора Festival, разрабатываемый Николаем Шмырёвым.

В сентябре 2006 г. по приглашению автора синтезатора espeak нами была начата новая работа с целью реализации поддержки русского языка. Даже при наличии таких перспективных проектов, как RHVoice, качественная поддержка русского языка в espeak является очень актуальной задачей. Синтезатор espeak используется в качестве синтезатора по умолчанию в некоторых распространённых системах, среди которых Android и Ubuntu Linux. Он построен на основе универсальных алгоритмов, которые пригодны для обработки текстов любого языка. Его разработкой занимается подданный Великобритании — Джонатан Даддингтон. Основной язык синтезатора — английский. К настоящему моменту существует возможность выбора между несколькими его акцентами и голосами. Помимо этого ведётся работа по реализации поддержки других языков, таких как:

  • немецкого;
  • греческого;
  • испанского;
  • итальянского;
  • польского;
  • эсперанто;
  • уэльского и др.

Синтезатор разрабатывается на языке C++ и свободно распространяется под лицензией >GPL v3. Espeak для GNU/Linux реализован как консольное приложение, воспринимающее текст через поток стандартного ввода, и выдающее результат через стандартный выходной поток или посылающее его непосредственно в устройство звуковой карты. Полученная речь может быть сохранена в *.wav файле. Для исключения неоднозначности представления национальных символов входной текст воспринимается в кодировке UTF-8.

В Win32 этот синтезатор поставляется и как консольное приложение, и как компонент к Microsoft Speech API 5.x (также в исходниках предусмотрена возможность сборки синтезатора в виде обычной DLL, благодаря чему он используется как встроенный синтезатор для бесплатной программы экранного доступа NVDA).

Для реализации поддержки русского языка в espeak необходимо знать основные правила русской фонетики. Точнее, необходимо было составить детерминированные правила преобразования буквенного текста в последовательность звуков, произносимых человеком. Эти исследования проведены учёными, и результаты опубликованы в научной литературе. В этой области значительную помощь нам оказал преподаватель фонетики русского языка филологического факультета ТГУ — Дмитрий Катунин. Он обработал накопленные знания, построил список звуков и подготовил формальные правила трансляции букв в звуки. В терминологии espeak звуки речи называются "фонемами". С точки зрения теории русской фонетики такое обозначение не совсем верно. Правильнее было бы их называть именно "звуками" (аллофонами), но поскольку здесь речь идёт только про синтезатор espeak, будем пользоваться термином "фонема", чтобы соблюдать общие традиции терминологии espeak.

Слова входного текста проходят два этапа обработки:

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

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

Правила для получения последовательности фонем хранятся в виде "A, B, C -> D". Где B — это рассматриваемая буква, A и C — контекст окружения этой буквы в слове, и D — это фонема, в которую эта буква может быть преобразована. Контекст окружения может задаваться как конкретными буквами, так и специальными символами, обозначающими группы букв. Правила синтезатора допускают неоднозначное определение таких цепочек. Для разрешения этой неоднозначности синтезатор назначает приоритет каждому правилу, который вычисляется на основе количества букв, задействованных в правиле, и степени конкретности определения контекста окружения. В правилах также можно указывать различия в трансляции в зависимости от ударения.

К сожалению, на текущий момент не известно никаких формальных способов вычисления позиции ударения в слове, поэтому используется заранее подготовленный словарь. Для особых сложных случаев, когда требуется определить правило, не укладывающееся в описанную схему, в синтезаторе можно напрямую на языке C++ реализовать алгоритм дополнительной обработки фонем. Это оказалось очень полезным, т. к. в ходе работы выяснились некоторые особенности русского языка, обработка которых не была предусмотрена стандартными инструментами espeak. К ним относится, например, необходимость анализировать не только позицию ударения в слове, но и отдельно обрабатывать первый предударный слог. Сейчас функция последующей обработки для русского языка содержит свою таблицу фонем, где хранятся правила преобразования для 11 фонем. Существуют и другие сложные случае, как, например, буква "е", которая может преобразовываться в девять звуков. Наконец, синтезатор хранит отдельный словарь для слов-исключений, например, "солнце", где сразу указывается слово и транскрипция к нему. Цепочки правил сохраняются во время разработки в специальный текстовый файл, который потом компилируется во внутренний бинарный формат для упрощения процедуры поиска. При генерации звуков на основе полученной последовательности фонем все фонемы делятся на три группы:

  • гласные;
  • звонкие согласные;
  • глухие согласные.

В espeak гласные звуки всегда синтезируются, звонкие согласные получаются путём смешивания синтезируемых звуков с предварительно записанными шумами голоса. Все остальные звуки просто записаны, например, "ш".

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

Вместе с синтезатором поставляется утилита espeakedit. Это GUI-приложение, написанное при помощи библиотеки WXLib. Оно позволяет визуально редактировать готовые фонемы. Фонема представляется в виде графика кривой, где последовательно можно выбирать форманты и изменять их значения, такие как частота, высота и ширина. Благодаря этим возможностям на основе уже готовых фонем можно получать новые, более верные звуки для некоторого языка. В то же время некоторые из фонем, такие как "р", пришлось синтезировать с нуля, т. к. не нашлось их аналогов в других языках. Для этого производилась запись тех слов, где они встречаются.



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024