def speak(self) -> List[SpeakerMsg]:
    'List of speaker msgs.\n\n        Contents:\n            * beginning of road -> :ref:`Speaker <speaker_msg>`.START_ZONE,\n              end of road -> :ref:`Speaker <speaker_msg>`.END_ZONE,\n              and in between -> :ref:`Speaker <speaker_msg>`.DRIVING_ZONE,\n            * close to an obstacle -> :ref:`Speaker <speaker_msg>`.OVERTAKING_ZONE\n            * before yield/stop lines                     -> :ref:`Speaker <speaker_msg>`.HALT_ZONE/SpeakerMsg.STOP_ZONE,\n            * parking area -> :ref:`Speaker <speaker_msg>`.PARKING_ZONE\n        '
    msgs = super().speak()

    def append_msg(t: int):
        msg = SpeakerMsg()
        msg.type = t
        msgs.append(msg)
    append_msg((SpeakerMsg.PARKING_ZONE if (self.current_section.type == road_section_type.PARKING_AREA) else SpeakerMsg.NO_PARKING_ZONE))
    append_msg((SpeakerMsg.OVERTAKING_ZONE if self._inside_any_interval(self.overtaking_zones) else SpeakerMsg.NO_OVERTAKING_ZONE))
    if (self.arc_length < self.start_zone_buffer):
        append_msg(SpeakerMsg.START_ZONE)
    elif ((self.arc_length + self.end_zone_buffer) < self.total_length):
        append_msg(SpeakerMsg.DRIVING_ZONE)
    else:
        append_msg(SpeakerMsg.END_ZONE)
    if self._inside_any_interval(self.halt_zones):
        append_msg(SpeakerMsg.HALT_ZONE)
    elif self._inside_any_interval(self.stop_zones):
        append_msg(SpeakerMsg.STOP_ZONE)
    else:
        append_msg(SpeakerMsg.NO_STOP_ZONE)
    for (x, msg) in reversed(self.speed_zones):
        if ((x + 0.5) < self.arc_length):
            append_msg(msg)
            break
    return msgs
List of speaker msgs.

Contents:
    * beginning of road -> :ref:`Speaker <speaker_msg>`.START_ZONE,
      end of road -> :ref:`Speaker <speaker_msg>`.END_ZONE,
      and in between -> :ref:`Speaker <speaker_msg>`.DRIVING_ZONE,
    * close to an obstacle -> :ref:`Speaker <speaker_msg>`.OVERTAKING_ZONE
    * before yield/stop lines                     -> :ref:`Speaker <speaker_msg>`.HALT_ZONE/SpeakerMsg.STOP_ZONE,
    * parking area -> :ref:`Speaker <speaker_msg>`.PARKING_ZONE
def speak(self) -> List[SpeakerMsg]:
    'List of speaker msgs.\n\n        Contents:\n            * beginning of road -> :ref:`Speaker <speaker_msg>`.START_ZONE,\n              end of road -> :ref:`Speaker <speaker_msg>`.END_ZONE,\n              and in between -> :ref:`Speaker <speaker_msg>`.DRIVING_ZONE,\n            * close to an obstacle -> :ref:`Speaker <speaker_msg>`.OVERTAKING_ZONE\n            * before yield/stop lines                     -> :ref:`Speaker <speaker_msg>`.HALT_ZONE/SpeakerMsg.STOP_ZONE,\n            * parking area -> :ref:`Speaker <speaker_msg>`.PARKING_ZONE\n        '
    msgs = super().speak()

    def append_msg(t: int):
        msg = SpeakerMsg()
        msg.type = t
        msgs.append(msg)
    append_msg((SpeakerMsg.PARKING_ZONE if (self.current_section.type == road_section_type.PARKING_AREA) else SpeakerMsg.NO_PARKING_ZONE))
    append_msg((SpeakerMsg.OVERTAKING_ZONE if self._inside_any_interval(self.overtaking_zones) else SpeakerMsg.NO_OVERTAKING_ZONE))
    if (self.arc_length < self.start_zone_buffer):
        append_msg(SpeakerMsg.START_ZONE)
    elif ((self.arc_length + self.end_zone_buffer) < self.total_length):
        append_msg(SpeakerMsg.DRIVING_ZONE)
    else:
        append_msg(SpeakerMsg.END_ZONE)
    if self._inside_any_interval(self.halt_zones):
        append_msg(SpeakerMsg.HALT_ZONE)
    elif self._inside_any_interval(self.stop_zones):
        append_msg(SpeakerMsg.STOP_ZONE)
    else:
        append_msg(SpeakerMsg.NO_STOP_ZONE)
    for (x, msg) in reversed(self.speed_zones):
        if ((x + 0.5) < self.arc_length):
            append_msg(msg)
            break
    return msgs