code: def eval2000_data_prep(data_folder: str, save_folder: str):
      """
      Prepare the eval2000/Hub5 English data (LDC2002S09 and LDC2002T43).
      The data serves as the test set and is separated into
      the full dataset (test.csv), the Switchboard portion
      of the dataset (test_swbd.csv) and the Callhome portion
      of the dataset (test_callhome.csv).
  
      Parameters
      ----------
      data_folder : str
          Path to the folder where the eval2000/Hub5 English data is located.
      save_folder : str
          The directory to store the csv files at.
      """
  
      logger.info(
          "Begin preparing the eval2000 Hub5 English test set and transcripts (LDC2002S09 and LDC2002T43)"
      )
  
      audio_folder = os.path.join(
          data_folder, "LDC2002S09/hub5e_00/english"
      )
      transcription_file = os.path.join(
          data_folder,
          "LDC2002T43/2000_hub5_eng_eval_tr/reference/hub5e00.english.000405.stm",
      )
  
      for d in [audio_folder, transcription_file]:
          if not os.path.exists(d):
              err_msg = f"The folder {d} does not exist (it is expected to prepare the eval2000/hub5 test set)"
              raise OSError(err_msg)
  
      csv_lines_callhome = [
          [
              "ID",
              "duration",
              "start",
              "stop",
              "channel",
              "wav",
              "words",
              "spk_id",
          ]
      ]
      csv_lines_swbd = [
          [
              "ID",
              "duration",
              "start",
              "stop",
              "channel",
              "wav",
              "words",
              "spk_id",
          ]
      ]
  
      with open(transcription_file) as file:
          utt_count = 0
          for line in file:
              # Skip header
              if line.startswith(";;"):
                  continue
  
              str_split = line.split()
              # Sometimes the end time of a segment is shifted to the right
              # So we remove all empty strings from the split
              str_split = [i for i in str_split if len(i) > 0]
  
              # Make ID unique
              id = str_split[2].strip() + "_" + str(utt_count)
              channel = str_split[1].strip()
  
              wav_name = str_split[0].strip() + ".sph"
              wav_path = os.path.join(audio_folder, wav_name)
  
              spk_id = str_split[2].strip()
  
              # The label "en" stands for "Callhome conversations"
              # The label "sw" stands for "Switchboard conversations"
              is_swbd = str_split[0].strip().startswith("sw_")
  
              # We want the segment start and end times in samples,
              # so we can slice the segment from the tensor
              try:
                  seg_start = int(
                      float(str_split[3].strip()) * SAMPLERATE
                  )
                  seg_end = int(
                      float(str_split[4].strip()) * SAMPLERATE
                  )
              except ValueError:
                  logger.error(
                      f"Unable to determine start and end time of segment. "
                      f"This should not happen! Split in "
                      f"question was: {str_split}"
                  )
  
              audio_duration = (seg_end - seg_start) / SAMPLERATE
  
              transcription = " ".join(str_split[6:])
              cleaned_transcription = filter_text(
                  transcription, dataset="eval2000"
              )
  
              # Skip empty transcriptions
              if len(cleaned_transcription) > 0:
                  utt_line = [
                      id,
                      audio_duration,
                      seg_start,
                      seg_end,
                      channel,
                      wav_path,
                      cleaned_transcription,
                      spk_id,
                  ]
                  if is_swbd:
                      csv_lines_swbd.append(utt_line)
                  else:
                      csv_lines_callhome.append(utt_line)
              utt_count += 1
  
      merge_files = []
      for name, lines in [
          ("swbd", csv_lines_swbd),
          ("callhome", csv_lines_callhome),
      ]:
          filename = f"test_{name}.csv"
          csv_file = os.path.join(save_folder, filename)
          logger.info(f"Creating csv file {csv_file}")
  
          with open(csv_file, mode="w") as csv_f:
              csv_writer = csv.writer(
                  csv_f,
                  delimiter=",",
                  quotechar='"',
                  quoting=csv.QUOTE_MINIMAL,
              )
  
              for line in lines:
                  csv_writer.writerow(line)
  
          merge_files.append(filename)
      merge_csvs(
          data_folder=save_folder,
          csv_lst=merge_files,
          merged_csv="test.csv",
      )
  
      glm_dir = os.path.join(
          data_folder,
          "LDC2002T43/2000_hub5_eng_eval_tr/reference",
      )
      logger.info("Start parsing mapping rules in en20000405_hub5.glm")
      parse_glm_file(glm_dir, save_folder)
  
imports: import re
  import csv
  import logging
  import os
  from collections import defaultdict
  from speechbrain.dataio.dataio import merge_csvs
  from speechbrain.utils.data_utils import download_file, get_all_files
label_desc: Use image node_id 17 for calling a global function with example usage: eval2000_data_prep(data_folder, save_folder) without return types