SAPI XML TTS для разработчиков
прикладных программ.
XML тэги речевого API (SAPI
5.1) предназначены для управлением процессом синтеза речи и включают в
себя несколько категорий.
-управление настройками речевого синтеза (громкость,
скорость произношения, высота основного тона, интонационное выделение
слов, произнесение слов по буквам)
- тэги прямого управления синтезом, через задание определенных значений
(пауза - миллисекунды, произношение – набор фонем, закладка – символьное
имя+событие)
- управление контекстом речевого синтеза (интерпретация слова, как части
речи и интерпретация специальных элементов: дат, чисел, денег)
- выбор голоса и языка (язык - русский, английский и т. д., голос -
женщины, мужчины или подростка)
Управление настройками речевого
синтеза.
SAPI TTS XML поддерживает пять тэгов, которые управляют
состоянием текущего голоса: громкость, скорость, частота основного тона,
интонационный акцент, побуквенное чтение слова. Действие этих тегов на
синтез очевидно из названия. Рассмотрим кратко примеры их использования.
Volume - уровень громкости. Тэг Volume управляет
громкостью синтезированной речи. Тэг может быть пустой и в этом случае
установленная громкость будет применена ко всему последующему тексту.
Если тэг не пустой, то после закрывающего тэга, уровень громкости будет
установлен в предшествующее значение. Рассмотрим пример не пустых
вложенных тэгов:
<volume level="50">
This text should be spoken at volume level fifty.
<volume level="100">
This text should be spoken at volume level one hundred.
</volume>
</volume>
Как мы видим, тэг volume имеет один атрибут это level. Значение этого
атрибута измеряется в относительных единицах от 0 до 100. Важно
заметить, что значение атрибута volume используется совместно с
внутренним значением уровня голоса, которое устанавливается программно
вызовом ISpVoice::SetVolume. И если вы выполнили команду SetVolume (50)
программно, то применение тега с атрибутом <volume level="50"> приведет
к тому, что уровень громкости понизится до 25 процентов от максимальной
громкости. Примером использование пустого тэга может служить следующая
строка:
Тише!<volume level="40"/> тише, <volume level="60"/>тише мыши! <volume
level="90"/>Котик Васька тут на крыше!
Rate - тэг задающий скорость произнесения речи.
Тэг может быть пустой, т.е. в этом случае установленная скорость будет
действительна для всего теста, следующего за этим тэгом. Тэг имеет два
атрибута Speed и AbsSpeed. Только один из атрибутов одновременно может
быть использован в тэге. Значения атрибутов должны быть целыми в
интервале от -10 до +10. Значения вне этого интервала могут быть усечены
выбранным синтезатором речи, но не SAPI. Разница в атрибутах Speed и
AbsSpeed состоит в том, что AbsSpeed задает абсолютное значение в
интервале -10 до +10, а Speed задает изменение скорости относительно
текущей скорости речи. Пример:
<rate absspeed="5">
Этот текст должен быть прочитан со скоростью пять.
<rate absspeed="-5">
Этот текст должен быть прочитан со скоростью минус пять.
</rate>
</rate>
<rate absspeed="0"/> Скорость произношения заданная по умолчанию.
Для установки скорости чтения по умолчанию используйте программный вызов
ISpVoice::SetRate.
Pitch – тэг управляющий высотой основного тона
голоса. Тэг может быть пустым и имеет два атрибута Middle и AbsMiddle.
Одновременное употребление атрибутов в тэге не допускается. Атрибут
AbsMiddle управляет выбором абсолютного значения высоты основного тона,
а Middle относительным. Пример применения пустого тэга:
<pitch absmiddle="-10"/> Text which follows should be spoken at pitch
negative ten.
<pitch absmiddle="0"/> Text which follows should be spoken at pitch zero.
<pitch absmiddle="10"/> Text which follows should be spoken at pitch ten.
Не каждый речевой синтезатор поддерживает этот тэг. Хотя допустимый
диапазон атрибутов в SDK описан в пределах от -10 до 10, но это не так.
Каждый разработчик сам закладывает допустимый диапазон значений. При
выборе голоса Microsoft Mike замена значений в вышеописанном примере на
числа -100 и 100 даст более заметный эффект изменения частоты основного
тона. Примером не пустого тэга может быть следующая конструкция.
<pitch middle="5">
This text should be spoken at pitch five.
<pitch middle="-5">
This text should be spoken at pitch zero.
</pitch>
</pitch>
Emph- тэг заставляющий синтезатор менять интонацию
при произнесении его содержимого. Тэг не может быть пустым. Действие
этого тэга зависит от реализации в конкретном синтезаторе. Попробуйте на
установленном у вас русскоязычном голосе:
Мышь. Здесь Кошка.
Мышь. Здесь <emph> кошка</emph>.
А теперь пусть голос Microsoft Sam прочитает вам:
Mish zdez koshka.
Mish zdez <emph> koshka.</emph>
Комментарии излишни.
Spell – заставляет голос читать текст по буквам.
Тэг не может быть пустым. Тэг будет полезен когда слово это
аббревиатура. Как я уже говорил не все речевые синтезаторы поддерживают
некоторые тэги. Так «катерина» от ScanSoft версии 1.0 читать по буквам
не умеет, а установленный в XP голос Microsoft Sam читает по буквам
великолепно. Пробуйте:
<spell>EDGE </spell>– Enhanced Datarate for GSM .
EDGE - Enhanced Datarate for GSM.
<spell>ASSIST</spell> Automated Systems Security Incident Support Team.
ASSIST Automated Systems Security Incident Support Team.
Теги прямого управления синтезом.
Три тэга предназначены для непосредственного управления
синтезом. Это Silence - Пауза, Pron- произношение и Bookmark-закладка.
Silence – Пауза. Тэг имеет один атрибут msec –
значение в миллисекундах и должен быть открытым. Пример:
Остановка синтеза на пол секунды <silence msec="500"/> произошла.
Pron- произношение. Тэг задает произношение путем указания в атрибуте
sym набора фонем, которые будут произнесены синтезатором в не
зависимости от содержания тэга. Т.е. вы прямо указываете синтезатору,
как произносить слово или фразу. Тэг может быть пустым. Содержание тэга
синтезатором не произносится, оно необходимо приложению для визуализации
текущего речевого синтеза. В атрибуте sym фонемы отделятся друг от друга
пробелом. Пример из SDK:
<pron sym="h eh 1 l ow & w er 1 l d "/>
<pron sym="h eh 1 l ow & w er 1 l d"> hello world </pron>
Для того чтобы использовать этот тэг вам надо знать набор фонем,
поддерживаемый вашим голосовым синтезатором. Для голосовых синтезаторов
от Microsoft все просто. Смотрим ветку в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSSam\LTS\PhoneConverter
И находим параметр PhoneMap. Его значение:
AA 000a AA1 000a0008 AA2 000a0009 AE 000b AE1 000b0008 AE2 000b0009 AH
000c AH1 000c0008 AH2 000c0009 AO 000d AO1 000d0008 AO2 000d0009 AW 000e
AW1 000e0008 AW2 000e0009 AX 000f AX1 000f0008 AX2 000f0009 AY 0010 AY1
00100008 AY2 00100009 B 0011 CH 0012 D 0013 DH 0014 EH 0015 EH1 00150008
EH2 00150009 ER 0016 ER1 00160008 ER2 00160009 EY 0017 EY1 00170008
EY2 00170009 F 0018 G 0019 H 001a IH 001b IH1 001b0008 IH2 001b0009 IY
001c IY1 001c0008 IY2 001c0009 JH 001d K 001e L 001f M 0020 N 0021 NG
0022 OW 0023 OW1 00230008 OW2 00230009 OY 0024 OY1 00240008 OY2 00240009
P 0025 R 0026 S 0027 SH 0028 T 0029 TH 002a UH 002b UH1 002b0008 UH2
002b0009 UW 002c UW1 002c0008 UW2 002c0009 V 002d W 002e Y 002f Z 0030
ZH 0031
В SDK для английского, китайского и японского есть Phoneme Table
(Таблица фонем). К сожалению, синтезаторы русского языка явно не
раскрывают свой набор фонем, используемый для синтеза русской речи.
Bookmark – закладка. Этот тэг используется для
генерации события «закладка». Получив это событие приложение может его
обработать, а через значение атрибута mark получить символьное имя
закладки. Тэг должен быть пустой.
Пример:
<bookmark mark="bookmark_one"/>
Управление контекстом речевого синтеза.
Теги PartOfSp и
Context обеспечивают контекст текущего голоса. Т.е. они
информируют голос, как правильно интерпретировать некоторые символьные
последовательности. Интерпретация голосом значений атрибутов обоих
тэгов, зависит от самого голоса и может быть изменена.
Тэг PartOfSp информирует голос, какой частью речи является слово(а). Тэг
должен быть закрытым. Атрибут part определяет часть речи, которая
находится в содержании тэга. Возможные значения атрибута - "Unknown", "Noun",
"Verb", "Modifier", "Function", "Interjection". Пример:
<partofsp part="noun"> A </partofsp> is the first letter of the alphabet.
Did you <partofsp part="verb"> record </partofsp> that <partofsp part="noun">
record </partofsp>?
Тэг Context обеспечивает голос информацией, которую он может затем
использовать, чтобы определить, как интерпретировать специальные
элементы: даты, числа, и денежные единицы. Например: запись «03/04/01»
без соответствующего указания не может быть правильно прочитана. Тэг
Context имеет один атрибут id, который и указывает голосу, как правильно
интерпретировать содержание данного тэга. Только несколько значений
атрибута id определены в SAPI. Разработчикам конкретного голоса, самим
позволяется расширять набор возможных значений атрибута id. За более
детальной информацией надо обращаться к документации на используемый
голос.
Пример:
<context id="date_mdy"> 03/04/01 </context> should be March fourth, two
thousand one.
<context id="date_dmy"> 03/04/01 </context> should be April third, two
thousand one.
<context id="date_ymd"> 03/04/01 </context> should be April first, two
thousand four.
Выбор голоса и языка.
Существует два тэга (Voice и Lang) , которые позволяют
менять голос и язык, если конечно они установлены в системе.
Тэг Voice выбирает голос, основываясь на значениях
указанных в атрибутах Age, Gender, Language, Name, Vendor, и
VendorPreferred. Тэг может быть пустым. В этом случае, используется
выбранный голос, для всего последующего за этим тегом текста. Пример:
<voice required="Gender=Female;Age!=Child">
Или
<voice required="Age=Teen">
A teen should speak this sentence - if a female, non-child teen is
present, she will be selected over a male teen, for example.
</voice>
</voice>
В данном случае для текущего языка будет произведена попытка выбрать
женский не детский голос. В ХР без установки дополнительных голосов
будет работать только первый пример. Пример с атрибутом required="Age=Teen"
вызовет ошибку.
Тэг Lang используется для выбора языка. Тэг может
быть пустым. Обратите внимание что тэг Lang это сокращенная версия тэга
Voice. Тэг имеет один атрибут LangId. Для английского языка он 409 а для
русского 419. Числа эти шестнадцатеричные, хотя и пишутся без типичной
приставки "0x". Пример:
<voice required="Language=409">
A U.S. English voice should speak this.
</voice>
<lang langid="409">
A U.S. English voice should speak this.
</lang>
<voice required="Language=419">
Это предложение будет произнесено на русском языке.
</lang>
Более подробную информацию о XML тэгах вы можете найти в Microsoft
Speech SDK SAPI 5.1 в статьях «XML TTS Tutorial» и «XML Schema: SAPI».
Заключение.
Знание XML тэгов
позволяет даже простому пользователю управлять процессом синтеза речи по
своему усмотрению, хотя и в некоторых рамках. Величину этих «рамок»
определяют разработчики конкретных «голосовых движков» Speech Engine. Из
виденных мною движков максимально полно поддержка XML реализована у
фирмы Microsoft. Скорее всего, это связано с тем, что фирма Microsoft
считает развитее речевых интерфейсов одним из важнейших направлений в
развитии интерфейсов Человек-Компьютер. А значит уровень, объем и
финансирование исследований в этой области находится на самом высоком
уровне. Результат налицо. Речевой синтез установленного по умолчанию
голоса Microsoft Sam весьма приличен. Еще боле качественный и чистый
английский голос у синтезатора от AT&T. Размер этого голоса более 450
Мбайт в архиве. Для сравнения: размер speechsdk51.exe с двумя
английскими голосами около 71 Мбайт. Каждый слышавший голоса от
Microsoft может его сравнить с одним из голосов от AT&T на странице http://www.research.att.com/~ttsweb/tts/demo.php.
Разница слышна не вооруженным ухом :) . Чистота синтеза очень хороша!
Кроме того, послушайте, как будет произнесено слово «son» и «daughter»
голосами от Майкрософт и АйТи.. Услышите ли вы ошибку, будет зависеть от
того, какому английскому вас учили. Установка Microsoft Speech SDK так
же изменит произношение некоторых слов. Есть еще хороший и чистый
английский голос от NeoSpeech. На странице http://www.neospeech.com/demo/demo_text.php
вы можете его услышать. Правда, мне показалось, что голоса AT&T
несколько чище. Если голоса от Майкрософт условно бесплатны, то за
голоса от АйТи и NeoSpeech нужно платить. Голос от АйТи в базовой
комплектации стоит 295 вечно зеленых. И это без оплаты трафика за
скачивания 450 Мбайт.( см. http://www.wizzardsoftware.com/products/tools.php).
Офисный системный блок стоит дешевле! Простому «честному» пользователю,
приходится ждать, пока Майкрософт подтянет уровень синтеза своих голосов
до уровня лидера - АтТи.:( . О русских голосах говорить нечего. «Катя»
от ScanSoft да «Николай» от Elan Speech – вот весь наш выбор.
Как говорится: «на безрыбье и рак – рыба». Фестиваль не предлагать.
Кластерный русский голос пока голосом назвать трудно. Единственное
достоинство Фестиваля это его открытость. В общем, подводя итог можно
сказать, что двуязычный синтез среднего качества сейчас возможен и
доступен простому пользователю, желающему заполнить бездарно пропадающее
время. Дорогу на работу, выполнение монотонной механической работы и
т.п. вам поможет скрасить ваш флеш плеер или сотовый телефон, с
записанной в них синтезированной речью. А что вы решите послушать:
книгу, ленту новостей, блоги, содержание своего почтового ящика, урок
истории, литературы или английского - решать ВАМ.
Паламарь
Игорь. 2007 год.