Codebase list sugar-read-activity / e3fe946
Re-enable tts in text backend now Gst bindings are working - SL #3349 The code is copied from Write activity, (should be good have this solved in the toolkit). The togglebutton api to change the icon name is fixed too. Signed-off-by: Gonzalo Odiard <gonzalo@laptop.org> Gonzalo Odiard 11 years ago
4 changed file(s) with 48 addition(s) and 51 deletion(s). Raw diff Collapse all Expand all
1616
1717 import logging
1818
19 _logger = logging.getLogger('read-etexts-activity')
19 _logger = logging.getLogger('read-activity')
2020
2121 supported = True
2222
2323 try:
24 import pygst
25 pygst.require("0.10")
2624 from gi.repository import Gst
27 #Gst.ElementFactory.make('espeak', 'source')
25 Gst.init(None)
26 Gst.ElementFactory.make('espeak', None)
2827 from speech_gst import *
29 _logger.info('use gst-plugins-espeak')
28 _logger.error('use gst-plugins-espeak')
3029 except Exception, e:
31 _logger.info('disable gst-plugins-espeak: %s' % e)
30 _logger.error('disable gst-plugins-espeak: %s' % e)
3231 try:
3332 from speech_dispatcher import *
34 _logger.info('use speech-dispatcher')
33 _logger.error('use speech-dispatcher')
3534 except Exception, e:
3635 supported = False
37 _logger.info('disable speech: %s' % e)
36 _logger.error('disable speech: %s' % e)
3837
3938 voice = 'default'
4039 pitch = 0
4342 highlight_cb = None
4443 end_text_cb = None
4544 reset_cb = None
46 reset_buttons_cb = None
1313 # along with this program; if not, write to the Free Software
1414 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1515
16 from gi.repository import Gst
1617 import logging
17 import pygst
18 pygst.require("0.10")
19 from gi.repository import Gst
2018
2119 import speech
2220
23 _logger = logging.getLogger('read-etexts-activity')
21 _logger = logging.getLogger('read-activity')
22
23
24 def get_all_voices():
25 all_voices = {}
26 for voice in Gst.ElementFactory.make('espeak', None).props.voices:
27 name, language, dialect = voice
28 if dialect != 'none':
29 all_voices[language + '_' + dialect] = name
30 else:
31 all_voices[language] = name
32 return all_voices
2433
2534
2635 def _message_cb(bus, message, pipe):
27 logging.error('gstreamer message %s', message)
28 if message is None:
29 return
30 if message.type == Gst.Message.EOS:
36 if message.type == Gst.MessageType.EOS:
3137 pipe.set_state(Gst.State.NULL)
3238 if speech.end_text_cb != None:
3339 speech.end_text_cb()
34 if message.type == Gst.Message.ERROR:
40 if message.type == Gst.MessageType.ERROR:
3541 pipe.set_state(Gst.State.NULL)
3642 if pipe is play_speaker[1]:
37 if speech.reset_cb is not None:
38 speech.reset_cb()
39 if speech.reset_buttons_cb is not None:
40 speech.reset_buttons_cb()
41 elif message.type == Gst.Message.ELEMENT and \
43 speech.reset_cb()
44 elif message.type == Gst.MessageType.ELEMENT and \
4245 message.structure.get_name() == 'espeak-mark':
4346 mark = message.structure['mark']
4447 speech.highlight_cb(int(mark))
4548
4649
4750 def _create_pipe():
48 pipe = Gst.Pipeline()
49 pipe.set_name('pipeline')
50
51 source = Gst.ElementFactory.make('espeak', 'source')
52 pipe.add(source)
53
54 sink = Gst.ElementFactory.make('autoaudiosink', 'sink')
55 pipe.add(sink)
56 source.link(sink)
51 pipe = Gst.parse_launch('espeak name=espeak ! autoaudiosink')
52 source = pipe.get_by_name('espeak')
5753
5854 bus = pipe.get_bus()
5955 bus.add_signal_watch()
60 logging.error('before adding message callback')
6156 bus.connect('message', _message_cb, pipe)
62 logging.error('ater adding message callback')
6357
6458 return (source, pipe)
6559
7266 speaker[1].set_state(Gst.State.NULL)
7367 speaker[1].set_state(Gst.State.PLAYING)
7468
75 Gst.init_check(None)
69
7670 info_speaker = _create_pipe()
7771 play_speaker = _create_pipe()
7872 play_speaker[0].props.track = 2
9084 _speech(play_speaker, words)
9185
9286
87 def pause():
88 play_speaker[1].set_state(Gst.State.PAUSED)
89
90
91 def continue_play():
92 play_speaker[1].set_state(Gst.State.PLAYING)
93
94
9395 def is_stopped():
94 for i in play_speaker[1].get_state(1):
96 for i in play_speaker[1].get_state():
9597 if isinstance(i, Gst.State) and i == Gst.State.NULL:
9698 return True
9799 return False
98100
99101
100 def pause():
101 play_speaker[1].set_state(Gst.State.NULL)
102
103
104102 def stop():
105103 play_speaker[1].set_state(Gst.State.NULL)
106 play_speaker[0].props.text = ''
107 if speech.reset_cb is not None:
108 speech.reset_cb()
109 if speech.reset_buttons_cb is not None:
110 speech.reset_buttons_cb()
3535 self._activity = activity
3636 if not speech.supported:
3737 return
38 self.is_paused = False
3839
3940 self._cnf_client = GConf.Client.get_default()
4041 self.load_speech_parameters()
128129
129130 def reset_buttons_cb(self):
130131 logging.error('reset buttons')
131 self.play_btn.set_named_icon('media-playback-start')
132 self.play_btn.set_icon_name('media-playback-start')
132133 self.stop_btn.set_sensitive(False)
134 self.is_paused = False
133135
134136 def play_cb(self, widget):
135137 self.stop_btn.set_sensitive(True)
136138 if widget.get_active():
137 self.play_btn.set_named_icon('media-playback-pause')
138 if speech.is_stopped():
139 self.play_btn.set_icon_name('media-playback-pause')
140 if not self.is_paused:
139141 speech.play(self._activity._view.get_marked_words())
142 else:
143 speech.continue_play()
140144 else:
141 self.play_btn.set_named_icon('media-playback-start')
145 self.play_btn.set_icon_name('media-playback-start')
146 self.is_paused = True
142147 speech.pause()
143148
144149 def stop_cb(self, widget):
145150 self.stop_btn.set_sensitive(False)
146 self.play_btn.set_named_icon('media-playback-start')
151 self.play_btn.set_icon_name('media-playback-start')
147152 self.play_btn.set_active(False)
153 self.is_paused = False
148154 speech.stop()
240240 self.connect('page-changed', handler)
241241
242242 def can_do_text_to_speech(self):
243 return False
243 return True
244244
245245 def get_marked_words(self):
246246 "Adds a mark between each word of text."