{"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":"none","dataSources":[{"sourceId":73047,"databundleVersionId":8149390,"sourceType":"competition"},{"sourceId":1647438,"sourceType":"datasetVersion","datasetId":974176},{"sourceId":7160652,"sourceType":"datasetVersion","datasetId":4135804}],"dockerImageVersionId":30684,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"%%time\n\n# install dependency \n!pip install audiomentations\n!pip install pydub\n!pip install soundfile\n!pip install pyroomacoustics","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Import**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport random\nimport os\nfrom tqdm import tqdm\nimport librosa\nimport numpy as np\nimport soundfile as sf\nfrom audiomentations import Compose, AddGaussianNoise, PitchShift, HighPassFilter, TimeStretch, RoomSimulator, OneOf, AddBackgroundNoise, PolarityInversion, Gain","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"[**Automatic Noise Detection and Reduction**](https://immohann.medium.com/denoiser-a-noise-detection-and-removal-module-1e9230a1ade6 )","metadata":{}},{"cell_type":"markdown","source":"# **Paths & Dataframes**","metadata":{}},{"cell_type":"code","source":"# paths\nBASE_DIR = '/kaggle/input/ben10/ben10'\n\ntrain_dir = f\"{BASE_DIR}/16_kHz_train_audio/\"\ntest_dir = f\"{BASE_DIR}/16_kHz_valid_audio/\"\n\ntrain_label = f\"{BASE_DIR}/train.csv\"\ntest_label = '/kaggle/input/ben10/sample_submission.csv'\n\n# audio constants\nSR = 16000","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# df\ntrain_df = pd.read_csv(train_label)\ntest_df = pd.read_csv(test_label)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Process Region Dataframes**","metadata":{}},{"cell_type":"code","source":"# extract regions\ndef extract_regions(path):\n    return path.split('_')[1].split(' ')[0]\n\ntrain_df['region'] = train_df['file_name'].apply(lambda x:extract_regions(x))\ntest_df['region'] = test_df['id'].apply(lambda x:extract_regions(x))\n\nregions = train_df.region.unique()\nprint(regions)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# region data factor\nregion_factor = {\n    'sandwip': 0.3,\n    'barishal': 1,\n    'chittagong': 0.2,\n    'habiganj': 1,\n    'kishoreganj': 0.2,\n    'narail': 0.2,\n    'narsingdi': 0.2,\n    'rangpur': 0.3,\n    'sylhet': 0.3,\n    'tangail': 0.2\n}\n\nprint(region_factor)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def select_data_by_region(region_name, data_df, region_factor):\n    if region_name not in region_factor:\n        raise ValueError(\"Region not found in region factor\")\n    \n    factor = region_factor[region_name]\n    \n    if factor == 1:\n        selected_data = data_df[data_df['region'] == region_name]\n    else:\n        region_data = data_df[data_df['region'] == region_name]\n        num_samples_to_select = int(len(region_data) * factor)\n        selected_data = region_data.sample(n=num_samples_to_select, random_state=42)\n    \n    return selected_data\n\nregion_wise_df = {}\n\n# Iterate over each region\nfor region in regions:\n    selected_df = select_data_by_region(region, train_df, region_factor)\n    region_wise_df[region] = selected_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Audiomentation Functions**","metadata":{}},{"cell_type":"code","source":"%%time\n\ndef show_signals(actual_signal, augmented_signal, sr, title):\n    \n    librosa.display.waveshow(actual_signal, sr=sr)\n    librosa.display.waveshow(augmented_signal, sr=sr)\n    plt.title(title)\n\n    plt.show()\n    \n    print('Original Audio:')\n    display(Audio(actual_signal, rate=sr))\n\n    print('Augmented Audio:')\n    display(Audio(augmented_signal, rate=sr))\n    \n# audio augmentation techniques\n# Raw audio augmentation (source: https://www.kaggle.com/competitions/bengaliai-speech/discussion/447976)\n\nrandom.seed(42)\n\naugment_with_music = Compose([\n    TimeStretch(min_rate=0.8, max_rate=2.0, p=0.5, leave_length_unchanged=True),\n    RoomSimulator(p=0.3),\n    OneOf([\n        AddBackgroundNoise(\n            sounds_path=[\n                '/kaggle/input/dns-2021-noise/datasets/noise',\n            ],\n            min_snr_in_db=5.0,\n            max_snr_in_db=30.0,\n            noise_transform=PolarityInversion(),\n            p=1.0\n        ),\n        AddBackgroundNoise(\n            sounds_path=[\n                '/kaggle/input/musan-noise/musan/music'\n            ],\n            min_snr_in_db=5.0,\n            max_snr_in_db=30.0,\n            noise_transform=PolarityInversion(),\n            p=1.0\n        ),\n        AddGaussianNoise(min_amplitude=0.005, max_amplitude=0.015, p=1.0),\n    ], p=0.7),\n    Gain(min_gain_in_db=-6, max_gain_in_db=6, p=0.2),\n    ])\n\naugment_with_speech = Compose([\n    TimeStretch(min_rate=0.8, max_rate=2.0, p=0.5, leave_length_unchanged=True),\n    RoomSimulator(p=0.3),\n    OneOf([\n        AddBackgroundNoise(\n            sounds_path=[\n                '/kaggle/input/dns-2021-noise/datasets/noise',\n            ],\n            min_snr_in_db=5.0,\n            max_snr_in_db=30.0,\n            noise_transform=PolarityInversion(),\n            p=1.0\n        ),\n        AddBackgroundNoise(\n            sounds_path=[\n                '/kaggle/input/musan-noise/musan/speech'\n            ],\n            min_snr_in_db=5.0,\n            max_snr_in_db=30.0,\n            noise_transform=PolarityInversion(),\n            p=1.0\n        ),\n        AddGaussianNoise(min_amplitude=0.005, max_amplitude=0.015, p=1.0),\n    ], p=0.7),\n    Gain(min_gain_in_db=-6, max_gain_in_db=6, p=0.2),\n    ])\n\naugment_with_noise = Compose([\n    TimeStretch(min_rate=0.8, max_rate=2.0, p=0.5, leave_length_unchanged=True),\n    RoomSimulator(p=0.3),\n    OneOf([\n        AddBackgroundNoise(\n            sounds_path=[\n                '/kaggle/input/dns-2021-noise/datasets/noise',\n            ],\n            min_snr_in_db=5.0,\n            max_snr_in_db=30.0,\n            noise_transform=PolarityInversion(),\n            p=1.0\n        ),\n        AddBackgroundNoise(\n            sounds_path=[\n                '/kaggle/input/musan-noise/musan/noise'\n            ],\n            min_snr_in_db=5.0,\n            max_snr_in_db=30.0,\n            noise_transform=PolarityInversion(),\n            p=1.0\n        ),\n        AddGaussianNoise(min_amplitude=0.005, max_amplitude=0.015, p=1.0),\n    ], p=0.7),\n    Gain(min_gain_in_db=-6, max_gain_in_db=6, p=0.2),\n    ])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Region Wise Augmentation**","metadata":{}},{"cell_type":"code","source":"!rm -rf /kaggle/working/augmented-dataset\n!rm /kaggle/working/augmented_train_set.csv","metadata":{"execution":{"iopub.status.busy":"2024-04-17T01:38:50.301091Z","iopub.execute_input":"2024-04-17T01:38:50.301656Z","iopub.status.idle":"2024-04-17T01:38:52.526591Z","shell.execute_reply.started":"2024-04-17T01:38:50.301620Z","shell.execute_reply":"2024-04-17T01:38:52.524447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# Create augmented dataset directory\nnew_train_df = pd.DataFrame(columns=['file_name', 'transcripts', 'region'])\noutput_path = \"augmented-dataset\"\nos.makedirs(output_path, exist_ok=True)\n\n# Define a function to save augmented audio samples with appropriate filenames\ndef save_augmented_audio(audio, audio_path, augment_type, sr, transcript, region):\n    global new_train_df  # Declare new_train_df as global variable\n    \n    # if it's raw file, then keep the name as it is\n    if augment_type == 'raw':\n        updated_filename = audio_path\n    else:\n        raw_filename = audio_path.split('.')[0]\n        updated_filename = raw_filename + '_' + augment_type + '.wav'\n    \n    sf.write(output_path+'/'+updated_filename, audio, sr)\n    new_row = pd.DataFrame({'file_name': [updated_filename], 'transcripts': [transcript], 'region': [region]})\n    new_train_df = pd.concat([new_train_df, new_row], ignore_index=True)\n\n# Function to iterate over each row in the region dataframe and augment the data\ndef augment_and_save_data(df, region_name):\n    \n    current_df = df[df['region'] == region_name]\n    region_wise_audio = region_wise_df[region_name]['file_name']\n    \n    for index, row in tqdm(current_df.iterrows()):\n        \n        audio_file_path = row['file_name']\n        transcript_value = row['transcripts']\n        region_value = region_name\n        sample_signal, sr = librosa.load(train_dir + audio_file_path)\n        \n        if audio_file_path in region_wise_audio.values:\n    \n            # augment\n            music_augmented_signal = augment_with_music(sample_signal, sr)\n            noise_augmented_signal = augment_with_noise(sample_signal, sr)\n            \n            save_augmented_audio(sample_signal, audio_file_path, 'raw', sr, transcript_value, region_value)\n            save_augmented_audio(music_augmented_signal, audio_file_path, 'music', sr, transcript_value, region_value)\n            save_augmented_audio(noise_augmented_signal, audio_file_path, 'noise', sr, transcript_value, region_value)\n        else:\n                        \n            # save original\n            save_augmented_audio(sample_signal, audio_file_path, 'raw', sr, transcript_value, region_value)\n            \n\n# Iterate over each region dataframe and augment the data\nfor region in regions:\n    print(region)\n    augment_and_save_data(train_df, region)\n\n# Save the DataFrame to CSV\nnew_train_df.to_csv('augmented_train_set.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-04-17T01:38:55.753628Z","iopub.execute_input":"2024-04-17T01:38:55.755715Z","iopub.status.idle":"2024-04-17T01:38:58.209059Z","shell.execute_reply.started":"2024-04-17T01:38:55.755654Z","shell.execute_reply":"2024-04-17T01:38:58.207441Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls \ndf = pd.read_csv('/kaggle/working/augmented_train_set.csv')\nprint(df.shape) # it should 4660*2+13610, 3","metadata":{"execution":{"iopub.status.busy":"2024-04-17T01:39:01.996846Z","iopub.execute_input":"2024-04-17T01:39:01.997310Z","iopub.status.idle":"2024-04-17T01:39:03.126609Z","shell.execute_reply.started":"2024-04-17T01:39:01.997267Z","shell.execute_reply":"2024-04-17T01:39:03.124532Z"},"trusted":true},"execution_count":null,"outputs":[]}]}