Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 3772)
+++ src/orca/default.py	(working copy)
@@ -2316,7 +2316,7 @@
                     #
                     speech.speak(_("blank"), voice, False)
         else:
-            speech.speak(chnames.getCharacterName(character), voice, False)
+            speech.speakCharacter(character, voice)
 
         self.speakTextSelectionState(obj, startOffset, endOffset)
 
@@ -3297,11 +3297,17 @@
         else:
             voice = self.voices[settings.DEFAULT_VOICE]
 
-        # We won't interrupt what else might be being spoken
-        # right now because it is typically something else
-        # related to this event.
+        # Make sure single characters are sent to speakCharacter()
+        # rather than to speak().
         #
-        speech.speak(character, voice, False)
+        if len(character.decode('utf-8')) == 1:
+            speech.speakCharacter(character, voice)
+        else:
+            # We won't interrupt what else might be being spoken
+            # right now because it is typically something else
+            # related to this event.
+            #
+            speech.speak(character, voice, False)
 
     def onTextInserted(self, event):
         """Called whenever text is inserted into an object.
@@ -4448,10 +4454,10 @@
 
         for (charIndex, character) in enumerate(itemString.decode("UTF-8")):
             if character.isupper():
-                speech.speak(character.encode("UTF-8"),
+                speech.speakCharacter(character.encode("UTF-8"),
                              self.voices[settings.UPPERCASE_VOICE])
             else:
-                speech.speak(character.encode("UTF-8"))
+                speech.speakCharacter(character.encode("UTF-8"))
 
     def _reviewCurrentItem(self, inputEvent, targetCursorCell=0,
                            speechType=1):
@@ -6276,7 +6282,10 @@
             else:
                 voice =  settings.voices[settings.DEFAULT_VOICE]
             phoneticString = phonnames.getPhoneticName(character)
-            speech.speak(phoneticString, voice)
+            if len(phoneticString.decode('utf-8')) == 1:
+                speech.speakCharacter(phoneticString, voice)
+            else:
+                speech.speak(phoneticString, voice)
 
     def printAncestry(self, child):
         """Prints a hierarchical view of a child's ancestry."""
Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 3772)
+++ src/orca/Gecko.py	(working copy)
@@ -8212,7 +8212,7 @@
         character = self.getCharacterAtOffset(obj, characterOffset)
         if obj:
             if character and character != self.EMBEDDED_OBJECT_CHARACTER:
-                speech.speak(character, self.getACSS(obj, character), False)
+                speech.speakCharacter(character, self.getACSS(obj, character))
             elif obj.getRole() != pyatspi.ROLE_ENTRY:
                 # We won't have a character if we move to the end of an
                 # entry (in which case we're not on a character and therefore
Index: src/orca/gnomespeechfactory.py
===================================================================
--- src/orca/gnomespeechfactory.py	(revision 3772)
+++ src/orca/gnomespeechfactory.py	(working copy)
@@ -641,7 +641,7 @@
                      used to augment/override the default
                      voice settings.
         """
-        self.speak(character, acss)
+        self.speak(chnames.getCharacterName(character), acss)
 
     def speakUtterances(self, utterances, acss=None, interrupt=True):
         """Speaks the given list of utterances immediately.
