diff options
author | Gonzalo Odiard <godiard@gmail.com> | 2012-10-24 12:08:35 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2012-10-24 12:21:20 (GMT) |
commit | f26a04fc580bcf7dc4118bcbf1358e9f56a27b33 (patch) | |
tree | 083900fdb8392dc5cb988b0f2ed4748db861d214 | |
parent | b98e1e9589e1fe8378b52372ded165eebdf16c92 (diff) |
Finish port of tts functionality to gtk3 and gst 1.0 - SL #4057
This patch solves SL #3705 too (tts button placement in the toolbar)
Signed-off-by: Gonzalo Odiard <gonzalo@laptop.org>
-rw-r--r-- | AbiWordActivity.py | 21 | ||||
-rw-r--r-- | speech.py | 27 | ||||
-rw-r--r-- | speech_gst.py | 36 | ||||
-rw-r--r-- | speechtoolbar.py | 10 |
4 files changed, 44 insertions, 50 deletions
diff --git a/AbiWordActivity.py b/AbiWordActivity.py index 27b90f7..ae74e7b 100644 --- a/AbiWordActivity.py +++ b/AbiWordActivity.py @@ -49,9 +49,9 @@ from toolbar import InsertToolbar from toolbar import ParagraphToolbar from widgets import ExportButtonFactory from port import chooser -# TODO Gtk3 -#import speech -#from speechtoolbar import SpeechToolbar + +import speech +from speechtoolbar import SpeechToolbar logger = logging.getLogger('write-activity') @@ -91,6 +91,13 @@ class AbiWordActivity(activity.Activity): view_toolbar.props.label = _('View') toolbar_box.toolbar.insert(view_toolbar, -1) + if speech.supported: + self.speech_toolbar_button = ToolbarButton(icon_name='speak') + toolbar_box.toolbar.insert(self.speech_toolbar_button, -1) + self.speech_toolbar = SpeechToolbar(self) + self.speech_toolbar_button.set_page(self.speech_toolbar) + self.speech_toolbar_button.show() + separator = Gtk.SeparatorToolItem() toolbar_box.toolbar.insert(separator, -1) @@ -136,14 +143,6 @@ class AbiWordActivity(activity.Activity): content_box.show_all() self.floating_image = False - # TODO Gtk3 -# if speech.supported: -# self.speech_toolbar_button = ToolbarButton(icon_name='speak') -# toolbar_box.toolbar.insert(self.speech_toolbar_button, -1) -# self.speech_toolbar = SpeechToolbar(self) -# self.speech_toolbar_button.set_page(self.speech_toolbar) -# self.speech_toolbar_button.show() - separator = Gtk.SeparatorToolItem() separator.props.draw = False separator.set_expand(True) @@ -21,19 +21,20 @@ _logger = logging.getLogger('write-activity') supported = True -#try: -# import gst -# gst.element_factory_make('espeak') -# from speech_gst import * -# _logger.info('use gst-plugins-espeak') -#except Exception, e: -# _logger.info('disable gst-plugins-espeak: %s' % e) -# try: -# from speech_dispatcher import * -# _logger.info('use speech-dispatcher') -# except Exception, e: -# supported = False -# _logger.info('disable speech: %s' % e) +try: + from gi.repository import Gst + Gst.init(None) + Gst.ElementFactory.make('espeak', None) + from speech_gst import * + _logger.error('use gst-plugins-espeak') +except Exception, e: + _logger.error('disable gst-plugins-espeak: %s' % e) + try: + from speech_dispatcher import * + _logger.error('use speech-dispatcher') + except Exception, e: + supported = False + _logger.error('disable speech: %s' % e) voice = 'default' pitch = 0 diff --git a/speech_gst.py b/speech_gst.py index 64d4ee3..9b026e4 100644 --- a/speech_gst.py +++ b/speech_gst.py @@ -14,7 +14,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import gst +from gi.repository import Gst import logging import speech @@ -24,7 +24,7 @@ _logger = logging.getLogger('write-activity') def get_all_voices(): all_voices = {} - for voice in gst.element_factory_make('espeak').props.voices: + for voice in Gst.ElementFactory.make('espeak', None).props.voices: name, language, dialect = voice if dialect != 'none': all_voices[language + '_' + dialect] = name @@ -34,29 +34,23 @@ def get_all_voices(): def _message_cb(bus, message, pipe): - if message.type == gst.MESSAGE_EOS: - pipe.set_state(gst.STATE_NULL) + if message.type == Gst.MessageType.EOS: + pipe.set_state(Gst.State.NULL) if speech.end_text_cb != None: speech.end_text_cb() - if message.type == gst.MESSAGE_ERROR: - pipe.set_state(gst.STATE_NULL) + if message.type == Gst.MessageType.ERROR: + pipe.set_state(Gst.State.NULL) if pipe is play_speaker[1]: speech.reset_cb() - elif message.type == gst.MESSAGE_ELEMENT and \ + elif message.type == Gst.MessageType.ELEMENT and \ message.structure.get_name() == 'espeak-mark': mark = message.structure['mark'] speech.highlight_cb(int(mark)) def _create_pipe(): - pipe = gst.Pipeline('pipeline') - - source = gst.element_factory_make('espeak', 'source') - pipe.add(source) - - sink = gst.element_factory_make('autoaudiosink', 'sink') - pipe.add(sink) - source.link(sink) + pipe = Gst.parse_launch('espeak name=espeak ! autoaudiosink') + source = pipe.get_by_name('espeak') bus = pipe.get_bus() bus.add_signal_watch() @@ -70,8 +64,8 @@ def _speech(speaker, words): speaker[0].props.rate = speech.rate speaker[0].props.voice = speech.voice[1] speaker[0].props.text = words - speaker[1].set_state(gst.STATE_NULL) - speaker[1].set_state(gst.STATE_PLAYING) + speaker[1].set_state(Gst.State.NULL) + speaker[1].set_state(Gst.State.PLAYING) info_speaker = _create_pipe() @@ -92,19 +86,19 @@ def play(words): def pause(): - play_speaker[1].set_state(gst.STATE_PAUSED) + play_speaker[1].set_state(Gst.State.PAUSED) def continue_play(): - play_speaker[1].set_state(gst.STATE_PLAYING) + play_speaker[1].set_state(Gst.State.PLAYING) def is_stopped(): for i in play_speaker[1].get_state(): - if isinstance(i, gst.State) and i == gst.STATE_NULL: + if isinstance(i, Gst.State) and i == Gst.State.NULL: return True return False def stop(): - play_speaker[1].set_state(gst.STATE_NULL) + play_speaker[1].set_state(Gst.State.NULL) diff --git a/speechtoolbar.py b/speechtoolbar.py index ef73e81..b01a221 100644 --- a/speechtoolbar.py +++ b/speechtoolbar.py @@ -156,7 +156,7 @@ class SpeechToolbar(Gtk.Toolbar): def reset_buttons_cb(self): logging.error('reset buttons') - self.play_btn.set_named_icon('media-playback-start') + self.play_btn.set_icon_name('media-playback-start') self.stop_btn.set_sensitive(False) self.play_btn.set_active(False) self.is_paused = False @@ -164,14 +164,14 @@ class SpeechToolbar(Gtk.Toolbar): def play_cb(self, widget): self.stop_btn.set_sensitive(True) if widget.get_active(): - self.play_btn.set_named_icon('media-playback-pause') + self.play_btn.set_icon_name('media-playback-pause') logging.error('Paused %s', self.is_paused) if not self.is_paused: # get the text to speech, if there are a selection, # play selected text, if not, play all abi = self._activity.abiword_canvas selection = abi.get_selection('text/plain') - if selection[0] is None or selection[1] == 0: + if not selection or selection[0] is None or selection[1] == 0: # nothing selected abi.select_all() text = abi.get_selection('text/plain')[0] @@ -183,13 +183,13 @@ class SpeechToolbar(Gtk.Toolbar): logging.error('Continue play') speech.continue_play() else: - self.play_btn.set_named_icon('media-playback-start') + self.play_btn.set_icon_name('media-playback-start') self.is_paused = True speech.pause() def stop_cb(self, widget): self.stop_btn.set_sensitive(False) - self.play_btn.set_named_icon('media-playback-start') + self.play_btn.set_icon_name('media-playback-start') self.play_btn.set_active(False) self.is_paused = False speech.stop() |