{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a12feb8b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5494b1c",
   "metadata": {},
   "source": [
    "## Prep container"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f2f3ecd7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# docker run --gpus all \\\n",
    "#     -it \\\n",
    "#     -v /home/georg/code/NeMo:/NeMo \\\n",
    "#     -v /home/georg:/home/georg \\\n",
    "#     -v /mnt/data-ssd-1:/mnt/data-ssd-1 \\\n",
    "#     -v /mnt/data-ssd-2:/mnt/data-ssd-2 \\\n",
    "#     -p 8888:8888 \\\n",
    "#     -p 6006:6006 \\\n",
    "#     --shm-size=32g \\\n",
    "#     --ulimit memlock=-1 \\\n",
    "#     --ulimit stack=67108864 \\\n",
    "#     nvcr.io/nvidia/pytorch:22.10-py3\n",
    "\n",
    "# cd /NeMo && ./reinstall.sh"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b41b6dc1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a9f80a3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "6daf5c98",
   "metadata": {},
   "source": [
    "## prep corpus and attempt finetuning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "71aef6ed",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import re\n",
    "import string\n",
    "import random\n",
    "import multiprocessing\n",
    "from collections import Counter\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "from suno_utils.utils.text import read_jsonl, write_jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "0fb45b8c",
   "metadata": {},
   "outputs": [],
   "source": [
    "metas = read_jsonl(\"/mnt/data-ssd-2/data/youtube_med/10_segments_meta.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "c266f7f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "allowed_chars = set(string.ascii_letters + string.digits + string.punctuation + \" \" + \"♫°£€\" + \"|—\")\n",
    "\n",
    "def fixup(text):\n",
    "    text = text.replace(\"®\", \"\").replace(\"™\", \"\")\n",
    "    text = text.replace(\"’\", \"'\")\n",
    "    text = text.replace(\"“\", '\"').replace(\"”\", '\"')\n",
    "    text = text.replace(\"🎶\", '♫').replace(\"♬\", '♫').replace(\"🎵\", '♫')\n",
    "    if len(set(text) - allowed_chars) > 0:\n",
    "        return None\n",
    "    return text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "fd2b4f3b",
   "metadata": {},
   "outputs": [],
   "source": [
    "text_list = [m[\"text\"] for m in metas]\n",
    "with multiprocessing.Pool(8) as p:\n",
    "    fixed_text_list = p.map(fixup, text_list, chunksize=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c8640a69",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7 % dropped\n"
     ]
    }
   ],
   "source": [
    "frac_dropped = len([s for s in fixed_text_list if s is None]) / len(fixed_text_list)\n",
    "print(round(frac_dropped * 100, 1), \"% dropped\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "f3b1ea05",
   "metadata": {},
   "outputs": [],
   "source": [
    "mistakes = Counter()\n",
    "total = Counter()\n",
    "for n, fixed_text in enumerate(fixed_text_list):\n",
    "    total[metas[n][\"original_id\"]] += 1\n",
    "    if fixed_text is None:\n",
    "        mistakes[metas[n][\"original_id\"]] += 1\n",
    "blocked_ids = set()\n",
    "for k, v in total.items():\n",
    "    if v < 3 or mistakes[k] >= 2:\n",
    "        blocked_ids.add(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "8e7e756e",
   "metadata": {},
   "outputs": [],
   "source": [
    "audio_filepaths = [\n",
    "    os.path.join(\n",
    "        \"/mnt/data-ssd-2/data/youtube_med/segments_audio\", \n",
    "        m[\"audio_filepath_wav\"].split(\"segments_audio\")[-1].strip(\"/\"),\n",
    "    ) \n",
    "    for m in metas\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "1f6f8240",
   "metadata": {},
   "outputs": [],
   "source": [
    "# get reliable duration\n",
    "from multiprocessing import Pool\n",
    "from suno_utils.audio import Audio\n",
    "def _foo(fp):\n",
    "    try:\n",
    "        return Audio.get_details(fp, attempt_using_header=True)[\"duration_s\"]\n",
    "    except:\n",
    "        return None\n",
    "with Pool(30) as p:\n",
    "    audio_durations = p.map(_foo, audio_filepaths)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "62694a3b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# kick out ones that have too many segments with errors\n",
    "fixed_metas = []\n",
    "for n, (fixed_text, audio_duration, audio_filepath) in enumerate(zip(\n",
    "    fixed_text_list, audio_durations, audio_filepaths\n",
    ")):\n",
    "    m = metas[n]\n",
    "    if m[\"original_id\"] in blocked_ids:\n",
    "        continue\n",
    "    if fixed_text is None:\n",
    "        continue\n",
    "    if audio_duration is None:\n",
    "        continue\n",
    "    fixed_metas.append({\n",
    "        \"original_id\": m[\"original_id\"],\n",
    "        \"original_start_s\": m[\"original_start_s\"],\n",
    "        \"original_end_s\": m[\"original_end_s\"],\n",
    "        \"duration_s\": audio_duration,\n",
    "        \"audio_filepath\": audio_filepath,\n",
    "        \"text\": fixed_text,\n",
    "    })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "ac5bfc21",
   "metadata": {},
   "outputs": [],
   "source": [
    "random.seed(6006)\n",
    "ids = list(set([m[\"original_id\"] for m in fixed_metas]))\n",
    "random.shuffle(ids)\n",
    "test_ids = set(ids[-500:])\n",
    "val_ids = set(ids[-1000:-500])\n",
    "val_mini_ids = set(ids[-600:-500])\n",
    "tr_ids = set(ids[:-1000])\n",
    "tr_mini_ids = set(ids[-2000:-1000])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "c958c67f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train\n",
      "4182344 segments\n",
      "20129.8 hours\n",
      "\n",
      "train mini\n",
      "30579 segments\n",
      "147.1 hours\n",
      "\n",
      "val\n",
      "15153 segments\n",
      "73.1 hours\n",
      "\n",
      "val mini\n",
      "2443 segments\n",
      "11.8 hours\n",
      "\n",
      "test\n",
      "15189 segments\n",
      "73.4 hours\n"
     ]
    }
   ],
   "source": [
    "def _format_nemo(id_subset):\n",
    "    nemo_metas = []\n",
    "    for m in fixed_metas: \n",
    "        orig_duration_s = m[\"original_end_s\"] - m[\"original_start_s\"]\n",
    "        if (\n",
    "            np.abs(orig_duration_s - m[\"duration_s\"]) > 0.1 or\n",
    "            m[\"duration_s\"] > 20.0 or\n",
    "            m[\"duration_s\"] < 0.1 or\n",
    "            m[\"original_id\"] not in id_subset\n",
    "        ):\n",
    "            continue\n",
    "        nemo_metas.append({\n",
    "            \"audio_filepath\": m[\"audio_filepath\"],\n",
    "            \"duration\": m[\"duration_s\"],\n",
    "            \"text\": m[\"text\"],\n",
    "        })\n",
    "    return nemo_metas\n",
    "\n",
    "nemo_metas_tr = _format_nemo(tr_ids)\n",
    "print(\"train\")\n",
    "print(len(nemo_metas_tr), \"segments\")\n",
    "print(round(np.sum([m[\"duration\"] for m in nemo_metas_tr]) / 60 / 60, 1), \"hours\")\n",
    "\n",
    "print()\n",
    "\n",
    "nemo_metas_tr_mini = _format_nemo(tr_mini_ids)\n",
    "print(\"train mini\")\n",
    "print(len(nemo_metas_tr_mini), \"segments\")\n",
    "print(round(np.sum([m[\"duration\"] for m in nemo_metas_tr_mini]) / 60 / 60, 1), \"hours\")\n",
    "\n",
    "print()\n",
    "\n",
    "nemo_metas_val = _format_nemo(val_ids)\n",
    "print(\"val\")\n",
    "print(len(nemo_metas_val), \"segments\")\n",
    "print(round(np.sum([m[\"duration\"] for m in nemo_metas_val]) / 60 / 60, 1), \"hours\")\n",
    "\n",
    "print()\n",
    "\n",
    "nemo_metas_val_mini = _format_nemo(val_mini_ids)\n",
    "print(\"val mini\")\n",
    "print(len(nemo_metas_val_mini), \"segments\")\n",
    "print(round(np.sum([m[\"duration\"] for m in nemo_metas_val_mini]) / 60 / 60, 1), \"hours\")\n",
    "\n",
    "print()\n",
    "\n",
    "nemo_metas_test = _format_nemo(test_ids)\n",
    "print(\"test\")\n",
    "print(len(nemo_metas_test), \"segments\")\n",
    "print(round(np.sum([m[\"duration\"] for m in nemo_metas_test]) / 60 / 60, 1), \"hours\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "636cd4f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def fixup_meta(metas):\n",
    "    \"\"\"fixes repetition bug\"\"\"\n",
    "    for m in metas:\n",
    "        try:\n",
    "            youtube_id = m[\"audio_filepath\"].split(\"/\")[-2]\n",
    "            first_line = first_line_data[youtube_id]\n",
    "            if m[\"text\"].startswith(first_line + \" \" + first_line):\n",
    "                m[\"text\"] = m[\"text\"][len(first_line) + 1:]\n",
    "        except:\n",
    "            pass\n",
    "        \n",
    "fixup_meta(nemo_metas_tr)\n",
    "fixup_meta(nemo_metas_tr_mini)\n",
    "fixup_meta(nemo_metas_val)\n",
    "fixup_meta(nemo_metas_val_mini)\n",
    "fixup_meta(nemo_metas_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "05c998bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "write_jsonl(nemo_metas_tr, \"/mnt/data-ssd-2/data/youtube_med/nemo/train.jsonl\")\n",
    "write_jsonl(nemo_metas_tr_mini, \"/mnt/data-ssd-2/data/youtube_med/nemo/train_mini.jsonl\")\n",
    "write_jsonl(nemo_metas_val, \"/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl\")\n",
    "write_jsonl(nemo_metas_val_mini, \"/mnt/data-ssd-2/data/youtube_med/nemo/val_mini.jsonl\")\n",
    "write_jsonl(nemo_metas_test, \"/mnt/data-ssd-2/data/youtube_med/nemo/test.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5ebd3d71",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c65753d1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6a4ddc75",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "1ca3a1b1",
   "metadata": {},
   "source": [
    "## prep esb dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "9d08600c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import string\n",
    "\n",
    "import tqdm\n",
    "\n",
    "from suno_utils.utils.text import read_jsonl, write_jsonl\n",
    "\n",
    "ESB_DATA_DIR = \"/mnt/data-ssd-2/data/esb_suno\"\n",
    "\n",
    "suno_esb_manifest = read_jsonl(os.path.join(ESB_DATA_DIR, \"manifest.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "a5528da6",
   "metadata": {},
   "outputs": [],
   "source": [
    "allowed_chars = set(string.ascii_letters + string.digits + string.punctuation + \" \" + \"♫°£€\" + \"|—\")\n",
    "\n",
    "def fixup_esb(text):\n",
    "    text = text.replace(\"--\", \"—\")\n",
    "    if len(set(text) - allowed_chars) > 0:\n",
    "        return None\n",
    "    return text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "0e513130",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5187/5187 [00:00<00:00, 221321.01it/s]\n"
     ]
    }
   ],
   "source": [
    "nemo_suno_esb_manifest = []\n",
    "for m in tqdm.tqdm(suno_esb_manifest):\n",
    "    if m[\"duration_s\"] > 20.0 or m[\"duration_s\"] < 0.1:\n",
    "        continue\n",
    "    text = fixup_esb(m[\"transcript\"])\n",
    "    if text is None:\n",
    "        continue\n",
    "    nemo_suno_esb_manifest.append({\n",
    "        \"audio_filepath\": os.path.join(ESB_DATA_DIR, m[\"uri\"]),\n",
    "        \"duration\": m[\"duration_s\"],\n",
    "        \"text\": text,\n",
    "    })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "c0b4eecf",
   "metadata": {},
   "outputs": [],
   "source": [
    "write_jsonl(nemo_suno_esb_manifest, os.path.join(ESB_DATA_DIR, \"nemo_manifest.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e63a4652",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "25759b62",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "4267e63c",
   "metadata": {},
   "source": [
    "## prep sanas dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "c71be34a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import string\n",
    "import uuid\n",
    "import random\n",
    "import re\n",
    "\n",
    "import tqdm\n",
    "import shutil\n",
    "import numpy as np\n",
    "\n",
    "from suno_utils.audio import Tokens\n",
    "from suno_utils.utils.text import read_jsonl, write_jsonl\n",
    "from suno_utils.utils.text import normalize_whitespace\n",
    "\n",
    "SANAS_DATA_DIR = \"/mnt/data-ssd-1/data/private/customer/sanas/2022-08-04-fili-callcenter/to_sanas\"\n",
    "TO_CALLCENTER_DATA_DIR = \"/mnt/data-ssd-1/data/misc/callcenter\"\n",
    "TO_CALLCENTER_SEGMENTS_DIR = os.path.join(TO_CALLCENTER_DATA_DIR, \"segments\")\n",
    "\n",
    "shutil.rmtree(TO_CALLCENTER_DATA_DIR, ignore_errors=True)\n",
    "os.makedirs(TO_CALLCENTER_DATA_DIR, exist_ok=True)\n",
    "os.makedirs(TO_CALLCENTER_SEGMENTS_DIR, exist_ok=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "id": "3e430946",
   "metadata": {},
   "outputs": [],
   "source": [
    "suno_sanas_manifest_1 = read_jsonl(os.path.join(SANAS_DATA_DIR, \"2022-08-12/segment_metadata.jsonl\"))\n",
    "for m in suno_sanas_manifest_1:\n",
    "    m[\"uri\"] = os.path.join(\"2022-08-12\", m[\"uri\"])\n",
    "suno_sanas_manifest_2 = read_jsonl(os.path.join(SANAS_DATA_DIR, \"2022-08-15/segment_metadata.jsonl\"))\n",
    "for m in suno_sanas_manifest_2:\n",
    "    m[\"uri\"] = os.path.join(\"2022-08-15\", m[\"uri\"])\n",
    "suno_sanas_manifest = suno_sanas_manifest_1 + suno_sanas_manifest_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "id": "fafa179b",
   "metadata": {},
   "outputs": [],
   "source": [
    "allowed_chars = set(string.ascii_letters + string.digits + string.punctuation + \" \" + \"♫°£€\" + \"|—\")\n",
    "\n",
    "def fixup_sanas(text):\n",
    "    text = text.replace(\"--\", \"—\")\n",
    "    text = re.sub(r\"-[\\,\\.\\?]\", \" — \", text)\n",
    "    text = normalize_whitespace(text)\n",
    "    if len(set(text) - allowed_chars) > 0:\n",
    "        return None\n",
    "    return text\n",
    "\n",
    "def _get_sanas_doc_id(fp):\n",
    "    return \"_\".join(\".\".join(fp.split(\"/\")[-1].split(\".\")[:-1]).split(\"_\")[:-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "id": "862938dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# mark train / val\n",
    "doc_ids = list(set([\n",
    "    _get_sanas_doc_id(m[\"uri\"])\n",
    "    for m in suno_sanas_manifest\n",
    "]))\n",
    "random.seed(6006)\n",
    "random.shuffle(doc_ids)\n",
    "doc_ids_tr = set(doc_ids[:-400])\n",
    "doc_ids_val = set(doc_ids[-400:-200])\n",
    "doc_ids_te = set(doc_ids[-200:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "id": "7190339e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 120074/120074 [00:31<00:00, 3772.19it/s]\n"
     ]
    }
   ],
   "source": [
    "nemo_suno_sanas_manifest_tr = []\n",
    "nemo_suno_sanas_manifest_val = []\n",
    "nemo_suno_sanas_manifest_te = []\n",
    "failed_texts = []\n",
    "for m in tqdm.tqdm(suno_sanas_manifest):\n",
    "    if m[\"duration_s\"] > 20.0 or m[\"duration_s\"] < 0.1:\n",
    "        continue\n",
    "    text = \" | \".join([\n",
    "        e[\"plaintext\"].strip()\n",
    "        for e in Tokens.from_dict(m[\"transcript\"][\"tokens\"]).speaker_turns\n",
    "        if len(e[\"plaintext\"].strip()) > 0\n",
    "    ]) \n",
    "    fixed_text = fixup_sanas(text)\n",
    "    if fixed_text is None:\n",
    "        failed_texts.append(text)\n",
    "        continue\n",
    "    old_fp = os.path.join(SANAS_DATA_DIR, m[\"uri\"])\n",
    "    new_fp = os.path.join(TO_CALLCENTER_SEGMENTS_DIR, f\"{str(uuid.uuid4())}.wav\")\n",
    "    os.symlink(old_fp, new_fp)\n",
    "    doc_id = _get_sanas_doc_id(m[\"uri\"])\n",
    "    if doc_id in doc_ids_tr:\n",
    "        nemo_suno_sanas_manifest_tr.append({\n",
    "            \"audio_filepath\": new_fp,\n",
    "            \"duration\": m[\"duration_s\"],\n",
    "            \"text\": fixed_text,\n",
    "        })\n",
    "    elif doc_id in doc_ids_val:\n",
    "        nemo_suno_sanas_manifest_val.append({\n",
    "            \"audio_filepath\": new_fp,\n",
    "            \"duration\": m[\"duration_s\"],\n",
    "            \"text\": fixed_text,\n",
    "        })\n",
    "    elif doc_id in doc_ids_te:\n",
    "         nemo_suno_sanas_manifest_te.append({\n",
    "            \"audio_filepath\": new_fp,\n",
    "            \"duration\": m[\"duration_s\"],\n",
    "            \"text\": fixed_text,\n",
    "        })\n",
    "assert(len(nemo_suno_sanas_manifest_tr) > 0)\n",
    "assert(len(nemo_suno_sanas_manifest_val) > 0)\n",
    "assert(len(nemo_suno_sanas_manifest_te) > 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "id": "56e63cdb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "181.6 train hours\n",
      "9.4 val hours\n",
      "8.6 test hours\n"
     ]
    }
   ],
   "source": [
    "print(round(np.sum([m[\"duration\"] for m in nemo_suno_sanas_manifest_tr]) / 60 / 60, 1), \"train hours\")\n",
    "print(round(np.sum([m[\"duration\"] for m in nemo_suno_sanas_manifest_val]) / 60 / 60, 1), \"val hours\")\n",
    "print(round(np.sum([m[\"duration\"] for m in nemo_suno_sanas_manifest_te]) / 60 / 60, 1), \"test hours\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "id": "2d65c742",
   "metadata": {},
   "outputs": [],
   "source": [
    "write_jsonl(nemo_suno_sanas_manifest_tr, os.path.join(TO_CALLCENTER_DATA_DIR, \"callcenter_manifest_tr.jsonl\"))\n",
    "write_jsonl(nemo_suno_sanas_manifest_val, os.path.join(TO_CALLCENTER_DATA_DIR, \"callcenter_manifest_val.jsonl\"))\n",
    "write_jsonl(nemo_suno_sanas_manifest_te, os.path.join(TO_CALLCENTER_DATA_DIR, \"callcenter_manifest_te.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f5a7ed36",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "890be4c9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "258a2ed7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dfeb97c4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "3cc0e10c",
   "metadata": {},
   "source": [
    "### make tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b64cbb30",
   "metadata": {},
   "outputs": [],
   "source": [
    "python /home/georg/code/NeMo/scripts/tokenizers/process_asr_text_tokenizer.py \\\n",
    "    --manifest=\"/mnt/data-ssd-2/data/youtube_med/nemo/train.jsonl\" \\\n",
    "    --data_root=\"/mnt/data-ssd-2/nemo_training/tokenizers/youtube_med\" \\\n",
    "    --vocab_size=256 \\\n",
    "    --tokenizer=\"spe\" \\\n",
    "    --no_lower_case \\\n",
    "    --spe_character_coverage=1.0 \\\n",
    "    --log"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "546c4814",
   "metadata": {},
   "source": [
    "### use pre-trained encoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 336,
   "id": "b74dcb9e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "726\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "ckpt_dir = \"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/\"\n",
    "best_ckpt = ckpt_dir + \"Conformer-CTC-BPE--val_wer=0.1798-epoch=2.ckpt\"\n",
    "d = torch.load(best_ckpt, map_location=\"cpu\")[\"state_dict\"]\n",
    "ne = {\".\".join(k.split(\".\")[1:]): v for k, v in d.items() if \"encoder\" in k}\n",
    "torch.save(ne, \"encoder.pt\")\n",
    "nd = {\".\".join(k.split(\".\")[1:]): v for k, v in d.items() if \"decoder\" in k}\n",
    "torch.save(nd, \"decoder.pt\")\n",
    "print(len(ne))\n",
    "print(len(nd))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d0528170",
   "metadata": {},
   "outputs": [],
   "source": [
    "# sudo mv /home/georg/notebooks/tasks/s2t/encoder.pt /mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/\n",
    "# sudo mv /home/georg/notebooks/tasks/s2t/decoder.pt /mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "95d838b6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4762d65c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "4a54e88d",
   "metadata": {},
   "source": [
    "## Safefy data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "01ab9e97",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "from nemo.collections.common.tokenizers.sentencepiece_tokenizer import SentencePieceTokenizer\n",
    "\n",
    "spe_fp = \"/mnt/data-ssd-2/nemo_training/tokenizers/youtube_med_1024/tokenizer_spe_bpe_v1024/tokenizer.model\"\n",
    "tokenizer = SentencePieceTokenizer(model_path=spe_fp)\n",
    "\n",
    "def _cuda_length_filter(from_fp, to_fp, tokenizer, max_tokens=1_000):\n",
    "    \"\"\"Safify to max number of tokens for cuda: 1024\"\"\"\n",
    "    # https://github.com/NVIDIA/NeMo/issues/4882\n",
    "    with open(to_fp, \"w\") as fw:\n",
    "        with open(from_fp) as f:\n",
    "            for line in f:\n",
    "                line = line.strip()\n",
    "                if len(line) == 0:\n",
    "                    continue\n",
    "                m = json.loads(line)\n",
    "                if len(tokenizer.text_to_ids(m[\"text\"])) <= max_tokens:\n",
    "                    fw.write(line + \"\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "e44d4b49",
   "metadata": {},
   "outputs": [],
   "source": [
    "_cuda_length_filter(\n",
    "    \"/mnt/data-ssd-2/data/youtube_med/nemo/train.jsonl\", \n",
    "    \"/mnt/data-ssd-2/data/youtube_med/nemo/train_safe.jsonl\", \n",
    "    tokenizer,\n",
    "    max_tokens=250,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "id": "e8a208d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "_cuda_length_filter(\n",
    "    \"/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_tr.jsonl\", \n",
    "    \"/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_safe_tr.jsonl\", \n",
    "    tokenizer,\n",
    "    max_tokens=250,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1dee7004",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "da70b42c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "423f43ad",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f0a62e3d",
   "metadata": {},
   "source": [
    "## do training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63502b5c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Runtime:\n",
    "#   Note - with precision 16 we get 2/3 epoch runtime and ~2/3 mem BUT nan for val?\n",
    "# 1x T4    (ctc, batch  8, precision 16) - 1.1s/it - 165h/epoch\n",
    "# 4x A30   (ctc, batch 12, precision 16) - 1.3it/s -  20h/epoch\n",
    "# 4x A30   (ctc, batch  8, precision 32) - 1.4it/s -  30h/epoch\n",
    "# 4x A5000 (ctc, batch  8, precision 32) - 1.9it/s -  22h/epoch\n",
    "\n",
    "# Max batchsize, A5000, 20s clips\n",
    "# ctc_large: 16\n",
    "# ctc_small: 48\n",
    "# transducer_large: 6\n",
    "\n",
    "# Cost\n",
    "#   (4x T4)   g4dn.12xlarge -  $3.9\n",
    "#   (4x A30)  g5.12xlarge   -  $5.7\n",
    "#   (4x V100) p3.8xlarge    - $12.2\n",
    "#   (8x A100) p4d.24xlarge  - $32.8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2e0aad0d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # Fuses the computation of prediction net + joint net + loss + WER calculation\n",
    "# # to be run on sub-batches of size `fused_batch_size`.\n",
    "# # When this flag is set to true, consider the `batch_size` of *_ds to be just `encoder` batch size.\n",
    "# # `fused_batch_size` is the actual batch size of the prediction net, joint net and transducer loss.\n",
    "# # Using small values here will preserve a lot of memory during training, but will make training slower as well.\n",
    "# # An optimal ratio of fused_batch_size : *_ds.batch_size is 1:1.\n",
    "# # However, to preserve memory, this ratio can be 1:8 or even 1:16.\n",
    "# # Extreme case of 1:B (i.e. fused_batch_size=1) should be avoided as training speed would be very slow.\n",
    "# fuse_loss_wer: true\n",
    "# fused_batch_size: 16"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "821979af",
   "metadata": {},
   "outputs": [],
   "source": [
    "# transducer (too slow to converge, try hybrid)\n",
    "CUDA_VISIBLE_DEVICES=0,1,2,3 python /mnt/data-ssd-2/nemo_training/scripts/speech_to_text_rnnt_bpe.py \\\n",
    "    --config-path=\"/mnt/data-ssd-2/nemo_training/configs/\" \\\n",
    "    --config-name=\"conformer_transducer_large\" \\\n",
    "    +pretrained_encoder_path=\"/mnt/data-ssd-2/models/public/stt_en_conformer_transducer_large/encoder.pt\" \\\n",
    "    model.train_ds.manifest_filepath=\"['/mnt/data-ssd-2/data/youtube_med/nemo/train_safe.jsonl','/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_safe_tr.jsonl']\" \\\n",
    "    model.validation_ds.manifest_filepath=\"['/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl','/mnt/data-ssd-2/data/esb_suno/nemo_manifest.jsonl','/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_val.jsonl']\" \\\n",
    "    model.train_ds.min_duration=0.09 \\\n",
    "    model.train_ds.max_duration=20.01 \\\n",
    "    model.tokenizer.dir=\"/mnt/data-ssd-2/nemo_training/tokenizers/youtube_med_1024/tokenizer_spe_bpe_v1024\" \\\n",
    "    trainer.max_epochs=100 \\\n",
    "    trainer.val_check_interval=0.1 \\\n",
    "    trainer.log_every_n_steps=100 \\\n",
    "    model.optim.lr=1.0 \\\n",
    "    model.train_ds.batch_size=4 \\\n",
    "    model.validation_ds.batch_size=2 \\\n",
    "    model.train_ds.num_workers=16 \\\n",
    "    model.validation_ds.num_workers=0 \\\n",
    "    model.joint.fused_batch_size=2 \\\n",
    "    \\\n",
    "    model.spec_augment.freq_masks=0 \\\n",
    "    model.spec_augment.time_masks=0 \\\n",
    "    \\\n",
    "    exp_manager.exp_dir=\"/mnt/data-ssd-2/nemo_training/checkpoints\" \\\n",
    "    exp_manager.checkpoint_callback_params.save_top_k=3 \\\n",
    "    exp_manager.create_wandb_logger=True \\\n",
    "    exp_manager.wandb_logger_kwargs.project=\"med_ft\" \\\n",
    "    exp_manager.wandb_logger_kwargs.name=\"test_transducer\"\n",
    "\n",
    "#     model.optim.sched.warmup_steps=10000 \\\n",
    "#     decoding.greedy.max_symbols=30 \\\n",
    "#     +pretrained_encoder_path=\"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/encoder.pt\" \\\n",
    "#     +allow_partial_init=True \\"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "813b2148",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ctc\n",
    "CUDA_VISIBLE_DEVICES=0,1,2,3 python /mnt/data-ssd-2/nemo_training/scripts/speech_to_text_ctc_bpe.py \\\n",
    "    --config-path=\"/mnt/data-ssd-2/nemo_training/configs/\" \\\n",
    "    --config-name=\"conformer_ctc_large\" \\\n",
    "    +pretrained_encoder_path=\"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/encoder.pt\" \\\n",
    "    +pretrained_decoder_path=\"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/decoder.pt\" \\\n",
    "    model.train_ds.manifest_filepath=\"/mnt/data-ssd-2/data/youtube_med/nemo/train.jsonl\" \\\n",
    "    model.validation_ds.manifest_filepath=\"['/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl','/mnt/data-ssd-2/data/esb_suno/nemo_manifest.jsonl','/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_val.jsonl']\" \\\n",
    "    model.train_ds.min_duration=0.09 \\\n",
    "    model.train_ds.max_duration=20.01 \\\n",
    "    model.tokenizer.dir=\"/mnt/data-ssd-2/nemo_training/tokenizers/youtube_med/tokenizer_spe_bpe_v256\" \\\n",
    "    trainer.max_epochs=100 \\\n",
    "    trainer.val_check_interval=0.1 \\\n",
    "    trainer.log_every_n_steps=100 \\\n",
    "    model.optim.lr=2e-1 \\\n",
    "    model.train_ds.batch_size=16 \\\n",
    "    model.validation_ds.batch_size=8 \\\n",
    "    model.train_ds.num_workers=16 \\\n",
    "    model.validation_ds.num_workers=0 \\\n",
    "    \\\n",
    "    model.spec_augment.freq_masks=0 \\\n",
    "    model.spec_augment.time_masks=0 \\\n",
    "    \\\n",
    "    exp_manager.exp_dir=\"/mnt/data-ssd-2/nemo_training/checkpoints\" \\\n",
    "    exp_manager.checkpoint_callback_params.save_top_k=3 \\\n",
    "    exp_manager.create_wandb_logger=True \\\n",
    "    exp_manager.wandb_logger_kwargs.project=\"med_ft\" \\\n",
    "    exp_manager.wandb_logger_kwargs.name=\"base_accum\"\n",
    "\n",
    "#     +pretrained_encoder_path=\"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/encoder.pt\" \\\n",
    "#     +pretrained_decoder_path=\"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/decoder.pt\" \\\n",
    "\n",
    "#     model.optim.lr=2e-1 \\\n",
    "#     +pretrained_encoder_path=\"/mnt/data-ssd-2/models/public/stt_en_conformer_ctc_large/encoder.pt\" \\\n",
    "#     model.validation_ds.manifest_filepath=\"/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl\" \\\n",
    "#     model.validation_ds.manifest_filepath=\"['/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl','/mnt/data-ssd-2/data/esb_suno/nemo_manifest.jsonl']\" \\\n",
    "\n",
    "#     trainer.precision=16 \\\n",
    "#     trainer.val_check_interval=0.1 \\\n",
    "#     trainer.check_val_every_n_epoch=1 \\"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "002eb7b3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ctc xlarge\n",
    "CUDA_VISIBLE_DEVICES=0,1,2,3 python /mnt/data-ssd-2/nemo_training/scripts/speech_to_text_ctc_bpe.py \\\n",
    "    --config-path=\"/mnt/data-ssd-2/nemo_training/configs/\" \\\n",
    "    --config-name=\"conformer_ctc_xlarge\" \\\n",
    "    +pretrained_encoder_path=\"/mnt/data-ssd-2/models/public/stt_en_conformer_ctc_xlarge/encoder.pt\" \\\n",
    "    model.train_ds.manifest_filepath=\"['/mnt/data-ssd-2/data/youtube_med/nemo/train_safe.jsonl','/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_safe_tr.jsonl']\" \\\n",
    "    model.validation_ds.manifest_filepath=\"['/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl','/mnt/data-ssd-2/data/esb_suno/nemo_manifest.jsonl','/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_val.jsonl']\" \\\n",
    "    model.train_ds.min_duration=0.09 \\\n",
    "    model.train_ds.max_duration=20.01 \\\n",
    "    model.tokenizer.dir=\"/mnt/data-ssd-2/nemo_training/tokenizers/youtube_med/tokenizer_spe_bpe_v256\" \\\n",
    "    trainer.max_epochs=100 \\\n",
    "    trainer.val_check_interval=0.1 \\\n",
    "    trainer.log_every_n_steps=100 \\\n",
    "    model.train_ds.num_workers=16 \\\n",
    "    model.validation_ds.num_workers=0 \\\n",
    "    model.spec_augment.freq_masks=0 \\\n",
    "    model.spec_augment.time_masks=0 \\\n",
    "    \\\n",
    "    model.optim.sched.warmup_steps=5000 \\\n",
    "    model.optim.lr=1.0 \\\n",
    "    model.train_ds.batch_size=2 \\\n",
    "    model.validation_ds.batch_size=2 \\\n",
    "    trainer.accumulate_grad_batches=8 \\\n",
    "    trainer.precision=\"bf16\" \\\n",
    "    \\\n",
    "    exp_manager.exp_dir=\"/mnt/data-ssd-2/nemo_training/checkpoints\" \\\n",
    "    exp_manager.checkpoint_callback_params.save_top_k=3 \\\n",
    "    exp_manager.create_wandb_logger=True \\\n",
    "    exp_manager.wandb_logger_kwargs.project=\"med_ft\" \\\n",
    "    exp_manager.wandb_logger_kwargs.name=\"xl_base\"\n",
    "\n",
    "#     model.train_ds.manifest_filepath=\"['/mnt/data-ssd-2/data/youtube_med/nemo/train_safe.jsonl','/mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_safe_tr.jsonl']\" \\\n",
    "#     model.train_ds.manifest_filepath=\"/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl\" \\\n",
    "#     trainer.accumulate_grad_batches=8 \\\n",
    "#     trainer.precision=\"bf16\" \\ "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cb9bf0e5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cc68afc9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f6229a31",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f53f302a",
   "metadata": {},
   "source": [
    "## Test checkpoint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f0b48cb0",
   "metadata": {},
   "outputs": [],
   "source": [
    "%pylab inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "id": "8040033e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !ls -lah /mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "id": "65abeca3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total 4.5G\r\n",
      "drwxr-xr-x 2 root root 4.0K Dec  8 18:12  .\r\n",
      "drwxr-xr-x 3 root root 4.0K Dec  8 14:37  ..\r\n",
      "-rw-r--r-- 1 root root 461M Dec  8 18:12  Conformer-Transducer-BPE.nemo\r\n",
      "-rw-r--r-- 1 root root 1.4G Dec  8 18:12 'Conformer-Transducer-BPE--val_wer=0.2326-epoch=0.ckpt'\r\n",
      "-rw-r--r-- 1 root root 1.4G Dec  8 18:12 'Conformer-Transducer-BPE--val_wer=0.2326-epoch=0-last.ckpt'\r\n",
      "-rw-r--r-- 1 root root 1.4G Dec  8 14:37 'Conformer-Transducer-BPE--val_wer=0.2384-epoch=0.ckpt'\r\n"
     ]
    }
   ],
   "source": [
    "!ls -lah /mnt/data-ssd-2/nemo_training/checkpoints/Conformer-Transducer-BPE/2022-12-08_15-50-12/checkpoints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "id": "d585c8c9",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[NeMo I 2022-12-08 19:16:42 mixins:170] Tokenizer SentencePieceTokenizer initialized with 1024 tokens\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo W 2022-12-08 19:16:42 modelPT:142] If you intend to do training or fine-tuning, please call the ModelPT.setup_training_data() method and provide a valid configuration file to setup the train data loader.\n",
      "    Train config : \n",
      "    manifest_filepath:\n",
      "    - /mnt/data-ssd-2/data/youtube_med/nemo/train_safe.jsonl\n",
      "    - /mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_safe_tr.jsonl\n",
      "    sample_rate: 16000\n",
      "    batch_size: 4\n",
      "    shuffle: true\n",
      "    num_workers: 16\n",
      "    pin_memory: true\n",
      "    use_start_end_token: false\n",
      "    trim_silence: false\n",
      "    max_duration: 20.01\n",
      "    min_duration: 0.09\n",
      "    is_tarred: false\n",
      "    tarred_audio_filepaths: null\n",
      "    shuffle_n: 2048\n",
      "    bucketing_strategy: synced_randomized\n",
      "    bucketing_batch_size: null\n",
      "    \n",
      "[NeMo W 2022-12-08 19:16:42 modelPT:149] If you intend to do validation, please call the ModelPT.setup_validation_data() or ModelPT.setup_multiple_validation_data() method and provide a valid configuration file to setup the validation data loader(s). \n",
      "    Validation config : \n",
      "    manifest_filepath:\n",
      "    - /mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl\n",
      "    - /mnt/data-ssd-2/data/esb_suno/nemo_manifest.jsonl\n",
      "    - /mnt/data-ssd-1/data/misc/callcenter/callcenter_manifest_val.jsonl\n",
      "    sample_rate: 16000\n",
      "    batch_size: 2\n",
      "    shuffle: false\n",
      "    num_workers: 0\n",
      "    pin_memory: true\n",
      "    use_start_end_token: false\n",
      "    \n",
      "[NeMo W 2022-12-08 19:16:42 modelPT:155] Please call the ModelPT.setup_test_data() or ModelPT.setup_multiple_test_data() method and provide a valid configuration file to setup the test data loader(s).\n",
      "    Test config : \n",
      "    manifest_filepath: null\n",
      "    sample_rate: 16000\n",
      "    batch_size: 16\n",
      "    shuffle: false\n",
      "    num_workers: 8\n",
      "    pin_memory: true\n",
      "    use_start_end_token: false\n",
      "    \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[NeMo I 2022-12-08 19:16:42 features:267] PADDING: 0\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo W 2022-12-08 19:16:43 nemo_logging:349] /home/georg/venvs/ml/lib/python3.8/site-packages/torch/nn/modules/rnn.py:62: UserWarning: dropout option adds dropout after all but last recurrent layer, so non-zero dropout expects num_layers greater than 1, but got dropout=0.2 and num_layers=1\n",
      "      warnings.warn(\"dropout option adds dropout after all but last \"\n",
      "    \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[NeMo I 2022-12-08 19:16:44 rnnt_models:207] Using RNNT Loss : warprnnt_numba\n",
      "    Loss warprnnt_numba_kwargs: {'fastemit_lambda': 0.0, 'clamp': -1.0}\n",
      "[NeMo I 2022-12-08 19:16:44 audio_preprocessing:507] Numba CUDA SpecAugment kernel is being used\n"
     ]
    }
   ],
   "source": [
    "from scipy.special import softmax\n",
    "\n",
    "from nemo.collections.asr.models import EncDecCTCModelBPE, EncDecRNNTBPEModel\n",
    "\n",
    "# best_ckpt = ckpt_dir + \"Conformer-CTC-BPE.nemo\"\n",
    "# asr_model = EncDecCTCModelBPE.restore_from(best_ckpt)\n",
    "\n",
    "# ckpt_dir = \"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-CTC-BPE/2022-11-26_22-56-06/checkpoints/\"\n",
    "# best_ckpt = ckpt_dir + \"Conformer-CTC-BPE--val_wer=0.1798-epoch=2.ckpt\"\n",
    "# asr_model = EncDecCTCModelBPE.load_from_checkpoint(best_ckpt)\n",
    "\n",
    "ckpt_dir = \"/mnt/data-ssd-2/nemo_training/checkpoints/Conformer-Transducer-BPE/2022-12-08_15-50-12/checkpoints/\"\n",
    "best_ckpt = ckpt_dir + \"Conformer-Transducer-BPE--val_wer=0.2326-epoch=0.ckpt\"\n",
    "\n",
    "# from checkpoint\n",
    "asr_model = EncDecRNNTBPEModel.load_from_checkpoint(best_ckpt)\n",
    "\n",
    "asr_model.eval();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "id": "5c7604b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# vocab = list(asr_model.cfg.decoder.vocabulary) + [\"\"]\n",
    "\n",
    "# def _decode(token_list):\n",
    "#     p = None\n",
    "#     nl = []\n",
    "#     for e in token_list:\n",
    "#         if e == p:\n",
    "#             continue\n",
    "#         nl.append(e)\n",
    "#         p = e\n",
    "#     return nl\n",
    "    \n",
    "# def _boost_logits(probs, boost_frac=0.3):\n",
    "#     if not np.isclose(probs.sum(axis=1).mean(), 1):\n",
    "#         probs = np.exp(probs)\n",
    "#     assert(np.isclose(probs.sum(axis=1).mean(), 1))\n",
    "#     l = []\n",
    "#     for n in range(probs.shape[0]):\n",
    "#         blank_p = probs[n, -1]\n",
    "#         extra_p = blank_p - blank_p * boost_frac\n",
    "#         tot_p = 1 - blank_p\n",
    "#         new_p_arr = np.array([v + v / tot_p * extra_p for v in probs[n, :-1]] + [blank_p*boost_frac])\n",
    "#         l.append(vocab[new_p_arr.argmax()])\n",
    "#     return \"\".join(_decode(l)).replace(\"▁\", \" \").strip()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "id": "3e616182",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8d4c9eb3c8144eea987d9a85c5a3a0b2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "['President Joe Biden, backed by the full symbolic power of the Western Alliance is locked in a showdown with Russian president Vladimir Putin who is using Ukraine as a hostage to try to force the US to renegotiate the settled outcome of the Cold War']"
      ]
     },
     "execution_count": 240,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/russia.wav\"])[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "id": "d1c50f59",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5c681d1611b74016b06459f57da943d7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "['When you start excluding exceptions from caster investion and tago make it a much less useful number for the equity investors']"
      ]
     },
     "execution_count": 241,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/spgi_hard_1.wav\"])[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "id": "e02653fa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ce29c85b2291408588c48f56d0ad31ee",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Alrighty. So our factress in Wu Ziang, Donguan and even in Thailand after we'"
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/spgi_hard_2.wav\"])[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "id": "a0f4bc1b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0d12b8aaa2f64a5883c517053637a532",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\"Our neighborhood said we're getting that tree out calf because I don't know if you noticed went\""
      ]
     },
     "execution_count": 244,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/georgia.wav\"])[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "id": "c21286c7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "85db74e44e574a5ebf261e4b7aee43f2",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Mr. Jones is a 28 year old gentleman with a history of ischemic cardiomyopathy EF of 20% hypertension hyperlipidemia status post orthotopic heart transplant in 2016 coming in today with substerminal chest pain and shortness of breath period'"
      ]
     },
     "execution_count": 246,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/med_1.wav\"])[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "id": "1c8f0cdf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7181bc24784a4d6587a929e5be932827",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'Ms. Roberts is a six year old woman with a history of COPD on home oxygen childhood asthma remote history of smoking coming in with chest pain shortness of breath and sputum production for the last five days. The patient has also had fevers, chills and Rigers high suspicion for COVID for which she got tested at an urgent care center five days ago. Initial swab was negative. However, she comes in with worsening fatigue myalgias and temperature to 101 degree Fahrenheit'"
      ]
     },
     "execution_count": 247,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/med_2.wav\"])[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "id": "25664a2b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c21da4f306c043d8954b13e1e85affe3",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\"Hello, Mr. Kutsko. How are you doing today? Very good, thanks I've been recently having some weird chest pain and I talk to my PCP and you referred me to you told me that it's probably nothing serious but I should maybe talk to a specialist so I figured that I'd come in so I called Brigham and Women's and here I am. Yeah I think that's a great idea. It's always better to be sure and we can certainly go through all the possible dangerous causes so we can exclude the dangerous causes and then you can rest assured that whatever it is is not that serious. People your age do get chest pain but it's almost never from the heart so to that point where exactly is your chest pain? Just point to your chest and show me where it is somewhere in the upper left region so I guess kind of technically where your heart is but it's actually pretty rare but when I do get it's a weird stinging that I don't usually feel so it's kind of a weird weird pain That's a very helpful description so stinging is it stabbing stinging or does it feel\""
      ]
     },
     "execution_count": 248,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/med_3.wav\"])[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 320,
   "id": "d9805323",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4419712f14094715984ab51ebf1c9a90",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\"The domestic side of the pork outlook seems exceedingly strong. How do I look into that? You hit the nail on the head can. we feel very good about pork's going to be you know\""
      ]
     },
     "execution_count": 320,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/spgi_2spk.wav\"])[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 327,
   "id": "26456d78",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "2753316f664c45418c2d6524bdc11751",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo W 2022-11-28 00:15:46 nemo_logging:349] /home/georg/venvs/ml/lib/python3.8/site-packages/torch/amp/autocast_mode.py:198: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
      "      warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
      "    \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f3668fb9fd0>]"
      ]
     },
     "execution_count": 327,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# hesitation\n",
    "logprobs = asr_model.transcribe([\"sample_data/audio_16k/spgi_2spk.wav\"], logprobs=True)[0]\n",
    "probs = np.exp(logprobs)\n",
    "plt.plot(probs[:,207])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 325,
   "id": "b537443a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8071d9d26a9e4ff6a860d20acdd74388",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo W 2022-11-28 00:13:57 nemo_logging:349] /home/georg/venvs/ml/lib/python3.8/site-packages/torch/amp/autocast_mode.py:198: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
      "      warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
      "    \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f3668d33a90>]"
      ]
     },
     "execution_count": 325,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# speaker change should be at ~175\n",
    "logprobs = asr_model.transcribe([\"sample_data/audio_16k/spgi_2spk.wav\"], logprobs=True)[0]\n",
    "probs = np.exp(logprobs)\n",
    "plt.plot(probs[:,189]+probs[:,113])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 296,
   "id": "1fb2e349",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<audio controls=\"controls\" autobuffer=\"autobuffer\" style=\"width:100%;\">\n",
       "  <source src=\"sample_data/audio_16k/ezra.wav\"/>\n",
       "  Your browser does not support the audio element.\n",
       "</audio>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Audio.play_audio(\"sample_data/audio_16k/ezra.wav\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 294,
   "id": "bd3729c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bee746881ae841298419806bf18c5d50",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[NeMo W 2022-11-27 12:38:55 nemo_logging:349] /home/georg/venvs/ml/lib/python3.8/site-packages/torch/amp/autocast_mode.py:198: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
      "      warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
      "    \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f366a343c70>]"
      ]
     },
     "execution_count": 294,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# music (bg music starts at 250, voice starts at 425)\n",
    "logprobs = asr_model.transcribe([\"sample_data/audio_16k/ezra.wav\"], logprobs=True)[0]\n",
    "probs = softmax(logprobs, axis=1)\n",
    "plt.plot(probs[:,242])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 301,
   "id": "cb3c9743",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5c5ca8d6476541a0ac8e42d35bc726e4",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Transcribing:   0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "\"Get some data from theMI client. I'm trying to use Kancer company score in type a1ad. Doing competitor analysis for the nerd perspective and sitting down with Dorg to sync on ASR and R&D. New York. Nerd valuation and contants research. I'm hooking up into the MI database for companies house and discovering some bugs on their end. so that's fun. Tysons. Working on speeding up a giant query over express feeds. so adding a bunch of indices and gonn to add some views. I's fun. Also, Saricch, guess how many donuts I had this week. 12. No, only five. But gues. Do better next time. I'll work on it I've been working on crossdocument co-referencing for Vasalo Hackweek. Yeah, I'm demoing Tsnia based graph layouts to Valo Hackweek today. I'm still digging out h email a little bit from going to Opscon and finishing up the Nurn patent application. Tyson's out. Chris.. Oh, sorry, I blockchain. All nerd all the time.Oh, we don't have Chris blockchain here. Iosing the lif line of succession.. Oh right, go tam. Bye bye.\""
      ]
     },
     "execution_count": 301,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "asr_model.transcribe([\"sample_data/audio_16k/spgi_standup.wav\"])[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f498e179",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a54a4ae4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5ee27a1f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "9344cd2b",
   "metadata": {},
   "source": [
    "## Ask nvidia"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10e0bdba",
   "metadata": {},
   "outputs": [],
   "source": [
    "# precision 16 leads to nan in validation\n",
    "# causal models\n",
    "# squeezeformer\n",
    "# log_every_n_steps not respected during validation\n",
    "# hanging of dataloader when multiple val sets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85042ed5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27528481",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "1c9b5249",
   "metadata": {},
   "source": [
    "## Playground"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fde7ec5b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "from suno_utils.utils.text import read_jsonl\n",
    "import pandas as pd\n",
    "\n",
    "manifest_tr = read_jsonl(\"/mnt/data-ssd-2/data/youtube_med/nemo/train.jsonl\")\n",
    "train_uids = set([m[\"audio_filepath\"].split(\"/\")[-1].split(\".\")[0] for m in manifest_tr])\n",
    "\n",
    "augmented_manifest = read_jsonl(\"/mnt/data-ssd-2/data/youtube_med/11_segments_asr_meta.jsonl\")\n",
    "augmented_manifest = [m for m in augmented_manifest if m[\"uid\"] in train_uids]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a76067fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# TODO: make whisper small preds on ec2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "9bfb57cf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pd.Series([m[\"asr_cer\"] for m in augmented_manifest]).hist(bins=50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "7d6f1de3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "48439"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub_metas = [m for m in augmented_manifest if m[\"asr_cer\"] >= 0.8]\n",
    "random.seed(6006)\n",
    "random.shuffle(sub_metas)\n",
    "len(sub_metas)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "800fb9cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'uid': '4b42b116-fe5d-44e3-b2d4-ef99ef631f08',\n",
       " 'uri': 'segments_audio/NU1TSrAkf0Y/4b42b116-fe5d-44e3-b2d4-ef99ef631f08.wav',\n",
       " 'duration_s': 19.08,\n",
       " 'text': \"I think the design symposium for the University I think the design symposium for the University of Waterloo is absolutely unique. I've been judging for three or four years now, every year it gets better and better, the projects get bigger and more ambitious. | My Capstone Design project is a MEMS Based Atomic Force Microscope. One of the highest resolution types of instruments on the market\",\n",
       " 'text_norm': \"i think the design symposium for the university i think the design symposium for the university of waterloo is absolutely unique i've been judging for three or four years now every year it gets better and better the projects get bigger and more ambitious my capstone design project is a mems based atomic force microscope one of the highest resolution types of instruments on the market\",\n",
       " 'asr_pred': 'i think the design syposium for the univrers i think the design syposium for the univrers of waterloo is absolutely unique i have been judging for three or four years now never a year it gets better and better the projects get bigger and more ambitious like haves design project is a member space atomic force microscope one of the highest resolution types of instruments on the market',\n",
       " 'asr_cer': 0.088,\n",
       " 'asr_wer': 0.176}"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "augmented_manifest[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "10e43b81",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<audio controls=\"controls\" autobuffer=\"autobuffer\" style=\"width:100%;\">\n",
       "  <source src=\"../../suno_stream_links/9588edd1-7a87-4c91-a00b-e6b33d6c9470.wav\"/>\n",
       "  Your browser does not support the audio element.\n",
       "</audio>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.846 - 1.0 - segments_audio/_XzjkZHW65s/790ead16-0510-4357-b6bc-9d91f393e674.wav\n",
      "text: Well, it kinda looks like a flat cross, but it isn't because the Lewis Structure is 2-dimensional and this molecule is 3-dimensional. Anytime you have a central atom with 4 groups attached to it, you should recognize that\n",
      "pred: any time you have a central atom with four groups attached to it you should recognize that the hybridization for this is sp three having four which means that the molecule is a terahedron or terahedral\n",
      "----------\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<audio controls=\"controls\" autobuffer=\"autobuffer\" style=\"width:100%;\">\n",
       "  <source src=\"../../suno_stream_links/f9a7665d-f27e-4af1-b806-e893a664a923.wav\"/>\n",
       "  Your browser does not support the audio element.\n",
       "</audio>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0 - 1.0 - segments_audio/sQvATPnhh_o/696a5ba2-0646-4741-b631-6ca9b9530c0e.wav\n",
      "text: My own sword, drill mode. Bruisers attack! Drill blaster. This thing's incredible.\n",
      "pred: on soor like no blater things incible give\n",
      "----------\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<audio controls=\"controls\" autobuffer=\"autobuffer\" style=\"width:100%;\">\n",
       "  <source src=\"../../suno_stream_links/a7883068-2af3-443f-906b-a8eca753c079.wav\"/>\n",
       "  Your browser does not support the audio element.\n",
       "</audio>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0 - 1.0 - segments_audio/AYegZfway5Y/87136940-31c5-4ef6-bf40-0b7d83f914d3.wav\n",
      "text: To make a final stand. Think again. Because kill you instead. You let the lights go out, amidst the darkened sky. And you.\n",
      "pred: and ya it will be bra then your better lets go while next doll ya ah\n",
      "----------\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<audio controls=\"controls\" autobuffer=\"autobuffer\" style=\"width:100%;\">\n",
       "  <source src=\"../../suno_stream_links/1606defa-4370-4878-a025-250989632790.wav\"/>\n",
       "  Your browser does not support the audio element.\n",
       "</audio>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.82 - 1.0 - segments_audio/MCS_6ixfq8U/97d9f8a4-3fc5-4d86-8ff2-be1dccb420ff.wav\n",
      "text: I'm just gonna give it a wee little wipe in here, alright? I'm going to wipe that off. It's a wee bit cold isn't it? And these are your electrodes today. I'm just going to stick them on.\n",
      "pred: just can keep back of like the detailil right member the off be like cool asnt nine year i like cho today or just can se them on\n",
      "----------\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "<audio controls=\"controls\" autobuffer=\"autobuffer\" style=\"width:100%;\">\n",
       "  <source src=\"../../suno_stream_links/cf364ee0-66c4-4698-b9f7-4189cf38bbb8.wav\"/>\n",
       "  Your browser does not support the audio element.\n",
       "</audio>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.885 - 1.0 - segments_audio/sebaqahYM5Y/c5f1a2bd-96d9-46a7-a16c-17ce9c45bf04.wav\n",
      "text: All right, show mine. | This is my cowgirl. Oh. | No idea how to use this. | Oh. | The irony in all of this is the hat company's name. | Bailey. | Is Bailey. It was meant to be, guys. Meant to be. | Nice.\n",
      "pred: right jo johnline my cow girl of oh ya ya ya three and all this the habit company's name really mo peaks the peak\n",
      "----------\n"
     ]
    }
   ],
   "source": [
    "for m in sub_metas[:5]:\n",
    "    Audio.play_audio(os.path.join(\"/mnt/data-ssd-2/data/youtube_med\", m[\"uri\"]))\n",
    "    print(m[\"asr_cer\"], \"-\", m[\"asr_wer\"], \"-\", m[\"uri\"])\n",
    "    print(\"text:\", m[\"text\"])\n",
    "    print(\"pred:\", m[\"asr_pred\"])\n",
    "    print(\"-\"*10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9548dfcb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c9784d85",
   "metadata": {},
   "outputs": [],
   "source": [
    "# TODO: enrich with whisper:\n",
    "#   /mnt/data-ssd-2/data/youtube_med/11_segments_asr_meta.jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "e81bb4bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "manifest_tr = read_jsonl(\"/mnt/data-ssd-2/data/youtube_med/nemo/train.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "id": "462b2cc8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'audio_filepath': '/mnt/data-ssd-2/data/youtube_med/segments_audio/LvaVsnHbIbI/12c211df-410e-4223-8efd-412964b3b8ee.wav',\n",
       " 'duration': 14.14,\n",
       " 'text': \"Hey guys. Hey guys. Dr. Berg here. In this short video, we're going to talk about hypoglycemia. What is that? That's a low blood sugar situation. The symptoms are irritableness. Sometimes you get bloodshot eyes or irritable or sand in the eyes that feels like it's an\"}"
      ]
     },
     "execution_count": 220,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "manifest_tr[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "id": "1784d92b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 216,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "manifest_tr[0][\"text\"].count(\"I think the design symposium \")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "33433e14",
   "metadata": {},
   "outputs": [],
   "source": [
    "out = [m for m in manifest_tr if \"♫\" in m[\"text\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "ed18e810",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1537"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(out)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "a9ab3651",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'audio_filepath': '/mnt/data-ssd-2/data/youtube_med/segments_audio/fAhAVYI64fk/ee4425eb-007a-41c6-8d3e-7b04d11276ea.wav',\n",
       "  'duration': 17.07,\n",
       "  'text': 'Perfect! ♫ You built a vehicle? Yeah I built a vehicle. Oh, free candy, maybe it should say \"free chewing gum\" though. I mean when we meet them, we say we have a lot of chewing gum for you'},\n",
       " {'audio_filepath': '/mnt/data-ssd-2/data/youtube_med/segments_audio/BgPdSEEGTJ0/06e79290-c8e2-4738-8b2d-87f072d9055d.wav',\n",
       "  'duration': 18.37,\n",
       "  'text': \"Gonna find out today. ♫ Epic Review Guys ♫ The contenders to good old eggnog that I grew up drinking are Silk Nog. Now this is basically soy milk eggnog. I've had this one the last several years\"}]"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "out[:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "820099b6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6a0092b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "v = write_jsonl(nemo_metas_tr, \"/mnt/data-ssd-2/data/youtube_med/nemo/train.jsonl\")\n",
    "write_jsonl(nemo_metas_tr_mini, \"/mnt/data-ssd-2/data/youtube_med/nemo/train_mini.jsonl\")\n",
    "write_jsonl(nemo_metas_val, \"/mnt/data-ssd-2/data/youtube_med/nemo/val.jsonl\")\n",
    "write_jsonl(nemo_metas_val_mini, \"/mnt/data-ssd-2/data/youtube_med/nemo/val_mini.jsonl\")\n",
    "write_jsonl(nemo_metas_test, \"/mnt/data-ssd-2/data/youtube_med/nemo/test.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "id": "fccefc1f",
   "metadata": {},
   "outputs": [],
   "source": [
    "nemo_metas_test = read_jsonl(\"/mnt/data-ssd-2/data/youtube_med/nemo/test.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "id": "4692bdd7",
   "metadata": {},
   "outputs": [],
   "source": [
    "metas = read_jsonl(\"/mnt/data-ssd-2/data/youtube_med/10_segments_meta.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "id": "e44e0bd6",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"first_line.json\") as f:\n",
    "    first_line_data = json.load(f)\n",
    "first_line_data = {k: v for k, v in first_line_data}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "id": "8f015e88",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"In today's video I will not only give you healthy low glycemic alternatives to refined sugar but I\""
      ]
     },
     "execution_count": 231,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "first_line_data[\"DcX0F09dqao\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "id": "b0164cca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'4xsj2O_fRnc'"
      ]
     },
     "execution_count": 232,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "audio_filepath.split(\"/\")[-2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "id": "36686c5a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"In today's video I will not only give you healthy low glycemic alternatives to refined sugar but I\""
      ]
     },
     "execution_count": 238,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "first_line"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "id": "f39aa106",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 241,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m[\"text\"].startswith(first_line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "id": "5e4a0e47",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m[\"text\"].startswith(first_line + \" \" + first_line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 248,
   "id": "92cb0330",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'audio_filepath': '/mnt/data-ssd-2/data/youtube_med/segments_audio/DcX0F09dqao/090f0aa4-5175-4b4b-b637-0f1ee76e2b2a.wav',\n",
       " 'duration': 18.16,\n",
       " 'text': \"In today's video I will not only give you healthy low glycemic alternatives to refined sugar but I will also show you how to use them in daily recipes. I'll cover whole food sweeteners, almost whole food sweetness, and artificial sweeteners. Furthermore, in some cases I will\"}"
      ]
     },
     "execution_count": 248,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nemo_metas_test[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "id": "aae0a734",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "id": "14025ebc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'audio_filepath': '/mnt/data-ssd-2/data/youtube_med/segments_audio/DcX0F09dqao/090f0aa4-5175-4b4b-b637-0f1ee76e2b2a.wav',\n",
       " 'duration': 18.16,\n",
       " 'text': \"In today's video I will not only give you healthy low glycemic alternatives to refined sugar but I will also show you how to use them in daily recipes. I'll cover whole food sweeteners, almost whole food sweetness, and artificial sweeteners. Furthermore, in some cases I will\"}"
      ]
     },
     "execution_count": 246,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nemo_metas_test[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c29f8e6b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "id": "bd5e8bf3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'original_id': 'NU1TSrAkf0Y',\n",
       " 'original_audio_filepath_wav': '/data/suno/data/harvest/youtube_med/audio_wav/NU1TSrAkf0Y.wav',\n",
       " 'original_start_s': 2.45,\n",
       " 'original_end_s': 21.53,\n",
       " 'uid': '4b42b116-fe5d-44e3-b2d4-ef99ef631f08',\n",
       " 'text': \"I think the design symposium for the University I think the design symposium for the University of Waterloo is absolutely unique. I've been judging for three or four years now, every year it gets better and better, the projects get bigger and more ambitious. | My Capstone Design project is a MEMS Based Atomic Force Microscope. One of the highest resolution types of instruments on the market\",\n",
       " 'transcript': 'i think the design syposium for the univrers i think the design syposium for the univrers of waterloo is absolutely unique i have been judging for three or four years now never a year it gets better and better the projects get bigger and more ambitious like haves design project is a member space atomic force microscope one of the highest resolution types of instruments on the market',\n",
       " 'audio_filepath_wav': '/data/suno/data/harvest/youtube_med/segments_audio/NU1TSrAkf0Y/4b42b116-fe5d-44e3-b2d4-ef99ef631f08.wav',\n",
       " 'audio_filepath_opus': '/data/suno/data/harvest/youtube_med/segments_audio_opus/NU1TSrAkf0Y/4b42b116-fe5d-44e3-b2d4-ef99ef631f08.opus'}"
      ]
     },
     "execution_count": 225,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for m in "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e04bb9e5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ee9da73",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "28195e06",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
