Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.philol.msu.ru/~otipl/SpeechGroup/publications/dialog~1.doc
Дата изменения: Thu Mar 10 15:18:35 2005
Дата индексирования: Sat Dec 22 14:09:53 2007
Кодировка: Windows-1251

Дата создания: 14.01.98
Дата последнего изменения: 12.03.98

ИНСТРУМЕНТАРИЙ ДЛЯ РАЗРАБОТКИ

СИСТЕМЫ СИНТЕЗА РЕЧИ


Г. С. Строкин
grg@philol.msu.ru






В докладе рассматривается один из возможных подходов к проблемам разработки
и машинной реализации алгоритмов автомати?еского синтеза ре?и. Доклад
основывается на опыте разработки новой версии системы конкатенативного
синтеза для русского языка, созданной на филологи?еском факультете МГУ.
Особое внимание уделяется встроенному в нашу систему специальному
формальному языку, который первона?ально был создан для описания модуля
автомати?еской фонети?еской транскрипции, но затем был усовершенствован с
целью использования его практи?ески на всех этапах преобразования
орфографи?еского текста в ре?ь.






1 Введение

Системы автомати?еского синтеза типа 'текст ( ре?ь' (text-to-speech)
озву?ивают произвольный текст на естественном языке, т. е. осуществляют
преобразование орфографи?еского текста на некотором языке в звуковой
сигнал. В процессе работы над реализацией алгоритма синтеза на компьютере
осуществляется переход от описания самого алгоритма на естественном языке к
программе, которая может выполняться машиной. При этом оказывается, ?то
прямой переход от лингвисти?еских алгоритмов к программе на одном из
универсальных языков программирования - довольно сложная зада?а, которая
осложняется еще и тем, ?то состояние современной науки пока не позволяет
говорить о существовании идеального алгоритма синтеза для какого бы то ни
было языка, и разработка и описание самих лингвисти?еских принципов,
лежащих в основе алгоритма синтеза, находятся еще на этапе исследования.
Следовательно, недостато?но один раз перевести описание алгоритма в
машинную программу (осуществить так называемую (кодировку(), а требуется
многократно изменять фрагменты лингвисти?еского описания и проверять их
действенность после повторного внесения изменений также и в машинную
программу. Тут возникает желание, а на наш взгляд, даже необходимость,
создать некоторую инвариантную запись алгоритмов, которая была бы
одновременно пригодна как для непосредственного восприятия ?еловеком и
осуществления оперативных изменений в алгоритме, так и для
непосредственного понимания и выполнения машиной. Подходит ли в роли такой
инвариантной записи текст программы на одном из традиционных языков
программирования? Как мы постараемся показать далее, нет.


1 Универсальные vs. специализированные языки программирования

Примеры универсальных языков программирования - Си и Паскаль. Под
универсальностью языка понимается возможность реализовать на нем любую
зада?у, которая требует использования ЭВМ. Универсальность - достоинство
языка, но оно же и его недостаток: отстутствие ориентированности на
конкретный тип зада? порождает большие сложности при реализации этих зада?,
так как для выполнения действий, элементарные для данной области не
предусмотрено стандартных и простых процедур. Лэрри Уолл, специалист по
лингвистике и computer science, создатель языка программирования Перл,
пишет по этому поводу следующее: (Of course, if your job is programming,
you can get your job done with any "complete" computer language,
theoretically speaking. But we know from experience that computer
languages differ not so much in what they make possible, but in what they
make easy. At one extreme, the so-called "fourth generation languages"
make it easy to do some things, but nearly impossible to do other things.
At the other extreme, certain well known, "industrial-strength" languages
make it equally difficult to do almost everything(. Когда лингвист
описывает зада?у преобразования текста в ре?ь, а также отдельные этапы
этого преобразования, он оперирует лингвисти?ескими (в ?астности,
фонологи?ескими) понятиями типа (фонемати?еская мягкость( или (побо?ное
ударение(. Давайте посмотрим, как можно реализовать на универсальном языке
программирования простейшие инструкции лингвиста (даже не используюшие этих
понятий), касающиеся этапа преобразования орфографи?еского текста в
фонети?ескую транскрипцию. Далее приведен пример зада?и и ее решения на
языке Паскаль.

Непроизносимые гласные:

Со?етания "вств" и "стн" транскрибируются как [ств] и [сн]
соответственно, т. е.:
1) /вств/ -> [ств]
2) /стн/ -> [лнц]

Реализация двух данных правил на языке Паскаль:

program transcription;
var
Word: String;
I, J, K: Integer;
begin
Write('Введите слово: '); ReadLn(Word);
K := Pos('вств', word);
while (K <> 0) do
begin
delete(Word, K, 1);
K := Pos('вств', Word);
end;
K := Pos('стн', Word);
while (K <> 0) do
begin
delete(Word, K+1, 1);
K := Pos('стн', Word);
end;
WriteLn('Транскрипция: ', Word);
end.

Как видно из примера, два правила, изложенные в лингвисти?еском описании,
реализуются программой в двадцать с лишним строк. Нетрудно заметить, ?то а)
такая запись о?ень громоздка, б) она трудна для восприятия, в) она
совершенно не имеет ни?его общего с записью, естественной для лингвиста и
поэтому плохо отражает суть происходящих преобразований. А если бы мы ?уть-
?уть усложнили правила, введя несколько слов-исклю?ений, требуя проверить,
не является ли транскрибируемое слово производным от одного из них,
программа увели?илась бы в два раза или более.


2 Предлагаемый подход к проблеме

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

"В", "С", "Т" , "В" -> "С", "Т", "В"
"С", "Т", "Н" -> "С", "Н"

Попытка реализации одного из лингвисти?еских модулей на этом языке в
надежде на зна?ительное упрощение программы оказалась настолько уда?ной,
?то мы заново переписали на этом языке и все остальные модули системы,
реализовав на обы?ном языке программирования (С++) лишь (техни?еские
детали( и сам обработ?ик языка. Далее будет рассмотрено общее строение
новой версии нашей системы, и будет показано место специализированного
языка в ней и возложенные на этот язык функции.


3 Общее устройство системы

Поскольку, как было показано, универсальные языки программирования
совершенно не подходят для зада? преобразования типа 'текст ( ре?ь', в
нашей новой системе процесс преобразования 'орфографи?еский
текст ( управляющая структура для блока озву?ивания' (см. о ней в разделе
(Кодировщик() полностью описывается и осуществляется с помощью правил,
записанными на специально разработанном языке. Поэтому написанный на C++
модуль обработки и выполнения правил в принципе не имеет отношения
собственно к синтезу и довольно невелик по размеру (5000 строк) по
сравнению с примерно таким же размером продолжающих расти текстов
лингвисти?еских модулей.

В целом устройство системы представлено на следующей схеме:

A. Собственно программа синтеза (библиотека синтеза)
1. Блок предобработки текста
2. Блок морфологи?еского анализа
3. Блок лингвисти?еской обработки
a) обработ?ик формального языка лингвисти?еских модулей
b) лингвисти?еские модули
4. Блок озву?ивания
B. Интегрированная среда разработ?ика ('оболо?ка')
1. Текстовый редактор
2. Интерфейс с библиотекой синтеза
a) компиляция правил
b) настройка параметров синтеза
c) собственно осуществление синтеза

Далее будут даны комментарии ко всем блокам системы, а в оставшейся ?асти
доклада внимание будет сосредото?ено на блоке лингвисти?еской обработки
(A.2), поскольку именно он осуществляет основную ?асть преобразования
'текст ( ре?ь', преобразуя предобработанный орфографи?еский текст в
управляющую структуру для блока озву?ивания (см. ниже).


1 Блок морфологи?еского анализа

Блок морфологи?еского анализа появился в системе недавно. Он представляет
из себя полностью автономную библиотеку, написанную Г. Сидоровым и
вклю?ающую в себя данные граммати?еского словаря Зализняка и функции для
анализа и синтеза парадигм с использованием этих данных. В данный момент
блок морфологи?еского анализа используется только для автомати?еской
расстановки ударений в исходном тексте. Механизм для использования
морфологи?еского анализа из других лингвисти?еских модулей еще предстоит
создать.


2 Блок озву?ивания

Коне?ным результатом работы лингвисти?еского блока является управляющая
структура для блока озву?ивания, подклю?аемого на коне?ном этапе
преобразования непосредственно для генерации звукового сигнала. Сам блок
озву?ивания правилами не описывается. Он подклю?ается на заклю?ительном
этапе синтеза для генерации звукового сигнала, и производимые им
преобразования имеют ?исто физи?еский смысл. Более подробно блок
озву?ивания описан в докладе А. В. Бабкина.


3 Оболо?ка

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

Оболо?ка, предназна?енная для разработки и экспериментальной работы над
синтезом, базируется на текстовом редакторе, снабженном специальными
функциями, которые позволяют, не выходя из редактора, осуществлять любые
требуемые операции:

. Создавать и редактировать правила (лингвисти?еские модули),
осуществлять их компиляцию, поиск и исправление возможных ошибок.
. Создавать и редактировать тексты, подлежащие синтезированию.
. Собственно осуществлять синтез, то есть применять написанные правила к
текстам или промежуто?ным представлениям этих текстов и слушать
результаты их озву?ивания.
. Полу?ать промежуто?ное представление текста после любого этапа
преобразования с целью ру?ной обработки или дальнейшего использования
его вне системы, в том ?исле:
5. традиционную фонети?ескую транскрипцию;
6. разные виды просоди?еской транскрипции: фонети?ескую транскрипцию с
разделением на синтагмы и указанием типов интонационных конструкций;
фонети?ескую транскрипцию с указанием длительности (в мс.) и высоты
(в полутонах) каждого звука; аллофонную транскрипцию; управляющую
структуру для блока озву?ивания; список сегментов с полным списком
всех признаков и их зна?ений.
. Редактировать и осуществлять окон?ательный синтез разных видов
промежуто?ного представления текста (пере?ислены выше), полу?енных на
разных этапах синтеза.
. Наблюдать, пользуясь промежуто?ными представлениями текста и подробным
от?етом (log-файлом), генерируемым системой, за ходом процесса
преобразования текста в ре?ь, а также детально исследовать любой этап
преобразования, проверяя, соответствует ли ожиданиям сущность
производимых преобразований и их результат.
. Экспериментировать с настройкой разных параметров синтеза, совмещая
изменение параметров с прослушиванием сигнала: изменять базовую ?астоту
для данного диктора, ?астотный регистр, ?астотный диапазон, темп,
длительность гласных и согласных.

Планируется также реализация возможности выбора диктора.


4 Лингвисти?еские модули и формальный язык описания правил синтеза

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


1 Правила-продукции

Правила-продукции - наиболее широко используемый тип правил в нашем языке.
Запись и смысл таких правил аналоги?ны традиционным правилам трансформации,
например в порождающей грамматике:

S -> NP VP

Отсутствует традиционное разграни?ение искомого сегмента (ИС) и левого и
правого контекста (ЛК и ПК): все является одновременно и тем и другим. То
есть вместо:

ИС/ЛК/ПК -> ВС(1) ВС(2) ... ВС(n),

(где ВС(i) -- выходной сегмент номер i), пишется:

ИС(1) ИС(2) ИС(3) -> ИС(1) ВС(1) ВС(2) ... ВС(n) ИС(3)

Это позволяет:

1. Иметь контексты любой длины:

ИС(1) ИС(2) ИС(i)...ИС(n) -> ИС(1) ИС(2)...ИС(i) ВС(1) ВС(2)...ВС(m)
ИС(i+2) ... Исn

2. Осуществлять перестановки (менять порядок следования сегментов):

ИС(1) ИС(2) ИС(3) -> ИС(1) ИС(3) ИС(2)

Пример на перестановки. Как уже было сказано, язык правил не привязан к
обработке русского языка. Покажем, как с помощью наших правил может быть
описан имевший место в испанском языке процесс развития со?етаний
aCiV ( aiCV ( eCV, напр. в форме "sepa" (< лат. "sapiam"), subj. от глагола
"saber" знать). В о?ень схемати?ной форме это выглядит так:

V C i V -> V i C V ;(лат. 'sapiam' -> ст.-исп. *'saipa', ср. порт.
'saiba')
a i -> e ;(ст.-исп. *'saipa' -> совр. исп. 'sepa')

На самом деле, эти правила пока не могут быть записаны в таком виде (по
при?инам, которые будут ясны позже). Реальная их запись немного неизящна:

V, C, "i", V -> %1, %3, %2, %4
"a", "i" -> "e" | %1

(?ерез "%i" обозна?ается исходный сегмент из левой ?асти, имеющий
порядковый номер i).


2 Типы и структуры данных


1 Сегменты

Представляют собой набор признаков, среди которых выделяются текстовые
признаки 'имя' и 'слово' (используется в пробелах). Неограни?енный набор
дополнительных признаков состоит из бинарных и ?исловых признаков.


2 Признаки

Всегда ассоциируются с некоторым сегментом, который хранит свой набор
признаков в специальном associative array (hash), имеющемся у каждого
сегмента. Признаки бывают бинарные (диапазон зна?ений - да/нет, 1/0,
истина/ложь и т. д.) и ?исловые (диапазон зна?ений -231 ... +231-1

Признаки идентифицируются текстовыми названиями. Список всех допустимых
названий (=допустимых признаков) описывается в специальном модуле правил,
поэтому для простоты обработки увели?ения быстродействия внутри программы
признаки идентифицируются соответствующими этим названиям порядковыми
номерами.


3 Списки (классы)

Делятся на классы сегментов и списки слов-исклю?ений.

По сравнению с [динами?ескими] признаками сегмента, которые могут принимать
произвольные зна?ения, признак принадлежности сегмента к некоторому классу
являются связанным стати?еским признаком, зависящим от другого признака -
имени сегмента.

Списки исклю?ений представляют собой довольно неуклюжую замену словарю и
предоставляют правилам возможность обращения к разным видам информации,
ассоциированной с разными словами. Примеры объявлений списков будут даны
ниже.


3 Типы правил


1 Правила-объявления

Объявления классов сегментов, списков исклю?ений и предопределенных
переменных (принятых по умол?анию констант).

Способ представления словарей исклю?ений и способ обращения к ним пока не
является удовлетворительным. Все правила-объявления сосредото?ены в одном
модуле, имеющем название "Данные".

Примеры объявлений.

Согласный=Б, В, Г, Д, Ж, З, Й, й, К, Л, М, Н, П, Р, С, Т, Ф, \
Х, Ц, Ч, Ш, Щ, h, j, z
Гласный=А, Е, Е, И, О, У, Ы, Э, Ю, Я, ъ, ь, у, ы

ИсклОГО=МНОГО, СТРОГО, ДОРОГО, ПОЛОГО


2 Более подробно о правилах-продукциях.

Для расширения возможностей поиска нужного контекста помимо названий
классов и конкретных имен сегментов в левой ?асти правил могут также
употребляться:

1. Название бинарного признака, которым должен обладать искомый сегмент,
или название ?ислового признака с указанием нужного зна?ения. Примеры:
Мягкость
Длительность(100)

2. Одна из встроенных функций: (Слог, ИзСписка, ПроизвОт, Найден(.
Специальная функция 'Найден', проверяющая, есть ли какой-нибудь сегмент
нужного класса или с нужным признаком на любом расстоянии слева или
права от текущего сегмента.
Пример. Проверить, находится ли текущий сегмент в заударном слоге:

Найден(Гласный, Ударение, Слева, вГраницахСлова)

3. Любое логи?еское выражение, в ка?естве аргументов которого могут
употребляться имена, классы и зна?ения признаков. Пример. Найти звук "й"
или любой мягкий зубной согласный кроме "л":
"й" ИЛИ (Зубной И Мягкость И НЕ "л")

В правой ?асти правил может встре?аться функция (Соотв(, которая переводит
сегмент одного класса в соответствующий ему сегмент другого класса.
Например, правило ассимиляции по глухости-звонкости записывается так:

ШумнЗвонк, ШумнГлух -> Соотв(%1, ШумнЗвонк, ШумнГлух), %1
ШумнГлух , ШумнЗвонк & ! "В" -> (Соотв(%1, ШумнГлух, ШумнЗвонк)) , %2



4 Общее устройство блока лингвисти?еской обработки


1 Данные

Все правила-объявления, т. е. определение классов сегментов, списков слов,
?исловых констант, набора возможных признаков, находятся в модуле (Данные(.
Этот модуль используется всеми остальными ((процедурными() модулями.


2 Транскриптор

Транскриптор имеет следующее устройство:

A. Предварительная обработка (пока недостато?на)
B. Собственно транскриптор:
1) 'словесный транскриптор', разбиение на фонети?еские слова,
маркировка ?асти?ных клитик.
1) просоди?еский транскриптор:
(a) расстановка степеней редукции
(b) определение длительности звуков (в мс)
(c) коррекция выбранной ИК.
(d) Общая параметризация для всех типов ИК.



3 Модули дополнительной параметризации

Отдельные для каждой ИК. Применяются к синтагме после просоди?еского
транскриптора. Реализация новой универсальной параметризации должны свести
к минимуму объем дополнительной параметризации.


4 Правила мелоди?еского оформления (интонационные правила)

Каждая ИК обрабатывается своим модулем. Синтагма предварительно
подвергается дополнительной параметризации в зависимости от ИК (см. выше).
Параметризованные слоги имеют набор параметров, кодируемый одним ?ислом, в
соответствии с которым выбирается номер правила, которое должно быть
применено к данному слогу. Правила мелоди?еского оформления имеют
специальную нотацию, более удобную для данной зада?и. Потом эта нотация
автомати?ески приводится к виду стандартных правил-продукций.


5 Кодировщик.

Кодировщик применяется на коне?ном этапе преобразования, после применения
модулей мелоди?еского оформления. Мы ограни?имся приведением примера
управляющей структуры, которая передается блоку озву?ивания по окон?ании
работы кодировшика:

|Код |Длительность |На?альная |Коне?ная |Дополнительны|
|аллофона | |?астота |?астота |е параметры |
|710304 |85 |168 |183 | |
|931616 |62 |183 |199 | |
|330104 |100 |0 |0 |a70 |
|851618 |206 |158 |126 |f126 70 |

Цифровое представление аллофонов - особенность реализации аллофонной базы
данных. Первые две цифры кодируют определенным образом звук, следующие две-
тип левого контекста, и следующие - тип правого контекста. По такому коду
блок озву?ивания обращается к базе данных для полу?ения нужного аллофона. В
правилах кодировщика используются специальные возможности работы с
сегментами ?ислового типа.


5 Особенности реализации языка описания правил

Разработка (скелета( языка и его реализация велись в о?ень ограни?енных
временных пределах, поэтому при создании синтаксиса основным принципом была
предельная простота и быстрая реализация синтакси?еского анализа. По этой
при?ине язык пока несколько неизящен, ?то, в про?ем, пока не мешает ему
справляться с возложенной на него зада?ей.

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


1 Недостатки

Если бы были неограни?енно доступны другие специализированные языки,
возможно, создание своего языка бы не потребовалось, и стоило бы или
встроить в систему один из уже имеющихся языков, некоторые из которых
намного превосходят по возможностям наш язык: Delta (Eloq. tech.), DATR,
(язык для ЛП( (мощными возможностями обладают также специализированные
языки для обработки текстов AWK и PERL) или детально изу?ить их
возможности и создать новый язык, объединяющий возможности нескольких
разных языков.

К сожалению, наш язык пока сильно уступает языку Delta, используемому
фирмой (Eloquent Technologies( для реализации синтеза по правилам. Основное
преимущество языка Delta - многоуровневая обработка данных с возможностью
попеременно обращаться к каждому из уровней. В нашем языке пока существует
только один уровень - сегментный (сегментам могут соответствовать звуки,
буквы и фонемы. В языке Delta обрабатываемая цепо?ка рассматривается как
несколько связанных друг с другом (потоков(, которые реально соответствуют
одной и той же последовательности, но один из потоков позволяет работать с
синтезируемым фрагментом как с последовательностью слов, второй как с
последовательностью слогов, третий - фонем и т. д., коли?ество уровней
(разукрупнения( не ограни?енно. Реализовать такую многопотоковую концепцию
довольно непросто.

Возможно, в ближайшее время синтаксис нашего языка будет изменен с целью
увели?ения как возможностей языка, так и уровня ?итабельности правил, а
синтакси?еский анализатор будет полностью переписан в терминах грамматики
EBNF (extended Backus-Naur form), поскольку имеется программа (yacc,
bison), осуществляющая автомати?ескую генерацию анализатора на основе такой
грамматики. Будет также сделана попытка ввести многоуровневую обработку
данных (уровень слов, усовершенствованное представление уровня слогов
и т. д.).