Index: src/orca/scripts/apps/soffice/speech_generator.py
===================================================================
--- src/orca/scripts/apps/soffice/speech_generator.py	(revision 4042)
+++ src/orca/scripts/apps/soffice/speech_generator.py	(working copy)
@@ -289,6 +289,49 @@
 
         return utterances
 
+    def _getSpeechForText(self, obj, already_focused):
+        """Get the speech for a text component. We don't want to speak
+        the name of a paragraph if its parent has a label.
+
+        Arguments:
+        - obj: the text component
+        - already_focused: False if object just received focus
+
+        Returns a list of utterances to be spoken for the object.
+        """
+
+        if obj.getRole() == pyatspi.ROLE_PARAGRAPH:
+            utterances = []
+            utterances.extend(self._getSpeechForObjectLabel(obj))
+            if len(utterances) == 0 and obj.parent:
+                parentLabel = self._getSpeechForObjectLabel(obj.parent)
+                # If we aren't already focused, we will have spoken the
+                # parent as part of the speech context and do not want
+                # to repeat it.
+                #
+                if already_focused:
+                    utterances.extend(parentLabel)
+                # If we still don't have a label, look to the name.
+                #
+                if not parentLabel and obj.name and len(obj.name):
+                    utterances.append(obj.name)
+
+            [text, caretOffset, startOffset] = \
+                self._script.getTextLineAtCaret(obj)
+            utterances.append(text)
+
+            utterances.extend(self._getSpeechForAllTextSelection(obj))
+
+            self._debugGenerator("soffice _getSpeechForText",
+                                 obj,
+                                 already_focused,
+                                 utterances)
+        else:
+            utterances.extend(speechgenerator.SpeechGenerator.\
+                _getSpeechForText(self, obj, already_focused))
+
+        return utterances
+
     def _getSpeechForToggleButton(self, obj, already_focused):
         """Get the speech for a toggle button.  We always want to speak the
         state if it's on a toolbar.
Index: src/orca/speechgenerator.py
===================================================================
--- src/orca/speechgenerator.py	(revision 4042)
+++ src/orca/speechgenerator.py	(working copy)
@@ -1826,7 +1826,8 @@
                     # Push announcement of cell to the end
                     #
                     if parent.getRole() not in [pyatspi.ROLE_TABLE_CELL,
-                                                pyatspi.ROLE_FILLER]:
+                                                pyatspi.ROLE_FILLER,
+                                                pyatspi.ROLE_UNKNOWN]:
                         utterances.append(\
                             rolenames.getSpeechForRoleName(parent))
                     utterances.append(text)
