[Sugar-devel] New and revised chapters of "Make Your Own Sugar Activities!" ready for review, feedback
Aleksey Lim
alsroot at member.fsf.org
Thu Jan 21 18:03:56 EST 2010
On Thu, Jan 21, 2010 at 10:53:30PM +0000, Aleksey Lim wrote:
> On Thu, Jan 21, 2010 at 10:41:59PM +0000, Aleksey Lim wrote:
> > On Thu, Jan 21, 2010 at 10:24:50AM -0600, Jim Simmons wrote:
> > > I just finished writing another chapter of the book, this one on
> > > adding Text to Speech to your Activities. I've also made various
> > > additions and corrections to the rest of it. If you want to check out
> > > what I have a PDF created with OBJAVI! is available here:
> > >
> > > http://objavi.flossmanuals.net/books/ActivitiesGuideSugar-en-2010.01.21-18.33.56.pdf
> >
> > Thanks for your efforts!
> >
> > just minor cleanups you can consider to make code less verbose and
> > easily understandable(perhaps), see attached speech.py
>
> and also, could be useful to mention words tracking feature of espeak,
> like http://wiki.sugarlabs.org/go/Activity_Team/gst-plugins-espeak#Simple_TTS_example
>
> Yes, some espeak versions(at least old ones) could miss some words but
s/some words/some symbols/
> its getting better(I didn't check last espeak version but at least
> espeak developers are working on track improvements) and in case of
> simple tts usage, just reusing espeak native feature would be more
> useful than coding marking stuff.
>
> >
> > > I'm going to start working on code samples for a Collaboration chapter
> > > next, and I want to do a chapter on debugging Sugar Activities after
> > > that. I think Walter had developed some code to let you run Sugar
> > > Activities outside of the Sugar environment and that would be a good
> > > fit for the debugging chapter. For collaboration I'm going to try to
> > > put together a sort of half-finished game called "Battle Royale Tic
> > > Tac Toe". I'll also write about file sharing as used by Read Etexts.
> > >
> > > Once I have this material added I think I'll have enough to make it
> > > worth putting on the front page of the site. That won't mean it's
> > > finished, but enough of it will be that the book could be considered
> > > complete.
> > >
> > > I welcome collaborators as well as editors on this. There are many
> > > topics you could put in a book like this that I'm not qualified to
> > > write.
> > >
> > > I'm up to 87 pages now.
> > >
> > > James Simmons
> > >
> >
> > --
> > Aleksey
>
> > import gst
> >
> > voice = 'default'
> > pitch = 0
> >
> > rate = -20
> > highlight_cb = None
> >
> > def _create_pipe():
> > pipeline = 'espeak name=source ! autoaudiosink'
> > pipe = gst.parse_launch(pipeline)
> >
> > def stop_cb(bus, message):
> > pipe.set_state(gst.STATE_NULL)
> >
> > def mark_cb(bus, message):
> > if message.structure.get_name() == 'espeak-mark':
> > mark = message.structure['mark']
> > highlight_cb(int(mark))
> >
> > bus = pipe.get_bus()
> > bus.add_signal_watch()
> > bus.connect('message::eos', stop_cb)
> > bus.connect('message::error', stop_cb)
> > bus.connect('message::element', mark_cb)
> >
> > return (pipe.get_by_name('source'), pipe)
> >
> > def _speech(source, pipe, words):
> > source.props.pitch = pitch
> > source.props.rate = rate
> > source.props.voice = voice
> > source.props.text = words;
> > pipe.set_state(gst.STATE_PLAYING)
> >
> > info_source, info_pipe = _create_pipe()
> > play_source, play_pipe = _create_pipe()
> >
> > # track for marks
> > play_source.props.track = 2
> >
> > def voices():
> > return info_source.props.voices
> >
> > def say(words):
> > _speech(info_source, info_pipe, words)
> > print words
> >
> > def play(words):
> > _speech(play_source, play_pipe, words)
> >
> > def is_stopped():
> > for i in play_pipe.get_state():
> > if isinstance(i, gst.State) and i == gst.STATE_NULL:
> > return True
> > return False
> >
> > def stop():
> > play_pipe.set_state(gst.STATE_NULL)
> >
> > def is_paused():
> > for i in play_pipe.get_state():
> > if isinstance(i, gst.State) and i == gst.STATE_PAUSED:
> > return True
> > return False
> >
> > def pause():
> > play_pipe.set_state(gst.STATE_PAUSED)
> >
> > def rate_up():
> > global rate
> > rate = min(99, rate + 10)
> >
> > def rate_down():
> > global rate
> > rate = max(-99, rate - 10)
> >
> > def pitch_up():
> > global pitch
> > pitch = min(99, pitch + 10)
> >
> > def pitch_down():
> > global pitch
> > pitch = max(-99, pitch - 10)
> >
> > def prepare_highlighting(label_text):
> > i = 0
> > j = 0
> > word_begin = 0
> > word_end = 0
> > current_word = 0
> > word_tuples = []
> > omitted = [' ', '\n', u'\r', '_', '[', '{', ']', '}', '|', '<',\
> > '>', '*', '+', '/', '\\' ]
> > omitted_chars = set(omitted)
> > while i < len(label_text):
> > if label_text[i] not in omitted_chars:
> > word_begin = i
> > j = i
> > while j < len(label_text) and label_text[j] not in omitted_chars:
> > j = j + 1
> > word_end = j
> > i = j
> > word_t = (word_begin, word_end, label_text[word_begin: word_end].strip())
> > if word_t[2] != u'\r':
> > word_tuples.append(word_t)
> > i = i + 1
> > return word_tuples
> >
> > def add_word_marks(word_tuples):
> > "Adds a mark between each word of text."
> > i = 0
> > marked_up_text = '<speak> '
> > while i < len(word_tuples):
> > word_t = word_tuples[i]
> > marked_up_text = marked_up_text + '<mark name="' + str(i) + '"/>' + word_t[2]
> > i = i + 1
> > return marked_up_text + '</speak>'
>
>
> --
> Aleksey
--
Aleksey
More information about the Sugar-devel
mailing list