[Homeros] И снова ru_tts: подключение любой команды, в качестве синтезатора к "speech-dispatcher"

Max heavy9922 на gmail.com
Ср Янв 27 14:18:40 MSK 2016


Приветствую всех.

Ранее, я уже описывал проблему, из-за которой невозможно подключить 
"ru_tts" к речевому серверу "speech-dispatcher", путём прописывания 
нужных данных в конфигурационном файле, модуля "sd_generic (этот модуль 
предназначен для подхвата синтезаторов, у которых нет своего модуля для 
"speech-dispatcher", но в качестве синтезатора, можно указать любую 
команду).
На самом же деле, никаких проблем нет, есть только моё очень плохое 
знание английского языка. В виду выше изложеного, я хотел бы принести 
свои извенения за то, что ввёл народ в заблуждение.
Так же, я хотел бы публично по благодарить дмитрия падучих, который 
непожалел времени на то, что бы вникнуть в мои проблемы. Уже в который 
раз подтверждается тот факт, что проблема не в том, что в линуксах 
чего-то нету, а в том, что нету доступной документации.

Теперь, собственно, принцип, по которому это всё работает. У речевого 
сервера "speech-dispatcher", есть так называемые модули, для более 
лучшего взаимодействия с синтезаторами. Естественно, наличие модуля для 
конкретного синтезатора речи, зависит от того, написал ли этот модуль 
разработчик. В моём дистрибутиве, эти модули находятся по пути:

/usr/lib/speech-dispatcher-modules/

И их названия, содержат в себе указания на то, что это модули для 
"speech-dispatcher". К примеру - "sd_espeak". Буквы "sd", указывают на 
"speech-dispatcher"; А "espeak" - это название синтезатора.
У каждого модуля, есть конфигурационный файл. Конфиги находятся, 
применительно опять-таки к моему дистрибутиву, по пути:

/etc/speech-dispatcher/modules/

В конфигурационных файлах, как правило, есть ряд параметров, которые 
влияют на поведение модуля для синтезатора. Эти параметры в большинстве 
случаев прокомментированы. Комментарии обозначены решотками или точкой с 
запятой в начале строки, как это в случае с "RHVoice". Перед самим 
параметром, правда, тоже может стоять решотка или точка с запятой в 
начале строки, но это часто указывает на то, что такой параметр либо 
сейчас неиспользуется, и для его использования нужно убрать решотку или 
точку с запятой и изменить значение; Либо указывает на то, что 
закомментированый параметр сейчас используется в своём значении по 
умолчанию, и если надо что-то изменить, то нужно раскомментировать 
строку, и подправить параметр как это нужно конкретному пользователю. 
Обычно комментарий к параметру, раскрывает суть, и контекст его 
использования.
Так же, у "speech-dispatcher", есть конфигурационный файл:

/etc/speech-dispatcher/speechd.conf

Где можно, вчитавшись в комментарии к параметрам, изменить поведение 
"speech-dispatcher" под себя.
Начиная, кажется, с версии 0.8, "speech-dispatcher" сам ищет модули, в 
каталоге

/usr/lib/speech-dispatcher-modules/

И их ненужно прописывать. Более же ранние версии "speech-dispatcher", 
требовали обязательной прописки модуля, в конфигурационном файле 
речевого сервера, о котором было упомянуто выше.

Это было вступление. Дальше, собственно, суть. Об установке синтезатора 
"ru_tts", и по желанию, словаря "rulex", я уже рассказывал в одном из 
своих писем то ли в этой рассылке, то ли в рассылке "homeros". Поэтому, 
я на процедуре установки, останавливатся небуду.

Среди модулей для "speech-dispatcher", есть модуль "sd_generic". Этот 
модуль, как описывалось выше, позволяет подхватить синтезатор или 
что-либо другое, у которого есть командная строка. Можно, к примеру, 
подхватить какой-нибудь речевой сервер, или просто выводить попадающий 
на синтезатор текст, в текстовый файл, ну и тому подобное. Подключение 
синтезатора "ru_tts", базируется именно на этом принципе.
В конфигурационном файле модуля "sd_generic", есть целый ряд переменных, 
которые, вобщем-то, позволяют прикрутить к "speech-dispatcher" 
синтезатор речи не просто так, а ещё и с уровнями пунктуации, шагами 
регулировки скорости, высоты, и так далее. Для пользователя это значит 
то, что при должной настройке, как скорость и высоту, так и пунктуацию, 
можно регулировать из под интерфейса "orca"; Либо же из под интерфейса 
той программы, которая поддерживает речевой сервер "speech-dispatcher".
В качестве примеров конфигурационных файлов, использующих "sd_generic", 
можно рассматривать файлы в каталоге "/etc/speech-dispatcher/modules", у 
которых есть приписка "generic". К примеру - в файле 
"espeak-generic.conf" используется работа "espeak" из командной строки, 
когда в начале из текста, который поступает с речевого сервера, 
создаётся при помощи "espeak", wav-файл и ложится в "/tmp"; а затем - 
этот файл проигрывается, и удаляется. Естественно, все переменные, там 
достаточно хорошо прокомментированы, поэтому человек, хорошо знающий 
английский язык, никаких затруднений испытывать небудет.

Теперь, что касается "ru_tts". В самом простом варианте, нужно создать 
конфигурационный файл "generic.conf", в каталоге 
"/etc/speech-dispatcher/modules". Вот пример моего конфигурационного файла:

GenericLanguage "ru" "ru" "koi8-r"
GenericLanguage "en" "en" "koi8-r"
GenericStripPunctChars "()\"*$="
GenericExecuteSynth \
"echo \'$DATA\' | ru_tts -m -r 0 -p 0.2 | sox -G -D -v 1.0 -t raw -r 
10000 -e signed-integer -c 1 -b 8 - -t raw -e unsigned-integer - | 
paplay --raw --format=u8 --rate=10000 --channels=1"

Последнюю строку, почтовик может разбить на несколько строк, поэтому 
нужно внимательно отнестись к ней.
Что же это, собственно такое:

GenericLanguage "ru" "ru" "koi8-r"
GenericLanguage "en" "en" "koi8-r"

Если вкратце, то указываем кодировку, модуль "sd_generic" сам 
перекодирует текст, поэтому в команде синтезатора, ненужно указывать 
пропуск текста, через утилиту-перекодировщик. Кодировку нужно указывать 
в связи с тем, что синтезатор речи "ru_tts", понимает только кодировку 
"koi8-r".

GenericStripPunctChars "()\"*$="

Здесь, в кавычках, указаны символы, которые я попросил 
"speech-dispatcher", а точнее "sd_generic", игнорировать. Это всё из-за 
того, что "ru_tts" произносит эти символы, и порой это мешает.

GenericExecuteSynth \

Насколько я понял комментарий - это строка указывающая на то, что дальше 
идёт выполняющаяся команда, установленая в качестве синтезатора.

"echo \'$DATA\' | ru_tts -m -r 0 -p 0.2 | sox -G -D -v 1.0 -t raw -r 
10000 -e signed-integer -c 1 -b 8 - -t raw -e unsigned-integer - | 
paplay --raw --format=u8 --rate=10000 --channels=1"

Это, собственно, команда, в которой данные от речевого сервера 
"speech-dispatcher" (переменная $DATA), передаются на синтезатор 
"ru_tts", который подготавливает звуковой поток. Затем, этот звуковой 
поток, попадает на утилиту "sox". "Sox" - это консольный аудио-редактор, 
конвертор, и много чего ещё, для работы со звуком (в том числе и со 
звуком в реальном времени). Знак вертикальной черты указывает на то, что 
результат работы одной утилиты, передаётся другой. В данном случае, мы 
причёсываем формат звука. После "sox", звуковой поток попадает на 
утилиту-плеер звукового сервера (в данном случае на утилиту "paplay", 
которая входит в состав "pulseaudio".
У каждого из звеньев этой цепочки, есть свои параметры. Подробно на 
параметрах "sox", я останавливатся небуду, поскольку врядли смогу 
качественно всё перевести из оффициальной документации. Так же, 
параметры утилиты "paplay", я тоже трогать небуду, там всё просто. 
Отмечу лишь, что звуковой поток, который "ru_tts" создаёт, получается в 
формате "raw". А поскольку при прямой передаче такого потока на "paplay" 
получается мягко говоря нечто странное, то в качестве посредника, мы 
используем "sox". Ну и естественно, что "paplay" по умолчанию, играет 
формат "wav", поэтому нужно указывать конкретные параметры для того, что 
бы "paplay" знал, как переданый ему звуковой поток в формате "raw" 
воспроизводить. Если параметров неуказать, то он будет думать, что поток 
в формате "wav".
Остановлюсь, пожалуй, на параметрах самого "ru_tts". Параметр -r - это 
скорость. Значение 1 - это самое медленное значение; А 0 - самое 
быстрое. Тоесть 0 - это самое быстрое, 0.1 - медленнее, и так до 0.9, 
после чего идёт 1.
-m - это параметр, указывающий на монотонность речи. Разумеется, что это 
моё предпочтение, если кому ненужно, то можно убрать.
-p - это высота. Тоже значение 1 - самое высокое; А 0 - самое низкое. 
Регулируется, по аналогии со скоростью.
Так же, как у высоты, так и у скорости, есть промежуточные значения. 
Скажем - 0.5 для пользователя слишком медленное значение, или слишком 
высокий тон речи; А 0.4 - слишком быстрый темп речи, или слишком низкая 
высота голоса. Можно устанавливать промежуточные значения: 0.41 - это 
чуть медленнее или чуть выше, нежели 0.4, ну и так до 0.49, после чего 
идёт уже 0.5.
Если же кто-то устанавливал словарь "rulex", и предпочитает с этим 
словарём работать в системе, то можно добавить параметр -s и указать 
путь к файлу "rulex.db".

После создания конфига, нужно перезапустить "speech-dispatcher":

sudo killall speech-dispatcher

А затем, в настройках орки, в качестве синтезатора, выбрать "generic".
Так же, файл необязательно должен называтся "generic.conf". Просто если 
его так назвать, то изменения подхватятся сразу же, после перезапуска 
"speech-dispatcher". Но можно назвать конфиг и, скажем - "ru_tts.conf", 
но в этом случае, в "speechd.conf", нужно прописать загрузку с этим 
конфигом.

Вот это, пожалуй, и всё. Добавлю только несколько оговорок:

1. В описаном мною случае, из под орки ничего регулировать нельзя. Это 
не потому, что я так захотел, а потому, что русскоязычной документации 
нету. Поэтому, если я и буду разбиратся с этими переменными, то это 
будет долго. Ну и конечный результат, будет неизвестно когда. Кроме того 
- здесь есть неоднозначности (СМ. пункт 2).

2. Я рассказал о параметрах "ru_tts", которые регулируют высоту и 
скорость. Однако , можно вобще отказатся от параметров скорости и 
высоты, которые предлагает "ru_tts", и регулировать всё утилитой "sox". 
КАк я уже описывал - это полноценный консольный аудио-редактор, со 
всякими эффектами. Тут и эквалайзер, и ускорение звукового потока, без 
смены высоты, и повышение частоты дискретизации и сэмплирования звука... 
Вобщем - много чего. Собственно инструментарий очень многочислен, и 
можно настроить всё не по какому-нибудь шаблону, а исходя из 
предпочтений конкретного пользователя. Иное дело, что все эти штуки, к 
графическому интерфейсу орки не прикрутить. У каждого разное восприятие, 
поэтому для каждого, настройки будут разными. Можно воспользоватся очень 
богатым функционалом того же сокса, но есть сложность: это всё при 
условии, что пользователь сам разберётся, потратит время на изучение 
того же сокса. Все эти штуки, ну никак в графический интерфейс не 
впихнуть,; А если впихнуть хотя бы что-то, то это уже получится 
шаблонное решение, под которое пользователю, которого что-либо 
неустраивает, прийдётся подстраиватся. Вобщем - это всё я к тому, что 
любая попытка что-то кастомизировать таким образом, что бы всё можно 
было крутить из под орки приведёт лишь к раскрытию части всего 
доступного функционала, а не всего, что может предложить используемый 
инструментарий.

3. У самого "ru_tts", есть некоторые странности. Для меня они 
незначительны. К примеру - непроговаривается при наборе мягкий знак, а 
так же некоторые буквы, звучат несовсем внятно.

4. При увеличении скорости, возможен эффект искажения речи. Всё это тоже 
отчасти можно компенсировать соксом.

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

P.S.:
Есть ещё одна хитрость: можно любой синтезатор, для которого есть 
модуль, использовать как два синтезатора. Скажем - у нас есть 
конфигурационный файл "generic.conf", но мы хотим использовать "ru_tts", 
но с какими-нибудь другими параметрами. И что бы каждый раз не 
редактировать конфиг, можно создать новый конфиг с нужными параметрами; 
А в главном файле "speech-dispatcher", прописать загрузку требуемого 
модуля, но указав созданый конфиг. Таким образом, можно создать два 
синтезатора "ru_tts": один конфиг это скажем параметры с которыми мы 
работаем в системе; А второй - для чтения книг или любых других текстов.



Подробная информация о списке рассылки Homeros