123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- # This is part of Kaylee
- # -- this code is licensed GPLv3
- # Copyright 2015-2016 Clayton G. Hobbs
- # Portions Copyright 2013 Jezra
-
- import os.path
- import sys
-
- import gi
- gi.require_version('Gst', '1.0')
- from gi.repository import GObject, Gst
- GObject.threads_init()
- Gst.init(None)
-
-
- class Recognizer(GObject.GObject):
- __gsignals__ = {
- 'finished' : (GObject.SIGNAL_RUN_LAST, GObject.TYPE_BOOLEAN,
- (GObject.TYPE_STRING,),
- GObject.signal_accumulator_true_handled)
- }
-
- def __init__(self, config):
- GObject.GObject.__init__(self)
-
- src = config.options.microphone
- if src:
- audio_src = 'alsasrc device="hw:{0},0"'.format(src)
- else:
- audio_src = 'autoaudiosrc'
-
- # Build the pipeline
- cmd = (
- audio_src +
- ' ! audioconvert' +
- ' ! audioresample' +
- ' ! pocketsphinx lm=' + config.lang_file + ' dict=' +
- config.dic_file +
- ' ! appsink sync=false'
- )
- try:
- self.pipeline = Gst.parse_launch(cmd)
- except Exception as e:
- print(e.message)
- print("You may need to install gstreamer1.0-pocketsphinx")
- raise e
-
- # Process results from the pipeline with self.result()
- bus = self.pipeline.get_bus()
- bus.add_signal_watch()
- bus.connect('message::element', self.result)
-
- def listen(self):
- self.pipeline.set_state(Gst.State.PLAYING)
-
- def pause(self):
- self.pipeline.set_state(Gst.State.PAUSED)
-
- def result(self, bus, msg):
- msg_struct = msg.get_structure()
- # Ignore messages that aren't from pocketsphinx
- msgtype = msg_struct.get_name()
- if msgtype != 'pocketsphinx':
- return
-
- # If we have a final command, send it for processing
- command = msg_struct.get_string('hypothesis')
- if command != '' and msg_struct.get_boolean('final')[1]:
- self.emit("finished", command.lower())
|