{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Audio Visualization\n\n- [source1: Bengali Speech Recognition -বাংলা বক্তৃতা স্বীকৃতি](https://www.kaggle.com/code/sujaykapadnis/bengali-speech-recognition)\n- [source2: [Pytorch] BirdCLEF23 Starter](https://www.kaggle.com/code/debarshichanda/pytorch-birdclef23-starter)\n- [source3: (study)[BirdCLEF23] Audio Visualization Wandb](https://www.kaggle.com/code/heiswicked/study-birdclef23-audio-visualization-wandb)","metadata":{}},{"cell_type":"markdown","source":"# Install","metadata":{}},{"cell_type":"code","source":"%%capture\n%pip install wandb mutagen\n# %pip install git+https://github.com/huggingface/peft.git\n# %pip install \"transformers==4.27.2\" \"datasets==2.9.0\" \"accelerate==0.17.1\" \"evaluate==0.4.0\" \"bitsandbytes==0.37.1\" loralib --upgrade --quiet","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:05:55.533802Z","iopub.execute_input":"2023-07-21T19:05:55.534229Z","iopub.status.idle":"2023-07-21T19:06:11.963191Z","shell.execute_reply.started":"2023-07-21T19:05:55.534195Z","shell.execute_reply":"2023-07-21T19:06:11.961386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import","metadata":{}},{"cell_type":"code","source":"import gc\nimport os\nimport time\nimport copy\nimport random\n\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Pytorch\nimport torch \nimport torch.nn as nn\n\nfrom torch.optim import lr_scheduler\nfrom torch.utils.data import DataLoader, Dataset\n\n# huggingface - transformers\n# from transformers import AutoTokenizer, AutoModel, AdamW, AutoConfig, DataCollatorWithPadding, AutoModelForSequenceClassification\n\n# HuggingFace peft \n# from peft import LoraConfig, get_peft_model, prepare_model_for_int8_training, TaskType\n\n# StratifiedKFold\n# from sklearn.model_selection import StratifiedKFold\n\n# Soundfile\nimport mutagen\nfrom mutagen.mp3 import MP3\nimport librosa\nimport librosa.display\nimport IPython.display as ipd\nimport torchaudio\n\n# Utils\nfrom tqdm.auto import tqdm, trange\n\n# Suppress warnings\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# For descriptive error messages\n# os.environ['CUDA_LAUNCH_BLOCKING'] = \"1\"\n\n# Tokenizer Warnings\n# os.environ[\"TOKENIZERS_PARALLELISM\"] = \"false\"","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:06:11.966339Z","iopub.execute_input":"2023-07-21T19:06:11.966859Z","iopub.status.idle":"2023-07-21T19:06:17.366738Z","shell.execute_reply.started":"2023-07-21T19:06:11.966812Z","shell.execute_reply":"2023-07-21T19:06:17.365046Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# wandb login","metadata":{}},{"cell_type":"code","source":"import wandb\n\n\ntry:\n    \n    from kaggle_secrets import UserSecretsClient\n    user_secrets = UserSecretsClient()\n    api_key = user_secrets.get_secret(\"wandb_api\")\n    wandb.login(key = api_key)\n    anony = None\n    \nexcept:\n    \n    anony = \"must\"\n    print(\"You need your user token\")\n#     print('If you want to use your W&B account, go to Add-ons -> Secrets and provide your W&B access token. Use the Label name as wandb_api. \\nGet your W&B access token from here: https://wandb.ai/authorize')","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:06:17.368603Z","iopub.execute_input":"2023-07-21T19:06:17.369642Z","iopub.status.idle":"2023-07-21T19:06:21.800156Z","shell.execute_reply.started":"2023-07-21T19:06:17.369602Z","shell.execute_reply":"2023-07-21T19:06:21.798918Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Config","metadata":{}},{"cell_type":"code","source":"config = {\"seed\": 2023, \n          \"competition\": \"Bengali.AI Spech Recognition 2023\",\n          \n          ## Audio\n          \"sample_rate\": 32_000,\n          \"max_time\": 5, \n          \"n_mels\": 224, \n          \"n_fft\": 1024\n          }","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:06:21.803144Z","iopub.execute_input":"2023-07-21T19:06:21.803803Z","iopub.status.idle":"2023-07-21T19:06:21.808908Z","shell.execute_reply.started":"2023-07-21T19:06:21.803768Z","shell.execute_reply":"2023-07-21T19:06:21.807993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Data","metadata":{}},{"cell_type":"code","source":"# Define the paths to the data directories\nBASE_DIR = '/kaggle/input/bengaliai-speech'\ntrain_data_dir = f\"{BASE_DIR}/train_mp3s/\"  \ntest_data_dir = f\"{BASE_DIR}/test_mp3s/\" \ntrain_csv_path = f\"{BASE_DIR}/train.csv\" \ndomains = f\"{BASE_DIR}/examples/\" \n\n# Load the train.csv file using pandas\ntrain_df = pd.read_csv(train_csv_path)\n\n# Preview the first few rows of the DataFrame\nprint(train_df.shape)\ndisplay(train_df.head())","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:06:21.810835Z","iopub.execute_input":"2023-07-21T19:06:21.811215Z","iopub.status.idle":"2023-07-21T19:06:27.976843Z","shell.execute_reply.started":"2023-07-21T19:06:21.811186Z","shell.execute_reply":"2023-07-21T19:06:27.975922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Get Infos","metadata":{}},{"cell_type":"code","source":"# Get the total number of audio files in the training and test directories\nprint(train_data_dir)\ntrain_audios = os.listdir(train_data_dir)\n\nprint(test_data_dir)\ntest_audios = os.listdir(test_data_dir)","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:06:27.978222Z","iopub.execute_input":"2023-07-21T19:06:27.979566Z","iopub.status.idle":"2023-07-21T19:07:01.103256Z","shell.execute_reply.started":"2023-07-21T19:06:27.979528Z","shell.execute_reply":"2023-07-21T19:07:01.101949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get the total duration of audio data in the training set (sec)\ntrain_total_duration = 0\nsamples = 10000\n\nfor i, row in train_df.head(samples).iterrows():\n    audio_path = os.path.join(train_data_dir, f\"{row['id']}.mp3\")\n    audio_info = torchaudio.info(audio_path)\n    duration = audio_info.num_frames / audio_info.sample_rate \n    train_total_duration += duration\n    \nprint(f\"Total Number of audio files in Train: {len(train_audios)}\")\nprint(f\"Total Duration of audio files in Train: {train_total_duration:.2f} | AVG: {train_total_duration / samples:.2f} | Samples: {samples}\")","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:07:01.105401Z","iopub.execute_input":"2023-07-21T19:07:01.105792Z","iopub.status.idle":"2023-07-21T19:09:25.675122Z","shell.execute_reply.started":"2023-07-21T19:07:01.105757Z","shell.execute_reply":"2023-07-21T19:09:25.674138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(test_audios), test_audios[:3]","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:09:25.676589Z","iopub.execute_input":"2023-07-21T19:09:25.677161Z","iopub.status.idle":"2023-07-21T19:09:25.686288Z","shell.execute_reply.started":"2023-07-21T19:09:25.677128Z","shell.execute_reply":"2023-07-21T19:09:25.684616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get the total duration of audio data in the test set (sec)\ntest_total_duration = 0\nsamples = len(test_audios)\n\nfor file in test_audios:\n    audio_path = os.path.join(test_data_dir, str(file))\n    audio_info = torchaudio.info(audio_path)\n    duration = audio_info.num_frames / audio_info.sample_rate \n    test_total_duration += duration\n    \nprint(f\"Total Number of audio files in Test: {len(test_audios)}\")\nprint(f\"Total Duration of audio files in Test: {test_total_duration:.2f} | AVG: {test_total_duration / samples:.2f} | Samples: {samples}\")","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:09:25.688372Z","iopub.execute_input":"2023-07-21T19:09:25.688741Z","iopub.status.idle":"2023-07-21T19:09:25.748288Z","shell.execute_reply.started":"2023-07-21T19:09:25.688712Z","shell.execute_reply":"2023-07-21T19:09:25.747128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Listen Samples [Train]","metadata":{}},{"cell_type":"code","source":"# Hello Hello , mic check\n# Choose some random indices for checking\nrandom_indices = [0, 10, 20, 30, 40]\n\nfor idx in random_indices:\n    row = train_df.iloc[idx]\n    audio_file_path = os.path.join(train_data_dir, f\"{row['id']}.mp3\")\n    audio = MP3(audio_file_path)\n    print(audio.info.length)\n\n    # Load the audio file using librosa\n    audio, sr = librosa.load(audio_file_path, sr=None)\n\n    # Print the transcription and play the audio\n    print(\"Transcription:\", row['sentence'])\n    ipd.display(ipd.Audio(audio, rate=sr))","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:09:25.752832Z","iopub.execute_input":"2023-07-21T19:09:25.753694Z","iopub.status.idle":"2023-07-21T19:09:39.044809Z","shell.execute_reply.started":"2023-07-21T19:09:25.753648Z","shell.execute_reply":"2023-07-21T19:09:39.043506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Listen Samples[Test]","metadata":{}},{"cell_type":"code","source":"for file in test_audios:\n    audio_path = os.path.join(test_data_dir, str(file))\n    # Load Data\n    audio, sr = librosa.load(audio_path, sr = None)\n    ipd.display(ipd.Audio(audio, rate =sr))","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:09:39.046550Z","iopub.execute_input":"2023-07-21T19:09:39.047540Z","iopub.status.idle":"2023-07-21T19:09:39.103852Z","shell.execute_reply.started":"2023-07-21T19:09:39.047504Z","shell.execute_reply":"2023-07-21T19:09:39.102379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize on Local Device","metadata":{}},{"cell_type":"code","source":"# Choose some random indices for checking\n# random_indices = [0, 10, 20, 30, 40]\n\nfor idx in random_indices:\n    row = train_df.iloc[idx]\n    audio_path = os.path.join(train_data_dir, f\"{row['id']}.mp3\")\n    print(f\"ID: {row['id']}\")\n    \n    # Load Data\n    audio, sr = librosa.load(audio_path, sr = None)\n    print(f\"SR: {sr}\")\n    \n    # Waveform\n    plt.figure(figsize = (8, 3))\n    librosa.display.waveshow(audio, sr= sr)\n    plt.title(f\"Waveform of Audio ID: {row['id']}\")\n    plt.xlabel(\"Time (sec)\")\n    plt.ylabel(\"Amplitude\")\n\n    plt.tight_layout()\n    plt.show()\n    \n    # Plot the log Mel spectrogram\n    plt.figure(figsize=(8, 3))\n    \n    # Mel-Spectrogram\n    mel_spec = librosa.feature.melspectrogram(y=audio, sr=sr)\n    mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)\n    librosa.display.specshow(mel_spec_db, sr=sr, x_axis='time', y_axis='mel')\n    \n    plt.colorbar(format='%+2.0f dB')\n    plt.title(f\"Log Mel Spectrogram - Audio File ID: {row['id']}\")\n    plt.xlabel(\"Time (s)\")\n    plt.ylabel(\"Mel Frequency\")\n    plt.tight_layout()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:09:39.105541Z","iopub.execute_input":"2023-07-21T19:09:39.106613Z","iopub.status.idle":"2023-07-21T19:09:47.355980Z","shell.execute_reply.started":"2023-07-21T19:09:39.106577Z","shell.execute_reply":"2023-07-21T19:09:47.354530Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# [Train, Test] CSV with PATH","metadata":{}},{"cell_type":"code","source":"# Train\ndef make_path(ids):\n    audio_path = os.path.join(train_data_dir, ids + \".mp3\")\n    return audio_path\n\ntrain_df['path'] = train_df.id.apply(lambda x: make_path(x))\nprint(train_df.shape)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:09:47.357696Z","iopub.execute_input":"2023-07-21T19:09:47.358102Z","iopub.status.idle":"2023-07-21T19:09:49.992074Z","shell.execute_reply.started":"2023-07-21T19:09:47.358064Z","shell.execute_reply":"2023-07-21T19:09:49.990582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Save\ntrain_df.to_csv(\"train_new.csv\", index = False)","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:09:49.993839Z","iopub.execute_input":"2023-07-21T19:09:49.994497Z","iopub.status.idle":"2023-07-21T19:10:00.037375Z","shell.execute_reply.started":"2023-07-21T19:09:49.994451Z","shell.execute_reply":"2023-07-21T19:10:00.035610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize in wandb","metadata":{}},{"cell_type":"code","source":"run = wandb.init(project = config['competition'], \n                 job_type = 'Visualization', \n                 name = 'Visualize Begali Speech', \n                 anonymous = 'must')","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:19:42.591926Z","iopub.execute_input":"2023-07-21T19:19:42.592457Z","iopub.status.idle":"2023-07-21T19:20:14.716690Z","shell.execute_reply.started":"2023-07-21T19:19:42.592423Z","shell.execute_reply":"2023-07-21T19:20:14.715795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preview_table = wandb.Table(columns = ['ID', 'Audio', 'Sentence', 'Split'])\n\ntmp_df = train_df.sample(77).reset_index(drop = True)\n\nfor i in tqdm(range(len(tmp_df))):\n    \n    row = tmp_df.loc[i]\n    \n    audio = wandb.Audio(row.path, \n                        # sample_rate = config['sample_rate'],\n                        sample_rate = None)\n    \n    preview_table.add_data(row.id,\n                           audio,\n                           row.sentence,\n                           row.split)\n    \n\nwandb.log({'Visualization': preview_table})\nrun.finish()","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:20:14.718645Z","iopub.execute_input":"2023-07-21T19:20:14.719272Z","iopub.status.idle":"2023-07-21T19:20:44.424183Z","shell.execute_reply.started":"2023-07-21T19:20:14.719239Z","shell.execute_reply":"2023-07-21T19:20:44.423114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## This is just to display the W&B run page in this interactive session\nfrom IPython import display\n\n# we create an IFrame and set the width and height\niF = display.IFrame(run.url, width = 1080, height = 720)\niF","metadata":{"execution":{"iopub.status.busy":"2023-07-21T19:20:44.425290Z","iopub.execute_input":"2023-07-21T19:20:44.425622Z","iopub.status.idle":"2023-07-21T19:20:44.438559Z","shell.execute_reply.started":"2023-07-21T19:20:44.425594Z","shell.execute_reply":"2023-07-21T19:20:44.437075Z"},"trusted":true},"execution_count":null,"outputs":[]}]}