summary refs log tree commit diff
path: root/kayleevc/recognizer.py
diff options
context:
space:
mode:
authorClayton G. Hobbs <clay@lakeserv.net>2016-02-16 13:14:28 -0500
committerClayton G. Hobbs <clay@lakeserv.net>2016-02-16 13:14:28 -0500
commit1c2928ff1a68db1f0408e02138121e8ac1253239 (patch)
tree8b62e00c0f6a30d4f14acb86caf9336f68dab8c4 /kayleevc/recognizer.py
parentb95f1154291f6af9e95193b442abc61e9d457fcc (diff)
Reorganize classes into a "kayleevc" package
That's "Kaylee Voice Command" if you didn't figure it out.  I think
everything still works properly, but I'll do more testing later to
verify.
Diffstat (limited to 'kayleevc/recognizer.py')
-rw-r--r--kayleevc/recognizer.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/kayleevc/recognizer.py b/kayleevc/recognizer.py
new file mode 100644
index 0000000..b54c055
--- /dev/null
+++ b/kayleevc/recognizer.py
@@ -0,0 +1,69 @@
+# 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_NONE,
+                      (GObject.TYPE_STRING,))
+    }
+
+    def __init__(self, config):
+        GObject.GObject.__init__(self)
+        self.commands = {}
+
+        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 + ' configured=true' +
+            ' ! 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)