[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