Здравствуйте!

Прежде всего хочу поблагодарить за столь быстрый и обстоятельный
ответ.

>>>>> "Дмитрий" == Дмитрий Падучих <[email protected]> writes:

    Дмитрий> Самая большая проблема, по-моему, в том, что Multispeech
    Дмитрий> делает большие паузы перед тем, как что-нибудь
    Дмитрий> сказать. Особенно это заметно при вводе текста с
    Дмитрий> побуквенным озвучиванием и при перемещении по пустым
    Дмитрий> строкам (пауза перед звуком пустой строки). Внутри текста
    Дмитрий> после знаков препинания или при переключении на другой
    Дмитрий> голос эти паузы тоже очень заметны. Речь не всегда хорошо
    Дмитрий> прерывается.

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

поначалу я боялся, что скорость отклика пострадает от применения
довольно тяжеловесного механизма предобработки текста, но практика
убедила меня в том, что корень проблемы не в этом, а в механике вывода
звука. Я перепробовал целый ряд различных вариантов. Сначала хотел
использовать библиотеку libao, привлекшую меня своей универсальностью
и простотой. От этой идеи пришлось отказаться, так как там добиться
приемлемого отклика оказалось практически невозможно (по крайней мере
законными методами) из-за идиотской внутренней буферизации. Пробовал я
и старый вариант с внешними проигрывателями, и реализацию подсистемы
звукового вывода своими руками на базе libasound и обращений к
драйверу через соответствующие вызовы ioctl. Но самый хороший вариант
(быстрый, устойчивый и универсальный) получился с PortAudio. Скорость
отклика, по моим субъективным ощущениям, стала не то чтобы сравнимой,
но даже лучшей, чем в старой версии Multispeech, а каких-либо вылетов
я за месяц постоянного использования на двух машинах не наблюдал вовсе
ни разу.

Пробовали ли вы как-нибудь играться с параметром "latency" в
конфигурации?

    Дмитрий> Например, в буфере *scratch* (то есть, выделение голосом
    Дмитрий> там соответствующее и полный режим пунктуации, обычный
    Дмитрий> для меня) есть такие строки:

    Дмитрий> (let ((dtk-program
    Дмитрий> "/opt/multispeech-2.0/bin/multispeech")) (tts-restart))

    Дмитрий> Если при чтении первой из них прервать речь, то
    Дмитрий> Multispeech прерывается, но тем не менее довольно часто
    Дмитрий> всё-таки проговаривает две закрывающие скобки.

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

    Дмитрий> PulseAudio и другие звуковые серверы у меня не запущены.

А у меня как раз работает Esound. Но Multispeech свой звук выводит
мимо него просто на устройство по-умолчанию. У меня здесь звуковуха
Sblive и Ubuntu 7.10 Gutsy. Старый Multispeech в этих условиях тоже
работал без нареканий. На работе же звуковуха
интегрированная. Определяется как I810-audio, если я правильно
помню. Приемлемой работы удалось добиться лишь через aoss, хотя
изредка звук вдруг пропадал по непонятным причинам. После установки
Hardy (Ubuntu 8.04) все стало и вовсе погано: речь пропадала раз по
пять за час работы. Правда, восстанавливалась по "C-e C-s" или
(непонятно почему) при выводе звуков от других источников. Я так и не
понял в чем тут дело. Ведь Multispeech для вывода звука тоже сторонние
программы использовал. Пропадания эти можно было и легко
спровоцировать быстрым потоком событий: например, быстро перемещаться
по тексту вниз или вверх, чтобы строки не дочитывались.

Там тоже у меня стоит Esound. Multispeech же выводит звук на /dev/dsp
через aoss. В этой ситуации все работает идеально. Кое-какие проблемы
появляются лишь при выводе на умолчательное ALSA устройство (как с
aoss, так и без него) при использовании использовании ускорителя. Лишь
сегодня обнаружил, - спасибо Сергею Флейтину. Но и в этом случае
проблемы отнюдь не с откликом. Просто речевые фрагменты не
дочитываются.

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

    Дмитрий> Другая проблема - тяжёлые зависимости. Нужные для сборки
    Дмитрий> библиотеки заняли 164MB свободного места на диске. А если
    Дмитрий> бы я установил Boost 1.37 вместо 1.34, то потребовалось
    Дмитрий> бы на 173MB больше.

Думаю, при современных объемах дисков это не слишком существенно, хотя
обилие зависимостей меня тоже несколько смущает. Тем не менее, я пошел
на это совершенно сознательно, стремясь использовать где можно уже
готовые и отработанные решения. Надеюсь, актуальность связанных с
зависимостями проблем снизится, когда появится готовый пакет, который
можно будет просто взять и установить. Я планирую добавить все
необходимое для сборки Debian-пакета.

    Дмитрий> Лучше, наверное, искать файл конфигурации не в
    Дмитрий> /etc/multispeech.conf, а в ${sysconfdir}/multispeech.conf

А у меня в окружении такой переменной нет.

    Дмитрий> с возможностью задать другой путь в командной строке или
    Дмитрий> в переменной окружения. Для других настроек тоже хорошо
    Дмитрий> бы иметь возможность переопределить значение из конфига в
    Дмитрий> командной строке или в переменной окружения. Например,
    Дмитрий> Multispeech может вызываться с кодировкой koi8-r из
    Дмитрий> Emacspeak и с utf-8 - из Orca.

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

    Дмитрий> Если в файле конфигурации указан неправильный путь к
    Дмитрий> словарю произношения, то вместо Configuration error лучше
    Дмитрий> было бы выдать куда-нибудь предупреждение и использовать
    Дмитрий> значение по умолчанию (то есть, без словаря).

Согласен. Это относится и к другим возможным нефатальным ошибкам. Тоже
учту. Спасибо.

    Дмитрий> Когда Multispeech завершает работу с Configuration error,
    Дмитрий> в колонках слышен щелчок. Возможно, лучше
    Дмитрий> инициализировать звук уже после обработки конфига.

Это довольно трудно устроить, если не вовсе невозможно без глобальной
перестройки программы. Вряд ли игра стоит свеч. Параметры конфигурации
используются только в конструкторах. Порядок же создания объектов
отнюдь не произволен, а тесно связан с их взаимоотношениями. Можно
считать этот щелчок издержкой архитектуры (терпимой, надеюсь) и
использования PortAudio. Без PortAudio его не наблюдалось. Да и сейчас
я его наблюдаю только дома. На работе - нет. Что же касается
PortAudio, то эта издержка оказалась не единственной. Другая мне
кажется более существенной: это некоторый разогрев процессора. Но я
счел, что этим все-таки возможно заплатить за полученные прелести, так
как проявляется это лишь во время речи. Во время молчания все обратно
остывает.

    Дмитрий> Если запустить Multispeech в командной строке, то по C-d
    Дмитрий> он не завершает работу, хотя на команды перестаёт
    Дмитрий> реагировать. К счастью, помогает C-c C-c (в Emacs).

Это я знаю и склонен воспринимать как bug. Тем более, что и устранить
его очень легко. Спасибо, что напомнили.

С уважением,
Игорь.
-- 
Blinux-rus mailing list
[email protected]
http://www.a11ywiki.org/cgi-bin/mailman/listinfo/blinux-rus

Ответить