class_docstr: Align text to audio using CTC segmentation.
  
  Usage:
      Initialize with given ASR model and parameters.
      If needed, parameters for CTC segmentation can be set with ``set_config(·)``.
      Then call the instance as function to align text within an audio file.
  
  Example:
      >>> # example file included in the ESPnet repository
      >>> import soundfile
      >>> speech, fs = soundfile.read("test_utils/ctc_align_test.wav")
      >>> # load an ASR model
      >>> from espnet_model_zoo.downloader import ModelDownloader
      >>> d = ModelDownloader()
      >>> wsjmodel = d.download_and_unpack( "kamo-naoyuki/wsj" )
      >>> # Apply CTC segmentation
      >>> aligner = CTCSegmentation( **wsjmodel )
      >>> text=["utt1 THE SALE OF THE HOTELS", "utt2 ON PROPERTY MANAGEMENT"]
      >>> aligner.set_config( gratis_blank=True )
      >>> segments = aligner( speech, text, fs=fs )
      >>> print( segments )
      utt1 utt 0.27 1.72 -0.1663 THE SALE OF THE HOTELS
      utt2 utt 4.54 6.10 -4.9646 ON PROPERTY MANAGEMENT
  
  On multiprocessing:
      To parallelize the computation with multiprocessing, these three steps
      can be separated:
      (1) ``get_lpz``: obtain the lpz,
      (2) ``prepare_segmentation_task``: prepare the task, and
      (3) ``get_segments``: perform CTC segmentation.
      Note that the function `get_segments` is a staticmethod and therefore
      independent of an already initialized CTCSegmentation object.
  
  References:
      CTC-Segmentation of Large Corpora for German End-to-end Speech Recognition
      2020, Kürzinger, Winkelbauer, Li, Watzel, Rigoll
      https://arxiv.org/abs/2007.09127
  
  More parameters are described in https://github.com/lumaku/ctc-segmentation
docstr: Convert text to list and extract utterance IDs.
docstr_tok: ["Convert","text","to","list","and","extract","utterance","IDs","."]
code: def _split_text(self, text):
      """Convert text to list and extract utterance IDs."""
      utt_ids = None
      # Handle multiline strings
      if isinstance(text, str):
          text = text.splitlines()
      # Remove empty lines
      text = list(filter(len, text))
      # Handle kaldi-style text format
      if self.kaldi_style_text:
          utt_ids_and_text = [utt.split(" ", 1) for utt in text]
          # remove utterances with empty text
          utt_ids_and_text = filter(
              lambda ui: len(ui) == 2, utt_ids_and_text
          )
          utt_ids_and_text = list(utt_ids_and_text)
          utt_ids = [utt[0] for utt in utt_ids_and_text]
          text = [utt[1] for utt in utt_ids_and_text]
      return utt_ids, text
  
imports: import argparse
  import logging
  import sys
  from pathlib import Path
  from typing import List, Optional, TextIO, Union
  import numpy
  import soundfile
  import torch
  from ctc_segmentation import CtcSegmentationParameters, ctc_segmentation, determine_utterance_segments, prepare_text, prepare_token_list
  from typeguard import check_argument_types, check_return_type
  from espnet2.tasks.asr import ASRTask
  from espnet2.torch_utils.device_funcs import to_device
  from espnet2.utils import config_argparse
  from espnet2.utils.types import str2bool, str_or_none
  from espnet.utils.cli_utils import get_commandline_args
label_desc: Use image node_id 6 for calling the CTCSegmentation obj's underlying member method code with example usage: obj._split_text(text) and returns: utt_ids,  text