{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "d31d8850",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:23:32.066655Z",
     "start_time": "2024-02-05T19:23:32.065191Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7cd4c0dd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:23:34.783104Z",
     "start_time": "2024-02-05T19:23:32.067673Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_3226588/3782103618.py:12: DeprecationWarning: \n",
      "Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),\n",
      "(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)\n",
      "but was not found to be installed on your system.\n",
      "If this would cause problems for you,\n",
      "please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466\n",
      "        \n",
      "  import pandas as pd\n"
     ]
    }
   ],
   "source": [
    "import tqdm\n",
    "import math\n",
    "import torch\n",
    "import random\n",
    "import funcy\n",
    "import copy\n",
    "import gc\n",
    "import re\n",
    "import json\n",
    "import tempfile\n",
    "import collections\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import fasttext\n",
    "from joblib import Parallel, delayed\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from suno_utils.audio import Audio\n",
    "from suno_utils.utils.text import (\n",
    "    write_jsonl,\n",
    "    read_jsonl,\n",
    "    write_json,\n",
    "    read_json,\n",
    "    normalize_whitespace,\n",
    ")\n",
    "from suno_utils.utils.s3 import read_from_s3, check_s3_file_exists, open_from_s3\n",
    "from suno_utils.utils.tokenizers import tokenize\n",
    "from suno_utils.harvest.youtube.constants.text_lang import BASE_TO_FASTTEXT_REMAP\n",
    "\n",
    "TMP_DIR = os.path.join(os.getcwd(), \"tmp\")\n",
    "os.makedirs(TMP_DIR, exist_ok=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9d50793",
   "metadata": {},
   "source": [
    "## Generate the jsonl from pieces"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8f428b8f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:23:34.933910Z",
     "start_time": "2024-02-05T19:23:34.785378Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/tony/anaconda3/envs/suno_env/lib/python3.10/site-packages/Bio/pairwise2.py:278: BiopythonDeprecationWarning: Bio.pairwise2 has been deprecated, and we intend to remove it in a future release of Biopython. As an alternative, please consider using Bio.Align.PairwiseAligner as a replacement, and contact the Biopython developers if you still need the Bio.pairwise2 module.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "from Bio import pairwise2\n",
    "\n",
    "from suno_utils.utils.metrics import get_cer\n",
    "from suno_utils.tasks.hoot import (\n",
    "    parse_lyrics,\n",
    "    legacy_parse_lyrics,\n",
    "    EMBEDDING_RATE as HOOT_EMBEDDING_RATE,\n",
    ")\n",
    "from suno_utils.utils.lyrics import remove_speakers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "fa4d2a57",
   "metadata": {},
   "outputs": [],
   "source": [
    "version_number = \"v8\"\n",
    "alignment_dataset = \"genius\"  # deezer, ytm, genius"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "2cd505d5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:23:56.161244Z",
     "start_time": "2024-02-05T19:23:34.935046Z"
    }
   },
   "outputs": [],
   "source": [
    "# Will use a local copy, loosely filtered\n",
    "with open(f\"/home/tony/Data/Hoot/{alignment_dataset}_metas.json\", \"r\") as fp:\n",
    "    metas = json.load(fp)\n",
    "metas_map = {m[\"id\"]: m for m in metas}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a1cc806d",
   "metadata": {},
   "source": [
    "#### do alignment (will be cache in TMP_DIR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "3028a60c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:26:51.737880Z",
     "start_time": "2024-02-05T19:23:56.842126Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "18353it [03:58, 76.81it/s]\n"
     ]
    }
   ],
   "source": [
    "for n_step, jsonl_name in tqdm.tqdm(\n",
    "    enumerate(\n",
    "        sorted(\n",
    "            os.listdir(\n",
    "                f\"/home/tony/Data/Hoot/alignments/{alignment_dataset}_{version_number}\"\n",
    "            )\n",
    "        )\n",
    "    )\n",
    "):\n",
    "    try:\n",
    "        flat_aligned_lyrics = read_jsonl(\n",
    "            os.path.join(\n",
    "                f\"/home/tony/Data/Hoot/alignments/{alignment_dataset}_{version_number}\",\n",
    "                jsonl_name,\n",
    "            )\n",
    "        )\n",
    "        write_jsonl(\n",
    "            flat_aligned_lyrics,\n",
    "            os.path.join(\n",
    "                TMP_DIR, f\"{alignment_dataset}_alignments_{version_number}.jsonl\"\n",
    "            ),\n",
    "            do_append=bool(n_step != 0),\n",
    "        )\n",
    "    except Exception as e:\n",
    "        print(e)\n",
    "        print(n_step, jsonl_name)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c43d1c8",
   "metadata": {},
   "source": [
    "#### Verify some stats after saving cache file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "23000343",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:27:24.520991Z",
     "start_time": "2024-02-05T19:26:51.739618Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "  1%|          | 9387/1689790 [00:15<46:56, 596.64it/s] "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "91885.8 hours\n",
      "0.0 hours silence\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# get summary (sample) stats\n",
    "with open(\n",
    "    os.path.join(TMP_DIR, f\"{alignment_dataset}_alignments_{version_number}.jsonl\")\n",
    ") as f:\n",
    "    n_tot_rows = sum(1 for _ in f)\n",
    "\n",
    "test_tokenize = True\n",
    "n_max_sample = n_tot_rows\n",
    "if test_tokenize:\n",
    "    n_max_sample = int(round(n_max_sample / 180))\n",
    "sample_data = []\n",
    "tot_duration_s = 0\n",
    "tot_duration_silence_s = 0\n",
    "n_tokens_list = []\n",
    "durations_list = []\n",
    "unique_ids = set()\n",
    "n = 0\n",
    "with open(\n",
    "    os.path.join(TMP_DIR, f\"{alignment_dataset}_alignments_{version_number}.jsonl\")\n",
    ") as f:\n",
    "    for line in tqdm.tqdm(f, total=n_tot_rows):\n",
    "        line = line.strip()\n",
    "        if len(line) == 0:\n",
    "            continue\n",
    "        k, v = json.loads(line)\n",
    "        if k not in metas_map:\n",
    "            continue\n",
    "        if k in unique_ids:\n",
    "            continue\n",
    "        unique_ids.add(k)\n",
    "        for e in v:\n",
    "            if e[\"text\"] != \"\":\n",
    "                tot_duration_s += e[\"end_s\"] - e[\"start_s\"]\n",
    "                durations_list.append(e[\"end_s\"] - e[\"start_s\"])\n",
    "            if e[\"text\"] == \"\":\n",
    "                tot_duration_silence_s += e[\"end_s\"] - e[\"start_s\"]\n",
    "            if test_tokenize:\n",
    "                n_tokens_list.append(len(tokenize(e[\"text\"], max_tokens=512 * 8)))\n",
    "        if n % 500 == 0:\n",
    "            sample_data.append((k, v))\n",
    "        n += 1\n",
    "        if n == n_max_sample:\n",
    "            break\n",
    "# print(int(len(unique_ids)*n_tot_rows/n_max_sample), \"items\")\n",
    "print(round(tot_duration_s * n_tot_rows / n_max_sample / 60 / 60, 1), \"hours\")\n",
    "print(\n",
    "    round(tot_duration_silence_s * n_tot_rows / n_max_sample / 60 / 60, 1),\n",
    "    \"hours silence\",\n",
    ")\n",
    "## last round\n",
    "# 748206 items\n",
    "# 34517.4 hours\n",
    "# 7617.4 hours silence\n",
    "## this round (approx)\n",
    "# 687017 items\n",
    "# 32635.1 hours\n",
    "# 0.0 hours silence\n",
    "## this round (approx)\n",
    "# 685557 items\n",
    "# 35829.3 hours\n",
    "# 0.0 hours silence\n",
    "# v7_0 is 1728914\n",
    "# 7b v3 data\n",
    "# v3 89881.3 hours\n",
    "# 7b v5 data\n",
    "# v5 93742.5 hours\n",
    "\n",
    "# v8\n",
    "# ytm 39067.6 hours\n",
    "# genius 91885.8 hours\n",
    "# deezer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "8cdd3fd1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:27:24.695973Z",
     "start_time": "2024-02-05T19:27:24.522055Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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xMfGjRv1wAMPSJJ69uxpXk+zxgpZf+t37Nihxo0by83Nzdw3p7FORkaGXn31VQUEBMjd3V1t2rSxuYZUqFAh25k/1x7zZrFlN6a6ePGihgwZoqCgILm4uKhy5cp6++23bWanWCwW9e/fX8uWLVONGjXk4uKi6tWra9WqVdm/4de52XU3axxy9OhRffvttze91f7IkSOSpIcfftimztHRUaVKlbIqO3XqlHr16iV/f38z9o8++shm3+PHj6tNmzZyd3eXn5+fBg0apNWrV9uMkbI+5127dqlJkyZyc3PTPffcY64PtmnTJtWvX1/FixdX5cqVtXbtWpu+chNT1vuyePFijR8/XuXKlZOrq6uaNWumw4cPW8Xz7bff6vjx4+Z7l9f1w4oXL65PP/1UPj4+Gj9+vPmzkNNYMbvxctbY8MiRI2rZsqVKlCihLl26SJK+++47PfHEEypfvrxcXFwUFBSkQYMG6e+//7baf+bMmZKsl9/Ikt048Oeff1aLFi3k6ekpDw8PNWvWTFu2bLFqkzU2/v777zV48GD5+vrK3d1djz/+uH7//Xerttu3b1dkZKRKly6t4sWLKyQkRL169crTe4o7HzOlgDz4+eef1bx5c5UpU0ZjxoxRRkaGxo4dK19fX5u248eP18iRI9WxY0c988wz+v333zVjxgw1btxYP//8s9XMlXPnzql58+Zq3769OnbsqC+++ELDhg1TzZo11aJFi38dd1xcnDp37qxmzZrprbfekiTt379f33//vV588cU8H7d8+fJq0qSJNmzYoNTUVHl6embbLjo6Wnv37tWAAQNUoUIFJScnKy4uTgkJCapQoYKmTZumAQMGyMPDQ6+99pokyd/f3+oYzz//vHx9fTVq1ChdvHjxhnEdOnRITz75pPr27avu3btr3rx5euKJJ7Rq1So99thjt3SOuYntWlm3QTzwwAOaMGGCkpKSNH36dH3//fc2n3tGRoYiIyNVv359vf3221q7dq3eeecdhYaG3vQbttGjR2vMmDEKDw9Xv379dPDgQc2ePVvbtm3T999/LycnJ02bNk2ffPKJli5dqtmzZ8vDw8Pq9otb8ffff6tp06Y6fPiw+vfvr5CQEC1ZskQ9evTQ+fPnc/w5ysjIUK9evfT5559r6dKlioqKkpT/vx8ffvihXnjhBXXo0EEvvviiLl++rF27dmnr1q166qmn8nTOAACpa9euevXVV7VmzRo9++yz2bbZu3evWrVqpVq1amns2LFycXHR4cOH9f3330uSqlatqrFjx2rUqFHq06ePGjVqJEl66KGHzGP8+eefatGihTp16qSnn376htda6Z/riMVi0bBhw5ScnKxp06YpPDxcO3fuNGd05UZuYruWYRhq06aNNmzYoN69e6t27dpavXq1hg4dqlOnTtnc9v7f//5XX331lZ5//nmVKFFC7777rqKjo5WQkGCTBLpWbq67VatW1aeffqpBgwapXLly5i1l2Y1LJSk4OFiStHDhQj388MM3nO2WlJSkBg0amIk1X19frVy5Ur1791Zqaqq5mPrFixf16KOP6syZM3rxxRcVEBCg2NhYbdiwIdvjnjt3Tq1atVKnTp30xBNPaPbs2erUqZMWLlyogQMHqm/fvnrqqac0efJkdejQQSdOnFCJEiVuKaYsEydOlIODg1566SWlpKRo0qRJ6tKli7n202uvvaaUlBSr5Qo8PDxyfE9uxsPDQ48//rjmzp2rffv2qXr16rd8jKtXryoyMlINGzbU22+/LTc3N0n/fOF56dIl9evXT6VKldKPP/6oGTNm6OTJk1qyZIkk6bnnntPp06cVFxenTz/99KZ97d27V40aNZKnp6defvllOTk56f3331fTpk3NBOG1BgwYoJIlS+r111/XsWPHNG3aNPXv31+ff/65pH+SqBEREfL19dUrr7wib29vHTt2zOaLYcBkALhlrVu3Ntzc3IxTp06ZZYcOHTKKFStmXPtrdezYMcPR0dEYP3681f67d+82ihUrZlXepEkTQ5LxySefmGVpaWlGQECAER0dbZYdPXrUkGTMmzfPat8mTZrYxNm9e3cjODjY3H7xxRcNT09P4+rVq7d8zpKMmJiYHOtffPFFQ5Lxyy+/ZBvnuXPnDEnG5MmTb9hP9erVsz2XefPmGZKMhg0b2sSfVXf06FGzLDg42JBkfPnll2ZZSkqKUaZMGaNOnTpm2euvv25k96cwu2PmFNuGDRsMScaGDRsMwzCM9PR0w8/Pz6hRo4bx999/m+2WL19uSDJGjRpllnXv3t2QZIwdO9bqmHXq1DHq1q1r09e1kpOTDWdnZyMiIsLIyMgwy9977z1DkvHRRx/ZnOfvv/9+w2NeLyoqyupnaNq0aYYkY8GCBWZZenq6ERYW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DGdnZ2PEiBGGJGPbtm1W9dWqVTPuueceIy0tzSzbuXOn4eDgYAwePPimMfXr188oXry4cfz4cbMsLi7OkGS8//77uTyzm3vjjTcMScb3339vll26dMkoVaqUERUVZdW2S5cuhru7u3H27FnDMAxj5cqVhpubm/H3338bhmEYR48eNSQZBw4cMPcJDw83BgwY8K/j3L59uyHJmDBhglk2adIkQ5Kxbt06sywjI8N44IEHjICAAKv3Psvff/9tVKhQwRg7dqwhyYiJiclV/y1atDDKlCljpKSkmGUffvihIclYvXr1vzgzAAD+R5Lx+uuvF3YYhmEYxqlTp4z09HTDMAwjKirKCA4OzrHt0aNHDcMwjN9///2G5/Dnn38aqamphmEYxuTJkw1J5r43k5aWZjVeyTJmzBhDkhEXF5er4+TGp59+akgyFi5caFVerVo147777jOuXLlilr322muGxWIx9u/fbxiGYezfv9+QZI7hLl68aBQvXtxYtWqVuU/v3r2N1q1b31JMt/LeBQcH24zjsrNp0yYjIyPDpkyS8dprr910/7feesuQZPz4449m2f79+w1HR0dj+PDhN90fKEzcvgcUoo0bN8pisWjx4sUaM2aMypYtqxIlSqhDhw5KSUlRWlqaBg4cKD8/P3l4eKhnz57ZzgZasGCB6tatq+LFi8vHx0edOnXSiRMnbNp98MEHCg0NVfHixfXggw/qu+++s2mT3ZpSu3btUo8ePVSxYkW5uroqICBAvXr10p9//mm17+jRo2WxWHT48GH16NFD3t7e8vLyUs+ePXXp0qWbvh/Xrm2V5fHHH5f0zy1017ty5YpefPFFvfjiiwoNDbWpP3v2rPbt26fHH3/cakbTfffdp6pVq2rRokU3jenLL79Uq1atVL58ebMsPDxc9957rxYvXnzT/XMrNjZWISEheuihh8yyDRs26M8//9Tzzz9v1TYmJkYXL17Ut99+K0n6+++/5erqKldXV0mSj4+PJJnv+bJly/Tzzz9rzJgx/zrOrFsGrr2l8rvvvpOvr68effRRs8zBwUEdO3ZUYmKiNm3aZHOcSZMmKTMzUy+99FKu+05NTVVcXJyefvpp8xtOSerWrZs8PDzy9fMAABSerPHEr7/+qqefflpeXl7y9fXVyJEjZRiGTpw4obZt28rT01MBAQF65513bI6Rlpam119/Xffcc49cXFwUFBSkl19+2WYclZaWpkGDBsnX11clSpRQmzZtdPLkSZvjZbem1Ndff62oqCgFBgbKxcVFoaGheuONN5SRkWG1b9OmTVWjRg3t27dPjzzyiNzc3FS2bFlNmjQpV+9HYGBgrmew3+jWvmv5+PioRIkSuWp7PWdnZ6vxSpYbjdnyKjY2Vu7u7mrbtq1Ztm/fPu3bt099+vSxmt30/PPPyzAMffHFF5L+GR9JUsmSJSVJbm5uKl68uDk++umnn7Rw4UJNmTLllmLKy3uXnp6uixcv5ljfuHFjOTg42JT5+Pjk6v384osv9MADD+iBBx4wy6pUqaJmzZoxPsJtj6QUcBuYMGGCVq9erVdeeUW9evXSV199pb59+6pXr1769ddfNXr0aLVv317z58/XW2+9ZbXv+PHj1a1bN1WqVElTpkzRwIEDtW7dOjVu3NgqcTB37lw999xzCggI0KRJk/Twww+rTZs22SavrhcXF6fffvtNPXv21IwZM9SpUyctWrRILVu2lGEYNu07duyov/76SxMmTFDHjh01f/78PCdEEhMTJUmlS5e2qZs2bZrOnTunESNGZLtv1sAzu9v+3NzcdPr0afP42Tl16pSSk5NVr149m7oHH3xQP//8c67O4WZ+/vln7d+/3+Y2t6zjX99/3bp15eDgYNbXqVNHKSkpeuedd3T8+HG9/vrr8vLyUuXKlZWWlqYhQ4ZozJgx5qDsVv35559KTk7W9u3b1bNnT0lSs2bNzPq0tLQc32NJNrcMJiQkaOLEiXrrrbdyvCUzO7t379bVq1dt3g9nZ2fVrl073z4PAMDt4cknn1RmZqYmTpyo+vXra9y4cZo2bZoee+wxlS1bVm+99ZbuuecevfTSS9q8ebO5X2Zmptq0aaO3335brVu31owZM9SuXTtNnTpVTz75pFUfzzzzjKZNm6aIiAhNnDhRTk5OioqKylV88+fPl4eHhwYPHqzp06erbt26GjVqlF555RWbtufOnVPz5s1133336Z133lGVKlU0bNiwO+rW8xuN2fLi999/V1xcnNq1ayd3d3ezPKfxUWBgoMqVK2fW33vvvfLy8tLo0aN1/PhxTZ48Wampqbr//vsl/bPWZv/+/XXPPffkS7w5Wb9+vdzc3OTh4aEKFSpo+vTpudrvwoULunDhwk3fz8zMTO3atSvH8eqRI0f0119/5Sl2wC4KeaYWcFfbsGGDIcmoUaOGOS3bMAyjc+fOhsViMVq0aGHVPiwszGrK9rFjxwxHR0dj/PjxVu12795tFCtWzCxPT083/Pz8jNq1a1vdSvXBBx8Ykqxu38u69WvevHlm2aVLl2xi/+yzzwxJxubNm82y119/3ZBk9OrVy6rt448/bpQqVermb0g2evfubTg6Ohq//vqrVfmZM2eMEiVKmLfQzZs3z+b2vYyMDMPb29to1qyZ1b5//PGH4e7ubkgytm/fnmPf27ZtMyQZn3zyiU3d0KFDDUnG5cuX83Re1xoyZIghydi3b59VeUxMjOHo6JjtPr6+vkanTp3M7cmTJxuOjo6GJKN48eJGbGysYRiGMX78eKNGjRrG1atX8xyfi4uLIcmQZJQqVcp49913reoHDBhgODg4GMeOHbMq79SpkyHJ6N+/v1V5hw4djIceesjcVi5v31uyZInNz1yWJ554wggICLiV0wIA3KayxhN9+vQxy65evWqUK1fOsFgsxsSJE83yc+fOGcWLFze6d+9uln366aeGg4OD8d1331kdd86cOVa3yu/cudOQZDz//PNW7Z566imbW9+yxhnX3qaV3fjoueeeM9zc3KzGB02aNLEZT6SlpRkBAQFGdHR07t6U/+9mt+9ludnte9e61dv3chIeHm54enoa586d+1fHyTJjxgxDkrFixQqr8qx4ExISbPZ54IEHjAYNGpjbsbGxRvHixQ1JhqOjo/H2228bhmEYCxcuNPz9/a2WA8iLm713rVu3Nt566y1j2bJlxty5c41GjRoZkoyXX375psfOWtrh2uURspP1WY8dO9ambubMmTZLOgC3G2ZKAbeBbt26WU3Lrl+/vgzDUK9evaza1a9fXydOnDCfDvLVV18pMzNTHTt21B9//GG+AgICVKlSJW3YsEGStH37diUnJ6tv375Wt7H16NFDXl5eN43v2tksly9f1h9//KEGDRpI+mfq8/Wuf6JIo0aN9Oeffyo1NfWmfV0rNjZWc+fO1ZAhQ2yeSjds2DDzySQ5cXBw0HPPPad169Zp+PDhOnTokHbs2KGOHTsqPT1d0v+mdmcnqy67RU2zbpW70f65kZmZqUWLFqlOnTqqWrWqTf85LaTu6upq1fdLL72kU6dOKT4+XqdOnVLnzp11+vRpTZgwQdOmTdPVq1c1YMAAlS9fXg8++KC+//77XMe4cuVKrVixQu+8847Kly9vM/38mWeekaOjozp27KgffvhBR44c0YQJE7R06VLzPLJs2LBBX375paZNm5br/rPc7PP4t58FAOD2cu013tHRUfXq1ZNhGOrdu7dZ7u3trcqVK1s9ZWzJkiWqWrWqqlSpYjU+yrrNPGt8tGLFCkn/zJi51sCBA3MV37Xjo7/++kt//PGHGjVqpEuXLtk8BdfDw0NPP/20ue3s7KwHH3zwjnk62ptvvqm1a9dq4sSJ8vb2zpdjxsbGytfXV4899phV+a2MBzp37mw1PhoyZIj5sJjx48fLw8NDY8aMUcWKFVWrVi1z7JJfvvnmG7388stq27atevXqpU2bNikyMtJ8WEtONm/erDFjxqhjx45WyyNkxx7jVaAg8fQ94DZw7XpFksxEUVBQkE15ZmamUlJSVKpUKR06dEiGYdgkbLJkJbqOHz8uSTbtnJycVLFixZvGd/bsWY0ZM0aLFi1ScnKyVV1KSspNzyfrtrFz585ZrQV0I99995169+6tyMhIjR8/3qpuy5Yt+vTTT7Vu3Tqb+++vN3bsWP3xxx+aNGmSJk6cKEmKiIhQ7969NWfOHHl4eOS4b9ZgM7t1vLIeeXwrt59lZ9OmTTp16pQGDRqUbf9ZybPs+r++b39/f/n7+5vbw4YNU7NmzdSsWTONGDFC69at0+eff64NGzYoKipKx44dy9XA8ZFHHpEktWjRQm3btlWNGjXk4eGh/v37S5Jq1aql2NhY9e3bVw8//LAkKSAgQNOmTVO/fv3M9/jq1at64YUX1LVrV6s1D3LrZp/Hv/0sAAC3l+zGR66urja3M3l5eVmtc3no0CHt378/xyfsZo1ljh8/LgcHB5t1KStXrpyr+Pbu3asRI0Zo/fr1Nl+8XT8+KleunM0T6UqWLKldu3blqq/b2eeff64RI0aod+/e6tevX74c87ffflN8fLz69+9v81S8Wx0PlCxZ0vwyVfpn2Qw/Pz/17NlTH330kebMmaOFCxfq2LFjevLJJ7Vv374Cu6XPYrFo0KBBWr16tTZu3GiVqMxy4MABPf7446pRo4b+85//3PSY9hivAgWJpBRwG3B0dLylcuP/r+OUmZkpi8WilStXZtv2RgmXW5E1A2bo0KGqXbu2PDw8lJmZqebNmyszM/OW476ZX375RW3atFGNGjX0xRdf2AxGXn75ZTVq1EghISHmgqN//PGHJOnMmTNKSEgwB7LOzs76z3/+o/Hjx+vXX3+Vv7+/7r33Xj311FNycHC44aCjTJky5jGvd+bMGfn4+PzrR0MvXLhQDg4O6ty5c7b9Z2RkKDk5WX5+fmZ5enq6/vzzzxs+FnrLli364osvtGfPHknSZ599ppEjRyosLExhYWF6//33tXz58mwHQzcSGhqqOnXqaOHChWZSSpI6dOigNm3a6JdfflFGRobuv/9+bdy4UdL/Hnv8ySef6ODBg3r//fetFoqV/vmG+dixY/Lz8zPXosru/ZBy/jxu9phsAEDRkt14IjdjjMzMTNWsWTPHBayv/9IvL86fP68mTZrI09NTY8eOVWhoqFxdXfXTTz9p2LBhNuOjfzs2ul3FxcWpW7duioqK0pw5c/LtuLGxsZKkLl262NRdOx64/rM8c+aMHnzwwRyPe+zYMb3zzjtas2aNHBwc9Nlnn+m5554zZyN9/PHHWrRoUY7rleaHrJjPnj1rU3fixAlFRETIy8tLK1asyNWC6lnj0ZzGR5IYI+G2RlIKKMJCQ0NlGIZCQkLM//hnJzg4WNI/3xxeOwX4ypUrOnr0qO67774c9z137pzWrVunMWPGaNSoUWb5oUOH8uEMbB05ckTNmzeXn5+fVqxYkW1iLSEhQcePH1dISIhNXZs2beTl5WW1yLtkPYsoIyNDGzduVP369W+YuCtbtqx8fX21fft2m7off/xRtWvXvrWTu05aWpq+/PJLNW3aNNvBQtbxt2/frpYtW5rl27dvV2ZmZo79G4ahF154weqphKdPn7bqIzAwUKdOncpT3H///Xe238Y5OztbzYBau3atpH+eVij987lduXLFnE11rU8++USffPKJli5dqnbt2mXbb40aNVSsWDFt375dHTt2NMvT09O1c+dOqzIAwN0rNDRUv/zyi5o1a2YzO+lawcHByszM1JEjR6xmRx08ePCmfWzcuFF//vmnvvrqKzVu3NgsP3r06L8LvgjZunWrHn/8cdWrV0+LFy+2+RLx34iNjVVoaKjVDKcs146Prk1AnT59WidPnlSfPn1yPO5LL72kNm3aqGHDhuY++TU+yq2sWzavn8n3559/KiIiQmlpaVq3bp2ZfLsZBwcH1axZM9vx6tatW1WxYsU8P2kRsAfWlAKKsPbt28vR0VFjxoyx+abNMAxzKnu9evXk6+urOXPmWN0ONn/+fJvkzfWyvtm7/vh5WRPoZhITExURESEHBwetXr06x2n3H3zwgZYuXWr1GjBggCTp7bff1sKFC2/Yz9tvv60zZ85oyJAhVuVHjhzRkSNHrMqio6O1fPlyq6cUrlu3Tr/++queeOKJvJymacWKFTp//ny23wJK0qOPPiofHx/Nnj3bqnz27Nlyc3PL8elA8+fP14kTJ/Taa6+ZZf7+/ub6FleuXNHhw4cVEBCQY2xXr17VuXPnbMp//PFH7d69O9snvFzr0KFDmjNnjlq1amUmTDt16mTzuWWt3dCyZUstXbpU9evXN49x4MABJSQkmNteXl4KDw/XggULrJ4i8+mnn+rChQv/+vMAANwZOnbsqFOnTunDDz+0qfv777/NtRFbtGghSXr33Xet2uRmjJPd+Cg9PV2zZs3Ka9i3rezGR/v371dUVJQqVKig5cuX5+vtYTk9lThL9erVVaVKFX3wwQfKyMgwy2fPni2LxaIOHTpku9+GDRu0YsUKTZo0ySy7dnwk/XNeNxof3YqzZ89axSf9MwabOHGinJ2dzeURJOnixYtq2bKlTp06pRUrVuS4NIf0z5d8169Z1qFDB23bts0qMXXw4EGtX7+e8RFue8yUAoqw0NBQjRs3TsOHD9exY8fUrl07lShRQkePHtXSpUvVp08fvfTSS3JyctK4cePM6clPPvmkjh49qnnz5t10TSlPT081btxYkyZN0pUrV1S2bFmtWbOmQL4JbN68uX777Te9/PLL+u9//6v//ve/Zp2/v7+50GVERITNvlnJtSZNmlglTBYsWKAvv/xSjRs3loeHh9auXavFixfrmWeeUXR0tNUxmjVrJklWt5a9+uqrWrJkiR555BG9+OKLunDhgiZPnqyaNWuqZ8+eVvtXqFDBZv8bWbhwoVxcXGziyFK8eHG98cYbiomJ0RNPPKHIyEh99913WrBggcaPHy8fHx+bff766y+9+uqrevPNN62+FevQoYPGjh2rzMxMff/997p8+bLV7KvrXbhwQUFBQXryySdVvXp1ubu7a/fu3Zo3b568vLw0cuRIq/bVqlXTE088ofLly+vo0aOaPXu2fHx8rKbyV6lSRVWqVMm2v5CQEJsZUlWrVlWTJk3M2wAlafz48XrooYfUpEkT9enTRydPntQ777yjiIgINW/ePMfzAQDcPbp27arFixerb9++2rBhgx5++GFlZGTowIEDWrx4sVavXq169eqpdu3a6ty5s2bNmqWUlBQ99NBDWrdunQ4fPnzTPh566CGVLFlS3bt31wsvvCCLxaJPP/20QG7H27Vrl7755htJ0uHDh5WSkqJx48ZJku677z61bt3abPvpp5/q+PHjunTpkqR/FszOatu1a1dz9nxKSopmzJghSebDT9577z15e3vL29vb6hb968dHf/31lyIjI3Xu3DkNHTpU3377rVW8oaGhCgsLM7ebNm2qTZs25fq9yfpyMacv7SRp8uTJatOmjSIiItSpUyft2bNH7733np555hmbB8dI/8ySHzhwoIYOHWq1VlmHDh308ssvy9fXV8ePH9fu3btv+uVmbt+7b775RuPGjVOHDh0UEhKis2fPKjY2Vnv27NGbb75plfzq0qWLfvzxR/Xq1Uv79+/X/v37zToPDw+rMVK3bt1s3s/nn39eH374oaKiosyx/5QpU+Tv72/zJSxw27H/A/8AZNmwYYMhyViyZIlVedZjh7dt22ZVnvWI5N9//92q/MsvvzQaNmxouLu7G+7u7kaVKlWMmJgY4+DBg1btZs2aZYSEhBguLi5GvXr1jM2bNxtNmjQxmjRpYrY5evSoIcmYN2+eWXby5Enj8ccfN7y9vQ0vLy/jiSeeME6fPm3zqOGc4svuMcrZkZTj69oYs5PTe7Z161ajcePGRsmSJQ1XV1fjvvvuM+bMmWNkZmbaHCM4ODjbxyzv2bPHiIiIMNzc3Axvb2+jS5cuRmJiok270qVLWz2G+EZSUlIMV1dXo3379jdt+8EHHxiVK1c2nJ2djdDQUGPq1KnZxm8YhjF06FCjXr16NvUXLlwwunXrZnh7extVqlQxVq1adcM+09LSjBdffNGoVauW4enpaTg5ORnBwcFG7969s/0cO3XqZAQFBRnOzs5GYGCg0bdvXyMpKemm52YY/3zuMTEx2ZZn97l/9913xkMPPWS4uroavr6+RkxMjJGampqrvgAAt7+cxhPdu3c33N3dbdo3adLEqF69ulVZenq68dZbbxnVq1c3XFxcjJIlSxp169Y1xowZY6SkpJjt/v77b+OFF14wSpUqZbi7uxutW7c2Tpw4YTPGyW4s8/333xsNGjQwihcvbgQGBhovv/yysXr1akOSsWHD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yy8rPj5et912m5o2bart27fr4Ycf1l//+tcyzzN58mRNmjRJO3fuVGRkpAYNGmT9JzI3N1c33XSTrrrqKu3YsUPJyck6cuSIhg0bZtPHkiVL5OnpqW3btmnRokXlju+VV17RSy+9pBdffFG7d+9WTEyMbr/9du3bt0/Sb7OgOnfurEmTJl3SrKeK+v+9goICDR06VLt27dLWrVsVGhqqrVu36t5779Xjjz+uvXv36s0331RSUlKZ/0LOnDlTw4YN0+7du3XLLbdo5MiROnHihCRp2rRp2rt3r9asWaMffvhBb7zxhpo3b16l8wAAoC5r3LixGjdurI8//lgFBQUXbDd06FAdPXpUa9asUVpamsLDwxUdHW29Jy9dulTPP/+8Zs+erbS0NIWGhuqNN94o009V86fCwkLFxMSoSZMm2rp1q7Zt26bGjRtrwIABNjOPNm7cqP3792vjxo1asmSJkpKSrI+6rVixQi1btrRmQGVnZ1c5To8//riMMfrkk0+q9LjMzEx9+OGHWrFihfVxvNOnT2vixInasWOHUlJS5O7urjvvvFMlJSWSpK+//lqStH79emVnZ2vFihXl9j1lyhR9+OGHWrJkib799lu1b99eMTEx1jUp9be//U0vvfSSduzYoXr16un++++v4tkDuCgDAJUwevRoM3jwYGOMMddcc425//77jTHGfPTRR+b3LyXx8fGme/fuNo+dN2+eCQsLs+krLCzMFBcXW/s6duxorr/+emu7qKjINGrUyCxbtswYY0xWVpaRZBITE602hYWFpmXLlmb27NnGGGOeffZZ079/f5vn/umnn4wkk5GRYYwx5oYbbjBXXXVVhecbEhJinn/+eZt9V199tXnkkUes7e7du5v4+PgK+zLGmMWLFxtfX99K9196vlu3bjXR0dGmT58+Jjc312obHR1tXnjhBZvHv/vuuyY4ONjalmSmTp1qbefn5xtJZs2aNcYYYwYNGmTuu+++So0fAACU71//+pdp2rSp8fb2Ntdee62Ji4sz6enp1vGtW7caHx8fc+7cOZvHtWvXzrz55pvGGGMiIiJMbGyszfHrrrvOJqe6lPzp3XffNR07djQlJSVWm4KCAtOgQQOzdu1am36LioqsNkOHDjXDhw+3tsPCwsy8efMqjMXF2gUGBppx48YZY8rmRcaUn1PWr1/fHD169KLPeezYMSPJfPfdd8aY/+VQO3futGn3+1w2Pz/f1K9f3yxdutQ6fv78eRMSEmLmzJljjDFm48aNRpJZv3691eazzz4zkszZs2cvOiYAlcdMKQBVNnv2bC1ZskQ//PDDJffRuXNnubv/7yUoMDBQXbt2tbY9PDzUrFkzHT161OZxkZGR1vf16tVTr169rHGkp6dr48aN1n8tGzdurCuuuEKSbKZ19+zZ86Jjy8vL0+HDh3XdddfZ7L/uuuuqdc6X0v+IESN0+vRpff755/L19bX2p6enKyEhweZcx44dq+zsbJ05c8Zq161bN+v7Ro0aycfHx4rpuHHjtHz5cvXo0UNTpkzRl19+We1zAwCgrhkyZIgOHz6slStXasCAAdq0aZPCw8OtmUbp6enKz89Xs2bNbN63s7KyrPwkIyNDvXv3tun3j9tS1fOn9PR0ZWZmqkmTJtbz+vv769y5cza5UefOneXh4WFtBwcHl8nBqssYU+Wb44SFhalFixY2+/bt26cRI0aobdu28vHxsZaIKF3eoDL279+vwsJCm1ysfv366t27d5lc7Pe5VHBwsCTZPTZAXVbP2QMAUPtERUUpJiZGcXFxGjNmjM0xd3d3GWNs9pWuSfB79evXt9l2c3Mrd1/pVOzKyM/P16BBgzR79uwyx0qTCOm34kxtccstt+i9995TamqqbrrpJmt/fn6+Zs6cqbvuuqvMY0rXXJDKj3NpTAcOHKiDBw9q9erVWrdunaKjoxUbG6sXX3yxhs4GAIA/J29vb9188826+eabNW3aND344IOKj4/XmDFjlJ+fr+DgYG3atKnM46q68HZV86f8/Hz17NlTS5cuLdPX74s91c3BKnL8+HEdO3bMWu+psvlieTnboEGDFBYWprffflshISEqKSlRly5dqr0Q+oX8PjalRTV7xgao65gpBeCSJCYm6tNPP1VqaqrN/hYtWignJ8cm0fjjLXmr46uvvrK+LyoqUlpamjp16iRJCg8P1/fff6/WrVurffv2Nl9VKUT5+PgoJCSkzK2ct23bpiuvvLLa51CV/seNG6fExETdfvvtNou6h4eHKyMjo8x5tm/f3uY/qBVp0aKFRo8erffee0/z58/XW2+9Vb2TAwAAuvLKK3X69GlJv71n5+TkqF69emXes0vXcuzYsaPNItuSymxfivDwcO3bt08BAQFlnvv3M7Ar4unpqeLi4ksexyuvvCJ3d3drofEWLVro1KlTVoykyuWLx48fV0ZGhqZOnaro6Gh16tSpzF2hPT09Jemi423Xrp21vmipwsJCffPNN3bJ9QBUHjOlAFySrl27auTIkVqwYIHN/r59++rYsWOaM2eO7r77biUnJ2vNmjXy8fGxy/MuXLhQHTp0UKdOnTRv3jz9+uuv1oKTsbGxevvttzVixAhNmTJF/v7+yszM1PLly/XOO+/YTEuvyOTJkxUfH6927dqpR48eWrx4sXbt2lXufxovRVX6f/TRR1VcXKzbbrtNa9asUZ8+fTR9+nTddtttCg0N1d133y13d3elp6drz549eu655yo1hunTp6tnz57q3LmzCgoKtGrVKqvABwAAKnb8+HENHTpU999/v7p166YmTZpox44dmjNnjgYPHizpt7sXR0ZG6o477tCcOXN0+eWX6/Dhw/rss8905513qlevXnr00Uc1duxY9erVS9dee63ef/997d69W23btq3W+EaOHKm5c+dq8ODB1l2FDx48qBUrVmjKlClq2bJlpfpp3bq1tmzZonvuuUdeXl4XvTHKqVOnlJOTo8LCQmVlZem9997TO++8o1mzZql9+/aSpIiICDVs2FDPPPOMHnvsMW3fvt36uOPFNG3aVM2aNdNbb72l4OBgHTp0SE8//bRNm4CAADVo0EDJyclq2bKlvL29yxTgGjVqpHHjxll3LQwNDdWcOXN05swZPfDAA5WKCQD7YKYUgEuWkJBQZvpyp06d9Prrr2vhwoXq3r27vv766yrfme5iEhMTlZiYqO7du+uLL77QypUrrcSodPZRcXGx+vfvr65du2rChAny8/Or0uwhSXrsscc0ceJETZo0SV27dlVycrJWrlypDh062OU8qtr/hAkTNHPmTN1yyy368ssvFRMTo1WrVunzzz/X1VdfrWuuuUbz5s1TWFhYpcfg6empuLg4devWTVFRUfLw8NDy5cvtcn4AANQFjRs3VkREhObNm6eoqCh16dJF06ZN09ixY/Xaa69J+u0jX6tXr1ZUVJTuu+8+XX755brnnnt08OBBBQYGSvqteBQXF6cnn3xS4eHhysrK0pgxY2w+kn8pGjZsqC1btig0NFR33XWXOnXqpAceeEDnzp2r0j8MExISdODAAbVr167MGk9/NH36dAUHB6t9+/YaNWqUTp48qZSUFD311FNWG39/f7333ntavXq1unbtqmXLlmnGjBkVjsPd3V3Lly9XWlqaunTpoieeeEJz5861aVOvXj0tWLBAb775pkJCQqzi4B8lJiZqyJAhGjVqlMLDw5WZmam1a9eqadOmFQcEgN24mT9+mBcAAAAA4FQ333yzgoKC9O677zp7KABQY/j4HgAAAAA40ZkzZ7Ro0SLFxMTIw8NDy5Yt0/r167Vu3TpnDw0AahQzpQAAAADAic6ePatBgwZp586dOnfunDp27KipU6eWe5ddAPgzoSgFAAAAAAAAh2OhcwAAAAAAADgcRSkAAAAAAAA4HEUpAAAAAAAAOBxFKQAAAAAAADgcRSkAAAAAAAA4HEUpAAAAAAAAOBxFKQAAAAAAADgcRSkAAAAAAAA43P8BRFh7GJY0NTEAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create two horizontal subplots\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n",
    "\n",
    "# Plot n_tokens distribution\n",
    "ax1.hist(pd.Series(n_tokens_list), bins=50)\n",
    "ax1.set_title(\n",
    "    f\"{alignment_dataset} Distribution of Tokens \\n median {np.median(n_tokens_list):.1f}, 70% {np.quantile(n_tokens_list, 0.70):.1f}\"\n",
    ")\n",
    "ax1.set_xlabel(\"Number of Tokens\")\n",
    "ax1.set_ylabel(\"Counts\")\n",
    "\n",
    "# Plot durations distribution\n",
    "ax2.hist(pd.Series(durations_list), bins=50)\n",
    "ax2.set_title(\n",
    "    f\"Distribution of Segment Durations\\nmedian {np.median(durations_list):.1f}, 70% {np.quantile(durations_list, 0.70):.1f}\"\n",
    ")\n",
    "ax2.set_xlabel(\"Segment Duration\")\n",
    "ax2.set_ylabel(\"Counts\")\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "71969894",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:39:44.151247Z",
     "start_time": "2024-02-05T19:39:44.149226Z"
    }
   },
   "outputs": [],
   "source": [
    "# # # listen to some\n",
    "# # there should be some leftover here\n",
    "# k, segments = sample_data[-3]\n",
    "# meta = metas_map[k]\n",
    "# audio = Audio.from_s3(meta[\"audio_filepath\"])\n",
    "# audio.play(compress=False)\n",
    "# print(f\"{meta['id']}\")\n",
    "# print(meta[\"genius_slug\"])\n",
    "# print(\"-\"*10)\n",
    "# for s in segments:\n",
    "#     print(s[\"text\"], s[\"start_s\"], s[\"end_s\"], s[\"vocal_start_s\"], s[\"vocal_end_s\"])\n",
    "#     audio.get_segment(s[\"start_s\"], s[\"end_s\"]).play(compress=False)\n",
    "#     print(\"-\"*10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "80cc74c5",
   "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.10.13"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
