GNOME Bugzilla – Bug 532982
spell word is not working in many places
Last modified: 2008-05-28 21:07:32 UTC
1. Open naudilus in list view 2. Make sure a file or folder is highlighted 3. Press the spell current flat review item (on the laptop double press capslock+k) What should happen is that the filename should be spelled What actually happens is that only the first letter is heard. This problem can also be reproduced in the message list of thunderbird or a chat area in pidgin. Spell word does seem to work in gedit
I can't recreate this. I tried it with both the laptop bindings (Caps_Lock-k) and using the desktop bindings (KP_5). A double press of that binding spells the filename. I also note that if the filename has more than one word, then I had to hit KP_6 to get to the next word, before doing double-KP_5 again, but I think that's to be expected.
Created attachment 111284 [details] orca settings that will reproduce the problem. This should help reproduce the problem
Yup. It certainly does. So here's an interesting thing. It all depends on the eSpeak rate. Mike had it at 99.0. I set it to 50.0, and Orca nicely spelled the file name. By experimentation, I think the failures start occurring somewhere between 75.0 and 80.0. I then went back to my .orca settings (Cepstral Swift/Callie) and bumped her up to 99.0, and she has no problem spelling all of the filename. So, perhaps I'm being naive, but this looks like an eSpeak bug. Mike, can you as an experiment, change to another TTS synth and try spelling a file name with that) at rate = 99.0? Thanks.
I've done a little more digging. The problem is in and around spellingGenerator() in default.py and the various methods it calls. I added a load of debug messages. For this test, we are trying to spell "File" (first menu name in the nautilus menu bar). Spelling for me is with the desktop key binding (i.e. a double press of KP_5). With a good run (eSpeak gnome-speech TTS, rate=59), we see the following: XXX: spelling: File XXX: spellingGenerator called. XXX: spelling: F XXX: before SayAllContext. XXX: SayAllContext: utterance: F XXX: SayAllContext: start offset: 0 XXX: SayAllContext: end offset: 1 XXX: __init_returning. SPEECH OUTPUT: 'F' XXX: __spellItemProgressCallback: 0 XXX: after SayAllContext. XXX: spelling: i XXX: before SayAllContext. XXX: SayAllContext: utterance: i XXX: SayAllContext: start offset: 1 XXX: SayAllContext: end offset: 2 XXX: __init_returning. SPEECH OUTPUT: 'i' XXX: __spellItemProgressCallback: 0 XXX: __spellItemProgressCallback: 0 XXX: __spellItemProgressCallback: 0 XXX: after SayAllContext. XXX: spelling: l XXX: before SayAllContext. XXX: SayAllContext: utterance: l XXX: SayAllContext: start offset: 2 XXX: SayAllContext: end offset: 3 XXX: __init_returning. SPEECH OUTPUT: 'l' XXX: __spellItemProgressCallback: 0 XXX: __spellItemProgressCallback: 0 XXX: __spellItemProgressCallback: 0 XXX: after SayAllContext. XXX: spelling: e XXX: before SayAllContext. XXX: SayAllContext: utterance: e XXX: SayAllContext: start offset: 3 XXX: SayAllContext: end offset: 4 XXX: __init_returning. SPEECH OUTPUT: 'e' XXX: __spellItemProgressCallback: 0 XXX: __spellItemProgressCallback: 0 XXX: __spellItemProgressCallback: 0 XXX: after SayAllContext. XXX: __spellItemProgressCallback: 2 ------- With a bad run (eSpeak gnome-speech TTS, rate=99), we see the following: XXX: spelling: File XXX: spellingGenerator called. XXX: spelling: F XXX: before SayAllContext. XXX: SayAllContext: utterance: F XXX: SayAllContext: start offset: 0 XXX: SayAllContext: end offset: 1 XXX: __init_returning. SPEECH OUTPUT: 'F' In other words, it's not coming back from the call to: yield [speechserver.SayAllContext(obj, string, startOffset, startOffset + 1), voice] in spellingGenerator() in default.py (around line 6629), and __spellItemProgressCallback() isn't getting called. Any ideas what might be causing this?
*** Bug 534932 has been marked as a duplicate of this bug. ***
It looks like the callback isn't getting called, which might imply this is an eSpeak/gnome-speech problem. Sigh. :-(
I took it a little further. As Orca was running, I attached to the second espeak-synthesis-driver process each time, with gdb. With a speech rate of 59, when I pressed double KP_5 I saw: [New Thread 0xb69d0b90 (LWP 24183)] [Thread 0xb69d0b90 (LWP 24183) exited] [New Thread 0xb69d0b90 (LWP 24184)] [Thread 0xb69d0b90 (LWP 24184) exited] [New Thread 0xb69d0b90 (LWP 24188)] [Thread 0xb69d0b90 (LWP 24188) exited] [New Thread 0xb69d0b90 (LWP 24189)] [Thread 0xb69d0b90 (LWP 24189) exited] [New Thread 0xb618eb90 (LWP 24190)] [Thread 0xb618eb90 (LWP 24190) exited] [New Thread 0xb598db90 (LWP 24191)] [Thread 0xb598db90 (LWP 24191) exited] [New Thread 0xb518cb90 (LWP 24192)] [Thread 0xb518cb90 (LWP 24192) exited] [New Thread 0xb518cb90 (LWP 24198)] [Thread 0xb518cb90 (LWP 24198) exited] With a speech rate of 99, when I pressed double KP_5 I saw: [New Thread 0xb69adb90 (LWP 24331)] [Thread 0xb69adb90 (LWP 24331) exited] [New Thread 0xb69adb90 (LWP 24332)] [Thread 0xb69adb90 (LWP 24332) exited] [New Thread 0xb69adb90 (LWP 24334)] [Thread 0xb69adb90 (LWP 24334) exited] [New Thread 0xb69adb90 (LWP 24335)] [Thread 0xb69adb90 (LWP 24335) exited] In other words, not so many new LWP's were created.
Here's the espeak-synthesis-driver debug messages for trying to spell "File" (first item in the menu bar). 1/ Good run (rate = 59): ... espeak_say called. espeak_speaker_from_servant called. espeak_synthesis_driver_say called. espeak_set_capitals called. espeak_synthesis_driver_set_param: called. espeak_set_volume called. espeak_synthesis_driver_set_param: called. espeak_set_rate called. espeak_synthesis_driver_set_param: called. espeak_set_pitch_fluctuation called. espeak_synthesis_driver_set_param: called. espeak_set_pitch called. espeak_synthesis_driver_set_param: called. espeak_synthesis_driver_say: saying: F espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_say: OK. espeak_synthesis_driver_timeout_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_timeout_callback called. espeak_say called. espeak_speaker_from_servant called. espeak_synthesis_driver_say called. espeak_set_capitals called. espeak_synthesis_driver_set_param: called. espeak_set_volume called. espeak_synthesis_driver_set_param: called. espeak_set_rate called. espeak_synthesis_driver_set_param: called. espeak_set_pitch_fluctuation called. espeak_synthesis_driver_set_param: called. espeak_set_pitch called. espeak_synthesis_driver_set_param: called. espeak_synthesis_driver_say: saying: i espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_say: OK. espeak_synthesis_driver_timeout_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_timeout_callback called. espeak_say called. espeak_speaker_from_servant called. espeak_synthesis_driver_say called. espeak_synthesis_driver_say: saying: l espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_say: OK. espeak_synthesis_driver_timeout_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_timeout_callback called. espeak_say called. espeak_speaker_from_servant called. espeak_synthesis_driver_say called. espeak_synthesis_driver_say: saying: e espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_say: OK. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_timeout_callback called. espeak_synthesis_driver_timeout_callback called. ... 2/ Bad run (rate = 99): ... espeak_say called. espeak_speaker_from_servant called. espeak_synthesis_driver_say called. espeak_set_capitals called. espeak_synthesis_driver_set_param: called. espeak_set_volume called. espeak_synthesis_driver_set_param: called. espeak_set_rate called. espeak_synthesis_driver_set_param: called. espeak_set_pitch_fluctuation called. espeak_synthesis_driver_set_param: called. espeak_set_pitch called. espeak_synthesis_driver_set_param: called. espeak_synthesis_driver_say: saying: F espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_index_callback called. espeak_synthesis_driver_say: OK. espeak_synthesis_driver_timeout_callback called. espeak_synthesis_driver_timeout_callback called. ... I need to add/adjust the debug to find out exactly what's going on. More tomorrow.
I added some more debug. Here's the espeak-synthesis-driver debug messages for trying to spell the "F" of "File" (first item in the menu bar). 1/ Good run (rate = 59): ... espeak_synthesis_driver_say: saying: F espeak_synthesis_driver_index_callback called. event->type: 2 espeakEVENT_SENTENCE. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_synthesis_driver_index_callback called. event->type: 1 WORD MARK or END. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_synthesis_driver_say: a_error: 0 espeak_synthesis_driver_say: OK. espeak_synthesis_driver_say: returning status: 7 espeak_synthesis_driver_timeout_callback called. espeak_synthesis_driver_index_callback called. event->type: 5 WORD MARK or END. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_synthesis_driver_index_callback called. event->type: 6 espeakEVENT_MSG_TERMINATED. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_say called. espeak_speaker_from_servant called. espeak_synthesis_driver_say called. espeak_set_capitals called. espeak_synthesis_driver_set_param: called. espeak_set_volume called. espeak_synthesis_driver_set_param: called. espeak_set_rate called. espeak_synthesis_driver_set_param: called. espeak_set_pitch_fluctuation called. espeak_synthesis_driver_set_param: called. espeak_set_pitch called. espeak_synthesis_driver_set_param: called. ... 2/ Bad run (rate = 99): ... espeak_synthesis_driver_say: saying: F espeak_synthesis_driver_index_callback called. event->type: 2 espeakEVENT_SENTENCE. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_synthesis_driver_index_callback called. event->type: 1 WORD MARK or END. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_synthesis_driver_index_callback called. event->type: 5 WORD MARK or END. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_synthesis_driver_index_callback called. event->type: 6 espeakEVENT_MSG_TERMINATED. a_callback_is_called is TRUE. Calling GNOME_Speech_SpeechCallback_notify. espeak_synthesis_driver_say: a_error: 0 espeak_synthesis_driver_say: OK. espeak_synthesis_driver_say: returning status: 9 espeak_synthesis_driver_timeout_callback called. ... espeak_synthesis_driver_timeout_callback called. ... It's still not exactly clear what the difference is. I'll keep digging.
Chatted with Will about this. The plan here is to put the code for spelling a word back the way it was. I.e. remove the speak progress callback stuff. Joanie, passing it over to you. Thanks.
That stuff has been reversed. Rich, passing it back over to you for confirmation that this bug is taken care of. :-)
This seems to be working just fine now. I switched to eSpeak (via GNOME Speech) and set the rate to 99. Double-Press KP_5 nicely spells the current flat review word. Moving it to "[pending]" as the fix is already committed. Mike, can you also check this out please? Thanks Joanie.
This now seems to be working well.
Thanks Mike. Closing as FIXED.