{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":25954,"databundleVersionId":2091745,"sourceType":"competition"},{"sourceId":5683788,"sourceType":"datasetVersion","datasetId":818525}],"dockerImageVersionId":30699,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install ../input/torchlibrosa/torchlibrosa-0.0.5-py3-none-any.whl","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:37:07.472586Z","iopub.execute_input":"2024-05-22T15:37:07.472871Z","iopub.status.idle":"2024-05-22T15:37:22.218857Z","shell.execute_reply.started":"2024-05-22T15:37:07.472845Z","shell.execute_reply":"2024-05-22T15:37:22.217568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\nimport re\nimport os\nimport cv2 \nimport timm\nimport math\nimport pywt\nimport json\nimport time\nimport torch\nimport joblib\nimport random\nimport librosa\nimport logging\nimport warnings\nimport audioread\nimport torchaudio\nimport matplotlib\nimport numpy as np\nimport pandas as pd\nimport soundfile as sf\nimport torch.nn.functional as F\nimport matplotlib.pyplot as plt\nimport torchvision.transforms as transforms\n\nfrom pathlib import Path\nfrom torch import nn, optim\nfrom typing import Optional\nfrom tqdm.notebook import tqdm\nfrom contextlib import contextmanager\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchlibrosa.augmentation import SpecAugmentation\nfrom keras.callbacks import EarlyStopping\nfrom torchlibrosa.stft import LogmelFilterBank, Spectrogram\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import label_ranking_average_precision_score\nfrom albumentations.core.transforms_interface import ImageOnlyTransform","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:37:28.952258Z","iopub.execute_input":"2024-05-22T15:37:28.952618Z","iopub.status.idle":"2024-05-22T15:37:58.421072Z","shell.execute_reply.started":"2024-05-22T15:37:28.952585Z","shell.execute_reply":"2024-05-22T15:37:58.420257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"NUM_CLASSES = 397         # NUMERO DE CLASES\nSR = 32_000               # FRECUENCIA DE MUESTREO\nDURATION = 5              # 5 SEGUNDOS                \nTHRESH = 0.25\n\nDEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(\"DEVICE:\", DEVICE)\n\nTEST_AUDIO_ROOT = Path(\"../input/birdclef-2021/train_soundscapes\")         # 20 AUDIOS DE 10min\nSAMPLE_SUB_PATH = \"../input/birdclef-2021/sample_submission.csv\"           # MUESTRA FRAGMENTACIÓN\nTARGET_PATH = Path(\"../input/birdclef-2021/train_soundscape_labels.csv\")   # DF FRAGMENTACIÓN 5 SEG CON ETIQUETA","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-22T15:38:04.229790Z","iopub.execute_input":"2024-05-22T15:38:04.230557Z","iopub.status.idle":"2024-05-22T15:38:04.236814Z","shell.execute_reply.started":"2024-05-22T15:38:04.230524Z","shell.execute_reply":"2024-05-22T15:38:04.235868Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.DataFrame([(path.stem, *path.stem.split(\"_\"), path) for path in TEST_AUDIO_ROOT.glob(\"*.ogg\")],\n                columns = [\"filename\", \"id\", \"site\", \"date\", \"filepath\"])","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:38:04.802988Z","iopub.execute_input":"2024-05-22T15:38:04.803603Z","iopub.status.idle":"2024-05-22T15:38:04.826475Z","shell.execute_reply.started":"2024-05-22T15:38:04.803573Z","shell.execute_reply":"2024-05-22T15:38:04.825736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# data","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:38:07.126849Z","iopub.execute_input":"2024-05-22T15:38:07.127493Z","iopub.status.idle":"2024-05-22T15:38:07.132096Z","shell.execute_reply.started":"2024-05-22T15:38:07.127463Z","shell.execute_reply":"2024-05-22T15:38:07.131241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Carga el archivo de audio\narchivo_audio = \"/kaggle/input/birdclef-2021/train_soundscapes/57610_COR_20190904.ogg\"\naudio, sr = librosa.load(archivo_audio, sr=None)\n\n# Calcular el nivel de descomposición\nlevel = int(np.log2(sr))\nprint(level)\n\n# Aplicar la DWT al audio\ncoeffs = pywt.wavedec(audio, 'db1', level=level)\n\n# Obtener los coeficientes de aproximación y detalles\ncA = coeffs[0]\ncD = coeffs[1:]\n\n# Graficar los coeficientes\nplt.figure(figsize=(10, 30))\n\n# Coeficiente de aproximación\nplt.subplot(level+1, 1, 1)\nplt.plot(np.arange(len(cA)), cA)\nplt.title('Coeficientes de aproximación (cA)')\nplt.xlabel('Muestra')\nplt.ylabel('Amplitud')\n\n# Coeficientes de detalle\nfor i in range(len(cD)):\n    plt.subplot(level+1, 1, i+2)\n    plt.plot(np.arange(len(cD[i])), cD[i])\n    plt.title(f'Coeficientes de detalle (cD{i+1})')\n    plt.xlabel('Muestra')\n    plt.ylabel('Amplitud')\n\nplt.tight_layout()\n# Guardar la imagen\nplt.savefig('coeficientes_dwt.png')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:38:08.117315Z","iopub.execute_input":"2024-05-22T15:38:08.118092Z","iopub.status.idle":"2024-05-22T15:38:29.021926Z","shell.execute_reply.started":"2024-05-22T15:38:08.118058Z","shell.execute_reply":"2024-05-22T15:38:29.021044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf test_data_1                    # BORRAR CARPETA\n# !mkdir test_data_1                     # CREAR CARPETA\n# TARGET_AUDIO_1 = Path(\"test_data_1\")   # AÑADIR CARPETA A VARIABLE CARPETA","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:38:29.023420Z","iopub.execute_input":"2024-05-22T15:38:29.023990Z","iopub.status.idle":"2024-05-22T15:38:30.025276Z","shell.execute_reply.started":"2024-05-22T15:38:29.023962Z","shell.execute_reply":"2024-05-22T15:38:30.024172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf TARGET_AUDIO_1  ","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:38:30.026767Z","iopub.execute_input":"2024-05-22T15:38:30.027104Z","iopub.status.idle":"2024-05-22T15:38:31.046795Z","shell.execute_reply.started":"2024-05-22T15:38:30.027068Z","shell.execute_reply":"2024-05-22T15:38:31.045499Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Inicializa el objeto MelSpecComputer.\n\n        Parámetros:\n            - sr (int): Frecuencia de muestreo de la señal de audio.\n            - n_mels (int): Número de bandas mel.\n            - fmin (int): Frecuencia mínima de las bandas mel.\n            - fmax (int): Frecuencia máxima de las bandas mel.\n            - wavelet (str): Nombre de la wavelet a utilizar en la DWT.\n            - wavelet_coeff (int): Índice del coeficiente wavelet para generar el espectrograma.\n            - **kwargs: Argumentos adicionales para personalizar el cálculo del espectrograma.\n                        Por defecto, se incluyen 'n_fft' y 'hop_length'.","metadata":{}},{"cell_type":"code","source":"class MelSpecComputer:\n    def __init__(self, sr, n_mels, fmin=0, fmax=16000, wavelet='db1', wavelet_coeff=0, **kwargs):\n        self.sr = sr\n        self.n_mels = n_mels\n        self.fmin = fmin\n        self.fmax = fmax\n        self.wavelet = wavelet\n        self.wavelet_coeff = wavelet_coeff\n        kwargs[\"n_fft\"] = kwargs.get(\"n_fft\", self.sr // 10)\n        kwargs[\"hop_length\"] = kwargs.get(\"hop_length\", self.sr // (10 * 4))\n        self.kwargs = kwargs\n\n    def __call__(self, y):\n        level = int(np.log2(self.sr))\n        # Aplicar la Transformada Wavelet Discreta (DWT)\n        coeffs = pywt.wavedec(y, self.wavelet, level=level)\n\n        # Seleccionar el coeficiente específico\n        if self.wavelet_coeff >= len(coeffs):\n            raise ValueError(\"El índice del coeficiente wavelet es mayor que el número de coeficientes disponibles.\")\n        y = coeffs[self.wavelet_coeff]\n\n        # Calcular el espectrograma de Mel\n        melspec = librosa.feature.melspectrogram(y=y, sr=self.sr, n_mels=self.n_mels, fmin=self.fmin, fmax=self.fmax, **self.kwargs)\n        melspec = librosa.power_to_db(melspec).astype(np.float32)\n        return melspec","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:38:31.049665Z","iopub.execute_input":"2024-05-22T15:38:31.050075Z","iopub.status.idle":"2024-05-22T15:38:31.060269Z","shell.execute_reply.started":"2024-05-22T15:38:31.050036Z","shell.execute_reply":"2024-05-22T15:38:31.059255Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_audio(record, sr=32000, root=Path(\"./\")):\n    waveform, sample_rate = torchaudio.load(root.joinpath(record).with_suffix(\".ogg\").as_posix())\n    if sample_rate != sr:\n        waveform = torchaudio.transforms.Resample(sample_rate, sr)(waveform)  # Poner frecuencia de muestreo en 32000 si es diferente\n    return waveform\n\nsound_len = 5 * 32000  # Tamaño de fragmentación\n\ndef load_and_save_test(row, coeficiente_detalle):\n    # Crear la carpeta base específica para el coeficiente de detalle si no existe\n    base_folder = Path(\"TARGET_AUDIO_1\") / f\"cD{coeficiente_detalle}\"\n    base_folder.mkdir(parents=True, exist_ok=True)  # Asegura que la carpeta existe\n\n    # Cargar y procesar el audio\n    y = load_audio(row[\"filepath\"], 32000)\n    y = y.squeeze()\n    len_y = len(y)\n\n    # Iterar sobre los segmentos de audio\n    for i in range(math.ceil(len_y / sound_len)):\n        t_min = max(i * sound_len - 32000, 0)\n        t_max = min((i + 1) * sound_len + 32000, len_y)\n        labl = np.array(y[int(t_min):int(t_max)])\n\n        # Comprobar si la longitud del segmento es menor que el tamaño esperado\n        if len(labl) < (7 * 32000):\n            labl = np.hstack([labl, labl])[:(7 * 32000)]\n\n        # Generar el nombre del archivo\n        file_name = \"_\".join(row[\"filename\"].split(\"_\")[:2] + [str((i + 1) * 5)]) + \".npy\"\n\n        # Guardar el archivo en la carpeta correspondiente\n        np.save(base_folder / file_name, do_melspec_1(labl), allow_pickle=True)\n\n# Parámetros de configuración\nnum_coeficientes = 14\n\n# Iterar sobre los coeficientes\nfor coeficiente_detalle in range(1, num_coeficientes + 1):\n    do_melspec_1 = MelSpecComputer(sr=32000, n_mels=128, wavelet='db1', wavelet_coeff=coeficiente_detalle)\n    \n    # Iterar sobre las filas del DataFrame con barra de progreso\n    for n, row in tqdm(data.iterrows(), total=data.shape[0]):\n        load_and_save_test(row, coeficiente_detalle)\n","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:38:34.484475Z","iopub.execute_input":"2024-05-22T15:38:34.484888Z","iopub.status.idle":"2024-05-22T15:50:12.516175Z","shell.execute_reply.started":"2024-05-22T15:38:34.484856Z","shell.execute_reply":"2024-05-22T15:50:12.515145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def visualize_spectrograms(file_id, num_coeficientes=14, base_folder=Path(\"TARGET_AUDIO_1\")):\n    fig, axs = plt.subplots(nrows=num_coeficientes, ncols=1, figsize=(5, 20))\n\n    for coef in range(1, num_coeficientes + 1):\n        folder = base_folder / f\"cD{coef}\"\n        file_path = folder / f\"{file_id}.npy\"\n\n        if file_path.exists():\n            melspec = np.load(file_path)\n            axs[coef - 1].imshow(melspec, aspect='auto', origin='lower', cmap='magma')\n            axs[coef - 1].set_title(f'Coeficiente Wavelet {coef}')\n            axs[coef - 1].axis('off')\n        else:\n            print(f\"File {file_path} does not exist\")\n\n    plt.tight_layout()\n    # Guardar la imagen\n    plt.savefig('spectrograms.png')\n    plt.show()\n\n# Uso de la función para visualizar un archivo específico\nfile_id = \"20152_SSW_5\"  # Reemplaza esto con el ID del archivo que deseas visualizar\nvisualize_spectrograms(file_id)","metadata":{"execution":{"iopub.status.busy":"2024-05-22T15:55:18.900053Z","iopub.execute_input":"2024-05-22T15:55:18.900413Z","iopub.status.idle":"2024-05-22T15:55:20.785946Z","shell.execute_reply.started":"2024-05-22T15:55:18.900384Z","shell.execute_reply":"2024-05-22T15:55:20.784943Z"},"trusted":true},"execution_count":null,"outputs":[]}]}