Index: source/gui/settingsDialogs.py
===================================================================
--- source/gui/settingsDialogs.py	(revision 1993)
+++ source/gui/settingsDialogs.py	(working copy)
@@ -309,7 +309,9 @@
 
 	def onVariantChange(self,evt):
 		val=evt.GetSelection()
-		getSynth().variant=getSynth().getVariantIdentifier(val)
+		s=getSynth()
+		speech.cancelSpeech()
+		s.variant=s.getVariantIdentifier(val)
 
 	def onRateChange(self,evt):
 		val=evt.GetSelection()
Index: source/synthDrivers/_espeak.py
===================================================================
--- source/synthDrivers/_espeak.py	(revision 1993)
+++ source/synthDrivers/_espeak.py	(working copy)
@@ -215,7 +215,7 @@
 	espeakDLL.espeak_SetVoiceByName(voice.identifier)
 
 def setVoiceByName(name):
-	espeakDLL.espeak_SetVoiceByName(name)
+	_bgExec(espeakDLL.espeak_SetVoiceByName,name)
 
 def setVoiceByLanguage(lang):
 	v=espeak_VOICE()
Index: source/synthDrivers/espeak.py
===================================================================
--- source/synthDrivers/espeak.py	(revision 1993)
+++ source/synthDrivers/espeak.py	(working copy)
@@ -123,13 +123,12 @@
 			self._variant="none"
 		identifier=_espeak.getCurrentVoice().identifier.split('+')[0]
 		if self._variant =="none":
-			_espeak.setVoiceByName(identifier.split('+')[0])
-		else:
-			identifier="%s+%s"%(identifier,self._variant)
-		try:
 			_espeak.setVoiceByName(identifier)
-		except:
-			_espeak.setVoiceByName(identifier.split('+')[0])
+		else:
+			try:
+				_espeak.setVoiceByName("%s+%s"%(identifier,val))
+			except:
+				_espeak.setVoiceByName(identifier)
 
 	def _get_variantCount(self):
 		return len(self._variantDict)

