Homeros/EmacspeakServersNamingPolicy
Именование речевых серверов emacspeak
Автор: Дмитрий Падучих
Имя речевого сервера или симлинка на него - это удобный способ конфигурировать речевой сервер при запуске. Emacspeak уже сейчас использует нечто подобное, хотя и не слишком упорядоченно. Неплохо было бы это дело упорядочить и использовать в речевых серверах, которыми мы пользуемся. Приятно, что если появится соглашение о передаче параметров конфигурации через имя сервера, то им можно будет пользоваться как в самом речевом сервере с минимальной поддержкой в Emacspeak, какая там есть сейчас, так и наоборот, с полной поддержкой в Emacspeak и с сервером, который не поддерживает соглашение. В идеале, конечно, лучше иметь поддержку на обеих сторонах.
Поскольку имя файла довольно ограниченно по длине и ещё должно быть достаточно внятным, я предлагаю помещать туда самое необходимое. Формат имени по моей задумке должен быть такой: протокол_идентификатор_кодировка.
Поля "протокол", "идентификатор" и "кодировка" не должны содержать знак подчёркивания. Два последних поля ("идентификатор" и "кодировка") являются необязательными. Если пропущен идентификатор, но есть кодировка, то мы просто пишем два подчёркивания подряд. Иначе подчёркивание перед полем можно опустить. Поля имеют следующие значения.
Протокол
Emacspeak использует для передачи команд синтаксис Tcl со всеми речевыми серверами, насколько я знаю. Но формат команд для изменения речевых параметров синтезатора внутри q{...} зависит от конкретного речевого сервера. То есть, по сути для разных речевых серверов используются разные протоколы. Причём чтобы выбрать протокол, Emacspeak просто по порядку проверяет, не содержится ли в имени сервера строка с названием протокола. На сегодняшний день это: "outloud", "multispeech", "espeak", "dtk-", "eflite". В таком порядке. Всё остальное конфигурируется как Dectalk, хотя в будущем по умолчанию может быть что-то другое. Эту информацию я и предлагаю помещать в поле "протокол". На самом деле Emacspeak ещё проверяет "ssh" в начале имени сервера, но это на случай, когда сервер запускается удалённо. Думаю, этот случай можно пока пропустить. Но в принципе, если развивать эту идею в самом Emacspeak, то лучше, наверное, было бы перенести эту информацию в "идентификатор", поскольку это информация скорее не о протоколе, а о транспорте. В общем, тут ещё надо подумать.
Для речевого сервера эта информация была бы полезной потому, что на основании её он мог бы решить, как ему обрабатывать команды изменения параметров синтезатора. Как выяснилось, Multispeech-2 не был готов, что внутри квадратных скобок будут команды Dectalk, и не смог их обработать. А если информация об этом была закодирована в argv[0], он мог бы их просто игнорировать или использовать другой алгоритм разбора. С Voiceman на самом деле та же проблема, хотя она ещё и не проявилась вроде бы. Он рассчитан на протокол espeak, но на самом деле получает команды Dectalk. Он их игнорирует, насколько я знаю, но проблема в том, что Orca не обрабатывает особым образом знаки < и > при использовании протокола Dectalk. Они обрабатываются как обычный текст. Как себя поведёт Voiceman, если отключить в Orca обработку пунктуации, и в тексте начнут попадаться эти знаки, сказать трудно.
Идентификатор
Пока я предполагаю, что это поле будет использоваться только для того, чтобы отличать речевые серверы друг от друга, если они используют один и тот же протокол и кодировку. По идее тут должно быть что-то не слишком длинное и понятное для пользователя. Например, espeak_vman_utf-8. Но, наверное, это поле можно использовать и для передачи какой-нибудь информации, специфической для данного сервера. Например, Voiceman мог бы получать в этом поле информацию о том, какую конфигурацию ему следует выбрать для данного соединения, и сообщать об этом voiceman по своему внутреннему протоколу.
Кодировка
Это поле задаёт кодировку, которая будет использоваться для общения с речевым сервером. Это должно быть что-то распознаваемое Emacs как кодирующая система (coding system). То есть, функция coding-system-p должна возвращать t. Но в то же время лучше использовать здесь общепринятое название кодировки, чтобы проще было пользоваться им в речевом сервере. То есть, скажем, koi8-r, но не cyrillic-koi8. Если это поле отсутствует, то речевой сервер использует свой обычный способ для определения кодировки. Берёт значение из файла конфигурации или ещё откуда-нибудь.