Speech

Материал из ALT Linux Wiki


Речевые технологии

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

  • festival (с поддержкой русского языка);
  • espeak;
  • flite;
  • mbrola;
  • freetts;
  • ru_tts.

Не все из приведённых синтезаторов удовлетворяют описанной ниже схеме.

Механизм унифицированной работы с речевыми синтезаторами

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

При рассмотрении вопросов речевого вывода уделяется особое внимание:

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

Речевой сервер VoiceMan

В ALT Linux вывод речи выполняет речевой сервер VoiceMan. Этот речевой сервер разрабатывался с 2003г. непосредственно для применения в среде ALT Linux. В него периодически вносятся изменения для более детальной интеграции в общий механизм вывода речи. Тем не менее, он не содержит каких-либо зависимостей на компоненты ALT Linux и может использоваться в любом дистрибутиве.

Функции сервера:

  • автоматическое переключение между синтезаторами для обработки разных национальных языков;
  • передача текстовой информации для произношения по сети;
  • единый конфигурационный файл;
  • некоторые возможности по предварительной обработке текста перед произношением;
  • полная UNICODE реализация.

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

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

В настоящий момент VoiceMan имеет следующие недостатки:

  • нет возможности дать команду серверу обновить конфигурацию без перезагрузки всего сервера;
  • неполная обработка команд emacspeak, что приводит к недостаточной регулировке скоростью речи;
  • неисследованная ошибка, приводящая к задержке при постраничной прокрутке в emacspeak;
  • в конфигурационных параметрах синтезатора явно указан вывод звука в ALSA через вызов утилиты aplay. Нужно сделать замену на специальный скрипт, который будет способен выполнять переключение на утилиту paplay пакета PulseAudio для случаев, когда требуется программное смешивание звука.

Возможно, это будет не нужно, т. к. PulseAudio способен выполнять перехват вывода от ALSA нна системном уровне.

Speech Dispatcher и другие варианты речевых серверов

Речевой сервер VoiceMan не единственный вариант приложения, который способен решать описанные задачи. Также для этих задач может применяться известная разработка Speech Dispatcher. Существует возможность распространить приводимую концепцию и на Speech Dispatcher, если конфигурационные возможности сервера окажутся достаточно гибкими, чтобы удовлетворять схеме, описанной ниже.Speech DispatcherБ упакован и помещён в репозиторий. Любые предложения по его поддержки принимаются и будут рассмотрены. Это утверждение также справедливо и для сервера multispeech.

ПВ вопросах применения различных серверов речи существует только одно ограничение: VoiceMan предпочтительно оставить сервером по умолчанию для программ-чтецов. Это связано с тем, что при установки пользователь должен получать максимально подготовленную и согласованную среду. В настоящий момент этому вопросу уделяется серьёзное внимание.

Как это устроено?

Директория /etc/tts.d

Ключевую роль в описываемой схеме играет директория /etc/tts.d. Предполагается, что каждый пакет с речевым синтезатором будет добавлять в эту директорию один или несколько файлов, достаточных, чтобы организовать взаимодействие с этим синтезатором каких-либо речевых серверов.

Рассмотрим пример : мы хотим установить синтезатор espeak. В пакете этого синтезатора присутствуют два файла:

  • /etc/tts.d/espeak.voiceman
  • /etc/tts.d/espeak-ru.voiceman

Эти файлы содержат необходимую конфигурационную информацию для работы с английским и русским языком в сервере VoiceMan. Расширение .voiceman обозначает, что конфигурация предназначена именно для сервера VoiceMan. Допускается, чтобы в пакете также поставлялась конфигурационная информация и для других серверов. Например, файлы для Speech Dispatcher должны иметь расширение .spd.

Содержимое директории /etc/tts.d фактически показывает, какие синтезаторы способны работать с какими речевыми серверами. Содержимое файлов для VoiceMan будет приведено ниже.

Использование файлов из директории /etc/tts.d

Как указывалось выше, сервер VoiceMan имеет единый конфигурационный файл, который при запуске составляется из фрагментов. В частности, директория /etc/voiceman.d содержит фрагменты, которые будут пристыкованы к главному файлу конфигурации при каждом запуске сервера.

Директория /etc/voiceman.d должна содержать символьные ссылки на файлы директории /etc/tts.d, указывающие, какие именно синтезаторы должны быть использованы в работе сервера. Манипулируя этими ссылками можно получить желаемое сочетание синтезаторов для работы с английским и русским языками. Эти ссылки не нужно создавать вручную. Доступны пять команд, для работы с ними:

  • voiceman-available - перечисляет все синтезаторы, доступные для работы на текущей системе;
  • voiceman-list - перечисляет синтезаторы, подключенные для работы с VoiceMan;
  • voiceman-enable и voiceman-disable - подключают и отключают некоторый синтезатор;
  • voiceman-clear - отключает все синтезаторы от использования в VoiceMan.

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

Установка речевых компонентов на систему ALT Linux

Для установки речевого вывода на систему ALT Linux в репозитории 4.1/branch доступны следующие пакеты:

  • voiceman-config-espeak - устанавливает речевой вывод, основанный на синтезаторе espeak;
  • voiceman-config-espeak-ru_tts - устанавливает речевой вывод, используя синтезатор espeak для английского языка и ru_tts - для русского;
  • voiceman-config-mbrola-ru_tts - устанавливает речевой вывод, используя синтезатор mbrola для английского языка и ru_tts - для русского. Доступен только для архитектуры i586.

Установка любого из этих пакетов выполнит все необходимые конфигурационные операции, которые требуются для работы программ-чтецов. Эти пакеты также можно ставить один поверх другого, как средство изменения конфигурации. В этом случае пакет, который был установлен системе, будет удалён автоматически. Эта операция совершенно безопасна, но изменение конфигурации при помощи средств VoiceMan предпочтительнее.

Как упаковать речевой синтезатор в пакет RPM?

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

  • в секцию Requires: нужно добавить пакет tts-base;
  • в секцию BuildRequires: нужно добавить пакет tts-devel;
  • должен присутствовать файл /etc/tts.d/ttsname.voiceman с содержимым, которое будет приведено ниже. Указание директории /etc/tts.d нужно заменять макросом %_ttsdir;
  • в секции %preun необходимо для каждого *.voiceman файла добавить вызов /usr/sbin/tts-unregister ttsname, где ttsname в данном случае - это имя файла без расширения .voiceman. Вызов этой команды отключит использования синтезатора в установленных речевых серверах при удалении пакета.

Остановимся на содержимом файла /etc/tts.d/ttsname.voiceman. Он должен содержать следующий текст (пример взят из синтезатора espeak):

[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"

Параметры name и type должны быть все одинаковые и иметь значение из примера. Параметр lang указывает язык и должен быть eng или rus.

Параметр command содержит текст команды, которую нужно вызвать, чтобы выполнить произношение текста. Предполагает, что сам текст поступит на поток стандартного ввода. В тексте команды могут присутствовать три подстановки : %v, %p и %r. На месте этих подстановок будут вставлено значения соответственно громкости, высоты и скорости речи.

Внутренние операции с этими параметрами сервер выполняет в диапазоне от 0 до 100. Перед вызовом команды текущее значение отображается в числовой диапазон, подходящий для конкретного синтезатора, а затем оставляется нужное количество десятичных знаков после запятой. Диапазон и количество знаков после запятой указываются тремя последующими параметрами из примера, где через двоеточие перечисляется количество знаков, нижняя граница и верхняя граница.

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