TalknType
Jump to navigation
Jump to search
This will eventually be an Activity based on the 1970s toy, [Speak & Spell].
Initial Activity Idea
- User opens the activity, and is presented with a skill level (1 to 4).
- The activity speaks, using the eSpeak Speech Synthesis software, which will soon be included in OLPC builds.
- The activity asks the user to spell a word from the dictionary (one of four, based on the skill level).
- As the user types each letter, the activity reads the letters out loud.
- When the user presses Enter, the activity reads the entered letters as a word.
- The activity compares the entered letters with the real word, and informs the user whether the word was spelt correctly or not.
- Another random word is offered for the user, etc, etc.
Installing
The code at the bottom of this page isn't ready for general use yet - it doesn't use the Sugar user interface, and only uses the terminal within sugar.
- You will need to save the code at the bottom of the page as talkntype.py in a directory.
- You will need a copy of the sugar-speechd speech server.
- You will need three audio files for the correct.wav incorrect.wav and begin.wav.
- Make sure your loudspeaker volume is turned up, using the keyboard keys.
- Open a copy of the Terminal activity. Change to root user:
su -
- Then run the sugar-speechd speech server:
./sugar-speechd
- The terminal will appear frozen, but this is ok. It means the server is running. Go back to the desktop (Home), and open another Terminal activity.
- As user OLPC, go to the directory that talkntype.py is stored in, and make it executable by typing:
chmod a+x talkntype.py
- Then run it by typing:
python talkntype.py
- You will need to type quite slowly.
- There is no Backspace key
- To exit the program, press 1 instead of entering a word.
To do
- Sugarise the idea into something usable by normal people! I have no real programming knowledge, so all help would be greatly appreciated! Please contact me via my userpage.
- Make an icon
- Include collaborative elements - spelling against a friend?
- Upload the code somewhere (but I don't know how git and dev.laptop really operate...)
- Upload the 3 audio files called in the code below.
Code
Below is the code for the talkntype.py program.
#!/bin/env python
import sys
import os
import dbus
import random
import time
wordlist = [ "above","angel","answer","calf","does","earth","echo","extra","for","four","guess","half","health","iron","learn","ocean","once","one","oven","pint","pull","range","says","ski","sure","swap","talk","to","touch","two","view","warm","was","wash","word" ]
bus = dbus.SessionBus()
APLAY = "/usr/bin/aplay"
size = len(wordlist)
index = random.randint(0, size-1)
elem = wordlist[index]
espeak_object = bus.get_object('org.laptop.Speech','/org/laptop/Speech')
answer = ""
clearit = "" # Because I couldn't null a string
# My class for key detection
class _Getch:
"""Gets a single character from standard input. Does not echo to the screen."""
def __init__(self):
try:
self.impl = _GetchWindows()
except ImportError:
self.impl = _GetchUnix()
def __call__(self): return self.impl()
class _GetchUnix:
def __init__(self):
import tty, sys
def __call__(self):
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
class _GetchWindows:
def __init__(self):
import msvcrt
def __call__(self):
import msvcrt
return msvcrt.getch()
getch = _Getch()
# MAIN LOOP
os.popen("aplay --quiet begin.wav") # play sound
for x in range(35):
index = random.randint(0, size-1)
elem = wordlist[index]
answer = clearit # null the string again
print "Spell..."
espeak_object.SayText("Spell " + elem)
# get an answer
print 'Type your answer, or press the spacebar to repeat the word, or 1 to quit'
for longestinput in range(15):
inkey = _Getch()
import sys
for i in xrange(sys.maxint):
k=inkey()
if k<>:break
print k,
espeak_object.SayText(k)
answer = answer + k
if k == " ": # if the user wants the word repeated
espeak_object.SayText(elem)
answer = clearit + k # because I don't know how to null a string
print
if k == "1":
espeak_object.SayText("goodbye")
sys.exit() # quit the program
if k == "\r":break
# say the answer
answer = answer.strip() # remove any whitespace from the user's answer
print # because I don't know how to do linebreaks
print "You typed", answer
espeak_object.SayText("You typed " + answer)
# check for correct
if answer == elem:
os.popen("aplay --quiet correct.wav") # play sound
print "Correct!"
espeak_object.SayText("Correct")
answer = clearit # null the string again
# check for incorrect
else:
os.popen("aplay --quiet incorrect.wav") # play sound
print "Incorrect answer."
espeak_object.SayText("Incorrect answer...")
print "The correct spelling of " + elem + " is "
espeak_object.SayText("The correct spelling of " + elem + "... is ")
def shout(string):
for character in string:
print character + " "
espeak_object.SayText(character)
shout(elem)
time.sleep(0.5)
print elem
espeak_object.SayText(elem) # say the word again in full with some pauses at each end
time.sleep(0.5)
print
answer = clearit # null the string again
Other links
- Screen_Reader Another OLPC activity using the eSpeak modules.
- Speech_synthesis Speech Synthesis on the OLPC.
- [[1]] Flash version of the Speak & Spell
- [[2]] Another Speak & Spell emulator
- [Speak&Spell Wikipedia article]