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

Ответить