pocketsphinx 是否刷新标准输出?

Does pocketsphinx flush stdout?

我一直在修补 CMUSphinx/Pocketsphinx 和 Node.js。我想做的是在后台生成 pocketsphinx_continuous,然后使用节点作为顶部的流量控制层。

但是,pocketsphinx 似乎完全忽略了标准输出。有谁知道这是否是设计使然?如果我通过 CLI 运行 它,我会看到输出如下:

READY....

Listening...

INFO: ngram_search.c(467): Resized score stack to 200000 entries INFO: ngram_search.c(459): Resized backpointer table to 10000 entries

可以从stderror 中看到INFO 和错误输出。 AFAICT READY、Listening 和任何成功的单词识别都看不到,也不会发送到标准输出。

我的节点非常简单,在测试 bash 脚本上运行良好,像 echo:

if(ps == null) {
        //'-logfn','/dev/null', 
        //sudo pocketsphinx_continuous -dict lm/8531.dic -lm lm/8531.lm -kws words.kws  -kws_threshold 1e-40 -logfn /dev/null -inmic yes
        //console.log(process.stdout.write(''));


        ps = spawn('pocketsphinx_continuous', ['-nfft','2048', '-hmm','/usr/local/share/pocketsphinx/model/en-us/en-us', '-dict','lm/8531.dic', '-lm','lm/8531.lm', '-kws','words.kws', '-kws_threshold','1e-40', '-inmic', 'yes']);
        
        //ps = spawn('bash',['test.sh']);
        //ps.stderr.pipe(process.stdout);
        //console.log(ps.stdout.write(''));

        ps.stdout.on('data', function (data) {
          console.log('stdout: ' + data);
        });
        ps.stderr.on('data', function (data) {
          console.log('stderr: ' + data);
        });
    }

此信息只能通过 GStreamer 或类似工具获得吗?提前致谢。

However, pocketsphinx seems to ignore stdout completely. Does anyone know if that is by design?

是的,默认情况下我们没有刷新标准输出。您需要运行 PTY 下的pocketsphinx 或等待程序完成才能获得输出。

在修订版 13156 中我们修复了这个问题,您可以直接更新,然后您应该会在消息解码后立即收到消息。

What I'd like to do is spawn pocketsphinx_continuous in the background and then use node as a traffic control layer on top.

最好直接使用节点绑定而不是spawn:

https://github.com/cmusphinx/node-pocketsphinx

使用 expect package

中的 unbuffer

这是我的例子

$> mkfifo pipe

$> unbuffer pocketsphinx_continuous -inmic yes -keyphrase "ok dag knee" -kws_threshold "e-15" -logfn /dev/null > pipe

在另一个航站楼

&> cat < pipe

它按预期工作...

READY....
Listening...

只需在 spwan 中调用 unbuffer 并将 pocketsphinx_continuous 作为参数传递