Speech: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
(Новая страница: «'''Было бы интересно узнать о возможностях речевых движков в LINUX'''»)
Строка 1: Строка 1:
[[Category:Sisyphus]]
'''Было бы интересно узнать о возможностях речевых движков в LINUX'''
 
== Речевые технологии ==
На этой странице рассматриваются основные вопросы работы с речевыми синтезаторами с точки зрения их применения как средства вывода информации при работе на компьютере без зрительного контроля. Сейчас подготовлены к работе следующие синтезаторы:
* festival (с поддержкой русского языка);
* espeak;
* flite;
* mbrola;
* freetts;
* ru_tts.
 
Не все из приведённых синтезаторов удовлетворяют описанной ниже схеме.
 
=== Механизм унифицированной работы с речевыми синтезаторами ===
Идея унифицированного вызова речевых синтезаторов заключается в том, чтобы перенаправлять речевую информацию от всех программ источников не напрямую в синтезатор, а в некоторое промежуточное программное обеспечение для предварительной обработки. Такой подход даёт возможность модифицировать порядок вызова синтезаторов и распространить изменения на все источники речи в системе. Также это позволяет исключить наложение звука при одновременном воспроизведении от разных программ.
 
При рассмотрении вопросов речевого вывода уделяется особое внимание:
* '''расширяемости''' - добавление в систему нового синтезатора или программы-источника не должно требовать модификаций всей системы речевого вывода;
* '''управляемости''' - у пользователя должен быть единый инструмент управления параметрами вывода речи.
 
=== Речевой сервер VoiceMan ===
В '''ALT Linux''' вывод речи выполняет речевой сервер <tt>VoiceMan</tt>. Этот речевой сервер разрабатывался с 2003г. непосредственно для применения в среде '''ALT Linux'''. В него периодически вносятся изменения для более детальной интеграции в общий механизм вывода речи. Тем не менее, он не содержит каких-либо зависимостей на компоненты '''ALT Linux''' и может использоваться в любом дистрибутиве.
 
Функции сервера:
* автоматическое переключение между синтезаторами для обработки разных национальных языков;
* передача текстовой информации для произношения по сети;
* единый конфигурационный файл;
* некоторые возможности по предварительной обработке текста перед произношением;
* полная '''UNICODE''' реализация.
 
Конфигурационный файл может быть собран автоматически при каждом запуске сервера из фрагментов, сохранённых в специальной директории. Это очень важная особенность, плотно используемая в общей системе управления синтезаторами.
 
<tt>VoiceMan</tt> не занимается самостоятельно выводом звука. Другими словами, в нём нет кода, для обращения к какой-либо звуковой библиотеке. Вывод звука выполняет внешняя программа. Вызов каждого синтезатора заключается в порождении новой группы процессов, и передаче главному процессу текста на поток стандартного ввода.
Описание внутреннего устройства <tt>VoiceMan</tt> можно прочитать в [ftp://ftp.altlinux.org/pub/people/msp/VoiceManArchitecture.pdf документе] с описанием архитектуры вывода речи на его основе.
 
В настоящий момент <tt>VoiceMan</tt> имеет следующие недостатки:
* нет возможности дать команду серверу обновить конфигурацию без перезагрузки всего сервера;
* неполная обработка команд <tt>emacspeak</tt>, что приводит к недостаточной регулировке скоростью речи;
* неисследованная ошибка, приводящая к задержке при постраничной прокрутке в <tt>emacspeak</tt>;
* в конфигурационных параметрах синтезатора явно указан вывод звука в <tt>ALSA</tt> через вызов утилиты <tt>aplay</tt>. Нужно сделать замену на специальный скрипт, который будет способен выполнять переключение на утилиту <tt>paplay</tt> пакета <tt>PulseAudio</tt> для случаев, когда требуется программное смешивание звука.
Возможно, это будет не нужно, т. к. <tt>PulseAudio</tt> способен выполнять перехват вывода от <tt>ALSA</tt> нна системном уровне.
 
=== <tt>Speech Dispatcher</tt> и другие варианты речевых серверов ===
Речевой сервер <tt>VoiceMan</tt> не единственный вариант приложения, который способен решать описанные задачи. Также для этих задач может применяться известная разработка <tt>Speech Dispatcher</tt>. Существует возможность распространить приводимую концепцию и на <tt>Speech Dispatcher</tt>, если конфигурационные возможности сервера окажутся достаточно гибкими, чтобы удовлетворять схеме, описанной ниже.<tt>Speech DispatcherБ</tt> упакован и помещён в репозиторий. Любые предложения по его поддержки принимаются и будут рассмотрены. Это утверждение также справедливо и для сервера <tt>multispeech</tt>.
 
ПВ вопросах применения различных серверов речи существует только одно ограничение: <tt>VoiceMan</tt> предпочтительно оставить сервером по умолчанию для программ-чтецов. Это связано с тем, что при установки пользователь должен получать максимально подготовленную и согласованную среду. В настоящий момент этому вопросу уделяется серьёзное внимание.
 
== Как это устроено? ==
=== Директория <tt>/etc/tts.d</tt> ===
Ключевую роль в описываемой схеме играет директория <tt>/etc/tts.d</tt>. Предполагается, что каждый пакет с речевым синтезатором будет добавлять в эту директорию один или несколько файлов, достаточных, чтобы организовать взаимодействие с этим синтезатором каких-либо речевых серверов.
 
Рассмотрим пример : мы хотим установить синтезатор <tt>espeak</tt>. В пакете этого синтезатора присутствуют два файла:
* <tt>/etc/tts.d/espeak.voiceman</tt>
*<tt>/etc/tts.d/espeak-ru.voiceman</tt>
 
Эти файлы содержат необходимую конфигурационную информацию для работы с английским и русским языком в сервере <tt>VoiceMan</tt>. Расширение <tt>.voiceman</tt> обозначает, что конфигурация предназначена именно для сервера <tt>VoiceMan</tt>. Допускается, чтобы в пакете также поставлялась конфигурационная информация и для других серверов. Например, файлы для <tt>Speech Dispatcher</tt> должны иметь расширение <tt>.spd</tt>.
 
Содержимое директории <tt>/etc/tts.d</tt> фактически показывает, какие синтезаторы способны работать с какими речевыми серверами. Содержимое файлов для <tt>VoiceMan</tt> будет приведено ниже.
 
=== Использование файлов из директории <tt>/etc/tts.d</tt> ===
 
Как указывалось выше, сервер <tt>VoiceMan</tt> имеет единый конфигурационный файл, который при запуске составляется из фрагментов. В частности, директория <tt>/etc/voiceman.d</tt> содержит фрагменты, которые будут пристыкованы к главному файлу конфигурации при каждом запуске сервера.
 
Директория <tt>/etc/voiceman.d</tt> должна содержать символьные ссылки на файлы директории <tt>/etc/tts.d</tt>, указывающие, какие именно синтезаторы должны быть использованы в работе сервера. Манипулируя этими ссылками можно получить желаемое сочетание синтезаторов для работы с английским и русским языками. Эти ссылки не нужно создавать вручную. Доступны пять команд, для работы с ними:
 
* <tt>voiceman-available</tt> - перечисляет все синтезаторы, доступные для работы на текущей системе;
* <tt>voiceman-list</tt> - перечисляет синтезаторы, подключенные для работы с <tt>VoiceMan</tt>;
* <tt>voiceman-enable</tt> и <tt>voiceman-disable</tt> - подключают и отключают некоторый синтезатор;
* <tt>voiceman-clear</tt> - отключает все синтезаторы от использования в <tt>VoiceMan</tt>.
 
При помощи этих команд можно выполнить манипуляции, и новая конфигурация будет задействована при следующем старте сервера.
== Установка речевых компонентов на систему '''ALT Linux''' ==
 
Для установки речевого вывода на систему '''ALT Linux''' в репозитории <tt>4.1/branch</tt> доступны следующие пакеты:
* <tt>voiceman-config-espeak</tt> - устанавливает речевой вывод, основанный на синтезаторе <tt>espeak</tt>;
* <tt>voiceman-config-espeak-ru_tts</tt> - устанавливает речевой вывод, используя синтезатор <tt>espeak</tt> для английского языка и <tt>ru_tts</tt> - для русского;
* <tt>voiceman-config-mbrola-ru_tts</tt> - устанавливает речевой вывод, используя синтезатор <tt>mbrola</tt> для английского языка и <tt>ru_tts</tt> - для русского. Доступен только для архитектуры <tt>i586</tt>.
 
Установка любого из этих пакетов выполнит все необходимые конфигурационные операции, которые требуются для работы программ-чтецов. Эти пакеты также можно ставить один поверх другого, как средство изменения конфигурации. В этом случае пакет, который был установлен системе, будет удалён автоматически. Эта операция совершенно безопасна, но изменение конфигурации при помощи средств <tt>VoiceMan</tt> предпочтительнее.
 
== Как упаковать речевой синтезатор в пакет <tt>RPM</tt>? ==
 
В этом разделе приводится сводка требований, которые нужны для правильной упаковки речевого синтезатора. Предположим, что мы упаковываем синтезатор с именем <tt>ttsname</tt>.
* в секцию <tt>Requires:</tt> нужно добавить пакет <tt>tts-base</tt>;
* в секцию <tt>BuildRequires:</tt> нужно добавить пакет <tt>tts-devel</tt>;
* должен присутствовать файл <tt>/etc/tts.d/ttsname.voiceman</tt> с содержимым, которое будет приведено ниже. Указание директории <tt>/etc/tts.d</tt> нужно заменять макросом <tt>%_ttsdir</tt>;
* в секции <tt>%preun</tt> необходимо для каждого <tt>*.voiceman</tt> файла добавить вызов <tt>/usr/sbin/tts-unregister ttsname</tt>, где <tt>ttsname</tt> в данном случае - это имя файла без расширения <tt>.voiceman</tt>. Вызов этой команды отключит использования синтезатора в установленных речевых серверах при удалении пакета.
 
Остановимся на содержимом файла <tt>/etc/tts.d/ttsname.voiceman</tt>. Он должен содержать следующий текст (пример взят из синтезатора <tt>espeak</tt>):
<pre>
[output]
name = "eng_output"
type = command
lang = "eng"
command = "espeak --stdout -p %p -s %r -a %v | voiceman-trim --words | aplay -t raw -f s8 -c 1 -r 22500"
pitch = "0:1:99"
rate = "0:200:90"
volume = "0:0:150"
cap list = "a eigh b bee c see d dee e ee f ef g gee h eighch i ei j jay k kay l el m em n en o oh p pee q quu r ar s es t tee u ou v vee w doubloo x ecs y why z zet"
</pre>
 
Параметры <tt>name</tt> и <tt>type</tt> должны быть все одинаковые и иметь значение из примера. Параметр <tt>lang</tt> указывает язык и должен быть <tt>eng</tt> или <tt>rus</tt>.
 
Параметр <tt>command</tt> содержит текст команды, которую нужно вызвать, чтобы выполнить произношение текста. Предполагает, что сам текст поступит на поток стандартного ввода. В тексте команды могут присутствовать три подстановки : <tt>%v</tt>, <tt>%p</tt> и <tt>%r</tt>. На месте этих подстановок будут вставлено значения соответственно громкости, высоты и скорости речи.
 
Внутренние операции с этими параметрами сервер выполняет в диапазоне от 0 до 100. Перед вызовом команды текущее значение отображается в числовой диапазон, подходящий для конкретного синтезатора, а затем оставляется нужное количество десятичных знаков после запятой. Диапазон и количество знаков после запятой указываются тремя последующими параметрами из примера, где через двоеточие перечисляется количество знаков, нижняя граница и верхняя граница.
 
Последний параметр <tt>caplist</tt> содержит пары подстановок, где на первом месте стоит некоторая буква, а за ней следует короткая строка, которая должна быть озвучена в том случае, если была получена команда прочитать только эту букву. Эта возможность бывает очень полезна, т. к. не все синтезаторы выполняют разборчивое произношение отдельных букв.

Версия от 18:55, 21 августа 2009

Было бы интересно узнать о возможностях речевых движков в LINUX