docs: def new_utterance(self, utterance_idx, track_idx, issuer_idx=None, start=0, end=float('inf')):
          """
          Add a new utterance to the corpus with the given data.
  
          Parameters:
              track_idx (str): The track id the utterance is in.
              utterance_idx (str): The id to associate with the utterance.
                                   If None or already exists, one is generated.
              issuer_idx (str): The issuer id to associate with the utterance.
              start (float): Start of the utterance within the track [seconds].
              end (float): End of the utterance within the track [seconds].
                           ``inf`` equals the end of the track.
  
          Returns:
              Utterance: The newly added utterance.
          """
  
          new_utt_idx = utterance_idx
  
          # Check if there is a track with the given idx
          if track_idx not in self._tracks.keys():
              raise ValueError('Track with id {} does not exist!'.format(track_idx))
  
          # Check if issuer exists
          issuer = None
  
          if issuer_idx is not None:
              if issuer_idx not in self._issuers.keys():
                  raise ValueError('Issuer with id {} does not exist!'.format(issuer_idx))
              else:
                  issuer = self._issuers[issuer_idx]
  
          # Add index to idx if already existing
          if new_utt_idx in self._utterances.keys():
              new_utt_idx = naming.index_name_if_in_list(new_utt_idx, self._utterances.keys())
  
          new_utt = tracks.Utterance(new_utt_idx,
                                     self.tracks[track_idx],
                                     issuer=issuer,
                                     start=start,
                                     end=end)
  
          self._utterances[new_utt_idx] = new_utt
  
          return new_utt