{
 "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",
    "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": [],
   "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 write_jsonl, read_jsonl, write_json, read_json, normalize_whitespace\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": [
    "## genius_hq"
   ]
  },
  {
   "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 parse_lyrics, legacy_parse_lyrics, EMBEDDING_RATE as HOOT_EMBEDDING_RATE\n",
    "from suno_utils.utils.lyrics import remove_speakers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "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(\"/home/tony/Data/Hoot/metas.json\", \"r\") as fp:\n",
    "    metas = json.load(fp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "29cb5d64",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:23:56.837124Z",
     "start_time": "2024-02-05T19:23:56.162921Z"
    }
   },
   "outputs": [],
   "source": [
    "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": 6,
   "id": "0deec392",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:23:56.840862Z",
     "start_time": "2024-02-05T19:23:56.838849Z"
    }
   },
   "outputs": [],
   "source": [
    "version_number = \"v5\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "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 [02:54, 105.39it/s]\n"
     ]
    }
   ],
   "source": [
    "for n_step, jsonl_name in tqdm.tqdm(\n",
    "    enumerate(\n",
    "        sorted(os.listdir(f\"/home/tony/Data/Hoot/alignments/genius_{version_number}\"))\n",
    "    )\n",
    "):\n",
    "    try:\n",
    "        flat_aligned_lyrics = read_jsonl(\n",
    "            os.path.join(\n",
    "                f\"/home/tony/Data/Hoot/alignments/genius_{version_number}\", jsonl_name\n",
    "            )\n",
    "        )\n",
    "        write_jsonl(\n",
    "            flat_aligned_lyrics,\n",
    "            os.path.join(TMP_DIR, f\"genius_hq_alignments_{version_number}.jsonl\"),\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": 8,
   "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%|▌                                                                                                       | 9592/1726787 [00:12<38:30, 743.25it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "93575.2 hours\n",
      "0.0 hours silence\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# get summary (sample) stats\n",
    "with open(os.path.join(TMP_DIR, f\"genius_hq_alignments_{version_number}.jsonl\")) 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(os.path.join(TMP_DIR, f\"genius_hq_alignments_{version_number}.jsonl\")) 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",
    "\n",
    "# 7b v3 data\n",
    "# v3 89881.3 hours\n",
    "# 7b v5 data\n",
    "# v5 93742.5 hours"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "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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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# max is prob around 1000\n",
    "pd.Series(n_tokens_list).hist(bins=50);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "f1611437",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-02-05T19:27:24.857383Z",
     "start_time": "2024-02-05T19:27:24.697166Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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1bb+x+LDGmFWja8mf3ssfewVf3cHDBhg0XEr3BbhaMKECdiyZQv27NmDtm3bSu1arRalpaUoKCiAi4uL1J6XlwetViv1OXjwoNl4Fe9mq+jzT2q1Gmq1ulK7ra1tvcJNfbevL0P5nf3iaDCp7vgaKIW1Vxbrr6ya1l/Jvw8NScljb6hxFQ1HQghMnDgRX375JXbt2gVfX1+z9b1794atrS127tyJiIgIAEBWVhZycnKg0+kAADqdDvPnz0d+fj7c3d0BAGlpadBoNOjatWvjHhAREVEDa//qN9X2+X1heCPMpPlSNBzFxMQgJSUFmzdvRsuWLaHX6wEAzs7OcHBwgLOzM6KiohAbGwtXV1doNBpMnDgROp0OwcHBAIDQ0FB07doVzzzzDBYvXgy9Xo8ZM2YgJiamyrNDRERERLeiaDhauXIlAKB///5m7WvXrsVzzz0HAHj77bdhZWWFiIgIGAwGhIWFYcWKFVJfa2trbNmyBdHR0dDpdHByckJkZCTmzJnTWIdBREREzYjil9WqY29vj6SkJCQlJd20j4+PD7Zu3WrJqREREdEdit+tRkRERCTDcEREREQkw3BEREREJHNbfM4RERFRc8e34DcdPHNEREREJMNwRERERCTDy2pNRE1OxxIRUdPG1/rbA88cEREREckwHBERERHJMBwRERERyTAcEREREckwHBERERHJMBwRERERyTAcEREREckwHBERERHJMBwRERERyTAcEREREckwHBERERHJMBwRERERyTAcEREREckwHBERERHJMBwRERERydgoPQEiIiKyrPavflNtn98XhjfCTJomnjkiIiIikmE4IiIiIpLhZTUiIqI7EC+93RzPHBERERHJMBwRERERyTAcEREREckwHBERERHJMBwRERERyTAcEREREcnwrfxERERUpZq83b854pkjIiIiIhmGIyIiIiIZRcPRnj178Mgjj8DLywsqlQqbNm0yWy+EwKxZs+Dp6QkHBweEhITg9OnTZn0uX76M0aNHQ6PRwMXFBVFRUbh69WojHgURERE1J4qGo2vXrqFnz55ISkqqcv3ixYuxbNkyrFq1CgcOHICTkxPCwsJQUlIi9Rk9ejSOHz+OtLQ0bNmyBXv27MG4ceMa6xCIiIiomVH0huyhQ4di6NChVa4TQmDp0qWYMWMGHnvsMQDABx98AA8PD2za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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# check the durations distribution\n",
    "pd.Series(durations_list).hist(bins=50)\n",
    "plt.title(\n",
    "    f\"median {np.median(durations_list):.1f}, 90% {np.quantile(durations_list, 0.90):.1f}\"\n",
    ")\n",
    "plt.xlabel(\"segment duration\")\n",
    "plt.ylabel(\"counts\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "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.12"
  },
  "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
}
