{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fed7c348",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"3\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "88c3355d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from suno_utils.diffusion_stems import generation as diffusion_gen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c046f7b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from suno_utils.audio import Audio\n",
    "\n",
    "_ = diffusion_gen.preload_models(compile=False)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fa37407c",
   "metadata": {},
   "source": [
    "Load a song to extract stems from"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf696991",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import numpy as np\n",
    "from suno_utils.utils.s3 import read_from_s3\n",
    "\n",
    "# gen_id = \"99bffa17-7e59-47b4-a048-5528cbda05d5\" # sister\n",
    "# gen_id = \"081d73c4-7805-4212-9c80-8db1137ca3c4\" # friends\n",
    "# gen_id = \"562f762d-6ced-4080-9af1-910ee3d0a5dc\" # something real\n",
    "# gen_id = \"23c15c62-494d-422d-8a60-8b0454044322\" # rubber duck\n",
    "# gen_id = \"4b140a9e-964b-422c-85b5-5861ad1a9d38\" # once\n",
    "# gen_id = \"7b214347-fa38-4e9b-96f4-f7ec65adea45\" # rock n roll\n",
    "gen_id = \"a5e2198a-f352-4abb-9a24-7f81b143ded3\"  # stone\n",
    "# gen_id = \"7f5e7819-b7a1-449d-a76c-9c38950c4274\" # canada\n",
    "# gen_id = \"27135940-957f-4152-9e40-72e5c10a46bd\" # drunk\n",
    "# gen_id = \"caf1d7ae-ce81-4c75-b737-fd41e47a38ba\" # linger\n",
    "# gen_id = \"ac5aa29a-f18f-406f-a904-c47493f1beec\" # linger vox\n",
    "# gen_id = \"b04719c3-012a-4a4a-9b02-3cb2875d1744\" # courtney\n",
    "# gen_id = \"7407c7b3-8aa2-4f0a-82e8-fa19933f6e94\" # opera\n",
    "# gen_id = \"5b9624ef-b416-4095-a5f3-4945f09bba86\" # butterflies\n",
    "# gen_id = \"e757aa19-5c33-4945-aaa1-1519b7890f0b\" # bubblegum\n",
    "# gen_id = \"7f774078-1672-4858-a37f-acad373c5a84\" # golden\n",
    "# gen_id = \"1cee79db-a0ee-44e4-9646-d312cd620997\"  # chinese\n",
    "\n",
    "s3_filepath = f\"s3://suno-data-uploads/studio/uploads/{gen_id}.npz\"\n",
    "mp3_filepath = f\"s3://suno-data-uploads/studio/uploads/{gen_id}.mp3\"\n",
    "vae_filepath = f\"s3://suno-data-uploads/studio/uploads/{gen_id}_vae.npz\"\n",
    "print(s3_filepath)\n",
    "data = read_from_s3(s3_filepath, read_f=np.load)\n",
    "vae_data = read_from_s3(vae_filepath, read_f=np.load)\n",
    "audio = Audio.from_s3(mp3_filepath, n_channels=2, sample_rate=48000)\n",
    "\n",
    "if \"v3.0_raw\" in data:\n",
    "    codes = data[\"v3.0_raw\"]\n",
    "elif \"v3.5_raw\" in data:\n",
    "    codes = data[\"v3.5_raw\"]\n",
    "elif \"v4.0_raw\" in data:\n",
    "    codes = data[\"v4.0_raw\"]\n",
    "else:\n",
    "    raise ValueError(\"No codes found\")\n",
    "\n",
    "text_data = read_from_s3(f\"s3://suno-data-uploads/studio/uploads/{gen_id}_hoot.json\")\n",
    "aligned_lyrics = json.loads(text_data)\n",
    "print(aligned_lyrics)\n",
    "audio.normalize_volume().play()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "41632475",
   "metadata": {},
   "outputs": [],
   "source": [
    "# dict of stem types\n",
    "diffusion_gen.STEM_TYPE_ID_TO_NAME\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29897167",
   "metadata": {},
   "source": [
    "Extract a stem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c0c34cd3",
   "metadata": {},
   "outputs": [],
   "source": [
    "steps = 12\n",
    "\n",
    "gen_cfg = diffusion_gen.DiffusionGenerationConfig(\n",
    "    audio=audio,\n",
    "    stem_type_id=0,\n",
    "    # stem_type_cfg_scale=2,\n",
    "    steps=steps,\n",
    "    seed=0,\n",
    ")\n",
    "\n",
    "pred_audio, l = diffusion_gen.generate(gen_cfg)\n",
    "pred_audio.play()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a1dd833",
   "metadata": {},
   "outputs": [],
   "source": [
    "gen_cfg = diffusion_gen.DiffusionGenerationConfig(\n",
    "    audio=audio,\n",
    "    stem_type_id=0,\n",
    "    stem_type_cfg_scale=2,\n",
    "    task=\"remove\",\n",
    "    steps=steps,\n",
    "    seed=0,\n",
    ")\n",
    "\n",
    "pred_audio, l = diffusion_gen.generate(gen_cfg)\n",
    "pred_audio.play()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6aa4e476",
   "metadata": {},
   "outputs": [],
   "source": [
    "gen_cfg = diffusion_gen.DiffusionGenerationConfig(\n",
    "    audio=audio,\n",
    "    stem_type_id=18,\n",
    "    stem_type_cfg_scale=2,\n",
    "    task=\"add\",\n",
    "    steps=steps,\n",
    "    seed=0,\n",
    ")\n",
    "\n",
    "pred_audio, l = diffusion_gen.generate(gen_cfg)\n",
    "pred_audio.play()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fe9f49bd",
   "metadata": {},
   "source": [
    "Dry a stem"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "86ebd4e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "gen_id = \"f8a50e25-d705-49fa-b83a-82521014cb63\"  # vocal\n",
    "lead_vocal = Audio.from_s3(gen_id)\n",
    "gen_cfg = diffusion_gen.DiffusionGenerationConfig(\n",
    "    audio=lead_vocal,\n",
    "    task=\"dry\",\n",
    "    steps=steps,\n",
    "    seed=0,\n",
    ")\n",
    "\n",
    "pred_audio, l = diffusion_gen.generate(gen_cfg)\n",
    "pred_audio.play()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4483a01d",
   "metadata": {},
   "source": [
    "Example modal call"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4a22177e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import modal\n",
    "import json\n",
    "from uuid import uuid4\n",
    "\n",
    "model_f_stem = modal.Cls.lookup(\"stems-stems_v1-dev\", \"StemStub\")\n",
    "gen_id = \"a5e2198a-f352-4abb-9a24-7f81b143ded3\"  # stone\n",
    "\n",
    "input = {\n",
    "    \"id\": str(uuid4()),\n",
    "    \"prompt_audio\": gen_id,\n",
    "    \"model_name\": \"stems\",\n",
    "    \"callback_url\": \"https://api-staging.suno.ai/api/generate/finish-clip/\",\n",
    "    \"metadata\": {\n",
    "        \"stem_type_id\": 0,\n",
    "        \"stem_type_cfg_scale\": 2,\n",
    "        \"task\": \"stem\",\n",
    "        \"stem_task\": \"remove\",\n",
    "    },\n",
    "}\n",
    "\n",
    "print(f\"Starting modal call for {input['id']}\")\n",
    "model_f_stem.stem.remote(json.dumps(input))\n",
    "print(f\"Done with modal call for {input['id']}. See it at https://cdn1.suno.ai/{input['id']}.mp3\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ff1f1925",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
