diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2002-12-13 15:25:26 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2002-12-13 15:25:26 (GMT) |
commit | 3d87e3cdf7420849e98f153c806fe50fe5131961 (patch) | |
tree | 07138d9bbad930d9a6ee8f025f4e4733439b4727 /Mac/Demo/speech/grail.py | |
parent | 72f3b7a5ded370e835a23be2f091bbee4e538b4c (diff) | |
download | cpython-3d87e3cdf7420849e98f153c806fe50fe5131961.zip cpython-3d87e3cdf7420849e98f153c806fe50fe5131961.tar.gz cpython-3d87e3cdf7420849e98f153c806fe50fe5131961.tar.bz2 |
The speech manager interface is no longer supported and a replacement is
(unfortunately: especially the grail demo was hiarious) still missing.
Diffstat (limited to 'Mac/Demo/speech/grail.py')
-rw-r--r-- | Mac/Demo/speech/grail.py | 228 |
1 files changed, 0 insertions, 228 deletions
diff --git a/Mac/Demo/speech/grail.py b/Mac/Demo/speech/grail.py deleted file mode 100644 index 4f95b9a..0000000 --- a/Mac/Demo/speech/grail.py +++ /dev/null @@ -1,228 +0,0 @@ -# Pass this program the Holy Grail script on stdin. -import sys -import string -import stdwin -from stdwinevents import * - -try: - import macspeech -except ImportError: - macspeech = None - -WINWIDTH = 1000 -scrw, scrh = stdwin.getscrsize() -if WINWIDTH > 0.8*scrw: - WINWIDTH = int(0.8*scrw) -BLACK = stdwin.fetchcolor('black') -RED = stdwin.fetchcolor('red') -BLUE = stdwin.fetchcolor('blue') - -done='done' - -class MacSpeaker: - def __init__(self): - self.voices = [] - self.nvoices = macspeech.CountVoices() - self.curvoice = 1 - self.rate = 1.0 - - def _newvoice(self): - vd = macspeech.GetIndVoice(self.curvoice) - sc = vd.NewChannel() - self.curvoice = self.curvoice + 1 - if self.curvoice > self.nvoices: - self.curvoice = 1 - return sc - - def newvoices(self, n): - self.voices = [] - for i in range(n): - self.voices.append(self._newvoice()) - if self.rate <> 1.0: - self.setrate(1.0) - - def setrate(self, factor): - self.rate = self.rate*factor - for v in self.voices: - r = v.GetRate() - v.SetRate(r*factor) - - def speak(self, i, text): - self.voices[i-1].SpeakText(text) - - def busy(self): - return macspeech.Busy() - -[NOTHING, NEWSCENE, ACT, TEXT, MORETEXT] = range(5) -def parseline(line): - stripline = string.strip(line) - if not stripline: - return NOTHING, '' - if stripline[:5] == 'Scene': - return NEWSCENE, stripline - if line[0] == '[': - return ACT, stripline - if line[0] == ' ' and ':' in line: - splitline = string.splitfields(stripline, ':') - stripline = string.joinfields(splitline[1:], ':') - return TEXT, (splitline[0], string.strip(stripline)) - return MORETEXT, stripline - -def readscript(file): - lines = file.readlines() - acts = [] - actor_dict = {} - longest = 0 - prev_act = 0 - for i in range(len(lines)): - tp, data = parseline(lines[i]) - if tp == NEWSCENE: - acts.append((actor_dict.keys(), lines[prev_act:i])) - prev_act = i - actor_dict = {} - elif tp == TEXT: - actor_dict[data[0]] = 1 - lines[i] = tp, data - return acts[1:] - -class Main: - def __init__(self): - if macspeech: - self.speaker = MacSpeaker() - else: - self.speaker = None - sys.stdin = open('SCRIPT', 'r') - self.acts = readscript(sys.stdin) - maxactor = 0 - for actorlist, actdata in self.acts: - if len(actorlist) > maxactor: - maxactor = len(actorlist) - if not self.loadnextact(): - print 'No acts to play!' - raise done - self.lh = stdwin.lineheight() - self.winheight = (maxactor+2)*self.lh - stdwin.setdefwinsize(WINWIDTH, self.winheight) - self.win = stdwin.open('The Play') - self.win.setdocsize(WINWIDTH, self.winheight) - self.win.change(((0,0),(WINWIDTH, self.winheight))) - self.menu = self.win.menucreate('Play') - self.menu.additem('Faster', '+') - self.menu.additem('Slower', '-') - self.menu.additem('Quit', 'Q') - self.speed = 4 - - def done(self): - del self.win - del self.menu - - def loadnextact(self): - if not self.acts: return 0 - actors, lines = self.acts[0] - del self.acts[0] - prevactor = 0 - for i in range(len(lines)): - tp, data = lines[i] - if tp == NOTHING: - continue - elif tp in (NEWSCENE, ACT): - lines[i] = 0, data - elif tp == TEXT: - prevactor = actors.index(data[0]) - lines[i] = prevactor+1, data[1] - else: - lines[i] = prevactor+1, data - self.lines = lines - self.actors = [''] + actors - self.actorlines = [''] * len(self.actors) - if self.speaker: - self.speaker.newvoices(len(self.actors)-1) - self.prevline = 0 - self.actwidth = 0 - for a in self.actors: - w = stdwin.textwidth(a) - if w > self.actwidth: - self.actwidth = w - return 1 - - def loadnextline(self): - if not self.lines: return 0 - self.actorlines[self.prevline] = '' - top = self.lh*self.prevline - self.win.change(((0, top), (WINWIDTH, top+self.lh))) - line, data = self.lines[0] - del self.lines[0] - self.actorlines[line] = data - self.prevline = line - top = self.lh*self.prevline - self.win.change(((0, top), (WINWIDTH, top+self.lh))) - if line == 0: - self.win.settimer(5*self.speed) - else: - if self.speaker: - self.speaker.speak(line, data) - tv = 1 - else: - nwords = len(string.split(data)) - tv = self.speed*(nwords+1) - self.win.settimer(tv) - return 1 - - def timerevent(self): - if self.speaker and self.speaker.busy(): - self.win.settimer(1) - return - while 1: - if self.loadnextline(): return - if not self.loadnextact(): - stdwin.message('The END') - self.win.close() - raise done - self.win.change(((0,0), (WINWIDTH, self.winheight))) - - def redraw(self, top, bottom, draw): - for i in range(len(self.actors)): - tpos = i*self.lh - bpos = (i+1)*self.lh-1 - if tpos < bottom and bpos > top: - draw.setfgcolor(BLUE) - draw.text((0, tpos), self.actors[i]) - if i == 0: - draw.setfgcolor(RED) - else: - draw.setfgcolor(BLACK) - draw.text((self.actwidth+5, tpos), self.actorlines[i]) - - def run(self): - self.win.settimer(10) - while 1: - ev, win, arg = stdwin.getevent() - if ev == WE_DRAW: - ((left, top), (right, bot)) = arg - self.redraw(top, bot, self.win.begindrawing()) - elif ev == WE_TIMER: - self.timerevent() - elif ev == WE_CLOSE: - self.win.close() - raise done - elif ev == WE_MENU and arg[0] == self.menu: - if arg[1] == 0: - if self.speed > 1: - self.speed = self.speed/2 - if self.speaker: - self.speaker.setrate(1.4) - elif arg[1] == 1: - self.speed = self.speed * 2 - if self.speaker: - self.speaker.setrate(0.7) - elif arg[1] == 2: - self.win.close() - raise done - -if 1: - main = Main() - try: - main.run() - except done: - pass - del main |