在我的GStreamer管道中录音时使用阀门

2 投票
1 回答
1634 浏览
提问于 2025-04-17 23:26

我在管道的阀门上遇到了问题:

self.pipeline = gst.parse_launch(' ! '.join(['autoaudiosrc',
                                              'queue silent=false leaky=2 max-size-buffers=0 max-size-time=0 max-size-bytes=0',
                                              'audioconvert',
                                              'audioresample',
                                              'audio/x-raw-int, rate=16000, width=16, depth=16, channels=1',
                                              'tee name=t',
                                              'queue',
                                              'audioresample',
                                              'audio/x-raw-int, rate=8000',
                                              'vader name=vader auto-threshold=true',
                                              'pocketsphinx lm=%s dict=%s name=listener' % (dir_path + '/pocketsphinx/lisa.lm',dir_path + '/pocketsphinx/lisa.dic'),
                                              'fakesink dump=1 t.',
                                              'valve name=valve drop=0',
                                              'queue',
                                              'flacenc',
                                              'filesink async=0 location=' + self.recording]))

我知道这样创建管道不是最优雅的Python方式,但这样写最容易理解。

把它设置为0可以记录麦克风的声音流到我的文件里,一切都正常。 但是我想默认是关闭的,只有在某个事件发生时(监听一个关键词,用pocketsphinx),再打开这个阀门,然后再把它关上。 可是这似乎不太管用:我的文件还是0字节。

一旦pocketsphinx听到关键词,我就用以下代码打开阀门:

self.recording_valve.set_property('drop',False)

我试着给出一个非常简单的例子来说明这个问题。也许问题不在这部分,但我的调试就是在这里找到的。

想查看整个项目: https://github.com/Seraf/LISA-CLIENT-Linux/blob/pocketsphinx/lisa.tac

这个链接调用了这个类: https://github.com/Seraf/LISA-CLIENT-Linux/blob/pocketsphinx/lib/listener.py

这个类又调用了这个类: github /Seraf/LISA-CLIENT-Linux/blob/pocketsphinx/lib/recorder.py

谢谢你的帮助!

1 个回答

2

这听起来有点傻,但我在快速重写我的文件时,使用“watch”命令监视文件,结果即使设置了1秒的时间间隔,它也没能及时看到文件的变化。

把出问题的那行去掉后,我发现文件内容确实填充得很好。

抱歉打扰大家了。

撰写回答