Does pocketsphinx flush stdout?



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

然而,pocketsphinx似乎完全忽略了stdout。有人知道这是故意的吗?如果我通过CLI运行它,我将看到输出如下:

准备……

听……

INFO: ngram_search.c(467):调整分数堆栈大小为200000项INFO: ngram_search.c(459):调整反向指针表的大小到10000项

INFO和error输出可以从stderror中看到。AFAICT的READY, Listening和任何成功的单词识别不能被看到,并且没有被发送到stdout。

我的节点非常简单,在测试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或类似的方式获得吗?

使用期望包中的unbuffer

下面是我的例子

$> mkfifo pipe

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

在另一个终端

&> cat < pipe

It works as expected…

READY....
Listening...

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

然而,pocketsphinx似乎完全忽略了stdout。有人知道这是故意的吗?

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

在13156版中,我们修复了这个问题,你可以更新,然后你应该在解码后尽快收到消息。

我想做的是在后台生成pocketsphinx_continuous,然后使用node作为顶部的流量控制层。

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

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

最新更新