Есть приложение julius, которое на stdout шлет текст, который оно распознало с микрофона. Я грепаю вывод для очистки от ненужных сообщений:
(ниже «<<< please speak >>>» выводится как-то хитро через curses - то появляясь, то изчезая)
Сразу после включения:
$ ./julius-start.sh | grep 'sen'
<<< please speak >>>
После голоса в микрофоне:
$ ./julius-start.sh | grep 'sen'
sentence1: <s> PHONE JOE </s>
<<< please speak >>>
Снова бзданул в микрофон:
$ ./julius-start.sh | grep 'sen'
sentence1: <s> PHONE JOE </s>
sentence1: <s> DIAL OH </s>
<<< please speak >>>
Итак, все нормально - вывод грепается.
Теперь, если я просто подключу второй греп (который 100% сработает) - вывода никакого нет:
После продолжительных пердений в микрофон и мигания строки "<<< плз говорите >>>".
$ ./julius-start.sh | grep 'sen' | grep 'ten'
<<< please speak >>>
Я не понимаю, что здесь происходит.
Далее я написал такую утилиту:
$ cat omg.c
main()
{
char buf[128];
while (1) {
memset(buf, 0, 128);
printf("---1\n");
read(0, buf, 127);
printf("---2\n");
printf("read: '%s'\n", buf);
}
}
$ gcc omg.c -o omg
и подключил ее к конвейеру:
$ ./julius-start.sh | grep 'sen' | ./omg
---1
<<< please speak >>>
В результате долгих говорений в микрофон '<< плз бздани >>' мигает (как и положено), но в omg read() блокировался!
Непонимания у меня все больше.
На всякий случай сделал еще так:
$ ./julius-start.sh | ./omg
---1
---2
read: 'STAT: include config: julian.jconf
'
---1
---2
read: 'pass1_best: <s>
sentence1: <s> DIAL TWO </s>
'
---1
<<< please speak >>>^[[A^C
- то есть, все ОК.
Но даже конвейер omg -> omg:
$ ./julius-start.sh | ./omg | ./omg
---1
<<< please speak >>>
молчит как партизан.
Собственно, проблема в том, что данные куда-то теряются после второго конвейeра.
Помогите, знающие люди (кого бы скастовать?).