speech_recognition
hmi_server_kaldi_client.py
Go to the documentation of this file.
1 # System imports
2 import os
3 
4 # Gstreamer imports
5 import gi
6 gi.require_version('Gst', '1.0')
7 from gi.repository import GObject, Gst
8 
9 # ROS imports
10 import rospy
11 
12 # TU/e Robotics
13 from hmi import AbstractHMIServer, HMIResult
14 
15 # Speech recognition
16 from .kaldi_gstreamer_app import KaldiGstApp
17 
18 
19 class HMIServerKaldiClient(AbstractHMIServer):
20  """
21  Subclass of AbstractHMIServer that creates a HMI client for
22  KaldiGstApp
23  """
24  def __init__(self):
25  """
26  Class constructor that initializes the parent AbstractHMIServer class
27  and gets parameters from ROS parameter server
28  """
29  super(HMIServerKaldiClient, self).__init__(rospy.get_name())
30 
31  # Get the kaldi model path from ROS Parameter server
32  self.model_path = rospy.get_param("~kaldi_model_path")
33 
34  self._kaldi_app = None
35 
36  # Check Kaldi environment variables
37  kaldi_root = os.environ.get("KALDI_ROOT", None)
38  if kaldi_root is None:
39  raise Exception("Environment variable KALDI_ROOT is not set")
40 
41  gst_plugin_path = os.environ.get("GST_PLUGIN_PATH", None)
42  if gst_plugin_path is None:
43  raise Exception("Environment variable GST_PLUGIN_PATH is not set")
44 
45  kaldi_gst_plugin_path = os.path.join(kaldi_root, "src/gst-plugin")
46  if kaldi_gst_plugin_path not in gst_plugin_path:
47  raise Exception("Kaldi gst plugin path {} not in gst plugin path {}".format(kaldi_gst_plugin_path,
48  gst_plugin_path))
49 
50  def _determine_answer(self, description, grammar, target, is_preempt_requested):
51  """
52  Method override to start speech recognition upon receiving a query
53  from the HMI server
54 
55  :param description: (str) description of the HMI request
56  :param grammar: (str) grammar that should be used
57  :param target: (str) target that should be obtained from the grammar
58  :param is_preempt_requested: (callable) checks whether a preempt is requested by the hmi client
59  """
60  self._kaldi_app = KaldiGstApp(self.model_path, grammar, target, is_preempt_requested)
61 
62  bus = self._kaldi_app.pipeline.get_bus()
63  bus.add_signal_watch()
64  bus.connect("message::eos", self._on_message)
65 
66  while not self._kaldi_app.sentence and not rospy.is_shutdown() and not is_preempt_requested():
67  rospy.logdebug("No sentence received so far...")
68  rospy.sleep(0.2)
69 
70  if self._kaldi_app.sentence:
71  rospy.loginfo("Kaldi returned: {}".format(self._kaldi_app.sentence))
72  result_str = self._kaldi_app.sentence
73  rospy.logdebug("Sending stop event")
74  self._kaldi_app.pipeline.send_event(Gst.Event.new_eos())
75  return HMIResult(result_str, "")
76  return None
77 
78  def _on_message(self, bus, message):
79  """ Callback for gstreamer pipeline bus message. Sets the gstreamer pipeline state to NULL and sets the
80  kaldi app to None
81 
82  :param bus:
83  :param message:
84  """
85  rospy.logdebug("Stopping gstreamer pipeline")
86  self._kaldi_app.pipeline.set_state(Gst.State.NULL)
87  rospy.logdebug("Setting kaldi app to None")
88  self._kaldi_app = None
89  rospy.loginfo("Gstreamer pipeline stopped successfully")
speech_recognition.hmi_server_kaldi_client.HMIServerKaldiClient._determine_answer
def _determine_answer(self, description, grammar, target, is_preempt_requested)
Definition: hmi_server_kaldi_client.py:50
speech_recognition.hmi_server_kaldi_client.HMIServerKaldiClient
Definition: hmi_server_kaldi_client.py:19
speech_recognition.kaldi_gstreamer_app.KaldiGstApp
Definition: kaldi_gstreamer_app.py:22
speech_recognition.hmi_server_kaldi_client.HMIServerKaldiClient.__init__
def __init__(self)
Definition: hmi_server_kaldi_client.py:24
speech_recognition.hmi_server_kaldi_client.HMIServerKaldiClient.model_path
model_path
Definition: hmi_server_kaldi_client.py:32
speech_recognition.hmi_server_kaldi_client.HMIServerKaldiClient._on_message
def _on_message(self, bus, message)
Definition: hmi_server_kaldi_client.py:78
speech_recognition.hmi_server_kaldi_client.HMIServerKaldiClient._kaldi_app
_kaldi_app
Definition: hmi_server_kaldi_client.py:34