code: def collect_data_asr(
      data_dir: Union[Path, str],
      split: str,
      prefix: str,
      src: str,
  ) -> List[List[Utterance]]:
      in_root = data_dir / "raw_audios" / "original"
      csv_root = data_dir / "transcribed_data" / src
      csv_root.mkdir(exist_ok=True, parents=True)
  
      # Get metadata TSV
      url = f"{DOWNLOAD_BASE_URL}/annotations/asr/asr_{src}.tsv.gz"
      tsv_path = csv_root / Path(url).name
      if not tsv_path.exists():
          try:
              download_url(url, csv_root.as_posix(), Path(url).name)
          except urllib.error.HTTPError:
              logging.warning(f"cannot download {url}. Skip")
              return []
  
      with gzip.open(tsv_path, "rt") as f:
          metadata = [x for x in csv.DictReader(f, delimiter="|")]
          metadata = [x for x in metadata if x["split"] == split]
  
      # Get talks
      talks = {}
      for r in metadata:
          event_id = r["session_id"]
          if event_id not in talks:
              talks[event_id] = []
  
          year = event_id[:4]
          audio_path = in_root / year / f"{event_id}_original.ogg"
          assert audio_path.is_file()
  
          # Note(jinchuan): Try to reserve the original text.
          # adopt original_text if provided, otherwise normed_text.
          if len(r["original_text"].strip()) > 0:
              text = r["original_text"]
          elif len(r["normed_text"].strip()) > 0:
              text = r["normed_text"]
          else:
              logging.warning(f"text is missing: {r}")
              continue
          text = preprocess_text(text)
  
          # Note(jinchuan): it has two time-stamps: "vad" and
          # "start_time" & "end_time". We adopt "vad" follwoing
          # the original VoxPopuli script.
          start_time = literal_eval(r["vad"])[0][0]
          end_time = literal_eval(r["vad"])[-1][-1]
          if end_time - start_time < 0.1:
              logging.warning(f"the utterance is too short. Skip: {r}")
              continue
  
          iso_src = toiso(src)
          path_template = "ffmpeg -i {} -ac 1 -ar 16000 -f wav - |"
          talks[event_id].append(
              Utterance(
                  utt_id=f"{prefix}_asr_{event_id}_{r['id_']}",
                  wav_id=f"{prefix}_asr_{event_id}",
                  wav_path=path_template.format(
                      str(audio_path.resolve())
                  ),
                  start_time=start_time,
                  end_time=end_time,
                  lang=f"<{iso_src}>",
                  task="<asr>",
                  text=text,
                  asr_text=text,
              )
          )
  
      return list(talks.values())
  
file_path: espnet/egs2/owsm_v3/s2t1/local/prepare_voxpopuli.py
imports: import csv
  import gzip
  import json
  import logging
  import urllib
  from argparse import ArgumentParser
  from ast import literal_eval
  from collections import defaultdict
  from pathlib import Path
  from typing import Dict, List, Optional, Tuple, Union
  from iso639 import languages
  from torchaudio.datasets.utils import download_url
  from utils import SYMBOL_NA, SYMBOL_NOSPEECH, SYMBOLS_TIME, LongUtterance, Utterance, generate_long_utterances
label_desc: Use image node_id 4 for calling a global function with example usage: collect_data_asr(data_dir, split, prefix, src) and returns: list, list