From f10e907e90b7555110d96c74c2d3341d60fd69a0 Mon Sep 17 00:00:00 2001 From: Assim Date: Mon, 30 Mar 2009 05:47:13 +0000 Subject: speech dispatcher dependency removed --- diff --git a/ListenSpell.py b/ListenSpell.py index cd94bf0..20dffe3 100755 --- a/ListenSpell.py +++ b/ListenSpell.py @@ -29,7 +29,7 @@ class ListenSpell(activity.Activity): DBname = "dict.db" self.las.load_db(DBname) - self.las.load_speechd_config() + self.las.load_espeak_config() self.use_phoneme = False @@ -131,15 +131,15 @@ class ListenSpell(activity.Activity): self.change_skill_level_button = gtk.Button("Change Skill Level") self.change_skill_level_button.connect("clicked", self.change_skill_level_button_clicked, None) - self.change_speechd_config_button = gtk.Button("Speech Configuration") - self.change_speechd_config_button.connect("clicked", self.speech_configuration_button_clicked, None) + self.change_espeak_config_button = gtk.Button("Speech Configuration") + self.change_espeak_config_button.connect("clicked", self.speech_configuration_button_clicked, None) self.v_buttonbox.add(self.repeat_word_button) self.v_buttonbox.add(self.get_def_button) self.v_buttonbox.add(self.get_usage_button) self.v_buttonbox.add(self.get_word_length_button) self.v_buttonbox.add(self.change_skill_level_button) - self.v_buttonbox.add(self.change_speechd_config_button) + self.v_buttonbox.add(self.change_espeak_config_button) self.v_buttonbox.show_all() @@ -200,11 +200,11 @@ class ListenSpell(activity.Activity): def _update_configuration(self, widget, attribute ): if attribute == "voice": - self.las.speechd_config(attribute, widget.get_active_text()) + self.las.espeak_config(attribute, widget.get_active_text()) elif(attribute == "skill_level"): self.las.set_skill_level(int(widget.skill_level)) else: - self.las.speechd_config(attribute, widget.get_value()) + self.las.espeak_config(attribute, widget.get_value()) def _speech_test(self, widget, speech_text): @@ -225,13 +225,17 @@ class ListenSpell(activity.Activity): self.config_dialog.vbox.pack_start(speech_frame, False, False, 0) - speech_config = self.las.get_speechd_config().copy() + speech_config = self.las.get_espeak_config().copy() #print "getting config" - volume_adj = gtk.Adjustment(float(speech_config['volume']), -100, 101, 1, 1, 1) - rate_adj = gtk.Adjustment(float(speech_config['rate']), -100, 101, 1, 1, 1) - pitch_adj = gtk.Adjustment(float(speech_config['pitch']), -100, 101, 1, 1, 1) - + #volume_adj = gtk.Adjustment(float(speech_config['volume']), -100, 101, 1, 1, 1) + #rate_adj = gtk.Adjustment(float(speech_config['rate']), -100, 101, 1, 1, 1) + #pitch_adj = gtk.Adjustment(float(speech_config['pitch']), -100, 101, 1, 1, 1) + + volume_adj = gtk.Adjustment(float(speech_config['volume']), 0, 201, 1, 1, 1) + rate_adj = gtk.Adjustment(float(speech_config['rate']), 80, 371, 1, 1, 1) + pitch_adj = gtk.Adjustment(float(speech_config['pitch']), 0, 100, 1, 1, 1) + volume_hscale = gtk.HScale(volume_adj) rate_hscale = gtk.HScale(rate_adj) @@ -246,39 +250,39 @@ class ListenSpell(activity.Activity): rate_hscale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) pitch_hscale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) - voice_box = gtk.combo_box_new_text() - voice_list = ["MALE1", "MALE2", "MALE3", "FEMALE1", "FEMALE2", "FEMALE3", "CHILD_MALE", "CHILD_FEMALE"] - #hscale4 = gtk.HScale(adj4) - for voice in voice_list: - voice_box.append_text(voice) + #voice_box = gtk.combo_box_new_text() + #voice_list = ["MALE1", "MALE2", "MALE3", "FEMALE1", "FEMALE2", "FEMALE3", "CHILD_MALE", "CHILD_FEMALE"] + ##hscale4 = gtk.HScale(adj4) + #for voice in voice_list: + #voice_box.append_text(voice) - try: - voice_index = voice_list.index(speech_config['voice']) - except ValueError: - voice_box.set_active(0) - else: - voice_box.set_active(voice_index) + #try: + #voice_index = voice_list.index(speech_config['voice']) + #except ValueError: + #voice_box.set_active(0) + #else: + #voice_box.set_active(voice_index) volume_label = gtk.Label("Volume") rate_label = gtk.Label("Rate") pitch_label = gtk.Label("pitch") - voice_label = gtk.Label("Voice") + #voice_label = gtk.Label("Voice") volume_adj.connect('value_changed',self._update_configuration, "volume") rate_adj.connect('value_changed',self._update_configuration, "rate") pitch_adj.connect('value_changed',self._update_configuration, "pitch") - voice_box.connect('changed', self._update_configuration, "voice") + #voice_box.connect('changed', self._update_configuration, "voice") config_table.attach(volume_label, 0,1,0,1) config_table.attach(rate_label, 0,1,1,2) config_table.attach(pitch_label, 0,1,2,3) - config_table.attach(voice_label, 0,1,3,4) + #config_table.attach(voice_label, 0,1,3,4) config_table.attach(volume_hscale, 1,2,0,1) config_table.attach(rate_hscale, 1,2,1,2) config_table.attach(pitch_hscale, 1,2,2,3) - config_table.attach(voice_box, 1,2,3,4) + #config_table.attach(voice_box, 1,2,3,4) speech_test_frame = gtk.Frame("Test Speech Setting") @@ -314,16 +318,11 @@ class ListenSpell(activity.Activity): elif response == gtk.RESPONSE_CANCEL: #print "going back" for k in speech_config: - #print k + " " + str(previous_speechd_config[k]) - self.las.speechd_config(k, speech_config[k]) + #print k + " " + str(previous_espeak_config[k]) + self.las.espeak_config(k, speech_config[k]) self.config_dialog.destroy() self.text_input.grab_focus() - - - - def get_speechd_config(self): - pass def submit_button_clicked(self, widget, data = None): answer = self.text_input.get_text() @@ -409,7 +408,7 @@ class ListenSpell(activity.Activity): #label.set_use_underline(True) table.attach(label, 0, 1, 0, 1) - skill_level_adj = gtk.Adjustment(float(self.las.get_skill_level()), 0,16,1,1,1) + skill_level_adj = gtk.Adjustment(float(self.las.get_skill_level()), 1,16,1,1,1) skill_level_scale = gtk.HScale(skill_level_adj) skill_level_scale.set_digits(0) skill_level_scale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) diff --git a/MANIFEST b/MANIFEST index f1a29c8..c0a0557 100755 --- a/MANIFEST +++ b/MANIFEST @@ -5,7 +5,7 @@ correct.wav ls.py setup.py dict.py -conv.sh +espeak.py incorrect.wav begin.wav las.py diff --git a/activity/activity.info b/activity/activity.info index b108201..d69d2f5 100755 --- a/activity/activity.info +++ b/activity/activity.info @@ -3,5 +3,5 @@ name = listen-spell service_name = org.laptop.listen-spell class = ListenSpell.ListenSpell icon = activity-listen-spell -activity_version = 1 +activity_version = 2 show_launcher = yes diff --git a/dict.db b/dict.db index 99b761c..099a779 100644 --- a/dict.db +++ b/dict.db Binary files differ diff --git a/dist/listen-spell-1.xo b/dist/listen-spell-1.xo deleted file mode 100755 index a2cbd8f..0000000 --- a/dist/listen-spell-1.xo +++ /dev/null Binary files differ diff --git a/espeak.py b/espeak.py new file mode 100644 index 0000000..2431602 --- /dev/null +++ b/espeak.py @@ -0,0 +1,70 @@ +#!/bin/env python +import sys +import os +import subprocess + +#-a +#Amplitude, 0 to 200, default is 100 +#-g +#Word gap. Pause between words, units of 10mS at the default speed +#-p +#Pitch adjustment, 0 to 99, default is 50 +#-s +#Speed in words per minute, 80 to 370, default is 170 +#-v +#Use voice file of this name from espeak-data/voices + +class espeak: + + def __init__(self): + self.cmd = {} + self.cmd['-a'] = 100 + self.cmd['-g'] = 10 + self.cmd['-p'] = 50 + self.cmd['-s'] = 170 + #cmd['-v'] = '' + #call(['cmd', 'arg1', 'arg2']) + + + def set_amplitude(self,amp): + self.cmd['-a'] = int(amp) + def set_word_gap(self,gap): + self.cmd['-g'] = int(gap) + def set_pitch(self,pitch): + self.cmd['-p'] = int(pitch) + def set_speed(self,speed): + self.cmd['-s'] = int(speed) + def set_voice(self,voice): + self.cmd['-v'] = str(voice) + + def get_amplitude(self): + return self.cmd['-a'] + def get_word_gap(self): + return self.cmd['-g'] + def get_pitch(self): + return self.cmd['-p'] + def get_speed(self): + return self.cmd['-s'] + def get_voice(self): + return self.cmd['-v'] + + def speak(self,word): + #cmd = "espeak" + args = ['espeak'] + i = 0 + #cmd3 = "espeak " + for k in self.cmd.keys(): + #cmd3 = cmd3 + str(k) + ' ' + str(self.cmd[k]) + ' ' + args.append(str(k) + ' ' + str(self.cmd[k])) + #cmd3 = cmd3 + "'" + word + "'" + args.append(word) + #args[i] = word + #print cmd3 + #os.execlp(cmd3) + subprocess.call(args) + +if __name__ == "__main__": + + k = espeak() + k.speak("hello") + k.speak("world") \ No newline at end of file diff --git a/las.py b/las.py index 04bf17e..1eece34 100755 --- a/las.py +++ b/las.py @@ -4,7 +4,8 @@ import os import dbus import random import time -import speechd +import espeak +from espeak import espeak import commands import simplejson #import csnd @@ -52,12 +53,14 @@ class Listenspell(): self.points = 0 self.words_played = 0 self.words_correct = 0 - self.config_file = 'ls-speechd-config' + self.config_file = 'ls-espeak-config' self.path = "." - self.speechd_init = False - self.__speechd_default_config = {'pitch':0, 'rate':0, 'language':'en', 'volume':100, 'voice':'MALE1', - 'spelling':False, 'punctuation':speechd.PunctuationMode.SOME } - self.__speechd_config = self.__speechd_default_config + self.espeak_init = False + self.espeak_obj = espeak() + #self.__espeak_default_config = {'pitch':0, 'rate':0, 'language':'en', 'volume':100, 'voice':'MALE1', + #'spelling':False, 'punctuation':espeak.PunctuationMode.SOME } + self.__espeak_default_config = {'pitch':0, 'rate':0, 'language':'en', 'volume':100} + self.__espeak_config = self.__espeak_default_config def load_db(self, SQLiteDB): if self.path == ".": @@ -160,116 +163,120 @@ class Listenspell(): return phnm - def get_speechd_config(self, default =0): + def get_espeak_config(self, default =0): if default == 1: - return self.__speechd_default_config + return self.__espeak_default_config else: - return self.__speechd_config + return self.__espeak_config - def load_speechd_config(self): + def load_espeak_config(self): try: fp = open(self.path + self.config_file) except IOError: #File doesn't exist, create it and write default config fp = open(self.path + self.config_file, 'w', 0) - speech_config = self.get_speechd_config(1) + speech_config = self.get_espeak_config(1) simplejson.dump(speech_config, fp) else: speech_config = simplejson.load(fp) for attr in speech_config: - self.speechd_config(attr, speech_config[attr]) + self.espeak_config(attr, speech_config[attr]) fp.close() return speech_config - def __start_speechd(self): - try: - self.client = speechd.SSIPClient('spd-test') - self.client.set_output_module('espeak') - self.client.set_language('en') - self.client.set_punctuation(speechd.PunctuationMode.SOME) - self.speech_state = None - except dbus.exceptions.DBusException: - print "Speech Dispatcher is not turned on." - return False - self.speechd_init = True + #def __start_espeak(self): + #try: + #self.client = espeak.SSIPClient('spd-test') + #self.client.set_output_module('espeak') + #self.client.set_language('en') + #self.client.set_punctuation(espeak.PunctuationMode.SOME) + #self.speech_state = None + #except dbus.exceptions.DBusException: + #print "Speech Dispatcher is not turned on." + #return False + #self.espeak_init = True - def __set_speechd_config(self, attribute = None, value = None, mode = 'one', config_obj = None): + def __set_espeak_config(self, attribute = None, value = None, mode = 'one', config_obj = None): if mode == 'one': if attribute == None or value == None: return False #print attribute + ":" + str(value) - self.__speechd_config[attribute] = value + self.__espeak_config[attribute] = value fp = open(self.path + self.config_file, 'w', 0) - simplejson.dump(self.__speechd_config, fp) + simplejson.dump(self.__espeak_config, fp) fp.close() elif mode == 'all': if config_obj == None: return False fp = open(self.path + self.config_file, 'w', 0) - self.__speechd_config = config_obj - simplejson.dump(self.__speechd_config, fp) + self.__espeak_config = config_obj + simplejson.dump(self.__espeak_config, fp) fp.close() - def speechd_config(self, attribute = None, data = None): + def espeak_config(self, attribute = None, data = None): if attribute == None or data == None: return False - if self.speechd_init == False: - if self.__start_speechd() == False: - return False + #if self.espeakinit == False: + #if self.__start_espeak() == False: + #return False attribute_list = ['pitch', 'rate', 'volume', 'voice', 'output_module', 'language', 'punctuation', 'spelling', 'synthesis_voice'] if attribute in attribute_list: try: - self.__set_speechd_config(attribute, data) + self.__set_espeak_config(attribute, data) if attribute == "pitch": - self.client.set_pitch(int(data)) #-100 to 100 + self.espeak_obj.set_pitch(int(data)) # 0 to 99 + #self.client.set_pitch(int(data)) #-100 to 100 elif attribute == "rate": - self.client.set_rate(int(data)) # -100 to 100 + self.espeak_obj.set_speed(int(data)) # 80 to 370 + #self.client.set_rate(int(data)) # -100 to 100 elif attribute == "volume": - self.client.set_volume(int(data))#-100 to 100 - elif attribute == "voice": - self.client.set_voice(str(data))#(FE)MALE(1,2,3), CHILD_(FE)MALE - elif attribute == "output_module": - self.client.set_output_module(str(data)) - elif attribute == "language": - self.client.set_language(str(data)) - elif attribute == "punctuation": - self.client.set_punctuation(data) - elif attribute == "spelling": - self.client.set_spelling(bool(data)) # True or False - elif attribute == "synthesis_voice": - self.client.set_synthesis_voice(str(data))#self.client.list_synthesis_voices() + self.espeak_obj.set_amplitude(int(data)) # 0 to 200 + #self.client.set_volume(int(data)) #-100 to 100 + #elif attribute == "voice": + #self.client.set_voice(str(data))#(FE)MALE(1,2,3), CHILD_(FE)MALE + #elif attribute == "output_module": + #self.client.set_output_module(str(data)) + #elif attribute == "language": + #self.client.set_language(str(data)) + #elif attribute == "punctuation": + #self.client.set_punctuation(data) + #elif attribute == "spelling": + #self.client.set_spelling(bool(data)) # True or False + #elif attribute == "synthesis_voice": + #self.client.set_synthesis_voice(str(data))#self.client.list_synthesis_voices() except AssertionError, e: print "Assertion Error: " + str(e) + ":" + str(attribute) + ":" + str(data) return False else: return False - def __speechd_callback(self,callback_type): - self.speech_state = callback_type + #def __espeak_callback(self,callback_type): + #self.speech_state = callback_type def say_text(self, text, wait= True): #wait: to wait for the text to be spoken or not #os.popen("espeak " + text) - if self.speechd_init == False: - if self.__start_speechd() == False: - return False + #if self.espeak_init == False: + #if self.__start_espeak() == False: + #return False text = str(text) - self.speech_state = None - - self.client.speak(text, callback=self.__speechd_callback,event_types=(speechd.CallbackType.BEGIN, - speechd.CallbackType.CANCEL, - speechd.CallbackType.END)) - if wait == True: - while(self.speech_state != "end"): - time.sleep(1) + #self.speech_state = None + self.espeak_obj.speak(text) + #self.client.speak(text, callback=self.__espeak_callback,event_types=(espeak.CallbackType.BEGIN, + #espeak.CallbackType.CANCEL, + #espeakCallbackType.END)) + #if wait == True: + #i = len(text) + ##while(self.speech_state != "end"): + #time.sleep(i) @@ -286,5 +293,5 @@ class Listenspell(): self.word_obj.exit_game() self.dict_obj.exit_game() self.say_text("goodbye") - self.client.close() + #self.client.close() sys.exit() diff --git a/ls-espeak-config b/ls-espeak-config new file mode 100644 index 0000000..52fb6be --- /dev/null +++ b/ls-espeak-config @@ -0,0 +1 @@ +{"volume": 100, "rate": 170.0, "language": "en", "pitch": 50.0} \ No newline at end of file diff --git a/ls-speechd-config b/ls-speechd-config deleted file mode 100644 index 079b966..0000000 --- a/ls-speechd-config +++ /dev/null @@ -1 +0,0 @@ -{"language": "en", "punctuation": "some", "volume": 100.0, "rate": 3.0, "pitch": -25.0, "spelling": false, "voice": "MALE1"} \ No newline at end of file -- cgit v0.9.1