diff --git a/src/sugar3/speech.py b/src/sugar3/speech.py index 27bb1c5d..a88cdf9d 100644 --- a/src/sugar3/speech.py +++ b/src/sugar3/speech.py @@ -18,12 +18,18 @@ import os import logging from gettext import gettext as _ +from gi.repository.GLib import GError from gi.repository import Gio -from gi.repository import Gst from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GObject +_HAS_GST = True +try: + from gi.repository import Gst +except: + _HAS_GST = False + from sugar3 import power DEFAULT_PITCH = 0 @@ -110,6 +116,24 @@ translated_espeak_voices = { } +def _has_espeak_module(): + try: + Gst.parse_launch('espeak') + except GError: + logging.error('The speech plugin is not installed in the system.') + return False + return True + + +def _check_modules(): + if not _HAS_GST: + logging.error('GST is not installed in the system.') + return False + if not _has_espeak_module(): + return False + return True + + class SpeechManager(GObject.GObject): __gtype_name__ = 'SpeechManager' @@ -128,6 +152,10 @@ class SpeechManager(GObject.GObject): def __init__(self, **kwargs): GObject.GObject.__init__(self, **kwargs) + self._player = None + if not self.enabled(): + return + self._player = _GstSpeechPlayer() self._player.connect('play', self._update_state, 'play') self._player.connect('stop', self._update_state, 'stop') @@ -140,6 +168,9 @@ class SpeechManager(GObject.GObject): self._save_timeout_id = -1 self.restore() + def enabled(self): + return _check_modules() + def _update_state(self, player, signal): self._is_playing = (signal == 'play') self._is_paused = (signal == 'pause') @@ -227,10 +258,14 @@ class SpeechManager(GObject.GObject): self._pitch, self._rate) def get_all_voices(self): - return self._player.get_all_voices() + if self._player: + return self._player.get_all_voices() + return None def get_all_traslated_voices(self): - return self._player.get_all_translated_voices() + if self._player: + return self._player.get_all_voices() + return None class _GstSpeechPlayer(GObject.GObject):