Ticket #81 (closed defect: fixed)
variant changing messes up in voice settings dialogue (doesn't occure with synth settings ring)
| Reported by: | valiant8086 | Owned by: | |
|---|---|---|---|
| Priority: | minor | Milestone: | 2009.1 |
| Component: | Speech synth drivers | Version: | development |
| Keywords: | voices | Cc: | |
| Operating system: | Blocked by: | ||
| Blocking: |
Description
Always reproduceable for me.
With NVDA running, press insert+n, down arrow to preferences, enter, down arrow to voice settings, enter.
Tab to the variant combo box and change it before speech has stopped announcing information about that field. E.G. just change the variant immediately without waiting for NVDA to finish talking. I can do this when I tab in and when I shift+tab in from the other direction. I can't do this to cause voices themselves to not change, only variants seam to do this. What happens for me is the variant isn't changed, the name of the new variant I have arrowed to is announced with the variant previously used. This is pretty obvious when you arrow to whisper and variant max is still speaking. In addition, max would continue to speak after that, even after I pressed ok. So, if you change a variant while ESpeak is actually speaking something instead of waiting for it to be quiet, the variant actually doesn't change. In addition, if you press ctrl to stop the speech after you put focus on the variant combo box, then change the variant, the voice is still not changed. This also happens for shift. I suspect this is do to the pause feature.
Attachments
Change History
comment:1 Changed 4 years ago by jteh
I can reproduce this every time, but only if I try to change the variant or hit control within the first quarter of a second or so of the "Variant combo box" announcement; i.e. at fastest speed, any time before the word "Variant" finishes speaking. If I wait any longer, it works fine. Is this the same for you?
eSpeak does seem to internally think that it has changed the voice/variant; i.e. getCurrentVoice().identifier returns the new voice/variant, even though the old one is still speaking. I think this is an eSpeak bug, though it may relate to our particular usage of eSpeak. I suspect that eSpeak doesn't like us calling espeak_SetVoiceByName while it is still speaking. Calling _espeak.stop() before changing variants doesn't work, as the last callback will not yet have occurred, so eSpeak will still be speaking. The fix is to queue setVoiceByName just as we queue other parameter changes. This is probably more correct anyway. I will commit this once I sleep and tidy up the code. :)
comment:2 Changed 4 years ago by pvagner
I have attempted to fix this. The patch is attached to this ticket. I believe I have also made variant switching code a bit nicer. Except of your hint to run voice voice change in the other thread like when altering pitch speed and inflection I have to cancel the speech before trying to change the variant.
Changed 4 years ago by pvagner
-
attachment
variantSelection.patch
added
attempt for a fix. I haven't committed this because jamie is also working on it.
comment:3 Changed 4 years ago by jteh
- Status changed from new to closed
- Component changed from Core to Synth drivers
- Version set to trunk
- Resolution set to fixed
- Milestone set to 0.6
Fixed in r1997.
Notes:
- The cancelSpeech() before the variant change in your patch was necessary because the cancelSpeech() that was happening *after* the variant change (the one that NVDA queues in response to the key press) was swallowing the voice change. See my change to synthDrivers._espeak.stop().
- We probably should cancelSpeech() before changing variant. However, if so, we should probably cancelSpeech() before changing voice as well. Since this is not necessary to fix this bug, I've left it out. We can fix this for all cases if it becomes a problem for other synths in future.


Here's my NVDA.ini file