[Homeros] ветка украинского языка

i_chay i_chay на rambler.ru
Вт Июн 15 22:04:26 UTC 2010


Приветствую всех.
Михаил пишет:
> В коде
> сервера некоторое знание о украинском языке всё-таки должно быть. 

Вообще-то нет.  Это вы наделяете некоторую последовательность символов такими понятиями как язык (хотя точнее было бы использовать термин 'алфавит').

> Если текст латинский, то
> используем анг. синтезатор, если текст кириллический, то берём
> синтезатор русский. 

Давайте переформулируем: если символ принадлежит множеству из первой таблицы, то активен первый синтезатор, а если множеству из второй таблицы, то -- второй синтезатор.
(По-моему, очевидно уже тут, что само собой напрашивается: если множеству из третьей таблице, то ...)
Видите: никакой латиницы, кириллицы, английского и русского.
Вопрос лишь в том, как поступить, если  существует пересечение двух множеств.
Вы этот момент исключаете, задавая в конфигурационных файлах заведомо не пересекающиеся множества (хотя, конечно, за этим должен был бы следить сервер или его конфигуратор, а не сам пользователь).
Но можно поступить по-другому: во-первых, алфавит можно было бы получать непосредственно от синтезатора (таким образом исключалась бы работа с конфигурационными файлами сервера). Понятно, что совсем правильно было бы получить от синтезатора идентификатор поддерживаемого алфавита (идентификатор поддерживаемого языка или идентификатор поддерживаемой группы символов), а собственно алфавиты (группы) предопределить заранее (или взять стандартные группы символов, если есть подходящие стандарты для данной задачи).
Во-вторых, сервер (а лучше so-модуль) самостоятельно мог бы строить пересечения для имеющихся множеств и объединять синтезаторы по общим (наибольшим) пересечениям в группы. Соответственно, разности множеств и пересечения составляли бы подгруппы в этих группах. То есть синтезатор определялся бы парой группа+подгруппа (в принципе, рекурсию можно продолжать до первой пустой подгруппы, тогда это будет уже не пара, а бболее длинная цепочка).
Активный синтезатор вычислялся бы для каждого слова. Слово обрабатывается посимвольно: если символ привел нас к синтезатору, то слово далее не обрабатывается, а озвучивается.
Если не привел, то в обработку попадает очередной символ. Понятно, что разрешено только движение по нисходящей, т.е. если очередной символ  не попадает в текущую группу/подгруппу и в нижеследующие подгруппы, то это считается концом слова и обработка завершается, а  В качестве синтезатора используется тот, в подгруппе которого оказался предыдущий символ (если это была группа, то используется синтезатор по умолчанию для этой группы или синтезатор с наименьшей разностью).
В итоге это будет обычный конечный автомат, только правила переходов сервер сформирует сам, на основе информации, получаемой от  синтезаторов (ну или из конфигурационных файлов).
Таким образом, сервер не будет ограничен количеством поддерживаемых языков. Если есть русско-англо-арабский текст и соответствующие синтезаторы, то текст будет озвучиваться без правки конфигурационных файлов.
Повторю еще раз, что, в общем случае, это не задача речевого сервера (даже деление текста на латиницу и кириллицу). Информацию о языке червер должен получать от клиента в рамках общей информации о контексте (надо сразу приучать клиентов делать это), а потом передавать эту информацию синтезатору или на основе этой информации подбирать синтезатор.
Поэтому, если все-таки подобный функционал включается в сервер, то, на мой взгляд, реализовывать его имеет смысл как динамически подгружаемый/выгружаемый модуль, который при желании можно вообще не загружать и это не скажется на работоспособности сервера.

    Успехов. Анатолий.


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