LINUX.ORG.RU

перенаправление вывода pocketsphinx в фаил

 , ,


0

1

Здравствуйте граждане форумчане.

Недавно задался целью настроить голосовое управление системой(Ubuntu) через pocketsphinx(да я знаю что можно julius или вообще через какой нибудь simon но все эти варианты в силу некоторых причин меня не устраивают). Собственно сам poocketsphinx я настроил, он приемлемо распознает мою речь. Настала пора что то сделать с распознанной речью. Поскольку результат прекрасно выводится в терминал первой моей мыслью было сделать так:

pocketsphinx_continuous -inmic yes -hmm zero_ru.cd_cont_4000 -dict ru.dic -jsgf jsgf > file
по идее я должен был получить фаил (а в идеале именованный пайп) с распознанной речью, однако фаил при тесте оказался пуст:( часто советуемые варианты на разных форумах по типу:
pocketsphinx_continuous -inmic yes -hmm zero_ru.cd_cont_4000 -dict ru.dic -jsgf jsgf &> file,
pocketsphinx_continuous -inmic yes -hmm zero_ru.cd_cont_4000 -dict ru.dic -jsgf jsgf > file 2>&1
также не дают ожидаемого результата.

Отдельно отмечу что поток ошибок stderr прекрасно перенаправляется:

pocketsphinx_continuous -inmic yes -hmm zero_ru.cd_cont_4000 -dict ru.dic -jsgf jsgf > file

а вот stdout либо в терминал либо некак:/

второй моей мыслью было наконец почитать документацию, и о чудо судя по man pocketsphinx_continuous существует параметр:

-hyp output file name

однако, он тоже не работает:

pocketsphinx_continuous -inmic yes -hmm zero_ru.cd_cont_4000 -dict ru.dic -jsgf jsgf -hyp file

ERROR: "cmd_ln.c", line 604: Unknown argument name '-hyp'
ERROR: "cmd_ln.c", line 701: Failed to parse arguments list
INFO: continuous.c(293): Specify '-infile <file.wav>' to recognize from file or '-inmic yes' to recognize from microphone.

в этот момент мне стало интересно что такого разработчик мог сделать со своей программой что в терминале результат есть а перенаправить его некуда нельзя. Нашол исходники на гитхабе https://github.com/cmusphinx/pocketsphinx/blob/master/src в которых к слову не нашел следов существования параметра -hyp зато нашол там следующий код:

if (!in_speech && utt_started) {
            ps_end_utt(ps);
            hyp = ps_get_hyp(ps, NULL);
            if (hyp != NULL)
        	printf("%s\n", hyp);
            if (print_times)
        	print_word_times();
            fflush(stdout);

            ps_start_utt(ps);
            utt_started = FALSE;
        }
судя по printf(«%s\n», hyp) и fflush(stdout) программа таки помещает все в стандартный поток вывода. То есть все по идее должно работать, но оно не работает! На этом мои мысли закончились, видимо в моей картине мира есть серьезные пробелы.

Теперь я прошу помощи знающих людей, где я ошибся, что я сделал неправильно и как таки заставить это работать?


Я делал так. Нашёл в исходных кодах код инициализации, тот что при запуске pocketsphinx, скопировал его, может что-то подправил, но уже не помню. Но я делал чтобы команды отправлялись на другой компьютер. Но для диагностики делал вывод printf, и всё работало. Так что вот мой вариант. Найди код инициализации, копируй его, добавь код вывода в файл и скомпилируй. Там в исходном коде сделать замену этому

-inmic yes -hmm zero_ru.cd_cont_4000 -dict ru.dic
Но там есть, и ты должен понять где что менять.

u0atgKIRznY5 ()
Ответ на: комментарий от u0atgKIRznY5

Ну в итоге я примерно так и сделал, просто захардкодил вывод в файл,но хотелось бы понять причины такого мистического поведения

Skrip ()
Ответ на: комментарий от u0atgKIRznY5

Так вроде в stdout оно и пишется, впрочем си я уже почти не помню, но вроде функция printf() пишет все именно в stdout а чтобы в другой поток направить используют fprintf(), или я загоняю?

Но даже отвлекаясь он этого, текст выводится в терминал, на сколько я понимаю в терминал выводятся только потоки stdout и stderr, в stderr в данном случае идут логи, а stdout пуст, как результат работы выводится на терминал - загадка.

У меня просто чувство что я чего-то недопонимаю во всей этой схеме и просто хочу понять чего, какие вообще существуют способы вывести что либо на терминал минуя stdout и stderr?

Skrip ()

Ну вот, если оно то

        if (!in_speech && utt_started) {
            /* speech -> silence transition, time to start new utterance  */
            ps_end_utt(ps);
            hyp = ps_get_hyp(ps, NULL );
            if (hyp != NULL) {
                printf("%s\n", hyp);
                fflush(stdout);
            }

            if (ps_start_utt(ps) < 0)
                E_FATAL("Failed to start utterance\n");
            utt_started = FALSE;
            E_INFO("Ready....\n");
        }
То напиши так.

        if (!in_speech && utt_started) {
            /* speech -> silence transition, time to start new utterance  */
            ps_end_utt(ps);
            hyp = ps_get_hyp(ps, NULL );
            if (hyp != NULL) {
                FILE *file;
                file fopen ( "file", "a" );
                fprintf(file, "%s\n", hyp);
                fclose ( file );
                //fflush(stdout);
            }

            if (ps_start_utt(ps) < 0)
                E_FATAL("Failed to start utterance\n");
            utt_started = FALSE;
            E_INFO("Ready....\n");
        }

u0atgKIRznY5 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.