我一直在摆弄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