Pocketsphinx + Gstreamer竞赛条件? Pocketsphinx无法在Python脚本中同时收听音频+录音吗? [英] Pocketsphinx + Gstreamer Race Condition? Pocketsphinx can't listen to audio + record from it at the same time in Python script?

查看:105
本文介绍了Pocketsphinx + Gstreamer竞赛条件? Pocketsphinx无法在Python脚本中同时收听音频+录音吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

概述:因此,这是我最后一个问题的跟进工作(

Overview: So this is a follow up to my last problem (here). I will be posting a full answer on that very soon. I'm able to get pocketsphinx to recognize audio input from my PS3 Eye in Python via Gstreamer. By specifying the correct alsa device ( hw:1 in my case ).

问题:我的下一个问题似乎涉及一种微小的比赛情况,涉及我的麦克风已经在使用中,需要能够记录一些东西.

ISSUE: My next issue seems to involve a tiny race condition involving my Microphone already being in use and needing to be able to record something.

想象以下内容:

  1. 我启动了我的python守护进程,它目前正在监听.
  2. 我对着麦克风说话,然后问好Hello Scarlett(Pocketsphinx匹配关键字并立即开始记录所有输入)
  3. 应该将音频记录到/tmp/目录中的wav文件中,并且应该一直保留到检测到静音为止

现在看来,当我开始第3步时,麦克风再次停止工作.我用一些冗长的选项来尝试找出发生了什么,但是检查我的/tmp/目录告诉了我一切:

Now it seems as though, when I begin step 3, the Microphone stops working AGAIN. I ran with some verbose options to try to figure out what happened but checking my /tmp/ directory told me everything:

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

文件大小为0字节.什么都没有记录.

要确认我通过strace运行了该过程并确认了我怀疑的内容,

To confirm that I ran the process through strace and confirmed what I suspected:

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

问题:我该怎么做才能使这项工作成功?

Question: What can I do to make this work?

这是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'])

这是录音机.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()


是否有最佳的调试方法?

谢谢.

推荐答案

因此,作为启动行,您需要这样的内容:

So, as a launch-line, you want something like this:

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来访问同一设备.这也可以提供更好的代码,因为您想要从正在执行语音检测的同一台设备上进行录音(据我所知),并且通过使用同一来源就可以保证确实如此.

The idea is that one alsasrc represents your microphone, and since this can be an exclusive access, you should not start another alsasrc to access the same device. This also makes for better code, since you want to record from the same device you are doing speech-detection from (as I understand), and by using the same source you are guaranteed that this will be the case.

现在,为了在python中执行此操作,您可能应该设置管道 适当地"而不是解析启动,这意味着您必须实例化每个元素:

Now, in order to do this in python, you should probably set up the pipeline "properly" rather than doing parse-launch, meaning you have to instantiate each element:

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

将它们添加到您的管道中:

Add them to your pipeline:

self.pipeline.add (self.recording_valve)

然后链接它们:

self.recording_valve.link (self.next_element)

...这是内部解析启动的操作,但是,在开始和停止记录时,您现在可以执行以下操作:

...which is what parse-launch does internally, however, in your start and stop recording, you can now do:

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

要开始录制,并且

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

停止.

(请记住最初将drop设置为True,因为默认情况下为False)

(Remember to set drop to True initially, since it is False by default)

您需要将所有这些放在一起的最后一块是关于T恤及其请求垫的信息.它可以有任意数量的src板,您可以执行以下操作来链接它:

The last piece you will need to put all this together is to know about the tee, and its request-pads. It can have any number of src-pads, and you can do the following to link it:

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

基本上,您需要从T恤上请求一个srcpad,并将其链接到阀门的水垫.您将需要对每个T型分支进行两次此操作.

Basically, you request a srcpad from the Tee, and link it to the sinkpad of the valve. You will need to do this twice for each of the tee's branches.

启动并运行所有内容,您应该可以使用.

Get that all up and running, and you should have something that works.

这篇关于Pocketsphinx + Gstreamer竞赛条件? Pocketsphinx无法在Python脚本中同时收听音频+录音吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆