{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "08218f19",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b440e776",
   "metadata": {},
   "source": [
    "## Chirp Combo Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "76fc0b2c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# vocab: \n",
    "#   0-119_548 text\n",
    "#   1x0-999   semantic\n",
    "#   8x0-4095  coarse\n",
    "\n",
    "#   1000 semantic pad token\n",
    "#   1001 semantic infer token\n",
    "#   4096 coarse pad token\n",
    "#   4097 coarse infer token\n",
    "#   4098 semantic interleave token\n",
    "\n",
    "# Memmaps:\n",
    "#   Nx9x3584 for audio tokens\n",
    "# Jsons:\n",
    "#   N*Dict with meta keys [\"dataset\", \"original_id\", \"start_s\", \"end_s\", \"text\"]\n",
    "#   Dict with meta keys {\"dataset\": [\"idx_list\"]}\n",
    "\n",
    "# Bundles (mert_v2_2x1k):\n",
    "# s3://suno-data/datasets/bundles/\n",
    "#  v1/youtube_music\n",
    "#  v1/genius_hq\n",
    "#  v1/jamendo\n",
    "#  v1/imslp\n",
    "#  v1/freesound\n",
    "#  v2/pond5\n",
    "#  (v1/fma)\n",
    "#  (v1/audioset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0e33ff3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "import tqdm\n",
    "import torch\n",
    "import funcy\n",
    "import json\n",
    "import gc\n",
    "import re\n",
    "import random\n",
    "import tempfile\n",
    "import collections\n",
    "from collections import defaultdict\n",
    "from joblib import Parallel, delayed\n",
    "from transformers import BertTokenizer\n",
    "\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\n",
    "\n",
    "TEXT_CODEBOOK_SIZE = 119_548\n",
    "TEXT_PAD_TOKEN = TEXT_CODEBOOK_SIZE\n",
    "TEXT_VOCAB_SIZE = 119_552\n",
    "\n",
    "SEMANTIC_CODEBOOK_SIZE = 1000\n",
    "SEMANTIC_N_CODEBOOKS = 1\n",
    "SEMANTIC_PAD_TOKEN = SEMANTIC_CODEBOOK_SIZE\n",
    "SEMANTIC_INFER_TOKEN = SEMANTIC_CODEBOOK_SIZE + 1\n",
    "SEMANTIC_VOCAB_SIZE = 1024\n",
    "SEMANTIC_RATE_HZ = 75\n",
    "SEMANTIC_SHIFT_FACTOR = 150\n",
    "assert(SEMANTIC_VOCAB_SIZE == (np.floor(SEMANTIC_CODEBOOK_SIZE // 64) + 1) * 64)\n",
    "\n",
    "COARSE_CODEBOOK_SIZE = 4096\n",
    "COARSE_N_CODEBOOKS = 8\n",
    "COARSE_PAD_TOKEN = COARSE_CODEBOOK_SIZE\n",
    "COARSE_INFER_TOKEN = COARSE_CODEBOOK_SIZE + 1\n",
    "COARSE_INTERLEAVE_TOKEN = COARSE_CODEBOOK_SIZE + 2\n",
    "COARSE_VOCAB_SIZE = 4160\n",
    "COARSE_RATE_HZ = 25\n",
    "COARSE_SHIFT_FACTOR = 1\n",
    "assert(COARSE_CODEBOOK_SIZE + 3 < COARSE_VOCAB_SIZE)\n",
    "assert(COARSE_VOCAB_SIZE % 64 == 0)\n",
    "\n",
    "BLOCK_SIZE = 4096\n",
    "N_TOKENS_TEXT = 512\n",
    "N_TOKENS_AUDIO = 3375  # max 45s of audio\n",
    "# make sure we have enough space for shift 10\n",
    "assert(\n",
    "    BLOCK_SIZE >= (\n",
    "        N_TOKENS_TEXT + N_TOKENS_AUDIO + \n",
    "        SEMANTIC_N_CODEBOOKS * SEMANTIC_SHIFT_FACTOR + \n",
    "        (COARSE_N_CODEBOOKS - 1) * COARSE_SHIFT_FACTOR\n",
    "    )\n",
    ")\n",
    "\n",
    "SEMANTIC_EMBED_DIR = \"mert_v2_2x1k\"\n",
    "CODEC_EMBED_DIR = \"dac_25_8\"\n",
    "\n",
    "METAS_DIR = \"/home/georg/notebooks/gpt/chirp_v1/metadata/\"\n",
    "OUT_DATA_DIR = \"/mnt/data/georg/data/chirp_v1\"\n",
    "os.makedirs(OUT_DATA_DIR, exist_ok=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "880fa9aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "# load manifests of IDs and text and tags etc\n",
    "meta_info_map = {\n",
    "    \"genius_hq\": {m[\"id\"]: m for m in read_jsonl(os.path.join(METAS_DIR, \"genius_hq.jsonl\"))},\n",
    "    \"youtube_music\": {m[\"id\"]: m for m in read_jsonl(os.path.join(METAS_DIR, \"youtube_music.jsonl\"))},\n",
    "    \"freesound\": {m[\"id\"]: m for m in read_jsonl(os.path.join(METAS_DIR, \"freesound.jsonl\"))},\n",
    "    \"jamendo\": {m[\"id\"]: m for m in read_jsonl(os.path.join(METAS_DIR, \"jamendo.jsonl\"))},\n",
    "    \"imslp\": {m[\"id\"]: m for m in read_jsonl(os.path.join(METAS_DIR, \"imslp.jsonl\"))},\n",
    "    \"pond5_music\": {m[\"id\"]: m for m in read_jsonl(os.path.join(METAS_DIR, \"pond5_music.jsonl\"))},\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9c043b02",
   "metadata": {},
   "outputs": [],
   "source": [
    "SEM_LEN_FAC = int(SEMANTIC_RATE_HZ / math.gcd(COARSE_RATE_HZ, SEMANTIC_RATE_HZ))  # 3\n",
    "COA_LEN_FAC = int(COARSE_RATE_HZ / math.gcd(COARSE_RATE_HZ, SEMANTIC_RATE_HZ))  # 1\n",
    "\n",
    "def _trim_to_common(semantic_arr, coarse_arr):\n",
    "    common_len = math.floor(min(len(semantic_arr) / SEM_LEN_FAC, len(coarse_arr) / COA_LEN_FAC))\n",
    "    if len(semantic_arr) > common_len * SEM_LEN_FAC:\n",
    "        semantic_arr = semantic_arr[:common_len*SEM_LEN_FAC]\n",
    "    if len(coarse_arr) > common_len * COA_LEN_FAC:\n",
    "        coarse_arr = coarse_arr[:common_len*COA_LEN_FAC]\n",
    "    return semantic_arr, coarse_arr\n",
    "\n",
    "def _parse_arrays(dset_name, meta_info, semantic_arr, coarse_arr):\n",
    "    # use semantic for timekeeping\n",
    "    arr_list = []\n",
    "    # first check if we have known segments\n",
    "    if dset_name == \"genius_hq\":\n",
    "        assert(\"text_segments\" in meta_info or \"text\" in meta_info)\n",
    "    if \"text_segments\" in meta_info:\n",
    "        semantic_step_ranges = [\n",
    "            (\n",
    "                int(round(m[\"start_s\"]*SEMANTIC_RATE_HZ)), \n",
    "                min(len(semantic_arr), int(round(m[\"end_s\"]*SEMANTIC_RATE_HZ))),\n",
    "            ) \n",
    "            for m in meta_info[\"text_segments\"]\n",
    "        ]\n",
    "    else:\n",
    "        # randomize offset to not get only multiples\n",
    "        offs = 0\n",
    "        semantic_step_ranges = []\n",
    "        if \"text\" not in meta_info and random.random() > 0.5:\n",
    "            # don't randomize offsets if we have lyrics\n",
    "            offs = random.randint(1, N_TOKENS_AUDIO-1)\n",
    "            semantic_step_ranges = [(0, min(len(semantic_arr), offs))]  \n",
    "        semantic_step_ranges += [\n",
    "            (\n",
    "                offs+n*N_TOKENS_AUDIO, \n",
    "                min(len(semantic_arr), offs+(n+1)*N_TOKENS_AUDIO),\n",
    "            ) \n",
    "            for n in range(int(np.ceil((len(semantic_arr)-offs)/N_TOKENS_AUDIO)))\n",
    "        ]\n",
    "    \n",
    "    for n_segment, (sem_start_idx, sem_end_idx) in enumerate(semantic_step_ranges):\n",
    "        if (\n",
    "            sem_end_idx - sem_start_idx > N_TOKENS_AUDIO or \n",
    "            sem_end_idx - sem_start_idx < int(round((N_TOKENS_AUDIO/8)))  # arbitrary\n",
    "        ):\n",
    "            continue\n",
    "        coarse_start_idx = int(round(sem_start_idx * COARSE_RATE_HZ / SEMANTIC_RATE_HZ))\n",
    "        coarse_end_idx = int(round(sem_end_idx * COARSE_RATE_HZ / SEMANTIC_RATE_HZ))\n",
    "        assert(sem_end_idx >= 0  and coarse_start_idx >= 0)\n",
    "        if sem_end_idx > len(semantic_arr) or coarse_end_idx > len(coarse_arr):\n",
    "            continue\n",
    "        # get array segments\n",
    "        arr_s = semantic_arr[sem_start_idx:sem_end_idx,:SEMANTIC_N_CODEBOOKS].copy()\n",
    "        arr_c = coarse_arr[coarse_start_idx:coarse_end_idx,:COARSE_N_CODEBOOKS].copy()\n",
    "        # fix any alignment mistakes\n",
    "        arr_s, arr_c = _trim_to_common(arr_s, arr_c)\n",
    "        # interleave\n",
    "        # t, cb\n",
    "        arr_c = arr_c.reshape(arr_c.shape[0] // 1, 1, arr_c.shape[-1])\n",
    "        # t, 1, cb\n",
    "        arr_c = np.concatenate([\n",
    "            arr_c,\n",
    "            np.full((arr_c.shape[0], 1, arr_c.shape[-1]), COARSE_INTERLEAVE_TOKEN),\n",
    "            np.full((arr_c.shape[0], 1, arr_c.shape[-1]), COARSE_INTERLEAVE_TOKEN),\n",
    "        ], axis=1)\n",
    "        # t, 3, cb\n",
    "        arr_c = arr_c.reshape(-1, arr_c.shape[-1])\n",
    "        # t*, cb\n",
    "        assert(len(arr_c) == len(arr_s))\n",
    "        # concat and stack\n",
    "        if len(arr_c) < N_TOKENS_AUDIO:\n",
    "            arr_c = np.pad(\n",
    "                arr_c, \n",
    "                ((0, N_TOKENS_AUDIO-len(arr_c)), (0, 0)),\n",
    "                constant_values=COARSE_PAD_TOKEN, \n",
    "                mode=\"constant\",\n",
    "            )\n",
    "            arr_s = np.pad(\n",
    "                arr_s, \n",
    "                ((0, N_TOKENS_AUDIO-len(arr_s)), (0, 0)),\n",
    "                constant_values=SEMANTIC_PAD_TOKEN, \n",
    "                mode=\"constant\",\n",
    "            )\n",
    "        arr = np.concatenate([arr_s, arr_c], axis=-1)\n",
    "        arr = arr.astype(np.uint16)\n",
    "        assert(arr.shape == (N_TOKENS_AUDIO, SEMANTIC_N_CODEBOOKS + COARSE_N_CODEBOOKS))\n",
    "        new_meta = {\n",
    "            \"id\": meta_info[\"id\"],\n",
    "            \"n_segment\": n_segment,\n",
    "            \"start_s\": round(sem_start_idx / SEMANTIC_RATE_HZ, 2),\n",
    "            \"end_s\": round(sem_end_idx / SEMANTIC_RATE_HZ, 2),\n",
    "        }\n",
    "        if \"text\" in meta_info and n_segment == 0:\n",
    "            new_meta[\"text\"] = meta_info[\"text\"]\n",
    "            new_meta[\"dset_suffix\"] = \"lyrics_foreign\"\n",
    "        if \"text_segments\" in meta_info:\n",
    "            assert(len(semantic_step_ranges) == len(meta_info[\"text_segments\"]))  # just to triple-check\n",
    "            new_meta[\"text\"] = meta_info[\"text_segments\"][n_segment][\"text\"]\n",
    "            new_meta[\"dset_suffix\"] = \"lyrics\"\n",
    "        if \"original_id\" in meta_info:\n",
    "            new_meta[\"original_id\"] = meta_info[\"original_id\"]\n",
    "        if \"tags\" in meta_info:\n",
    "            new_meta[\"tags\"] = meta_info[\"tags\"]\n",
    "        arr_list.append((arr, new_meta))\n",
    "        del arr_s, arr_c\n",
    "    return arr_list\n",
    "\n",
    "def _process_archives(\n",
    "    dset_name,\n",
    "    s3_semantic_archive_filepaths, \n",
    "    s3_coarse_archive_filepaths\n",
    "):\n",
    "    semantic_archive = {}\n",
    "    for s3_semantic_archive_filepath in s3_semantic_archive_filepaths:\n",
    "        if not check_s3_file_exists(s3_semantic_archive_filepath):\n",
    "            continue\n",
    "        for k, v in read_from_s3(s3_semantic_archive_filepath, read_f=np.load).items():\n",
    "            semantic_archive[k] = v\n",
    "    coarse_archive = {}\n",
    "    for s3_coarse_archive_filepath in s3_coarse_archive_filepaths:\n",
    "        if not check_s3_file_exists(s3_coarse_archive_filepath):\n",
    "            continue\n",
    "        for k, v in read_from_s3(s3_coarse_archive_filepath, read_f=np.load).items():\n",
    "            coarse_archive[k] = v\n",
    "    semantic_uids, coarse_uids = set(semantic_archive.keys()), set(coarse_archive.keys())\n",
    "    assert(\n",
    "        (len(semantic_uids) < 10 and len(coarse_uids) < 10) or\n",
    "        (len(semantic_uids & coarse_uids) / (len(semantic_uids) + len(coarse_uids)) > 0.1)\n",
    "    )\n",
    "    assert(len(semantic_uids & coarse_uids) > 0)\n",
    "    arr_list = []\n",
    "    for uid in semantic_uids & coarse_uids:\n",
    "        if uid not in meta_info_map[dset_name]:\n",
    "            continue\n",
    "        semantic_arr = semantic_archive[uid]\n",
    "        coarse_arr = coarse_archive[uid]\n",
    "        if np.abs(len(coarse_arr) / COARSE_RATE_HZ - len(semantic_arr) / SEMANTIC_RATE_HZ) > 0.1:\n",
    "            # skip if embeddings not roughly the same duration\n",
    "            continue\n",
    "        semantic_arr, coarse_arr = _trim_to_common(semantic_arr, coarse_arr)\n",
    "        assert(len(coarse_arr) == len(semantic_arr) * COARSE_RATE_HZ / SEMANTIC_RATE_HZ)\n",
    "        arr_list.extend(_parse_arrays(dset_name, meta_info_map[dset_name][uid], semantic_arr, coarse_arr))\n",
    "    del semantic_archive, coarse_archive\n",
    "    gc.collect()\n",
    "    return arr_list\n",
    "\n",
    "def _prep_data(\n",
    "    dataset,\n",
    "    njobs=5,\n",
    "    chunksize=10,\n",
    "    is_val=False,\n",
    "    n_offs=0,\n",
    "):\n",
    "    dset_name, dset_version, (start_idx, end_idx), n_sem, n_coarse = dataset\n",
    "    dset_type = \"val\" if is_val else \"tr\"\n",
    "    out_mm_filepath = os.path.join(OUT_DATA_DIR, f\"combo_{dset_type}.bin\")\n",
    "    out_metas_filepath = os.path.join(OUT_DATA_DIR, f\"combo_metas_{dset_type}.jsonl\")\n",
    "    tot_duration_dict = defaultdict(int)\n",
    "    n_chunks = int(np.ceil((end_idx - start_idx) / chunksize))\n",
    "    for idx_chunk in tqdm.tqdm(funcy.chunks(chunksize, list(range(start_idx, end_idx))), total=n_chunks):\n",
    "        n_jobs = np.min([njobs, chunksize, len(idx_chunk)])\n",
    "        encoded_arrays_list = Parallel(n_jobs=n_jobs, prefer=\"threads\")(\n",
    "            delayed(_process_archives)(\n",
    "                dset_name,\n",
    "                [\n",
    "                    f\"s3://suno-data/datasets/bundles/{dset_version}/{dset_name}/{SEMANTIC_EMBED_DIR}/part_{idx_idx}.npz\"\n",
    "                    for idx_idx in range(idx*n_sem, (idx+1)*n_sem)\n",
    "                ],\n",
    "                [\n",
    "                    f\"s3://suno-data/datasets/bundles/{dset_version}/{dset_name}/{CODEC_EMBED_DIR}/part_{idx_idx}.npz\"\n",
    "                    for idx_idx in range(idx*n_coarse, (idx+1)*n_coarse)\n",
    "                ],\n",
    "            )\n",
    "            for idx in idx_chunk\n",
    "        )    \n",
    "        for encoded_arrays in encoded_arrays_list:\n",
    "            to_write_len = np.sum([arr.size for arr, _ in encoded_arrays])\n",
    "            if to_write_len == 0:\n",
    "                continue\n",
    "            out_mm = np.memmap(\n",
    "                out_mm_filepath, dtype=np.uint16, mode=\"r+\", shape=(n_offs+to_write_len,)\n",
    "            )\n",
    "            for arr, arr_meta in encoded_arrays:\n",
    "                out_mm[n_offs:n_offs+arr.size] = arr.reshape(-1,)\n",
    "                n_offs += arr.size\n",
    "                dataset_str = dset_name\n",
    "                if \"dset_suffix\" in arr_meta:\n",
    "                    dataset_str += f\"_{arr_meta['dset_suffix']}\"\n",
    "                add_meta = {\n",
    "                    \"dataset\": dataset_str,\n",
    "                    \"id\": arr_meta[\"id\"],\n",
    "                    \"start_s\": round(arr_meta[\"start_s\"], 2),\n",
    "                    \"end_s\": round(arr_meta[\"end_s\"], 2),\n",
    "                }\n",
    "                if \"original_id\" in arr_meta:\n",
    "                    add_meta[\"original_id\"] = arr_meta[\"original_id\"]\n",
    "                if \"tags\" in arr_meta:\n",
    "                    tags = [s for s in arr_meta[\"tags\"] if len(s) > 0]\n",
    "                    if len(tags) > 0:\n",
    "                        add_meta[\"tags\"] = tags\n",
    "                if \"text\" in arr_meta:\n",
    "                    add_meta[\"text\"] = arr_meta[\"text\"]\n",
    "                tot_duration_dict[dataset_str] += arr_meta[\"end_s\"] - arr_meta[\"start_s\"]\n",
    "                with open(out_metas_filepath, \"a\") as f:\n",
    "                    f.write(json.dumps(add_meta) + \"\\n\")\n",
    "            out_mm.flush()\n",
    "            del out_mm\n",
    "        del encoded_arrays_list\n",
    "        gc.collect()\n",
    "    for k, v in tot_duration_dict.items():\n",
    "        print(f\"{round(v / 60 / 60):,} hours of {k} data\")\n",
    "    return n_offs\n",
    "\n",
    "def prep_data(\n",
    "    datasets,\n",
    "    is_val=False,\n",
    "    njobs=5,\n",
    "    chunksize=10,\n",
    "):\n",
    "    n_offs = 0\n",
    "    dset_type = \"val\" if is_val else \"tr\"\n",
    "    out_mm_filepath = os.path.join(OUT_DATA_DIR, f\"combo_{dset_type}.bin\")\n",
    "    out_metas_filepath = os.path.join(OUT_DATA_DIR, f\"combo_metas_{dset_type}.jsonl\")\n",
    "    out_info_filepath = os.path.join(OUT_DATA_DIR, f\"combo_info_{dset_type}.json\")\n",
    "    out_mm = np.memmap(out_mm_filepath, dtype=np.uint16, mode=\"w+\", shape=(1,))\n",
    "    with open(out_metas_filepath, \"w\") as f:\n",
    "        f.write(\"\")\n",
    "    for dataset in datasets:\n",
    "        n_offs = _prep_data(\n",
    "            dataset,\n",
    "            njobs=njobs,\n",
    "            chunksize=chunksize,\n",
    "            is_val=is_val,\n",
    "            n_offs=n_offs,\n",
    "        )\n",
    "    datasets_info = {}\n",
    "    with open(out_metas_filepath) as f:\n",
    "        n = 0\n",
    "        for line in f:\n",
    "            line = line.strip()\n",
    "            if len(line) == 0:\n",
    "                continue\n",
    "            m = json.loads(line)\n",
    "            if m[\"dataset\"] not in datasets_info:\n",
    "                datasets_info[m[\"dataset\"]] = {\"idx_list\": []}\n",
    "            datasets_info[m[\"dataset\"]][\"idx_list\"].append(n)\n",
    "            n += 1\n",
    "    write_json(datasets_info, out_info_filepath)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "421cfc98",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████| 1/1 [00:19<00:00, 19.96s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "58 hours of youtube_music data\n",
      "2 hours of youtube_music_lyrics_foreign data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████| 1/1 [00:18<00:00, 18.47s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7 hours of genius_hq_lyrics data\n",
      "2 hours of genius_hq_lyrics_foreign data\n",
      "6 hours of genius_hq data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████| 1/1 [00:23<00:00, 23.73s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 hours of freesound data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████| 1/1 [00:18<00:00, 18.61s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "29 hours of imslp data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████| 1/1 [00:17<00:00, 17.24s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "35 hours of jamendo data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████| 1/1 [00:17<00:00, 17.18s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "14 hours of pond5_music data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# (start_idx, end_idx), n_archives_semantic, n_archives_coarse\n",
    "datasets = [\n",
    "    (\"youtube_music\", \"v1\", (0, 1), 1, 1),\n",
    "    (\"genius_hq\", \"v1\", (0, 1), 1, 1),\n",
    "    (\"freesound\", \"v1\", (0, 2), 1, 1),\n",
    "    (\"imslp\", \"v1\", (0, 1), 1, 1),\n",
    "    (\"jamendo\", \"v1\", (0, 1), 1, 1),\n",
    "    (\"pond5_music\", \"v2\", (0, 1), 1, 1),\n",
    "]\n",
    "prep_data(\n",
    "    datasets,\n",
    "    is_val=True,\n",
    ")\n",
    "# 58 hours of youtube_music data\n",
    "#  2 hours of youtube_music_lyrics_foreign data\n",
    "#  7 hours of genius_hq_lyrics data\n",
    "#  2 hours of genius_hq_lyrics_foreign data\n",
    "#  6 hours of genius_hq data\n",
    "#  1 hours of freesound data\n",
    "# 29 hours of imslp data\n",
    "# 35 hours of jamendo data\n",
    "# 14 hours of pond5_music data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "291224dc",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████| 211/211 [6:30:03<00:00, 110.92s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "125,784 hours of youtube_music data\n",
      "3,770 hours of youtube_music_lyrics_foreign data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████| 431/431 [11:02:15<00:00, 92.19s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6,624 hours of genius_hq_lyrics_foreign data\n",
      "24,634 hours of genius_hq data\n",
      "32,560 hours of genius_hq_lyrics data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████| 102/102 [2:17:25<00:00, 80.84s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "406 hours of freesound data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████| 56/56 [1:27:23<00:00, 93.63s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "19,482 hours of imslp data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████| 12/12 [17:59<00:00, 89.93s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3,720 hours of jamendo data\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████| 414/414 [10:09:59<00:00, 88.40s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "61,893 hours of pond5_music data\n"
     ]
    }
   ],
   "source": [
    "# (start_idx, end_idx), n_archives_semantic, n_archives_coarse\n",
    "datasets = [\n",
    "    (\"youtube_music\", \"v1\", (1, 2102), 1, 1),\n",
    "    (\"genius_hq\", \"v1\", (1, 4302), 1, 1),\n",
    "    (\"freesound\", \"v1\", (2, 1021), 1, 1),\n",
    "    (\"imslp\", \"v1\", (1, 558), 1, 1),\n",
    "    (\"jamendo\", \"v1\", (1, 112), 1, 1),\n",
    "    (\"pond5_music\", \"v2\", (1, 4138), 1, 1),\n",
    "]\n",
    "prep_data(\n",
    "    datasets,\n",
    "    is_val=False,\n",
    "    njobs=10,\n",
    "    chunksize=10,\n",
    ")\n",
    "# 125,784 hours of youtube_music data\n",
    "# 3,770 hours of youtube_music_lyrics_foreign data\n",
    "# 32,560 hours of genius_hq_lyrics data\n",
    "# 6,624 hours of genius_hq_lyrics_foreign data\n",
    "# 24,634 hours of genius_hq data\n",
    "# 406 hours of freesound data\n",
    "# 19,482 hours of imslp data\n",
    "# 3,720 hours of jamendo data\n",
    "# 61,893 hours of pond5_music data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2ab57df8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # verify\n",
    "# mm = np.memmap(\"/mnt/data/georg/data/chirp_v1/combo_val.bin\", dtype=np.uint16, mode=\"r\")\n",
    "# metas = read_jsonl(\"/mnt/data/georg/data/chirp_v1/combo_metas_val.jsonl\")\n",
    "# mm = mm.reshape(-1, 3375, 9)\n",
    "# assert(len(mm) == len(metas))\n",
    "# assert(mm[:100,:,0].min() >= 0)\n",
    "# assert(mm[:100,:,0].max() <= 1000+1)\n",
    "# assert(mm[:100,:,1:].min() >= 0)\n",
    "# assert(mm[:100,:,1:].max() <= 4096+2)\n",
    "# assert(mm[:,1::3,1:].min() == 4096)\n",
    "# assert(mm[:,2::3,1:].min() == 4096)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "acc5c5d5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !aws s3 cp /mnt/data/georg/data/chirp_v1/combo_info_val.json s3://suno-data/georg/data/chirp_v1/\n",
    "# !aws s3 cp /mnt/data/georg/data/chirp_v1/combo_metas_val.jsonl s3://suno-data/georg/data/chirp_v1/\n",
    "# !aws s3 cp /mnt/data/georg/data/chirp_v1/combo_val.bin s3://suno-data/georg/data/chirp_v1/\n",
    "\n",
    "# !aws s3 cp /mnt/data/georg/data/chirp_v1/combo_info_tr.json s3://suno-data/georg/data/chirp_v1/\n",
    "# !aws s3 cp /mnt/data/georg/data/chirp_v1/combo_metas_tr.jsonl s3://suno-data/georg/data/chirp_v1/\n",
    "# !aws s3 cp /mnt/data/georg/data/chirp_v1/combo_tr.bin s3://suno-data/georg/data/chirp_v1/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "06a6c5b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !du -hs /mnt/data/georg/data/chirp_v1/combo_tr.bin\n",
    "# # 1.5T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "cbcbca32",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "13939\n"
     ]
    }
   ],
   "source": [
    "# # randomly listen to some stuff\n",
    "# from suno_utils.tasks.dac import preload_models as preload_codec_models\n",
    "# _ = preload_codec_models(\"/mnt/data/georg/tmp/d_codec_25x8.pt\")\n",
    "# from suno_utils.tasks.dac import decode as codec_decode, EMBEDDING_RATE as CODEC_EMBEDDING_RATE\n",
    "# mm = np.memmap(\"/mnt/data/georg/data/chirp_v1/combo_val.bin\", dtype=np.uint16, mode=\"r\")\n",
    "# mm = mm.reshape(-1, 3375, 9)\n",
    "# test_metas = read_jsonl(\"/mnt/data/georg/data/chirp_v1/combo_metas_val.jsonl\")\n",
    "# test_info = read_json(\"/mnt/data/georg/data/chirp_v1/combo_info_val.json\")\n",
    "# assert(len(test_metas) == len(mm))\n",
    "# idx_list = list(range(len(test_metas)))\n",
    "# #random.shuffle(idx_list)\n",
    "# #idx_list = [idx for idx in idx_list if \"text\" in test_metas[idx]]\n",
    "# print(len(mm))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "7a05e8d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # show text and audio\n",
    "# # idx = random.choice(idx_list)\n",
    "# idx = random.choice(test_info[\"pond5_music\"][\"idx_list\"])\n",
    "# # print(len(test_metas[idx][\"tokens\"]), \"tokens\")\n",
    "# print(\"tags:\", test_metas[idx].get(\"tags\"))\n",
    "# arr = mm[idx,1:].copy().astype(np.int16)[:,1:]\n",
    "# pad_idx_arr = np.where(arr == 4096)[0]\n",
    "# if len(pad_idx_arr) > 0:\n",
    "#     arr = arr[:pad_idx_arr[0],:]\n",
    "# codec_decode(arr[2::3]).play()\n",
    "# print(\"text:\", test_metas[idx].get(\"text\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9d09d9ef",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c2f048ba",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "73c92bda",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "747f0363",
   "metadata": {},
   "source": [
    "## get all tags"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "73286512",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_metas = read_jsonl(\"/mnt/data/georg/data/chirp_v1/combo_metas_val.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "a3ed7922",
   "metadata": {},
   "outputs": [],
   "source": [
    "tags = []\n",
    "for e in train_metas:\n",
    "    tags.extend(e.get(\"tags\", []))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "2eed69a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "vc_tags = pd.Series(tags).value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "bf1c83e8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pop                2495781\n",
       "Rap                2431682\n",
       "Rock               1193692\n",
       "commute            1089137\n",
       "energy boosters     940473\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc_tags.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "f76f1e83",
   "metadata": {},
   "outputs": [],
   "source": [
    "vc_tags = vc_tags.to_frame()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "6766efb1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>lonely castle.</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Strings.</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>asianbeatz-riff-1.</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>dnb loops 001 only guitar wet 180 bpm.</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>yuung.</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                        count\n",
       "lonely castle.                            0.0\n",
       "Strings.                                  0.0\n",
       "asianbeatz-riff-1.                        0.0\n",
       "dnb loops 001 only guitar wet 180 bpm.    0.0\n",
       "yuung.                                    0.0"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc_tags.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "fece8109",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = vc_tags[vc_tags[\"count\"]>=3][\"count\"].to_dict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "76df4ede",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1170fdc3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "89cb8d05",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7ec03489",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "94c6fee4",
   "metadata": {},
   "outputs": [],
   "source": [
    "tag_freqs = tag_freq"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "190334fa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Pop': 14.7,\n",
       " 'Rap': 14.7,\n",
       " 'Rock': 14.0,\n",
       " 'commute': 13.9,\n",
       " 'energy boosters': 13.8,\n",
       " 'Romantic': 13.6,\n",
       " 'chill': 13.5,\n",
       " 'hip-hop': 13.4,\n",
       " 'feel good': 13.4,\n",
       " 'dance & electronic': 13.2,\n",
       " 'R&B': 13.0,\n",
       " 'romance': 12.9,\n",
       " 'holiday': 12.9,\n",
       " 'Classical': 12.7,\n",
       " 'En Español': 12.7,\n",
       " 'Baroque': 12.7,\n",
       " 'rock': 12.6,\n",
       " 'piano': 12.6,\n",
       " 'bollywood & indian': 12.6,\n",
       " 'latin': 12.5,\n",
       " 'party': 12.5,\n",
       " 'France': 12.5,\n",
       " 'indie & alternative': 12.5,\n",
       " 'decades': 12.5,\n",
       " 'Deutschland': 12.4,\n",
       " 'folk & acoustic': 12.4,\n",
       " 'Em Português': 12.3,\n",
       " 'Trap': 12.3,\n",
       " 'orchestra': 12.3,\n",
       " 'focus': 12.2,\n",
       " 'family': 12.2,\n",
       " 'metal': 12.2,\n",
       " 'Alternative Rock': 12.1,\n",
       " 'Country': 12.1,\n",
       " 'christian & gospel': 12.1,\n",
       " 'French Rap': 12.1,\n",
       " 'country & americana': 12.1,\n",
       " 'r&b & soul': 12.1,\n",
       " 'Polska': 12.0,\n",
       " 'Brasil': 12.0,\n",
       " 'arabic': 12.0,\n",
       " 'Italy': 12.0,\n",
       " 'Electronic': 12.0,\n",
       " 'Россия (Russia)': 12.0,\n",
       " 'brazilian': 12.0,\n",
       " 'jazz': 12.0,\n",
       " 'workout': 11.9,\n",
       " 'Alternative': 11.9,\n",
       " 'Hip-Hop': 11.9,\n",
       " 'Latin Music': 11.9,\n",
       " 'j-pop': 11.8,\n",
       " 'pop': 11.7,\n",
       " 'Christian': 11.7,\n",
       " 'Early 20th century': 11.7,\n",
       " 'voices, chorus, orchestra': 11.7,\n",
       " 'Indie Rock': 11.7,\n",
       " 'Polski Rap': 11.6,\n",
       " 'classical': 11.6,\n",
       " 'electronic': 11.6,\n",
       " 'UK': 11.6,\n",
       " 'blues': 11.6,\n",
       " 'Indie': 11.6,\n",
       " 'reggae & caribbean': 11.6,\n",
       " 'k-pop': 11.5,\n",
       " 'african': 11.5,\n",
       " 'Soul': 11.5,\n",
       " 'Singer-Songwriter': 11.5,\n",
       " 'Indie Pop': 11.5,\n",
       " 'Русский рэп (Russian Rap)': 11.5,\n",
       " 'mandopop & cantopop': 11.5,\n",
       " 'black lives matter': 11.4,\n",
       " 'Pop-Rock': 11.4,\n",
       " 'Folk': 11.4,\n",
       " 'Dance': 11.3,\n",
       " 'Cover': 11.3,\n",
       " 'Alternative Pop': 11.3,\n",
       " 'Latin Urban': 11.3,\n",
       " 'soundtracks & musicals': 11.2,\n",
       " 'Korea': 11.2,\n",
       " 'Remix': 11.2,\n",
       " 'Korean': 11.2,\n",
       " 'Metal': 11.2,\n",
       " 'Latin Pop': 11.1,\n",
       " 'España': 11.1,\n",
       " 'sleep': 11.1,\n",
       " 'piano, orchestra': 11.1,\n",
       " 'pride': 11.0,\n",
       " 'South Korea': 11.0,\n",
       " 'Turkey': 11.0,\n",
       " 'ambient': 11.0,\n",
       " 'Soundtrack': 11.0,\n",
       " 'Scandinavia': 10.9,\n",
       " 'opm': 10.9,\n",
       " 'Italian Rap': 10.9,\n",
       " 'Underground Rap': 10.9,\n",
       " 'Ballad': 10.9,\n",
       " 'Electro-Pop': 10.9,\n",
       " 'Türkiye': 10.9,\n",
       " 'Acoustic': 10.9,\n",
       " 'Modern': 10.9,\n",
       " 'EDM': 10.8,\n",
       " 'organ': 10.8,\n",
       " 'Synth-Pop': 10.8,\n",
       " 'Punk Rock': 10.7,\n",
       " 'voices, mixed chorus (SATB), orchestra': 10.7,\n",
       " 'synthesizer': 10.7,\n",
       " 'Portugal': 10.7,\n",
       " '2 violins, viola, cello': 10.7,\n",
       " 'voices, mixed chorus, orchestra': 10.7,\n",
       " 'Non-Music': 10.7,\n",
       " 'Русский поп (Russian Pop)': 10.7,\n",
       " 'Japan': 10.7,\n",
       " 'Japanese': 10.7,\n",
       " 'soundtrack': 10.7,\n",
       " 'Post-Hardcore': 10.7,\n",
       " 'Reggaetón': 10.6,\n",
       " 'Hard Rock': 10.6,\n",
       " 'Soul Pop': 10.6,\n",
       " 'Dance-Pop': 10.6,\n",
       " 'Israeli Music': 10.6,\n",
       " 'Metalcore': 10.6,\n",
       " 'French Pop': 10.6,\n",
       " 'Pop-Punk': 10.6,\n",
       " 'drums': 10.5,\n",
       " 'voice, piano': 10.5,\n",
       " 'Live': 10.5,\n",
       " 'guitar': 10.5,\n",
       " 'Spanish Rap': 10.5,\n",
       " 'Nederland': 10.5,\n",
       " 'bass': 10.5,\n",
       " 'Canada': 10.5,\n",
       " 'Folk Rock': 10.5,\n",
       " 'violin, piano': 10.5,\n",
       " 'West Coast': 10.5,\n",
       " 'Deutschsprachiger Pop': 10.4,\n",
       " 'Türkçe Sözlü Rap': 10.4,\n",
       " 'keyboard': 10.4,\n",
       " 'Australia': 10.4,\n",
       " 'Emo': 10.4,\n",
       " 'Funk': 10.4,\n",
       " 'Spanish Urban': 10.4,\n",
       " 'Reggae': 10.4,\n",
       " 'Jazz': 10.4,\n",
       " 'experimental': 10.3,\n",
       " 'J-Pop': 10.3,\n",
       " 'Русский рок (Russian Rock)': 10.3,\n",
       " 'Heavy Metal': 10.3,\n",
       " 'violin, orchestra': 10.3,\n",
       " 'Argentina': 10.3,\n",
       " 'Sverige': 10.3,\n",
       " 'violin': 10.3,\n",
       " 'Italian Pop': 10.3,\n",
       " 'East Coast': 10.3,\n",
       " 'Alternative Metal': 10.3,\n",
       " 'Latin Trap': 10.3,\n",
       " 'Alternative R&B': 10.3,\n",
       " 'Puerto Rico': 10.2,\n",
       " 'Musicals': 10.2,\n",
       " 'Arabia | عربي': 10.2,\n",
       " 'K-Pop (케이팝)': 10.2,\n",
       " 'House': 10.2,\n",
       " 'Greece': 10.2,\n",
       " 'Piano': 10.2,\n",
       " 'Danmark': 10.2,\n",
       " 'easylistening': 10.2,\n",
       " 'Boy Band': 10.2,\n",
       " 'România': 10.2,\n",
       " 'Gospel': 10.1,\n",
       " 'Eighties': 10.1,\n",
       " 'México': 10.1,\n",
       " 'Conscious Hip-Hop': 10.1,\n",
       " 'Emo Rap': 10.1,\n",
       " 'K-Solo': 10.1,\n",
       " 'UK Rap': 10.1,\n",
       " 'Gangsta Rap': 10.1,\n",
       " 'Hardcore Rap': 10.0,\n",
       " 'Progressive Rock': 10.0,\n",
       " 'electricguitar': 10.0,\n",
       " 'chillout': 10.0,\n",
       " 'alternative': 10.0,\n",
       " 'British Rock': 10.0,\n",
       " 'New Wave': 10.0,\n",
       " 'Christmas': 10.0,\n",
       " 'dance': 10.0,\n",
       " 'South Africa': 10.0,\n",
       " 'Drill': 9.9,\n",
       " 'soprano, alto, tenor, bass, mixed chorus (SATB), orchestra': 9.9,\n",
       " 'Srbija': 9.9,\n",
       " 'Girl Group': 9.9,\n",
       " 'Spanish Pop': 9.9,\n",
       " 'Christian Pop': 9.9,\n",
       " 'Arabic Rap | راب عربي': 9.9,\n",
       " 'Seventies': 9.9,\n",
       " 'Norge': 9.9,\n",
       " 'Electronic Rock': 9.8,\n",
       " 'Deutschsprachiger Rock': 9.8,\n",
       " 'Post-Punk': 9.8,\n",
       " 'clavier': 9.8,\n",
       " 'Boom Bap': 9.8,\n",
       " 'Vietnam': 9.8,\n",
       " 'Atlanta Rap': 9.8,\n",
       " 'Experimental': 9.8,\n",
       " 'violin, cello, piano': 9.8,\n",
       " 'Blues': 9.8,\n",
       " 'Colombia': 9.7,\n",
       " 'Psychedelic Rock': 9.7,\n",
       " 'Art Rock': 9.7,\n",
       " 'Psychedelic': 9.7,\n",
       " 'Dream Pop': 9.7,\n",
       " 'Cloud Rap': 9.7,\n",
       " 'Lo-Fi': 9.7,\n",
       " 'Worship': 9.7,\n",
       " 'Indie Rap': 9.7,\n",
       " 'techno': 9.7,\n",
       " 'vocal soloists, mixed chorus, orchestra': 9.7,\n",
       " 'Romanized': 9.7,\n",
       " 'Christian Rap': 9.7,\n",
       " 'Israeli Rap': 9.7,\n",
       " 'Blues Rock': 9.7,\n",
       " 'house': 9.7,\n",
       " 'Dancehall': 9.6,\n",
       " 'Progressive Metal': 9.6,\n",
       " 'Gaming': 9.6,\n",
       " 'Filipino': 9.6,\n",
       " 'computer': 9.6,\n",
       " 'Русский трэп (Russian Trap)': 9.6,\n",
       " 'cello': 9.6,\n",
       " 'Power Metal': 9.6,\n",
       " 'Neo Soul': 9.6,\n",
       " 'orchestral': 9.6,\n",
       " 'indie': 9.6,\n",
       " 'Funk Nacional': 9.6,\n",
       " 'harpsichord': 9.6,\n",
       " 'Teen Pop': 9.5,\n",
       " 'Renaissance': 9.5,\n",
       " 'synth': 9.5,\n",
       " 'newage': 9.5,\n",
       " 'Ireland': 9.5,\n",
       " 'Nu-Metal': 9.5,\n",
       " 'lounge': 9.5,\n",
       " 'Unreleased': 9.5,\n",
       " 'Pop Rap': 9.5,\n",
       " 'hiphop': 9.5,\n",
       " 'strings': 9.5,\n",
       " 'folk': 9.5,\n",
       " 'Nineties': 9.5,\n",
       " 'Québec': 9.5,\n",
       " 'Adult Alternative': 9.5,\n",
       " 'Freestyle': 9.5,\n",
       " 'Україна (Ukraine)': 9.5,\n",
       " 'Adult Contemporary': 9.4,\n",
       " 'music': 9.4,\n",
       " 'trance': 9.4,\n",
       " 'Comedy': 9.4,\n",
       " 'Art Pop': 9.4,\n",
       " 'Folk Pop': 9.4,\n",
       " 'Disco': 9.4,\n",
       " 'Jamaica': 9.4,\n",
       " 'Future Bass': 9.4,\n",
       " 'Österreich': 9.4,\n",
       " 'cello, piano': 9.4,\n",
       " 'Electro': 9.4,\n",
       " 'Israeli Pop': 9.4,\n",
       " 'Israeli Rock': 9.4,\n",
       " 'Suomi': 9.3,\n",
       " 'poprock': 9.3,\n",
       " 'Dubstep': 9.3,\n",
       " 'K-R&B': 9.3,\n",
       " 'België/Belgique': 9.3,\n",
       " 'loop': 9.3,\n",
       " 'Svensk Rap': 9.3,\n",
       " 'Country Pop': 9.3,\n",
       " 'Norsk': 9.3,\n",
       " 'Egyptian | مصري': 9.3,\n",
       " 'Anime': 9.3,\n",
       " 'world': 9.3,\n",
       " 'Iran': 9.3,\n",
       " 'voice': 9.3,\n",
       " 'Persian': 9.3,\n",
       " 'Bedroom Pop': 9.3,\n",
       " 'Dominican Republic': 9.3,\n",
       " 'Christian Rock': 9.3,\n",
       " 'Experimental Rock': 9.3,\n",
       " 'Farsi': 9.2,\n",
       " 'Symphonic Metal': 9.2,\n",
       " 'Latin Rock': 9.2,\n",
       " 'violin, strings, continuo': 9.2,\n",
       " 'acousticguitar': 9.2,\n",
       " 'dark': 9.2,\n",
       " 'Hardcore Punk': 9.2,\n",
       " 'Americana': 9.2,\n",
       " 'Electro House': 9.2,\n",
       " 'soprano, alto, tenor, bass; mixed chorus (SATB), orchestra': 9.2,\n",
       " 'Afrobeats': 9.2,\n",
       " 'Disney': 9.2,\n",
       " 'Schlager': 9.2,\n",
       " 'Electronica': 9.2,\n",
       " 'Soft Rock': 9.2,\n",
       " \"Children's Music\": 9.2,\n",
       " 'TV': 9.2,\n",
       " 'YouTube': 9.2,\n",
       " 'J-Rock': 9.2,\n",
       " 'voices, orchestra': 9.2,\n",
       " 'Rap-Rock': 9.2,\n",
       " 'French R&B': 9.2,\n",
       " 'Horrorcore': 9.2,\n",
       " 'atmospheric': 9.2,\n",
       " 'Orchestral': 9.2,\n",
       " 'Chile': 9.1,\n",
       " 'film': 9.1,\n",
       " 'Nerdcore': 9.1,\n",
       " 'LGBTQ+': 9.1,\n",
       " 'Thrash Metal': 9.1,\n",
       " 'UK R&B': 9.1,\n",
       " 'Industrial': 9.1,\n",
       " 'downtempo': 9.1,\n",
       " 'drummachine': 9.1,\n",
       " 'popfolk': 9.1,\n",
       " 'Post-Grunge': 9.1,\n",
       " 'Chill': 9.1,\n",
       " 'Ambient': 9.1,\n",
       " 'Hyperpop': 9.1,\n",
       " 'Aussie Hip-Hop': 9.1,\n",
       " 'Contemporary Folk': 9.1,\n",
       " 'Holiday': 9.1,\n",
       " 'Drum & Bass': 9.1,\n",
       " 'Demo': 9.0,\n",
       " 'Gothic Rock': 9.0,\n",
       " 'Uruguay': 9.0,\n",
       " 'instrumentalpop': 9.0,\n",
       " 'Scandipop': 9.0,\n",
       " 'Grunge': 9.0,\n",
       " 'relaxing': 9.0,\n",
       " 'Srpski Rap': 9.0,\n",
       " 'Power Pop': 9.0,\n",
       " 'Regional Mexicano': 9.0,\n",
       " 'J-Rap': 9.0,\n",
       " 'beat': 9.0,\n",
       " 'Synth Rock': 9.0,\n",
       " 'Dirty South': 9.0,\n",
       " 'Motown': 9.0,\n",
       " 'Deep House': 9.0,\n",
       " 'Dark Pop': 9.0,\n",
       " 'progressive': 9.0,\n",
       " 'Parody': 9.0,\n",
       " 'Experimental Rap': 9.0,\n",
       " 'Québec Rap': 9.0,\n",
       " 'Alternative Country': 8.9,\n",
       " 'Egyptian Rap | راب مصري': 8.9,\n",
       " 'Melodic Hardcore': 8.9,\n",
       " 'C-Pop': 8.9,\n",
       " 'Hrvatska': 8.9,\n",
       " 'Synthwave': 8.9,\n",
       " 'Variété Française': 8.9,\n",
       " 'Iranian Rap': 8.9,\n",
       " 'Country Rap': 8.9,\n",
       " 'Soul Jazz': 8.9,\n",
       " 'Theme Song': 8.9,\n",
       " 'happy': 8.9,\n",
       " 'K-Hip-Hop': 8.9,\n",
       " 'Industrial Metal': 8.9,\n",
       " 'flute': 8.9,\n",
       " 'melodic': 8.9,\n",
       " 'Funk-Pop': 8.9,\n",
       " '3 sopranos, 2 altos, 2 tenors, 2 basses, 2 mixed choruses (SSAATTBBB), 2 orchestras': 8.9,\n",
       " 'DMV': 8.9,\n",
       " 'triphop': 8.9,\n",
       " 'Farsi Rap': 8.9,\n",
       " 'Bay Area': 8.9,\n",
       " 'Funk Rock': 8.9,\n",
       " 'Shoegaze': 8.9,\n",
       " 'cello, orchestra': 8.9,\n",
       " 'Broadway': 8.8,\n",
       " '2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n2 horns, 2 trumpets, timpani, strings': 8.8,\n",
       " 'funk': 8.8,\n",
       " 'emotional': 8.8,\n",
       " 'reggae': 8.8,\n",
       " 'Neo-Psychedelia': 8.8,\n",
       " 'Progressive House': 8.8,\n",
       " 'electricpiano': 8.8,\n",
       " \"voices, mixed chorus, orchestra \\n    Cast\\n        Eva, Pogner's daughter (soprano)\\nMagdalena, Eva's nurse (mezzo-soprano)\\nWalther von Stolzing, a young knight from Franconia (heldentenor)\\nDavid, Sachs' apprentice (high character-tenor)\\nA Nightwatchman (bas\": 8.8,\n",
       " 'Garage Rock': 8.8,\n",
       " 'Switzerland': 8.8,\n",
       " 'Melodic Metalcore': 8.8,\n",
       " 'Latin Rap': 8.8,\n",
       " 'Screen': 8.8,\n",
       " 'Spoken Word': 8.8,\n",
       " 'K-Ballad': 8.8,\n",
       " 'Venezuela': 8.8,\n",
       " 'Albania': 8.8,\n",
       " 'Tradução Em Português': 8.8,\n",
       " 'Baroque Pop': 8.8,\n",
       " 'Trip-Hop': 8.8,\n",
       " 'energetic': 8.8,\n",
       " 'percussion': 8.8,\n",
       " 'Melodic Death Metal': 8.8,\n",
       " 'Traducción Al Español': 8.8,\n",
       " 'Experimental Pop': 8.8,\n",
       " 'Sertanejo': 8.8,\n",
       " 'sampler': 8.7,\n",
       " 'Alternative Dance': 8.7,\n",
       " 'Polski Rock': 8.7,\n",
       " 'India': 8.7,\n",
       " 'Český Rap': 8.7,\n",
       " 'Easy Listening': 8.7,\n",
       " 'Religion': 8.7,\n",
       " 'Groove Metal': 8.7,\n",
       " 'Death Metal': 8.7,\n",
       " 'Britpop': 8.7,\n",
       " 'Česko': 8.7,\n",
       " 'Glam Rock': 8.7,\n",
       " 'Azerbaijan': 8.7,\n",
       " 'Nigeria': 8.7,\n",
       " 'electropop': 8.7,\n",
       " 'Industrial Rock': 8.7,\n",
       " 'MPB (Música Popular Brasileira)': 8.7,\n",
       " 'dream': 8.7,\n",
       " 'Jazz Rap': 8.7,\n",
       " 'soundscape': 8.7,\n",
       " 'Post-Rock': 8.7,\n",
       " 'Hardcore': 8.6,\n",
       " 'K-OST': 8.6,\n",
       " 'En Français': 8.6,\n",
       " 'Trance': 8.6,\n",
       " 'Melodic Dubstep': 8.6,\n",
       " 'Hip-Hop Tuga': 8.6,\n",
       " 'Bass Music': 8.6,\n",
       " 'Русское аренби (Russian R&B)': 8.6,\n",
       " 'Srpski Pop': 8.6,\n",
       " 'Downtempo': 8.6,\n",
       " 'New York': 8.6,\n",
       " 'Cumbia': 8.6,\n",
       " 'rap': 8.6,\n",
       " 'saxophone': 8.6,\n",
       " 'epic': 8.6,\n",
       " 'Israeli Yam Tichoni': 8.6,\n",
       " 'Protest Songs': 8.6,\n",
       " 'meditative': 8.5,\n",
       " 'Polski Pop': 8.5,\n",
       " 'Svensk Pop': 8.5,\n",
       " 'Noise Rock': 8.5,\n",
       " 'Bubblegum Pop': 8.5,\n",
       " 'Morocco | مغربي': 8.5,\n",
       " 'Mashup': 8.5,\n",
       " 'Bluegrass': 8.5,\n",
       " 'love': 8.5,\n",
       " 'Indonesia': 8.5,\n",
       " 'Middle East': 8.5,\n",
       " 'Norsk Rap': 8.5,\n",
       " 'Sixties': 8.5,\n",
       " 'China': 8.5,\n",
       " 'Türkçe Çeviri': 8.5,\n",
       " 'Industrial Hip-Hop': 8.5,\n",
       " 'piano 4-hands': 8.5,\n",
       " 'Gothic Metal': 8.5,\n",
       " 'space': 8.5,\n",
       " 'Corrido': 8.5,\n",
       " 'Techno': 8.5,\n",
       " 'Electronic Trap': 8.5,\n",
       " 'voices, male chorus (TTBB), orchestra': 8.5,\n",
       " 'Dark Wave': 8.5,\n",
       " 'French Rock': 8.5,\n",
       " \"voices, chorus, orchestra \\n    Cast\\n        Lohengrin (tenor)\\nElsa of Brabant (soprano)\\nOrtrud Telramund's wife (dramatic soprano or mezzo-soprano)\\nFriedrich of Telramund, a Count of Brabant (baritone)\\nHeinrich der Volger (bass)\\nThe King's Herald (bass)\\nFo\": 8.5,\n",
       " 'Memes': 8.5,\n",
       " 'Poetry': 8.5,\n",
       " 'club': 8.5,\n",
       " 'G-Funk': 8.5,\n",
       " 'Беларусь (Belarus)': 8.5,\n",
       " 'psychedelic': 8.4,\n",
       " 'Hong Kong': 8.4,\n",
       " 'harpsichord, strings, continuo': 8.4,\n",
       " 'Hindi': 8.4,\n",
       " 'sad': 8.4,\n",
       " 'Angola': 8.4,\n",
       " 'Русский андеграунд (Russian Underground)': 8.4,\n",
       " 'Eurovision': 8.4,\n",
       " 'industrial': 8.4,\n",
       " 'A Cappella': 8.4,\n",
       " '2 violins, 2 violas, cello': 8.4,\n",
       " 'Battle Rap': 8.4,\n",
       " 'Chicago Drill': 8.4,\n",
       " 'American Folk': 8.4,\n",
       " 'Mandopop': 8.4,\n",
       " 'Magyar': 8.4,\n",
       " 'Jazz Fusion': 8.4,\n",
       " 'Traditional': 8.4,\n",
       " 'Israeli Hip-Hop': 8.4,\n",
       " 'Moroccan Rap  | راب مغربي': 8.4,\n",
       " 'deep': 8.4,\n",
       " 'background': 8.4,\n",
       " 'Ska': 8.4,\n",
       " 'New Zealand': 8.4,\n",
       " 'Vocaloid': 8.4,\n",
       " 'Avant Garde': 8.4,\n",
       " 'Algerian Rap | راب جزائري': 8.3,\n",
       " 'voices, mixed chorus, orchestra \\nCast\\n    Gods, Goddesses\\n        Wotan (bass-baritone)\\nLoge (tenor)\\nFricka (mezzo-soprano)\\nFreia (soprano)\\nDonner (baritone)\\nFroh (tenor)\\nErda (contralto)\\n    Nibelungs\\n        Alberich (baritone)\\nMime (tenor)\\n    Giants\\n  ': 8.3,\n",
       " 'VBT (Videobattleturnier)': 8.3,\n",
       " 'American Underground': 8.3,\n",
       " 'unspecified, but most likely keyboard': 8.3,\n",
       " 'Literature': 8.3,\n",
       " 'trumpet': 8.3,\n",
       " 'singersongwriter': 8.3,\n",
       " 'Black Metal': 8.3,\n",
       " 'atmosphere': 8.3,\n",
       " 'Indie Folk': 8.3,\n",
       " 'Balada': 8.3,\n",
       " 'violin, viola, cello, piano': 8.3,\n",
       " '2 violins, viola, cello, piano': 8.3,\n",
       " 'symphonic': 8.3,\n",
       " 'Bosna': 8.3,\n",
       " 'Desi Hip-Hop': 8.3,\n",
       " 'Djent': 8.3,\n",
       " 'Nu Disco': 8.3,\n",
       " 'Diss': 8.3,\n",
       " 'movie': 8.3,\n",
       " 'Rockabilly': 8.3,\n",
       " 'Perú': 8.3,\n",
       " 'synthpop': 8.3,\n",
       " 'Glitch': 8.3,\n",
       " 'darkambient': 8.2,\n",
       " 'New Jack Swing': 8.2,\n",
       " 'Solo: piano\\nOrchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n2 horns, 2 trumpets, timpani, strings': 8.2,\n",
       " 'Chapter ONE': 8.2,\n",
       " 'Cuba': 8.2,\n",
       " 'Traditional Folk': 8.2,\n",
       " 'Tropical House': 8.2,\n",
       " 'Lyrical Poetry': 8.2,\n",
       " 'Chillout': 8.2,\n",
       " 'Politics': 8.2,\n",
       " 'drum': 8.2,\n",
       " 'Svensk Rock': 8.2,\n",
       " 'Folk Punk': 8.2,\n",
       " 'Future House': 8.2,\n",
       " 'K-Indie': 8.2,\n",
       " 'dubstep': 8.2,\n",
       " 'Doom Metal': 8.2,\n",
       " 'Bollywood': 8.2,\n",
       " 'Electro-Funk': 8.2,\n",
       " 'classicalguitar': 8.2,\n",
       " 'Cantopop': 8.2,\n",
       " 'Samba': 8.2,\n",
       " 'ambience': 8.2,\n",
       " 'inspiring': 8.2,\n",
       " 'voices, chorus and orchestra': 8.2,\n",
       " 'Orchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n4 horns, 2 trumpets, 3 trombones, tuba, timpani, strings': 8.2,\n",
       " 'minimal': 8.2,\n",
       " 'clarinet, 2 violins, viola, cello': 8.2,\n",
       " 'K-Rock': 8.1,\n",
       " 'punkrock': 8.1,\n",
       " 'Orchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n2 horns, 2 trumpets, timpani, strings': 8.1,\n",
       " 'Traduction Française': 8.1,\n",
       " 'Grime': 8.1,\n",
       " 'instrumentalrock': 8.1,\n",
       " 'Progressive Metalcore': 8.1,\n",
       " 'Florida Rap': 8.1,\n",
       " 'Русский ютуб (Russian YouTube)': 8.1,\n",
       " 'uplifting': 8.1,\n",
       " 'Meme Rap': 8.1,\n",
       " 'Math Rock': 8.1,\n",
       " 'slow': 8.1,\n",
       " 'Chamber Music': 8.1,\n",
       " 'Solo: piano\\nOrchestra: 2 flutes (2nd also piccolo), 2 oboes, 2 clarinets, 2 bassoons\\n4 horns, 2 trumpets, timpani, strings': 8.1,\n",
       " \"voices, chorus, orchestra \\n    Roles\\n        Otello, moro, generale dell'Armata Veneta (tenor)\\nJago, alfiere (baritone)\\nCassio, capo di Squadra (tenor)\\nRoderigo, gentiluomo Veneziano (tenor)\\nLodovico, Ambasciatore della Repubblica Veneta (bass)\\nMontano, pr\": 8.1,\n",
       " 'pad': 8.1,\n",
       " 'fusion': 8.1,\n",
       " 'calm': 8.1,\n",
       " 'deephouse': 8.1,\n",
       " 'Folk Metal': 8.0,\n",
       " 'Қазақстан (Kazakhstan)': 8.0,\n",
       " 'Fantasy (Lit)': 8.0,\n",
       " 'electronica': 8.0,\n",
       " 'Plugg': 8.0,\n",
       " 'romantic': 8.0,\n",
       " 'Concertino: 2 violins, cello\\nRipieno: strings, continuo': 8.0,\n",
       " 'drumnbass': 8.0,\n",
       " 'Cinematic': 8.0,\n",
       " 'voices, chorus, orchestra \\n    Voices:\\n        soprano, alto, tenor, bass, mixed chorus (SATB)\\n    Orchestra:\\n        2 flutes, 2 oboes, 2 clarinets, 2 bassoons, contrabassoon\\n4 horns, 2 trumpets, 3 trombones, timpani, organ (ad lib), strings': 8.0,\n",
       " 'Retro': 8.0,\n",
       " '2 violins, 2 violas, 2 cellos': 8.0,\n",
       " 'electro': 8.0,\n",
       " 'Dembow': 8.0,\n",
       " 'Spanish Rock': 8.0,\n",
       " 'Instrumental': 8.0,\n",
       " 'rnb': 8.0,\n",
       " 'UK Drill': 8.0,\n",
       " 'harp': 8.0,\n",
       " 'Afro Trap': 8.0,\n",
       " 'dub': 8.0,\n",
       " 'Organ': 8.0,\n",
       " 'Crioulo Cabo-Verdiano': 8.0,\n",
       " 'rhodes': 8.0,\n",
       " 'ethno': 8.0,\n",
       " 'song': 8.0,\n",
       " 'Extreme Metal': 8.0,\n",
       " 'Intro': 8.0,\n",
       " 'Glitch Hop': 8.0,\n",
       " 'Voices: soprano, baritone; mixed chorus (SATB)\\nOrchestra: piccolo, 2 flutes, 2 oboes, 2 clarinets, 2 bassoons, contrabassoon (ad lib.)\\n4 horns, 2 trumpets, 3 trombones, tuba\\ntimpani, organ (ad lib.), harp (doubled ad lib.), strings': 8.0,\n",
       " 'Trap Metal': 8.0,\n",
       " 'drama': 8.0,\n",
       " 'noise': 8.0,\n",
       " 'Abstract Rap': 8.0,\n",
       " 'Speed Metal': 8.0,\n",
       " 'disco': 8.0,\n",
       " 'Chicago Rap': 8.0,\n",
       " 'Southern Rock': 7.9,\n",
       " 'clarinet, piano': 7.9,\n",
       " 'effect': 7.9,\n",
       " '2 violins, cello, strings, continuo': 7.9,\n",
       " 'advertising': 7.9,\n",
       " 'Symphonic Power Metal': 7.9,\n",
       " 'game': 7.9,\n",
       " 'Salsa': 7.9,\n",
       " 'hardrock': 7.9,\n",
       " 'melancholic': 7.9,\n",
       " 'country': 7.9,\n",
       " 'Post-Punk Revival': 7.9,\n",
       " '\\u200b\\u200bIsiZulu': 7.9,\n",
       " 'summer': 7.9,\n",
       " 'Deathcore': 7.9,\n",
       " 'voice, orchestra \\n    Voice - soprano\\n    Orchestra\\n        4 flutes (3rd, 4th also piccolo), 3 oboes (3rd also English horn),\\n            3 clarinets (A, B♭, C)(2nd also clarinet (E♭), 3rd also bass clarinet (B♭), 3 bassoons (3rd also contrabassoon)\\n     ': 7.9,\n",
       " 'Indie Electronic': 7.9,\n",
       " 'K-Japanese': 7.9,\n",
       " 'melody': 7.9,\n",
       " 'Iranian Pop': 7.9,\n",
       " 'VTuber': 7.9,\n",
       " 'documentary': 7.9,\n",
       " 'Memphis': 7.9,\n",
       " 'Русский панк-рок (Russian Punk Rock)': 7.9,\n",
       " 'clarinet, orchestra': 7.9,\n",
       " 'organ (both with and without pedals)': 7.9,\n",
       " 'Album-Oriented Rock (AOR)': 7.9,\n",
       " 'Noise Pop': 7.9,\n",
       " 'motivational': 7.9,\n",
       " 'Eurodance': 7.9,\n",
       " 'soul': 7.9,\n",
       " 'brass': 7.9,\n",
       " 'Electronicore': 7.9,\n",
       " 'Nepali': 7.9,\n",
       " '2 violins, viola, cello, double bass': 7.9,\n",
       " 'Slowcore': 7.9,\n",
       " 'flute, violin, harpsichord, orchestra': 7.9,\n",
       " 'Emo Pop': 7.9,\n",
       " 'Skate Punk': 7.9,\n",
       " 'Bachata': 7.8,\n",
       " 'Ska Punk': 7.8,\n",
       " 'violin, viola, cello': 7.8,\n",
       " 'bpm': 7.8,\n",
       " 'Solo: violin\\nOrchestra: 2 oboes, 2 horns (A/E), strings': 7.8,\n",
       " 'cinematic': 7.8,\n",
       " '2 pianos, orchestra': 7.8,\n",
       " 'voices, mixed chorus, orchestra \\n    Cast\\n        Gustavo, Re di Svezia (Tenor)\\nRenato, suo segretario e sposo di Amelia (Baritone)\\nAmelia, moglie di Renato (Soprano)\\nUlrica, Zingara (Mezzo-Soprano)\\nOscar, paggio (Soprano)\\nCristiano, marinaio (Bass)\\nHorn, ': 7.8,\n",
       " 'christmas': 7.8,\n",
       " 'Christian R&B': 7.8,\n",
       " 'soft': 7.8,\n",
       " 'Afrobeat': 7.8,\n",
       " 'breakbeat': 7.8,\n",
       " 'field-recording': 7.8,\n",
       " 'African Languages': 7.8,\n",
       " 'dramatic': 7.8,\n",
       " 'ambiental': 7.8,\n",
       " 'mixed chorus (SATB)': 7.8,\n",
       " 'improvisation': 7.8,\n",
       " 'horn': 7.8,\n",
       " 'Indian Pop': 7.8,\n",
       " 'Christian Metal': 7.8,\n",
       " 'Afrika': 7.8,\n",
       " 'Electro-Hop': 7.8,\n",
       " 'Solo: piano\\nOrchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n4 horns, 2 trumpets, timpani, strings': 7.8,\n",
       " 'Orchestra: piccolo, 4 flutes, 4 oboes (4th also English horn), clarinet (E♭),\\n3 clarinets (B♭, A), bass clarinet (B♭), 4 bassoons (4th also contrabassoon)\\n4 horns (F), 3 trumpets (F), 3 trombones, tuba, timpani, bass drum, side drum,\\ncymbals, triangle, tam': 7.8,\n",
       " 'Scotland': 7.8,\n",
       " 'edm': 7.8,\n",
       " 'orchestra (2 versions)': 7.8,\n",
       " 'postrock': 7.8,\n",
       " 'Hard Dance': 7.8,\n",
       " 'flute, strings, continuo': 7.8,\n",
       " 'bell': 7.8,\n",
       " 'British Folk': 7.8,\n",
       " '90s': 7.8,\n",
       " 'cello or 5-stringed cello (violoncello piccolo, possibly viola pomposa)': 7.8,\n",
       " 'accordion': 7.8,\n",
       " 'Punjabi': 7.7,\n",
       " 'Classical Music': 7.7,\n",
       " '2 violins, strings, continuo': 7.7,\n",
       " 'Stoner Rock': 7.7,\n",
       " 'Spotify Singles': 7.7,\n",
       " 'doublebass': 7.7,\n",
       " 'Azerbaijani Rap': 7.7,\n",
       " 'Synth': 7.7,\n",
       " 'voices, mixed chorus (SATB), orchestra \\n    Cast\\n        Marguerite (mezzo-soprano)\\nFaust (tenor)\\nMéphistophélès (baritone or bass)\\nBrander (bass)\\n    Chorus\\n        6-part mixed chorus (SSTTBB), Children’s Chorus (SS)\\n    Orchestra\\n        3 flutes (also ': 7.7,\n",
       " 'Concert': 7.7,\n",
       " 'adventure': 7.7,\n",
       " 'viola': 7.7,\n",
       " 'Neofolk': 7.7,\n",
       " 'corporate': 7.7,\n",
       " 'horror': 7.7,\n",
       " 'Satire': 7.7,\n",
       " 'groove': 7.7,\n",
       " 'Outro': 7.7,\n",
       " 'voices, mixed chorus, orchestra \\n    Cast\\n        Baron Mirko Zeta (bass-baritone)\\nValencienne (soprano)\\nCount Danilo Danilovitch (tenor)\\nHanna Glawari (soprano)\\nCamille de Rosillon (tenor)\\nVicomte Cascada (baritone)\\nRaoul St. Brioche (baritone)\\nBogdanovit': 7.7,\n",
       " 'rhythm': 7.7,\n",
       " 'voice, orchestra': 7.7,\n",
       " 'K-Idol-Hip-Hop': 7.7,\n",
       " 'Tunisian Rap | راب تونسي': 7.7,\n",
       " 'trombone': 7.7,\n",
       " 'sound': 7.7,\n",
       " '2 violins, viola, 2 cellos': 7.7,\n",
       " 'fx': 7.7,\n",
       " 'Chillhop': 7.7,\n",
       " 'unspecified (includes: flute ; harpsichord ; 2 violins)': 7.7,\n",
       " 'groovy': 7.7,\n",
       " 'Detroit Rap': 7.7,\n",
       " 'Philosophy': 7.7,\n",
       " 'Music': 7.6,\n",
       " 'Dub': 7.6,\n",
       " '80s': 7.6,\n",
       " 'Noise': 7.6,\n",
       " 'Afroswing': 7.6,\n",
       " 'Dark Ambient': 7.6,\n",
       " 'Roots': 7.6,\n",
       " 'Garage Punk': 7.6,\n",
       " 'Space Rock': 7.6,\n",
       " 'analog': 7.6,\n",
       " 'Lounge': 7.6,\n",
       " 'fun': 7.6,\n",
       " 'Skramz': 7.6,\n",
       " 'Doo-Wop': 7.6,\n",
       " 'Trapwave': 7.6,\n",
       " 'upbeat': 7.6,\n",
       " 'Swing': 7.6,\n",
       " 'various': 7.6,\n",
       " 'Taiwan': 7.6,\n",
       " 'idm': 7.6,\n",
       " 'positive': 7.6,\n",
       " 'Psychedelic Soul': 7.6,\n",
       " 'sample': 7.6,\n",
       " 'Flamenco': 7.6,\n",
       " 'violin, viola, cello, double bass, piano': 7.6,\n",
       " 'Forró': 7.6,\n",
       " 'Soul Rap': 7.6,\n",
       " 'Orchestra: 3 flutes (3rd also piccolo), 3 oboes (3rd also English horn)\\n3 clarinets (3rd also bass clarinet), 3 bassoons (3rd also contrabassoon)\\n4 horns, 3 trumpets, 3 trombones, tuba\\ntimpani, side drum, bass drum, cymbals, triangle, tam-tam, 2 harps, str': 7.6,\n",
       " 'ballad': 7.6,\n",
       " 'violin, keyboard': 7.6,\n",
       " 'action': 7.6,\n",
       " 'harpsichord (or piano)': 7.6,\n",
       " 'orchestra \\n    2 flutes, piccolo, 2 oboes, English horn, 2 clarinets, 3 bassoons, contrabassoon\\n4 horns, 3 trumpets, 2 cornets, 3 trombones, tuba\\ntimpani, bass drum, cymbals, tam-tam, triangle, glockenspiel, 2 harps, strings': 7.5,\n",
       " 'loops': 7.5,\n",
       " 'Polskie Tłumaczenie (Polish Translation)': 7.5,\n",
       " 'violin, continuo': 7.5,\n",
       " '2 violas, cello, 2 bass viols, continuo (harpsichord)': 7.5,\n",
       " 'oboe, strings, continuo': 7.5,\n",
       " \"voices, mixed chorus, orchestra \\n    Cast\\n        Sir John Falstaff (baritone)\\nFord, marito d'Alice (baritone)\\nFenton (tenor)\\nDr.Cajus (tenor)\\nBardolfo (tenor)\\nPistola (bass)\\nMrs. Alice Ford (soprano)\\nNannetta, figlia d'Alice (soprano)\\nMrs. Quickly (mezzo-\": 7.5,\n",
       " 'violin, orchestra \\n    piccolo, 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n4 horns, 2 trumpets, 3 trombones\\ntimpani, percussion, harp, strings': 7.5,\n",
       " 'Cartoon': 7.5,\n",
       " 'Tech': 7.5,\n",
       " 'flute, continuo': 7.5,\n",
       " 'News': 7.5,\n",
       " 'B.78: piano 4 hands\\nB.83: orchestra': 7.5,\n",
       " 'processed': 7.5,\n",
       " 'retro': 7.5,\n",
       " 'nature': 7.5,\n",
       " 'Experimental Folk': 7.5,\n",
       " 'Bossa Nova': 7.5,\n",
       " 'Theatre': 7.5,\n",
       " \"voices, chorus, orchestra \\n    Voices\\n        3 sopranos, 2 altos, tenor, baritone, bass\\n    Choruses (SATB) \\n        children's chorus, 2 mixed choruses\\n    Orchestra\\n        2 piccolos (1st also 5th flute), 4 flutes, 4 oboes, English horn, clarinet (E♭),\": 7.5,\n",
       " '2 recorders, violin, strings (2 violins, viola, cello, violone), continuo': 7.5,\n",
       " 'children': 7.5,\n",
       " 'piano solo, jazz band (later orchestra)': 7.5,\n",
       " 'drone': 7.5,\n",
       " 'Translation': 7.5,\n",
       " 'grunge': 7.5,\n",
       " 'Harpsichord, organ': 7.5,\n",
       " 'acidjazz': 7.5,\n",
       " 'Orchestra': 7.5,\n",
       " 'Jazz-Funk': 7.5,\n",
       " 'Hymn': 7.5,\n",
       " 'Rap Metal': 7.5,\n",
       " 'clarinet': 7.5,\n",
       " 'cello*': 7.5,\n",
       " 'alto, tenor, mixed chorus (SATB), piano (ad lib.)': 7.5,\n",
       " 'sci-fi': 7.5,\n",
       " 'acousticbassguitar': 7.5,\n",
       " 'Chinese Hip-Hop': 7.5,\n",
       " 'clavier (keyboard)': 7.4,\n",
       " 'cool': 7.4,\n",
       " 'commercial': 7.4,\n",
       " 'Solo: piano\\nOrchestra: 3 flutes/piccolo, 2 oboes, 2 clarinets, 2 bassoons + 2 horns, 2 trumpets, 3 trombones, tuba + timpani, percussion + strings': 7.4,\n",
       " 'Deutschsprachiger Trap': 7.4,\n",
       " 'Jamaican Patois': 7.4,\n",
       " 'celtic': 7.4,\n",
       " 'rocknroll': 7.4,\n",
       " 'History': 7.4,\n",
       " 'Русский перевод (Russian Translation)': 7.4,\n",
       " '2 trumpets': 7.4,\n",
       " 'Big Band': 7.4,\n",
       " 'Orchestra\\n    2 flutes, 2 oboes, 2 clarinets, 2 bassoons,\\n4 horns, 3 trumpets, 3 trombones, tuba, timpani, strings': 7.4,\n",
       " 'voices, mixed chorus, orchestra \\n    Cast\\n        Le récitant (tenor)\\nCenturion (tenor)\\nPolydorus (bass)\\nLa vierge Marie (mezzo-soprano)\\nJoseph (baritone)\\nHérode (bass)\\nLe père de famille (bass)\\n    Mixed Chorus(SSAATTBB)\\nOrchestra\\n        2 flutes (2nd al': 7.4,\n",
       " 'chanson': 7.4,\n",
       " 'Smooth Jazz': 7.4,\n",
       " 'voices, double mixed choruses (SATB/SATB), orchestra': 7.4,\n",
       " 'voices, silent chorus, orchestra': 7.4,\n",
       " 'darkwave': 7.4,\n",
       " 'ambiance': 7.4,\n",
       " 'flute, piano': 7.4,\n",
       " 'ukulele': 7.4,\n",
       " 'Rapcore': 7.4,\n",
       " 'voices, chorus, orchestra \\n    Cast (SSSAATTB)\\n        Elijah (baritone)\\nWidow (soprano)\\nYouth (soprano)\\nAngel II (soprano)\\nQueen (alto)\\nAngel I (alto)\\nObadiah (tenor)\\nAhab (tenor)\\n    Mixed Chorus (SATB)\\nOrchestra\\n        2 flutes, 2 oboes, 2 clarinets, 2': 7.4,\n",
       " 'eurodance': 7.4,\n",
       " 'oboe, clarinet, horn, bassoon, piano': 7.4,\n",
       " 'Folklore': 7.4,\n",
       " 'Banda': 7.4,\n",
       " 'hard': 7.3,\n",
       " 'mixed chorus (SATB), orchestra': 7.3,\n",
       " 'jazzfusion': 7.3,\n",
       " 'Space': 7.3,\n",
       " 'Halloween': 7.3,\n",
       " 'Voices: 2 sopranos, alto, 3 tenors, 2 basses; 2 mixed choruses (SATTB)\\nOrchestra: 2 flutes, 2 tenor recorders, 3 cornettos, 3 trombones, bass trombone\\nstrings*, continuo (organ and other instruments)\\n• 2 violini da brazzo (violins), 3 viuole da brazzo (vio': 7.3,\n",
       " 'oboe': 7.3,\n",
       " 'flute, harpsichord': 7.3,\n",
       " 'recorder*, oboe, trumpet, violin, strings, continuo (violone & harpsichord)': 7.3,\n",
       " 'contemporary': 7.3,\n",
       " '2 pianos': 7.3,\n",
       " 'orchestra ; 2 pianos': 7.3,\n",
       " 'bongo': 7.3,\n",
       " 'Piano (solo)': 7.3,\n",
       " 'New Age': 7.3,\n",
       " 'worldfusion': 7.3,\n",
       " 'Loop': 7.3,\n",
       " 'Voices: mezzo-soprano (in Romanze, no.3b), mixed chorus (male chorus in no.4, mixed chorus in nos.7 and 8)\\nOrchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons, 4 horns, 2 trumpets, 3 trombones, timpani, strings': 7.3,\n",
       " 'tenor, chorus and orchestra \\n    Vocal Solo (tenor)\\nMixed Chorus (SSTTBB)\\n        80 female voices, 60 tenors, 70 basses\\n    4 Brass Choirs\\n        Choir I (North)\\n            4 cornets, 4 trombones, 2 tubas\\n        Choir II (East)\\n            4 trumpets, ': 7.3,\n",
       " 'ska': 7.3,\n",
       " '3 violins, 3 violas, 3 cellos, continuo (harpsichord)': 7.3,\n",
       " 'mixed chorus (SATB, wordless offstage), orchestra': 7.3,\n",
       " 'modular': 7.3,\n",
       " 'narrator (optional), soprano, orchestra': 7.3,\n",
       " 'Drumstep': 7.3,\n",
       " 'Sludge Metal': 7.3,\n",
       " 'Celtic': 7.3,\n",
       " 'pipeorgan': 7.3,\n",
       " 'tribal': 7.3,\n",
       " 'female chorus, orchestra': 7.3,\n",
       " 'voices, continuo': 7.3,\n",
       " 'drum-loop': 7.3,\n",
       " 'Planète Rap': 7.3,\n",
       " 'Orchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n2 horns, 2 trumpets, 3 trombones, timpani, strings': 7.3,\n",
       " 'Chillstep': 7.3,\n",
       " 'digital': 7.3,\n",
       " 'Underground Soul': 7.2,\n",
       " 'Drums': 7.2,\n",
       " '120': 7.2,\n",
       " 'clavier and pedal (this is one organ; the \"clavier\" refers to the two manuals and \"pedal\" is the pedals)': 7.2,\n",
       " 'violin, cello, orchestra': 7.2,\n",
       " '2 horns, strings': 7.2,\n",
       " 'electric': 7.2,\n",
       " 'choir': 7.2,\n",
       " 'heavymetal': 7.2,\n",
       " 'IDM': 7.2,\n",
       " 'orchestra \\n    3 flutes (3rd also piccolo), 2 oboes, 2 clarinets, 2 bassoons\\n4 horns, 2 trumpets, 3 trombones, tuba\\ntimpani, snare drum, cymbals, bass drum, harp, strings': 7.2,\n",
       " 'Northern Ireland': 7.2,\n",
       " 'harpsichord (or piano), orchestra': 7.2,\n",
       " 'Hardstyle': 7.2,\n",
       " 'Irish Folk': 7.2,\n",
       " 'classicrock': 7.2,\n",
       " 'acoustic': 7.2,\n",
       " 'recorder, strings, continuo': 7.2,\n",
       " 'Amapiano': 7.2,\n",
       " 'powerful': 7.2,\n",
       " '2 voices, mixed chorus (SATB), guitar': 7.2,\n",
       " 'Traduzione Italiana': 7.2,\n",
       " 'Guitar': 7.2,\n",
       " 'violin/flute, bass viol/violin, harpsichord; harpsichord solo; see also the Walsh edition which mentions viola but not bass viol.': 7.2,\n",
       " 'harmonica': 7.2,\n",
       " 'flute, harp, orchestra': 7.2,\n",
       " 'recorder, continuo': 7.2,\n",
       " 'Solo: cello\\nOrchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons, 2 horns, 2 trumpets, timpani, strings': 7.2,\n",
       " 'Finnish Rock': 7.1,\n",
       " 'Solo: organ\\nOrchestra: 2 oboes, strings, continuo': 7.1,\n",
       " 'reverb': 7.1,\n",
       " 'alternativerock': 7.1,\n",
       " 'Русский хайперпоп (Russian Hyperpop)': 7.1,\n",
       " 'gothic': 7.1,\n",
       " 'sport': 7.1,\n",
       " 'heavy': 7.1,\n",
       " 'Bass': 7.1,\n",
       " 'orchestra \\n    3 flutes (3rd also piccolo), 2 oboes, English horn, 2 clarinets, 2 bassoons, contrabassoon\\n4 horns, 3 trumpets, 3 trombones, tuba\\ntimpani, triangle, cymbals, glockenspiel, harp, strings': 7.1,\n",
       " 'ethnicrock': 7.1,\n",
       " \"voices, chorus, orchestra \\n    Cast\\n        Simon Boccanegra, primo doge di Genova (Baritone)\\nMaria Boccanegra, sua figlia, sotto il nome di Amelia Grimaldi (Soprano)\\nJacopo Fiesco, sotto il nome d'Andrea (Bass)\\nGabriele Adorno, gentiluomo genovese (Tenor)\": 7.1,\n",
       " 'Netflix': 7.1,\n",
       " 'soprano, orchestra': 7.1,\n",
       " 'kick': 7.1,\n",
       " 'piano, orchestra \\n    2 flutes (2nd also piccolo), 2 oboes (2nd also English horn), \\n        piccolo clarinet, clarinet, 2 bassoons\\n    2 horns, trumpet, trombone\\ntimpani, triangle, snare drum, cymbals, bass drum, tam-tam, wood block, whip, harp, strings (': 7.1,\n",
       " 'piano\\nalso orchestrated by Ravel\" (see \"Arrangements and Transcriptions\" tab)': 7.1,\n",
       " 'Breakbeat': 7.1,\n",
       " 'distortion': 7.1,\n",
       " 'harpsichord or organ': 7.1,\n",
       " 'Vaporwave': 7.1,\n",
       " 'Rage': 7.1,\n",
       " 'trailer': 7.1,\n",
       " 'piano, orchestra \\n    Orchestra\\n        2 flutes (2nd also piccolo), 2 oboes (2nd also English horn),\\n            2 clarinets (B♭, 2nd also bass clarinet (B♭)), 2 bassoons\\n        4 horns (F),\\n3 trumpets (B♭), 3 trombones, tuba\\ntimpani, percussion* (3 play': 7.1,\n",
       " 'Violin, piano': 7.1,\n",
       " 'piano 4 hands (B.145); orchestra (B.147)': 7.1,\n",
       " 'voices, chorus, orchestra \\n    Solo Voices (soprano, alto, tenor, bass)\\nMixed Chorus\\nOrchestra\\n        2 oboes, 2 bassoons, 2 horns, 2 trumpets, 3 trombones\\ntimpani, organ, strings (no violas)': 7.1,\n",
       " 'snare': 7.1,\n",
       " 'voice, chamber orchestra (original) ; voice, orchestra (revised)': 7.1,\n",
       " 'lead': 7.1,\n",
       " '2 violins, cello, double bass, later arranged for string quartet': 7.1,\n",
       " 'Voices: tenor + male chorus (TTB) - ad lib.\\nOrchestra: 3 flutes/piccolo, 2 oboes, 2 clarinets, 2 bassoons + 4 horns, 3 trumpets, 3 trombones + timpani, cymbals, triangle + harp + organ + strings': 7.1,\n",
       " 'wind band': 7.1,\n",
       " 'jazzfunk': 7.1,\n",
       " 'violin, viola, orchestra': 7.0,\n",
       " '2 violins, viola, cello, double bass, clarinet, horn, bassoon': 7.0,\n",
       " 'delay': 7.0,\n",
       " 'Русский баттл-рэп (Russian Battle Rap)': 7.0,\n",
       " 'Phonk': 7.0,\n",
       " 'lute': 7.0,\n",
       " '2 treble (violins), cello or gamba, continuo': 7.0,\n",
       " 'orchestra (different for each piece)': 7.0,\n",
       " 'Post-Metal': 7.0,\n",
       " '70s': 7.0,\n",
       " 'Sports': 7.0,\n",
       " 'Orchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n4 horns, 2 trumpets, timpani, strings': 7.0,\n",
       " 'Orchestra: timpani, xylophone, snare drum, cymbals, tam-tam, bass drum, harp, celesta, strings, piano': 7.0,\n",
       " '4 voices': 7.0,\n",
       " 'glitch': 7.0,\n",
       " 'newwave': 7.0,\n",
       " 'Medieval': 7.0,\n",
       " 'hopeful': 7.0,\n",
       " 'bass (1727, 1747) or soprano (1731) or mezzo-soprano (1735), orchestra': 7.0,\n",
       " 'Dark Trap': 7.0,\n",
       " 'early 20th century': 7.0,\n",
       " 'narrator, orchestra': 7.0,\n",
       " 'orchestra \\n    piccolo, 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n4 horns 2 trumpet, 3 trombones, tuba\\ntimpani, bass drum, cymbals, tam-tam, bell (D), harp, strings': 7.0,\n",
       " 'Voices: soprano, alto, tenor, bass; mixed chorus (SATB)\\nOrchestra: 2 flutes, 2 oboes, 2 clarinets (B♭/A), 2 bassoons\\n4 horns (F/B♭ basso), 2 trumpets (C), 3 trombones, timpani, organ (ad lib), strings': 7.0,\n",
       " '60s': 7.0,\n",
       " 'Synth Punk': 6.9,\n",
       " 'vocal': 6.9,\n",
       " \"piano (for Ravel's orchestration, see Arrangements and Transcriptions)\": 6.9,\n",
       " 'mellow': 6.9,\n",
       " 'Hard Bass': 6.9,\n",
       " 'Deutsche Übersetzung': 6.9,\n",
       " 'voices, chorus, orchestra \\n    Roles\\n        Leonor de Guzmán (mezzo-soprano)\\nInés (soprano)\\nFernand (tenor)\\nAlphonse XI (baritone)\\nBalthazar (bass)\\nDon Gaspar (tenor)\\nLord (tenor) \\n    Mixed Chorus \\n        sopranos, altos, tenors 1/2, basses 1/2 (SATTBB)': 6.9,\n",
       " 'suspense': 6.9,\n",
       " '120bpm': 6.9,\n",
       " '3 harpsichords, strings, continuo': 6.9,\n",
       " 'Solo: violin\\nOrchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons, 4 horns, 2 trumpets, timpani, strings': 6.9,\n",
       " 'Stoner Metal': 6.9,\n",
       " 'funny': 6.9,\n",
       " '2 mixed choruses (SATB/SATB), orchestra (colle parta)': 6.9,\n",
       " 'alto, tenor, bass; mixed chorus (SATB), orchestra': 6.9,\n",
       " 'swing': 6.9,\n",
       " 'Drone': 6.9,\n",
       " 'BPM': 6.9,\n",
       " 'violin, cello, piano, orchestra': 6.9,\n",
       " 'mixed chorus (SSATB), (bassoon, strings (colle parta))': 6.9,\n",
       " 'Solo: viola\\nOrchestra: 2 flutes (2nd also piccolo), 2 oboes (1st also English Horn), 2 clarinets,\\n4 bassoons, 4 horns, 2 trumpets (C), 2 cornets, 3 trombones, ophicleïde\\ntimpani, triangle, cymbals, 2 tambourines (3 players), harp, strings': 6.9,\n",
       " 'travel': 6.9,\n",
       " 'orchestra \\n    2 flutes (2nd also piccolo), 2 oboes (2nd also English horn), 2 clarinets, 2 bassoons\\n4 horns, 2 cornets, 3 trombones\\ntimpani, triangle, cymbals, bass drum, tambourine, side drum, harp, strings': 6.9,\n",
       " 'arp': 6.9,\n",
       " '5-7 voices/instruments, continuo': 6.8,\n",
       " 'free': 6.8,\n",
       " 'scary': 6.8,\n",
       " 'Interlude': 6.8,\n",
       " 'Surf Rock': 6.8,\n",
       " '1-2 treble instruments, continuo (with exceptions noted below) \\n    5th–7th Concerts, soprano instrument and continuo\\n8th Concert, all pieces are for soprano instrument and continuo except for the Grande Ritournéle, which is for 2 soprano instruments and c': 6.8,\n",
       " 'weird': 6.8,\n",
       " 'creepy': 6.8,\n",
       " 'soprano, tenor, bass; mixed chorus (SATB), orchestra': 6.8,\n",
       " 'strings, continuo': 6.8,\n",
       " 'Modern Classical': 6.8,\n",
       " 'hop': 6.8,\n",
       " 'Italia': 6.8,\n",
       " 'hip': 6.8,\n",
       " 'rhythmic': 6.8,\n",
       " 'lofi': 6.8,\n",
       " 'funky': 6.8,\n",
       " 'mezzo-soprano solo, orchestra': 6.8,\n",
       " 'Norsk Rock': 6.8,\n",
       " 'remix': 6.8,\n",
       " 'eurorack': 6.8,\n",
       " 'voices, piano 4-hands': 6.8,\n",
       " 'clap': 6.8,\n",
       " 'piano or harpsichord': 6.7,\n",
       " 'Surf Punk': 6.7,\n",
       " 'chorus (wordless), orchestra \\n    Mixed Chorus (SATB, offstage)\\nOrchestra\\n        piccolo (also offstage), 2 flutes (2nd also piccolo), alto flute, 2 oboes, English horn\\n            E♭ clarinet (also offstage), 2 clarinets, bass clarinet, 3 bassoons, contr': 6.7,\n",
       " 'female chorus (wordless), orchestra \\n    3 flutes, 2 oboes, English horn, 2 clarinets, 3 bassoons\\n4 horns, 3 trumpet, 3 trombones, tuba\\ntimpani, snare drum, cymbals, 2 harps, strings': 6.7,\n",
       " 'voices': 6.7,\n",
       " 'voices, chorus, orchestra \\n    Cast\\n        Nabucco, re di Babilona (baritone)\\nIsmaele, nipote di Sedecia re di Gerusalemme (tenor)\\nZaccaria, gran pontefice degli Ebrei (bass)\\nAbigaille, schiava, creduta figlia primogenita di Nabucodonosor (soprano)\\nFenena': 6.7,\n",
       " 'New York Drill': 6.7,\n",
       " 'piano\\nOrchestral version: Solo: piano\\nOrchestra: 2 flutes, 2 oboes, 2 clarinets, 2 bassoons\\n2 horns, trombone, timpani, strings': 6.7,\n",
       " 'percs': 6.7,\n",
       " 'clarinet (or violin), cello, piano': 6.7,\n",
       " 'people': 6.7,\n",
       " 'Witch House': 6.7,\n",
       " '4 voices (SATB)': 6.7,\n",
       " 'Solo: flute\\nOrchestra: strings, continuo': 6.7,\n",
       " 'organ, orchestra': 6.7,\n",
       " 'virginal (harpsichord) or organ (manuals)': 6.7,\n",
       " 'voice, piano (Nos.1 to 42)\\nvoice, chorus (SATB, ad lib), piano (Nos.43 to 49)': 6.7,\n",
       " 'cello (with viola and tenor tuba) and orchestra \\n    piccolo, 2 flutes, 2 oboes, english horn, 2 clarinets (2nd also E♭), \\n        bass clarinet, 3 bassoons, contrabassoon\\n    6 horns, 3 trumpets, 3 trombones, tenor tuba (euphonium), tuba\\ntimpani, bass dru': 6.7,\n",
       " 'English Translation': 6.7,\n",
       " 'orchestra \\n    3 flutes (3rd also piccolo), 2 oboes, 2 clarinets, 2 bassoons\\n4 horns, 2 trumpets, 3 trombones, tuba\\ntimpani, glockenspiel, bass drum, cymbals, tam-tam, triangle, harp, strings': 6.7,\n",
       " ...}"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "697c6710",
   "metadata": {},
   "outputs": [],
   "source": [
    "a = {k: round(v, 1) for k, v in a.items() if \"\\n\" not in k}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "b4e18e01",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Vocals 1, 2, 3, Flutes 1, 2, Piano, Bells, Acoustic Guitar, Violins, Violas, Electric Bass, Drums</th>\n",
       "      <td>3.044522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>scared</th>\n",
       "      <td>3.044522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Dream</th>\n",
       "      <td>3.044522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Synthethic</th>\n",
       "      <td>3.044522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>wind band (or orchestra or piano)</th>\n",
       "      <td>3.044522</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                       count\n",
       "Vocals 1, 2, 3, Flutes 1, 2, Piano, Bells, Acou...  3.044522\n",
       "scared                                              3.044522\n",
       "Dream                                               3.044522\n",
       "Synthethic                                          3.044522\n",
       "wind band (or orchestra or piano)                   3.044522"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc_tags[vc_tags[\"count\"]>=3].tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "f34f7572",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70467, 1)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc_tags.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "d5c294bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[<Axes: title={'center': 'count'}>]], dtype=object)"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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y4ddXT+nTp3ySPJs3brV163Uu/Pnz3tuueUWj91u99x///2e559/3tct1ZvJkyd77rnnHl+3cd0lJyd7nnnmGa9lDz/8sOfJJ5/0UUf1S5Jn1apV1uOKigpPVFSU59VXX7WWnT171hMaGur5/e9/74MO695/znw5u3bt8kjyfP7559enqXpW3cz//Oc/PTfffLPn4MGDng4dOnjmzZt33XuraxzJqUNlZWUqKirS4MGDrWWBgYEaPHiwCgsLfdjZ9XPu3DlJUqtWrXzcSf1LTU1VcnKy1+/bVH/605/Up08fPfLII2rTpo169+6t//mf//F1W/XurrvuUkFBgf7+979Lkv76179q+/btSkpK8nFn18exY8fkcDi8/sabN2+ufv36+c17mvTt+1pAQEC9fqGzr1VUVGjUqFGaNGmSbr/9dl+3U2ca9Nc63Gj+/e9/q7y8vMrXSkRGRurIkSM+6ur6qaioUHp6uu6++25169bN1+3Uqz/84Q/au3evdu/e7etWrotPP/1UCxcuVEZGhn75y19q9+7deu655xQSEqKUlBRft1dvpkyZIqfTqS5duigoKEjl5eV66aWX9OSTT/q6tevC4XBI0mXf0yrXme7ixYuaPHmyHn/88Qb1Dd219corr6hRo0Z67rnnfN1KnSLkoM6kpqbq4MGD2r59u69bqVdffPGFnn/+edntdoWFhfm6neuioqJCffr00a9//WtJUu/evXXw4EHl5uYaHXJWrFihZcuWKT8/X7fffruKi4uVnp6u6Ohoo+fGt9xut37yk5/I4/Fo4cKFvm6n3hQVFWnBggXau3evAgICfN1OneJ0VR266aabFBQUpJKSEq/lJSUlioqK8lFX10daWprWrFmjzZs3q127dr5up14VFRXp1KlTuuOOO9SoUSM1atRIW7du1WuvvaZGjRqpvLzc1y3WubZt2youLs5rWdeuXXX8+HEfdXR9TJo0SVOmTNFjjz2m7t27a9SoUZo4caJmzZrl69aui8r3LX98T6sMOJ9//rnsdrvRR3E+/PBDnTp1Su3bt7fe0z7//HP94he/UMeOHX3d3vdCyKlDISEhio+PV0FBgbWsoqJCBQUFstlsPuys/ng8HqWlpWnVqlXatGmTYmNjfd1SvRs0aJAOHDig4uJi66dPnz568sknVVxcrKCgIF+3WOfuvvvuKh8N8Pe//10dOnTwUUfXx4ULFxQY6P02GRQUpIqKCh91dH3FxsYqKirK6z3N6XTqo48+MvY9Tfq/gPOPf/xDH3zwgVq3bu3rlurVqFGjtH//fq/3tOjoaE2aNEkbNmzwdXvfC6er6lhGRoZSUlLUp08f9e3bV/Pnz1dpaalGjx7t69bqRWpqqvLz8/XHP/5RzZo1s87TN2/eXI0bN/Zxd/WjWbNmVa45atKkiVq3bm3stUgTJ07UXXfdpV//+tf6yU9+ol27dmnRokVatGiRr1urV8OHD9dLL72k9u3b6/bbb9e+ffs0d+5cPfPMM75urc58/fXX+vjjj63Hx44dU3FxsVq1aqX27dsrPT1dv/rVr3TLLbcoNjZW06ZNU3R0tEaMGOG7pr+nmmZu27atfvzjH2vv3r1as2aNysvLrfe1Vq1aKSQkxFdtfy9X+j3/Z5ALDg5WVFSUbrvttuvdat3y9e1dJnr99dc97du394SEhHj69u3r2blzp69bqjeSLvuzZMkSX7d2XZl+C7nH4/G8//77nm7dunlCQ0M9Xbp08SxatMjXLdU7p9Ppef755z3t27f3hIWFeX74wx96/vu//9vjcrl83Vqd2bx582X/HU5JSfF4PN/eRj5t2jRPZGSkJzQ01DNo0CDP0aNHfdv091TTzMeOHav2fW3z5s2+bv2aXen3/J9MuYU8wOMx6KM7AQAA/h+uyQEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkf5/7v4qeF2JXcAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "vc_tags.hist(bins=50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "e542d571",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Pop</th>\n",
       "      <td>14.730112</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rap</th>\n",
       "      <td>14.704094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rock</th>\n",
       "      <td>13.992562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>commute</th>\n",
       "      <td>13.900896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>energy boosters</th>\n",
       "      <td>13.754138</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     count\n",
       "Pop              14.730112\n",
       "Rap              14.704094\n",
       "Rock             13.992562\n",
       "commute          13.900896\n",
       "energy boosters  13.754138"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc_tags.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "31b48406",
   "metadata": {},
   "outputs": [],
   "source": [
    "vc_tags[\"count\"] = np.log(vc_tags[\"count\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4b6eb8b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b922dc67",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f89014e2",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "1754ec08",
   "metadata": {},
   "outputs": [],
   "source": [
    "vc_test = pd.Series(tags).value_counts()\n",
    "# vc_test.to_csv(\"val_tags.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "69291006",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_metas = read_jsonl(\"/mnt/data/georg/data/chirp_v1/combo_metas_tr.jsonl\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "4ae26258",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'dataset': 'youtube_music',\n",
       " 'id': 'gCXtSGlJFiE',\n",
       " 'start_s': 5.25,\n",
       " 'end_s': 50.25}"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_metas[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "81043fb3",
   "metadata": {},
   "outputs": [],
   "source": [
    "tr_tags = []\n",
    "for e in train_metas:\n",
    "    if \"text\" in e:\n",
    "        text_tags_m = re.search(r\"^\\[.*?\\]\", e[\"text\"])\n",
    "        if text_tags_m:\n",
    "            tr_tags.append(text_tags_m.group())\n",
    "#     tr_tags.extend(e.get(\"tags\", []))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "330cc89e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "816440"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(tr_tags)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "622afc07",
   "metadata": {},
   "outputs": [],
   "source": [
    "vc_tags = pd.Series(tr_tags).value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "5a29c6c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Verse 1]      278783\n",
       "[Intro]        197959\n",
       "[Chorus]        45541\n",
       "[Verso 1]       29844\n",
       "[Hook]          18996\n",
       "[Strofa 1]      16659\n",
       "[Verse]         15458\n",
       "[Куплет 1]      14828\n",
       "[Zwrotka 1]     14041\n",
       "[Couplet 1]     13232\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "0ecc2489",
   "metadata": {},
   "outputs": [],
   "source": [
    "vc = pd.Series([s[1:-1].split()[0].lower() for s in vc_test.index if len(s[1:-1].split()) > 0]).value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "c5ddbf13",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['intro', 'letra', 'verse', 'testo', 'hook', 'couplet', 'verso',\n",
       "       'chorus', 'part', 'lirik', 'refrain', 'strofa', 'refren', 'the',\n",
       "       'refrão', 'intro,', 'mc', 'куплет', '1.', 'dj', 'pre', '1', 'paroles',\n",
       "       'zwrotka', 'lil', '세븐틴', 'vers', 'mr.', 'teksti', 'припев', 'young',\n",
       "       '여자친구', 'el', 'וורס', 'bridge', 'פזמון', 'текст', '업텐션', 'ref.', '아이유',\n",
       "       'spoken', 'intro;', 'estribillo', 'sample', 'songtext', '周杰伦', '러블리즈',\n",
       "       '최유리', 'coro', 'king', 'интро', 'المقطع', '이하이', 'big', '자우림',\n",
       "       'strophe', 'produit', '마마무', 'tekst', '갓세븐', 'don', '심규선', '씨엘씨',\n",
       "       'produced', 'la', 'chris', 'ref', '펜타곤', 'ben', 'prod.', 'ورس',\n",
       "       'ritornello', 'jay', '오마이걸', '1st', '선미', '트레저', 'john', '트와이스',\n",
       "       'אינטרו', 'nakarat', 'scratches', 'dr.', 'first', 'instrumental',\n",
       "       'yung', 'voice', '온앤오프', '안예은', '더보이즈', 'בית', 'guitar', 'giriş',\n",
       "       'pre-chorus', '우주소녀', 'intro-', 'rap', 'lil'', 'parte', 'قسمت'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc.index[:100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4e50407b",
   "metadata": {},
   "outputs": [],
   "source": [
    "you have\n",
    "    relevant_logits = (\n",
    "        logits_no_prompt + \n",
    "        (logits_prompt_no_tags - logits_no_prompt) * cfg_coef +\n",
    "        (logits_prompt - logits_prompt_no_tags) * cfg_coef * cfg_coef_tags\n",
    "    )\n",
    "    \n",
    "and I have\n",
    "    relevant_logits = (\n",
    "        logits_no_prompt \n",
    "        + (logits_prompt - logits_no_prompt) * cfg_coef / 2\n",
    "        + (logits_tags - logits_no_prompt) * cfg_coef_tags / 2\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3ac7bb0f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3b83b572",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "71ab4ce5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'dataset': 'youtube_music_lyrics_foreign',\n",
       " 'id': 'KQvQvmc6_o0',\n",
       " 'start_s': 0.0,\n",
       " 'end_s': 45.0,\n",
       " 'tags': ['bollywood & indian', 'commute'],\n",
       " 'text': \"ஏதோ\\nஏதோ ஒரு மயக்கம்\\nஎங்கும் காற்று நிறைந்திருக்கும்\\nஉள்ளே உள்ளே உன்னை இழுக்கும்\\nஉள்ளே வந்தால் நெஞ்சு வழுக்கும்\\nஇந்த உலகம் புது உலகம் ஆஆ ஆஆ\\nகண் திறந்தும் காணா உலகம் ஆஆ ஆஆ\\n\\nI like the way you move\\nYou like the way I move\\nWhy don't we dance together all night long\\nநீ தேடும் ஆண் மகன்\\nஉன் தோட்ட தேன் மகன்\\nஉன் முன்னே சுட சுட அணைத்திட வா\\n\\nBounce, bounce, bounce with me\\nBounce, bounce, bounce with me\\n\\nகண்ணோடு பார்ப்பது\\nநேரில் காணும் பொய்யடா\\nகண்ணீரை பார்த்திடு\\nமெய்யாகும் பொய்யே\\n\\nஎன்னென்ன வேண்டுமோ\\nஇங்கே வந்து உய்யடா\\nஎந்தன் உள்ளம் பொய்யடா பையா\\n\\nவிழிகளில் ஒரு போதை இருந்தாலே\\nநீ இன்றை இன்றை வெல்லலாம் வென்றாலே\\nதான்னாலே இந்த உலகம் பின்னாலே\\n\\nஉன் வாழ்க்கை உடைந்த வாழ்க்கை\\nகண்ணோடு சேர்த்து வைக்க\\nபோவோம் நண்பா வா\\nபுது உலகம் காண்போம்\\n\\nI'm gonna get me to my papi, you know\\nWe're gonna move together and burn the floor\\n'Cause I wanna sing nah-nah-nah, ay-oh, ay-oh\\nCome closer to me papi, ay-oh, ay-oh\\nSlide with me, nah-nah-nah, ay-oh, ay-oh\\nB-bounce with me, nah-nah-nah, ay-oh, ay-oh\\n\\nYo bounce, bounce, bounce with me\\nBounce, bounce, bounce with me\"}"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "79ffdcc1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'dataset': 'youtube_music',\n",
       " 'id': 'gCXtSGlJFiE',\n",
       " 'start_s': 230.25,\n",
       " 'end_s': 275.25}"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_metas[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "abf6cea1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1d043bc7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6a8c9832",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3c56fb37",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "155a8d8a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2bbbf4ef",
   "metadata": {},
   "outputs": [],
   "source": [
    "vc_tr = pd.Series(tr_tags).value_counts()\n",
    "vc_tr.to_csv(\"tr_tags.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "c0d8ddb3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Pop                    2495781\n",
       "Rap                    2431682\n",
       "Rock                   1193692\n",
       "commute                1089137\n",
       "energy boosters         940473\n",
       "Romantic                795019\n",
       "chill                   698452\n",
       "hip-hop                 658433\n",
       "feel good               632374\n",
       "dance & electronic      517349\n",
       "R&B                     461800\n",
       "romance                 393162\n",
       "holiday                 387094\n",
       "Classical               344225\n",
       "En Español              338211\n",
       "Baroque                 323000\n",
       "rock                    307439\n",
       "piano                   305790\n",
       "bollywood & indian      288803\n",
       "latin                   273635\n",
       "party                   273494\n",
       "France                  262844\n",
       "indie & alternative     260337\n",
       "decades                 258747\n",
       "Deutschland             243534\n",
       "folk & acoustic         236559\n",
       "Em Português            230862\n",
       "Trap                    211316\n",
       "orchestra               209478\n",
       "focus                   208600\n",
       "family                  198803\n",
       "metal                   189955\n",
       "Alternative Rock        186698\n",
       "Country                 181376\n",
       "christian & gospel      178723\n",
       "French Rap              176081\n",
       "country & americana     175511\n",
       "r&b & soul              173122\n",
       "Polska                  169492\n",
       "Brasil                  167472\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc_tr.head(40)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "77a0a553",
   "metadata": {},
   "outputs": [],
   "source": [
    "l = []\n",
    "for e in train_metas:\n",
    "    if e[\"dataset\"] != \"imslp\":\n",
    "        continue\n",
    "    l.extend(e.get(\"tags\", []))\n",
    "vc = pd.Series(l).value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "f76f67ea",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Romantic                                                                               795006\n",
       "Classical                                                                              344033\n",
       "Baroque                                                                                322989\n",
       "piano                                                                                  260256\n",
       "orchestra                                                                              205569\n",
       "Early 20th century                                                                     121494\n",
       "voices, chorus, orchestra                                                              117481\n",
       "piano, orchestra                                                                        63946\n",
       "Modern                                                                                  52204\n",
       "organ                                                                                   47062\n",
       "voices, mixed chorus (SATB), orchestra                                                  46100\n",
       "2 violins, viola, cello                                                                 45031\n",
       "voices, mixed chorus, orchestra                                                         44306\n",
       "voice, piano                                                                            37694\n",
       "violin, piano                                                                           35136\n",
       "violin, orchestra                                                                       30558\n",
       "keyboard                                                                                21757\n",
       "soprano, alto, tenor, bass, mixed chorus (SATB), orchestra                              20671\n",
       "violin                                                                                  18978\n",
       "clavier                                                                                 18138\n",
       "violin, cello, piano                                                                    17392\n",
       "vocal soloists, mixed chorus, orchestra                                                 16368\n",
       "harpsichord                                                                             14115\n",
       "Renaissance                                                                             13629\n",
       "cello, piano                                                                            11735\n",
       "violin, strings, continuo                                                               10306\n",
       "soprano, alto, tenor, bass; mixed chorus (SATB), orchestra                               9948\n",
       "voices, orchestra                                                                        9677\n",
       "cello                                                                                    9401\n",
       "3 sopranos, 2 altos, 2 tenors, 2 basses, 2 mixed choruses (SSAATTBBB), 2 orchestras      7203\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vc.head(30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4531aac2",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f0e1aafb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "143ac0a7",
   "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
}
