Lex:
>> Надеюсь, что в утилите конвертации Вы позаботились об уменьшении
>> задержки. При построении цепочки процессов, объединённых в конвейер,
>> задержка всей цепочки, очевидно, не меньше, чем у составляющих
>> процессов.
Le> Не знаю, возможно есть какие-то специальные трюки, чтобы уменшить эту
Le> самую задержку. Я неписал раньше конвеерных утилит. Приведу текст своей
Le> программы полностью, авось кто из экспертов что-то посоветует?
Это вопрос буферизации. Чтобы уменьшить задержку, нужно, чтобы программа
брала только то, что доступно в данный момент, и отдавала сразу же после
обработки. В Вашей программе cin.read ждёт, пока в cin не появится
достаточно данных для заполнения buf, а cin.write копит вывод в своём
буфере. Если бы эту программу писал я, то сделал бы так (грубая версия без
обработки ошибок, непроверенная к тому же).
#include <stdint.h>
#include <unistd.h>
#define STDIN 0
#define STDOUT 1
#define TOGGLE 0x80808080
#define BUFSIZE 1024
uint32_t buf[BUFSIZE];
int main(void) {
int i, n, nw, units;
char *p;
while ((n = read(STDIN, buf, sizeof(buf))) > 0) {
units = (n >> 2) + (n & 3? 1 : 0);
for (i = 0; i < units; i++)
buf[i] ^= TOGGLE;
p = (char *)buf;
while (n > 0 && (nw = write(STDOUT, p, n)) > 0) {
n -= nw;
p += nw;
}
}
return 0;
}
[...]
Le> О задержке вначале и я. С прерыванием у меня все отлично.
Тут есть несколько факторов. Задержка в начале может быть из-за того, что
синтезатор в самом начале создаёт маленькую паузу в звуковом потоке. AFAIK,
в Voiceman есть даже специальная утилита trim, которая её удаляет. Ещё один
фактор - время запуска самих процессов. Его можно уменьшить, если удастся
сократить число процессов, или запускать процессы заранее. Третий фактор -
задержка, возникающая из-за того, что процессам в конвейере, как ни крути,
нужно читать вход и писать на выход. Если все процессы делают это
эффективно, как в приведённой программе, то уменьшить эту задержку можно
только за счёт уменьшения числа процессов.
>> Про Voiceman не скажу, но Multispeech 1, как я помню, вызывает синтезатор
>> для каждой команды q {...} отдельно. А Emacspeak определяет конец
>> фрагмента для q {...} после знака пунктуации, за которым идёт знак
>> пробела.
Le> А какой в этом глубинный смысл?
В чём, в Multispeech или Emacspeak? В случае Multispeech смысл в простоте,
наверное.
[...]
Le> Еще, если я вдруг решусь занятся портированием newfon'а с использованием
Le> winelib, какой интерфейс для синтезатора делать? Вариант, реализованый в
Le> ru_tts мне не нравится из-за необходимости запуска процесса на каждый
Le> чих. С winelib это будет еще более громоздко,
В таком случае нужно предусмотреть возможность обработки команд изменения
параметров во входном потоке синтезатора или какой-то другой способ
управления. AFAIK, в eSpeak для этой цели служит разметка входного текста в
формате SSML. У Dectalk команды заключаются в квадратные скобки (кстати,
некий документ с описанием для Software Dectalk есть).
--
Дмитрий Падучих
--
Blinux-rus mailing list
[email protected]
http://www.a11ywiki.org/cgi-bin/mailman/listinfo/blinux-rus