Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/speech_gst.py
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@sugarlabs.org>2011-02-21 20:11:04 (GMT)
committer Gonzalo Odiard <godiard@sugarlabs.org>2011-02-21 20:11:04 (GMT)
commita04af069262aed24bcceae48d414906a36ec28e2 (patch)
tree332eb32a6a7fa59cac6b9cc33c7c740905fc00fe /speech_gst.py
parent66b9606d49af508a2414121d8aaa8956de1d037e (diff)
Add text to speech capability to text backend
Too much code stolen from Read EText activity
Diffstat (limited to 'speech_gst.py')
-rw-r--r--speech_gst.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/speech_gst.py b/speech_gst.py
new file mode 100644
index 0000000..4627c75
--- /dev/null
+++ b/speech_gst.py
@@ -0,0 +1,87 @@
+# Copyright (C) 2009 Aleksey S. Lim
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# 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
+import logging
+
+import speech
+
+_logger = logging.getLogger('read-etexts-activity')
+
+
+def _message_cb(bus, message, pipe):
+ if message.type in (gst.MESSAGE_EOS, gst.MESSAGE_ERROR):
+ pipe.set_state(gst.STATE_NULL)
+ if pipe is play_speaker[1]:
+ speech.reset_cb()
+ elif message.type == gst.MESSAGE_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)
+
+ bus = pipe.get_bus()
+ bus.add_signal_watch()
+ bus.connect('message', _message_cb, pipe)
+
+ return (source, pipe)
+
+
+def _speech(speaker, words):
+ speaker[0].props.pitch = speech.pitch
+ 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)
+
+
+info_speaker = _create_pipe()
+play_speaker = _create_pipe()
+play_speaker[0].props.track = 2
+
+
+def voices():
+ return info_speaker[0].props.voices
+
+
+def say(words):
+ _speech(info_speaker, words)
+
+
+def play(words):
+ _speech(play_speaker, words)
+
+
+def is_stopped():
+ for i in play_speaker[1].get_state():
+ if isinstance(i, gst.State) and i == gst.STATE_NULL:
+ return True
+ return False
+
+
+def stop():
+ play_speaker[1].set_state(gst.STATE_NULL)