-->

Pocketsphinx +的Gstreamer竞争条件? Pocketsphinx不能在Pyt

2019-10-18 11:45发布

概述:所以这是一个后续行动,我的最后一个问题( 在这里 )。 我将很快发布对一个完整的答案。 我能够得到pocketsphinx从通过的Gstreamer我的PS3眼睛在Python识别音频输入。 通过指定正确的ALSA设备(HW:1在我的情况)。

问题:我的下一个问题似乎涉及一个微小的竞争条件涉及到我的麦克风已处于使用中并需要能够记录一些东西。

想象一下以下内容:

  1. 我开始了我的蟒蛇守护进程,且目前在听。
  2. 我对我的麦克风说话,说你好斯嘉丽(Pocketsphinx与关键字匹配,现在开始记录所有输入)
  3. 音频,就是要记录在/ tmp /目录下的wav文件,并想呆在那里,直到检测沉默

现在看来,好像,当我开始第3步,麦克风停止工作一次。 我有一些详细的选项跑到揣摩发生了什么事,但检查我的/ tmp /目录都告诉我了:

pi@scarlettpi ~ $ ls -lta /tmp/ | grep wav
-rw-r--r--   1 pi    pi       0 Aug 13 20:57 fsdgjdspi.wav
pi@scarlettpi ~ $

文件大小为0字节。 没有什么是越来越记录。

为了证实我跑的过程中,通过strace的,并证实了我的猜测:

pi@scarlettpi ~ $ strace -p 12416 | tee -a pi.strace.log 2>&1
Process 12416 attached - interrupt to quit
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\1\0\0\0\0\0\0\0", 16)         = 8
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\1\0\0\0\0\0\0\0", 16)         = 8
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\1\0\0\0\0\0\0\0", 16)         = 8
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\1\0\0\0\0\0\0\0", 16)         = 8
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\1\0\0\0\0\0\0\0", 16)         = 8
ioctl(7, 0x80044121, 0xbebd764c)        = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
futex(0x1e47f34, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x1e47f30, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
futex(0x1e45218, FUTEX_WAKE_PRIVATE, 1) = 1
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
ioctl(7, 0x80044121, 0xbebd764c)        = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
gettimeofday({1376379565, 54761}, NULL) = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
open("/usr/local/lib/python2.7/dist-packages/pi-0.1.0-py2.7.egg/static/sounds/pi-listening.wav", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
open("/usr/local/lib/python2.7/dist-packages/pi-0.1.0-py2.7.egg/static/sounds/pi-listening.wav", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
lstat64("/tmp/tmpkTS2Fwpi.wav", 0xbebd73a0) = -1 ENOENT (No such file or directory)
socketpair(PF_FILE, SOCK_STREAM, 0, [19, 20]) = 0
fcntl64(19, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
fcntl64(20, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
brk(0x1f20000)                          = 0x1f20000
socketpair(PF_FILE, SOCK_STREAM, 0, [21, 22]) = 0
fcntl64(21, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
fcntl64(22, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
write(1, "Bossjones Note: Technically we'r"..., 97) = 97
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
stat64("/usr/share/alsa/alsa.conf", {st_mode=S_IFREG|0644, st_size=9184, ...}) = 0
open("/dev/snd/controlC1", O_RDONLY|O_CLOEXEC) = 23
fcntl64(23, F_SETFD, FD_CLOEXEC)        = 0
ioctl(23, UI_DEV_CREATE, 0xbebd6dd4)    = 0
close(23)                               = 0
open("/dev/snd/controlC1", O_RDWR|O_CLOEXEC) = 23
fcntl64(23, F_SETFD, FD_CLOEXEC)        = 0
ioctl(23, USBDEVFS_CONTROL or USBDEVFS_CONTROL32, 0xbebd6f74) = 0
ioctl(23, 0x40045532, 0xbebd6fac)       = 0
open("/dev/snd/pcmC1D0c", O_RDWR|O_NONBLOCK|O_CLOEXEC) = -1 EBUSY (Device or resource busy)
close(23)                               = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
open("/tmp/tmpkTS2Fwpi.wav", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 23
fstat64(23, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f6f000
_llseek(23, 0, [0], SEEK_SET)           = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
stat64("/usr/share/alsa/alsa.conf", {st_mode=S_IFREG|0644, st_size=9184, ...}) = 0
open("/dev/snd/controlC1", O_RDONLY|O_CLOEXEC) = 24
fcntl64(24, F_SETFD, FD_CLOEXEC)        = 0
ioctl(24, UI_DEV_CREATE, 0xbebd6dd4)    = 0
close(24)                               = 0
open("/dev/snd/controlC1", O_RDWR|O_CLOEXEC) = 24
fcntl64(24, F_SETFD, FD_CLOEXEC)        = 0
ioctl(24, USBDEVFS_CONTROL or USBDEVFS_CONTROL32, 0xbebd6f74) = 0
ioctl(24, 0x40045532, 0xbebd6fac)       = 0
open("/dev/snd/pcmC1D0c", O_RDWR|O_NONBLOCK|O_CLOEXEC) = -1 EBUSY (Device or resource busy)
close(24)                               = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(1, " * Listening closely...\n", 24) = 24
clock_gettime(CLOCK_MONOTONIC, {355220, 267713756}) = 0
clock_gettime(CLOCK_MONOTONIC, {355220, 268557726}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 1 ([{fd=3, revents=POLLIN}])
read(3, "-\0\0\0\0\0\0\0", 16)          = 8
clock_gettime(CLOCK_MONOTONIC, {355220, 273415554}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
read(3, 0xbebd828c, 16)                 = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {355220, 277294417}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 280380308}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 282305240}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 284684156}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 286915077}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 290111964}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 291641910}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 293437847}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355220, 295553772}) = 0
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 10705) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {355231, 13213798}) = 0
write(1, " # cancel False False\n", 22) = 22
write(1, " * Not a word in the past 10 sec"..., 49) = 49
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
close(23)                               = 0
munmap(0xb6f6f000, 4096)                = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
gettimeofday({1376379576, 186258}, NULL) = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
open("/usr/local/lib/python2.7/dist-packages/pi-0.1.0-py2.7.egg/static/sounds/pi-cancel.wav", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
open("/usr/local/lib/python2.7/dist-packages/pi-0.1.0-py2.7.egg/static/sounds/pi-cancel.wav", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
ioctl(7, 0x80044121, 0xbebd7ac4)        = -1 EPIPE (Broken pipe)
futex(0xe78524, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0xe78520, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
futex(0xe78500, FUTEX_WAKE_PRIVATE, 1)  = 1
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
futex(0x1b82fec, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x1b82fe8, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
futex(0x1ac5618, FUTEX_WAKE_PRIVATE, 1) = 1
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 1 ([{fd=3, revents=POLLIN}])
read(3, "*\0\0\0\0\0\0\0", 16)          = 8
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
read(3, 0xbebd828c, 16)                 = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, 0) = 0 (Timeout)
poll([{fd=3, events=POLLIN}, {fd=6, events=POLLIN}], 2, -1^C <unfinished ...>
Process 12416 detached

问:我能做些什么,使这项工作?

这里是Python代码。

Listener.py:

import pi
from pi.becore import ScarlettConfig
from recorder import Recorder
from brain import Brain

import os
import json
import tempfile
#import sys

import pygtk
pygtk.require('2.0')
import gtk
import gobject
import pygst
pygst.require('0.10')
gobject.threads_init()
import gst

scarlett_config=ScarlettConfig()

class Listener:
  def __init__(self, gobject, gst):
    self.failed = 0

    self.pipeline = gst.parse_launch(' ! '.join(['alsasrc device=' + scarlett_config.gimmie('audio_input_device'),
                                               'queue',
                                               'audioconvert',
                                               'audioresample',
                                               'queue',
                                               'vader name=vader auto-threshold=true',
                                               'pocketsphinx lm=' + scarlett_config.gimmie('LM') + ' dict=' + scarlett_config.gimmie('DICT') + ' hmm=' + scarlett_config.gimmie('HMM') + ' name=listener',
                                               'fakesink dump=1']))
    listener = self.pipeline.get_by_name('listener')
    listener.connect('result', self.__result__)
    listener.set_property('configured', True)
    print "KEYWORDS WE'RE LOOKING FOR: " + scarlett_config.gimmie('ourkeywords')

    bus = self.pipeline.get_bus()
    bus.add_signal_watch()
    bus.connect('message::application', self.__application_message__)
    self.pipeline.set_state(gst.STATE_PLAYING)

  def result(self, hyp, uttid):
    if hyp in scarlett_config.gimmie('ourkeywords'):
      self.failed = 0
      self.listen()
    else:
      self.failed += 1
      if self.failed > 4:
        pi.speak("" + scarlett_config.gimmie('scarlett_owner') + ", if you need me, just say my name.")
        self.failed = 0

  def listen(self):
    self.pipeline.set_state(gst.STATE_PAUSED)
    pi.play('pi-listening')
    Recorder(self)

  def cancel_listening(self):
    pi.play('pi-cancel')
    self.pipeline.set_state(gst.STATE_PLAYING)

###[ ........MUSIC SUFF HERE........ ]

  def __result__(self, listener, text, uttid):
    struct = gst.Structure('result')
    struct.set_value('hyp', text)
    struct.set_value('uttid', uttid)
    listener.post_message(gst.message_new_application(listener, struct))

  def __application_message__(self, bus, msg):
    msgtype =  msg.structure.get_name()
    if msgtype == 'result':
      self.result(msg.structure['hyp'], msg.structure['uttid'])

这里是recorder.py:

import pi
from pi.becore import ScarlettConfig

import os
import tempfile

import pygtk
pygtk.require('2.0')
import gtk
import gobject
import pygst
pygst.require('0.10')
gobject.threads_init()
import gst

scarlett_config=ScarlettConfig()

class Recorder:
  def __init__(self, listener):
    self.listener = listener
    self.started = False
    self.finished = False
    self.recording = tempfile.mktemp(suffix='pi.wav')

    self.pipeline = gst.parse_launch(' ! '.join(['alsasrc device=' + scarlett_config.gimmie('audio_input_device'),
                                                 'queue',
                                                 'audioconvert',
                                                 'queue',
                                                 'audioresample',
                                                 'queue',
                                                 'vader name=vader auto-threshold=false',
                                                 'fakesink dump=1']))

    print "Bossjones Note: What is the current PIPLINE state BEFORE we're recording" + self.pipeline.get_state()

    self.recorder = gst.parse_launch(' ! '.join(['alsasrc device=' + scarlett_config.gimmie('audio_input_device'),
                                                 'queue',
                                                 'audioconvert',
                                                 'audioresample',
                                                 'audio/x-raw-int,rate=16000,width=16,channels=1,endianness=(int)1234',
                                                 'wavenc',
                                                 'filesink location=' + self.recording]))

    print "Bossjones Note: Technically we're suppose to be recording to this location: " + self.recording
    vader = self.pipeline.get_by_name('vader')
    vader.connect('vader_start', self.__start__)
    vader.connect('vader_stop', self.__stop__)

    bus = self.pipeline.get_bus()
    bus.add_signal_watch()
    bus.connect('message::application', self.__application_message__)
    self.pipeline.set_state(gst.STATE_PLAYING)
    self.recorder.set_state(gst.STATE_PLAYING)

    print " * Listening closely..."
    gobject.timeout_add_seconds(10, self.cancel)

  def start(self):
    self.started = True
    print " * Recording..."

  def stop(self):
    print " * (silence)"
    gobject.timeout_add_seconds(1, self.stop_now)

  def stop_now(self):
    print " # stop_now"
    if self.finished == True:
      self.listener.cancel_listening()
      return

    self.finished = True
    print " * Stored recording to ", self.recording
    self.pipeline.set_state(gst.STATE_NULL)
    self.recorder.set_state(gst.STATE_NULL)

    print " * Converting to FLAC..."
    os.system("ffmpeg -i %s -y %s" % (self.recording, self.recording))
    #os.unlink(self.recording)
    os.system("sox %s %s.final.wav noisered %s/static/noise.prof 0.21" % (self.recording, self.recording, pi.PWD))
    os.system("flac -f --best --sample-rate 16000 -o %s.flac %s.final.wav 2>/dev/null"  % (self.recording, self.recording))
    os.unlink(self.recording + ".final.wav")
    print " * Done."
    self.listener.answer(self.recording + '.flac')

  def cancel(self):
    print " # cancel", self.finished, self.started
    if self.finished == True:
      print " # cancel - noop"
      return

    if self.started == False:
      self.finished = True
      print " * Not a word in the past 10 seconds, cancelling"
      self.pipeline.set_state(gst.STATE_NULL)
      self.recorder.set_state(gst.STATE_NULL)
      self.listener.cancel_listening()

  def __start__(self, vader, arg0):
    print " # vader:start"
    struct = gst.Structure('vader_start')
    struct.set_value('arg0', arg0)
    vader.post_message(gst.message_new_application(vader, struct))

  def __stop__(self, vader, arg0):
    print " # vader:stop"
    struct = gst.Structure('vader_stop')
    struct.set_value('arg0', arg0)
    vader.post_message(gst.message_new_application(vader, struct))

  def __application_message__(self, bus, msg):
    msgtype = msg.structure.get_name()
    if msgtype == 'vader_stop':
      self.stop()
    elif msgtype == 'vader_start':
      self.start()

的最佳方式思考调试这个?

谢谢。

Answer 1:

所以,作为发射线,你想是这样的:

gst-launch alsasrc device=hw:1 ! queue ! 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" ! fvader name=vader auto-threshold=true ! pocketsphinx lm=/home/pi/dev/scarlettPi/config/speech/lm/scarlett.lm dict=/home/pi/dev/scarlettPi/config/speech/dict/scarlett.dic hmm=/usr/local/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k name=listener ! fakesink dump=1 t. ! valve drop=0 ! queue ! wavenc ! filesink location=test.wav async=0

这个想法是,一个alsasrc代表您的麦克风,并因为这可以是一个独占访问,你不应该开始另一个alsasrc访问相同的设备。 这也使得更好的代码,因为你想从你从做语音检测(据我所知)相同的设备录制,并通过你保证,这将是相同的情况下源。

现在,为了在python做到这一点,你应该建立管道“正常”,而不是做解析推出,这意味着你必须初始化每个元素:

self.recording_valve = gst.element_factory_make('valve')

将它们添加到您的管道:

self.pipeline.add (self.recording_valve)

然后将它们链接:

self.recording_valve.link (self.next_element)

......这就是解析推出内部确实,但是,在你开始和停止录制,现在就可以这样做:

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

要开始录制,并

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

停止。

(记得最初设定下降为True,因为它是虚假的默认情况下)

最后一块,你将需要把所有这些组合起来是了解的发球,并请垫。 它可以有任意数量的SRC-垫,你可以做以下链接吧:

self.tee.get_request_pad('src%d').link(self.recording_valve_queue.get_pad('sink'))

基本上,你要求从发球一srcpad,并将其链接到阀门的sink衬垫。 您将需要为每个球座的树枝做两次。

获取所有的启动和运行,你应该有一些作品。



文章来源: Pocketsphinx + Gstreamer Race Condition? Pocketsphinx can't listen to audio + record from it at the same time in Python script?