{"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":"gpu","dataSources":[{"sourceId":73047,"databundleVersionId":8149390,"sourceType":"competition"},{"sourceId":8053685,"sourceType":"datasetVersion","datasetId":4749230},{"sourceId":8066063,"sourceType":"datasetVersion","datasetId":4758773},{"sourceId":8117484,"sourceType":"datasetVersion","datasetId":4756671}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\n\nimport pandas as pd\n\nimport librosa\nimport librosa.display\n\nimport numpy as np\n\nimport IPython.display as ipd\n\nimport matplotlib.pyplot as plt\n\nimport random\n\nfrom collections import Counter\n\nfrom sklearn.model_selection import train_test_split\n\nimport torch\nimport torchaudio\n\nfrom dataclasses import dataclass\nfrom typing import Any, Dict, List, Union\nfrom datasets import DatasetDict\nfrom datasets import Dataset as DS\n\nfrom transformers import (\n    WhisperFeatureExtractor,\n    WhisperTokenizer,\n    WhisperProcessor,\n    WhisperForConditionalGeneration,\n    Seq2SeqTrainingArguments,\n    Seq2SeqTrainer,\n    TrainerCallback,\n    TrainingArguments,\n    TrainerState,\n    TrainerControl,\n    EarlyStoppingCallback,\n    pipeline\n)\n\nfrom torchmetrics.text import WordErrorRate, CharErrorRate","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-22T17:42:45.478270Z","iopub.execute_input":"2024-04-22T17:42:45.478840Z","iopub.status.idle":"2024-04-22T17:43:09.221323Z","shell.execute_reply.started":"2024-04-22T17:42:45.478807Z","shell.execute_reply":"2024-04-22T17:43:09.220351Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip freeze > requirements.txt","metadata":{"execution":{"iopub.status.busy":"2024-04-22T17:43:36.617104Z","iopub.execute_input":"2024-04-22T17:43:36.618118Z","iopub.status.idle":"2024-04-22T17:43:40.289757Z","shell.execute_reply.started":"2024-04-22T17:43:36.618085Z","shell.execute_reply":"2024-04-22T17:43:40.288561Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BASE_DIR = '/kaggle/input/ben10/ben10'\ntrain_data_dir = f\"{BASE_DIR}/16_kHz_train_audio/\"\ntest_data_dir = f\"{BASE_DIR}/16_kHz_valid_audio/\"\ndata_path = f\"{BASE_DIR}/train.csv\"","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:14:37.929999Z","iopub.execute_input":"2024-04-07T13:14:37.930761Z","iopub.status.idle":"2024-04-07T13:14:37.935861Z","shell.execute_reply.started":"2024-04-07T13:14:37.930727Z","shell.execute_reply":"2024-04-07T13:14:37.934438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"split2path = {\n    \"train\": train_data_dir,\n    \"test\": test_data_dir,\n}","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:14:37.937254Z","iopub.execute_input":"2024-04-07T13:14:37.938463Z","iopub.status.idle":"2024-04-07T13:14:37.984498Z","shell.execute_reply.started":"2024-04-07T13:14:37.938417Z","shell.execute_reply":"2024-04-07T13:14:37.98343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = pd.read_csv(data_path)\ndata.sample(10)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:14:37.986651Z","iopub.execute_input":"2024-04-07T13:14:37.987619Z","iopub.status.idle":"2024-04-07T13:14:38.310049Z","shell.execute_reply.started":"2024-04-07T13:14:37.987588Z","shell.execute_reply":"2024-04-07T13:14:38.308836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def extract_split(filename):\n    filename_ = filename.split(\"_\")\n    split = filename_[0]\n    return split\n\ndef extract_district(filename):\n    filename_ = filename.split(\" \")[0]\n    district = filename_.split(\"_\")[1]\n    return district\n\ndef beautify_dataset(data):\n    splits = []\n    districts = []\n    newpaths = []\n    transcripts = []\n    \n    for i in range(len(data)):\n        filename, transcript = data.iloc[i]\n        split = extract_split(filename)\n        district = extract_district(filename)\n        dir_path = split2path[split]\n        composed_path = f\"{dir_path}{filename}\"\n        \n        if os.path.exists(composed_path) == False:\n            print(f\"{composed_path} does not exist.\")\n            continue\n        \n        # replace any newline characters\n        transcript = transcript.replace(\"\\n\", \" \")\n        transcript = \" \".join(transcript.split())\n        \n        splits.append(split)\n        districts.append(district)\n        newpaths.append(composed_path)\n        transcripts.append(transcript)\n    \n    data['file_path'] = newpaths\n    data['district'] = districts\n    data['split'] = splits\n    data['transcripts'] = transcripts\n    \n#     data.drop(columns=['file_name'], inplace=True)\n    \n    return data","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:14:38.311435Z","iopub.execute_input":"2024-04-07T13:14:38.311989Z","iopub.status.idle":"2024-04-07T13:14:38.322997Z","shell.execute_reply.started":"2024-04-07T13:14:38.311936Z","shell.execute_reply":"2024-04-07T13:14:38.32207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = beautify_dataset(data)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:14:38.324292Z","iopub.execute_input":"2024-04-07T13:14:38.324813Z","iopub.status.idle":"2024-04-07T13:15:09.512446Z","shell.execute_reply.started":"2024-04-07T13:14:38.324783Z","shell.execute_reply":"2024-04-07T13:15:09.511345Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[data[\"transcripts\"] == \"<>\"]","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:09.513699Z","iopub.execute_input":"2024-04-07T13:15:09.514051Z","iopub.status.idle":"2024-04-07T13:15:09.538365Z","shell.execute_reply.started":"2024-04-07T13:15:09.514022Z","shell.execute_reply":"2024-04-07T13:15:09.537208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[data[\"transcripts\"] == \"\"]","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:09.539857Z","iopub.execute_input":"2024-04-07T13:15:09.540303Z","iopub.status.idle":"2024-04-07T13:15:09.558543Z","shell.execute_reply.started":"2024-04-07T13:15:09.540272Z","shell.execute_reply":"2024-04-07T13:15:09.557378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[data[\"transcripts\"] == \"..\"]","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:09.560337Z","iopub.execute_input":"2024-04-07T13:15:09.560683Z","iopub.status.idle":"2024-04-07T13:15:09.581603Z","shell.execute_reply.started":"2024-04-07T13:15:09.560655Z","shell.execute_reply":"2024-04-07T13:15:09.580687Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**NOTE:** Think of how you want use the existing models/your finetuned model to replace these examples.... For now let's just handle them.","metadata":{}},{"cell_type":"code","source":"# print(list(data[data['transcripts'] == ''].index))\ndata.drop(data[data['transcripts'] == ''].index, inplace=True)\n      \n# print(list(data[data['transcripts'] == '<>'].index))\ndata.drop(data[data['transcripts'] == \"<>\"].index, inplace=True)\n      \n# print(list(data[data['transcripts'] == '..'].index))\ndata.drop(data[data['transcripts'] == \"..\"].index, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:09.585117Z","iopub.execute_input":"2024-04-07T13:15:09.585667Z","iopub.status.idle":"2024-04-07T13:15:09.627637Z","shell.execute_reply.started":"2024-04-07T13:15:09.585634Z","shell.execute_reply":"2024-04-07T13:15:09.626505Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data[\"transcripts\"] = data[\"transcripts\"].str.strip()","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:09.629354Z","iopub.execute_input":"2024-04-07T13:15:09.629811Z","iopub.status.idle":"2024-04-07T13:15:09.648551Z","shell.execute_reply.started":"2024-04-07T13:15:09.629771Z","shell.execute_reply":"2024-04-07T13:15:09.647484Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # remove punctuations\n# punctuations = [\n#     \"/::\\)\",\"/::\",\"(-_-)\",\"(*_*)\",\"(>_<)\",\":)\",\";)\",\":P\",\"xD\",\"-_-\",\"*_*\",\"(>_<)\",\"...\",\".\",\",\",\";\",\":\",\"!\",\"?\",\"'\",\"অ�\", \"অাবার\", \"।\"\n#     \"\\\"\",\"-\",\"_\",\"/\",\"\\\\\",\"|\",\"{\",\"}\",\"[\",\"]\",\"(\",\")\",\"<\",\">\",\"@\",\"#\",\"$\",\"%\",\"^\",\"&\",\"*\",\"~\",\"`\",\"+\",\"=\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"৳\",\"০\",\n#     \"১\",\"২\",\"৩\",\"৪\",\"৫\",\"৬\",\"৭\",\"৮\",\"৯\",\"\\n\",\"\\t\",\"\\r\",\"\\f\",\"\\v\",\"\\u00C0-\\u017F\",\"\\u2000-\\u206F\",\"\\u25A0-\\u25FF\",\"\\u2600-\\u26FF\",\"\\u2B00-\\u2BFF\",\"\\u3000-\\u303F\",\n#     \"\\uFB00-\\uFB4F\",\"\\uFE00-\\uFE0F\",\"\\uFE30-\\uFE4F\",\"\\u1F600-\\u1F64F\",\"\\u1F300-\\u1F5FF\",\"\\u1F680-\\u1F6FF\",\"\\u1F1E0-\\u1F1FF\",\"\\u2600-\\u26FF\",\"\\u2700-\\u27BF\",\n#     \"\\u1F300-\\u1F5FF\",\"\\u1F900-\\u1F9FF\",\"\\u1F600-\\u1F64F\",\"\\u1F680-\\u1F6FF\",\"\\u1F1E0-\\u1F1FF\",\"\\u1F600-\\u1F64F\",\n# ]","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:09.650486Z","iopub.execute_input":"2024-04-07T13:15:09.650972Z","iopub.status.idle":"2024-04-07T13:15:09.661085Z","shell.execute_reply.started":"2024-04-07T13:15:09.650892Z","shell.execute_reply":"2024-04-07T13:15:09.659455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def remove_punctuations(text):\n#     for punctuation in punctuations:\n#         text = text.replace(punctuation, \"\")\n#     return text\n\n# # Apply the function to the 'transcript' column\n# data['transcripts'] = data['transcripts'].apply(remove_punctuations)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:09.662699Z","iopub.execute_input":"2024-04-07T13:15:09.663087Z","iopub.status.idle":"2024-04-07T13:15:10.064323Z","shell.execute_reply.started":"2024-04-07T13:15:09.663055Z","shell.execute_reply":"2024-04-07T13:15:10.062966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import re\ndef remove_emoji(text):\n    emoji_pattern = re.compile(\n        \"[\"u\"\\U0001F600-\\U0001F64F\"  # emoticons\n        u\"\\U0001F300-\\U0001F5FF\"  # symbols & pictographs\n        u\"\\U0001F680-\\U0001F6FF\"  # transport & map symbols\n        u\"\\U0001F1E0-\\U0001F1FF\"  # flags (iOS)\n        u\"\\U00002702-\\U000027B0\"\n        u\"\\U000024C2-\\U0001F251\"\n        \"]+\",\n        flags=re.UNICODE,\n    )\n    return emoji_pattern.sub(r\"\", text)\n\n# Apply the remove_emoji function to the 'Description' column\ndata['transcripts'] = data['transcripts'].apply(remove_emoji)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:10.066174Z","iopub.execute_input":"2024-04-07T13:15:10.066531Z","iopub.status.idle":"2024-04-07T13:15:10.305213Z","shell.execute_reply.started":"2024-04-07T13:15:10.066502Z","shell.execute_reply":"2024-04-07T13:15:10.304168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def remove_extra_space(text):\n    text = re.sub(r\"[a-zA-Z]+\", \"\", text)\n    text = re.sub(r\"\\s+\", \" \", text)\n    return text\n\ndata['transcripts'] = data['transcripts'].apply(remove_extra_space)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:10.306639Z","iopub.execute_input":"2024-04-07T13:15:10.307218Z","iopub.status.idle":"2024-04-07T13:15:10.860167Z","shell.execute_reply.started":"2024-04-07T13:15:10.307178Z","shell.execute_reply":"2024-04-07T13:15:10.859166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def remove_extra(text):\n    text = re.sub(r\"\\s+\", \" \", text)\n    return text\n\ndata['transcripts'] = data['transcripts'].apply(remove_extra)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:10.862182Z","iopub.execute_input":"2024-04-07T13:15:10.862571Z","iopub.status.idle":"2024-04-07T13:15:11.224653Z","shell.execute_reply.started":"2024-04-07T13:15:10.862539Z","shell.execute_reply":"2024-04-07T13:15:11.22319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.transcripts.sample(20)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:11.226223Z","iopub.execute_input":"2024-04-07T13:15:11.226563Z","iopub.status.idle":"2024-04-07T13:15:11.239198Z","shell.execute_reply.started":"2024-04-07T13:15:11.226535Z","shell.execute_reply":"2024-04-07T13:15:11.237783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.transcripts[7693]","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:15:11.240902Z","iopub.execute_input":"2024-04-07T13:15:11.241405Z","iopub.status.idle":"2024-04-07T13:15:11.252466Z","shell.execute_reply.started":"2024-04-07T13:15:11.241363Z","shell.execute_reply":"2024-04-07T13:15:11.2511Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TASK = \"transcribe\"\nMODEL_NAME = \"arif11/bangla-ASR-v7\"\nMODEL_PATH = \"/kaggle/input/asr-v16/whisper-reg-ben\"","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:38:52.586041Z","iopub.execute_input":"2024-04-07T13:38:52.587377Z","iopub.status.idle":"2024-04-07T13:38:52.592287Z","shell.execute_reply.started":"2024-04-07T13:38:52.587334Z","shell.execute_reply":"2024-04-07T13:38:52.591164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_extractor = WhisperFeatureExtractor.from_pretrained(MODEL_PATH)\ntokenizer = WhisperTokenizer.from_pretrained(MODEL_PATH, language='bn', task=TASK)\nprocessor = WhisperProcessor.from_pretrained(MODEL_PATH, language='bn', task=TASK)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:39:08.222063Z","iopub.execute_input":"2024-04-07T13:39:08.22387Z","iopub.status.idle":"2024-04-07T13:39:10.404718Z","shell.execute_reply.started":"2024-04-07T13:39:08.223773Z","shell.execute_reply":"2024-04-07T13:39:10.401921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids = tokenizer.encode(\"\")\nids","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:16:45.435098Z","iopub.execute_input":"2024-04-07T13:16:45.435499Z","iopub.status.idle":"2024-04-07T13:16:45.443695Z","shell.execute_reply.started":"2024-04-07T13:16:45.43547Z","shell.execute_reply":"2024-04-07T13:16:45.442178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tokenizer.decode(ids)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:16:46.547033Z","iopub.execute_input":"2024-04-07T13:16:46.547423Z","iopub.status.idle":"2024-04-07T13:16:46.562759Z","shell.execute_reply.started":"2024-04-07T13:16:46.547394Z","shell.execute_reply":"2024-04-07T13:16:46.561176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@dataclass\nclass DataCollatorSpeechSeq2SeqWithPadding:\n    processor: Any\n\n    def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> Dict[str, torch.Tensor]:\n        # split inputs and labels since they have to be of different lengths and need different padding methods\n        # first treat the audio inputs by simply returning torch tensors\n        input_features = [{\"input_features\": feature[\"input_features\"]} for feature in features]\n        batch = self.processor.feature_extractor.pad(input_features, return_tensors=\"pt\")\n\n        # get the tokenized label sequences\n        label_features = [{\"input_ids\": feature[\"labels\"]} for feature in features]\n        # pad the labels to max length\n        labels_batch = self.processor.tokenizer.pad(label_features, return_tensors=\"pt\")\n\n        # replace padding with -100 to ignore loss correctly\n        labels = labels_batch[\"input_ids\"].masked_fill(labels_batch.attention_mask.ne(1), -100)\n\n        # if bos token is appended in previous tokenization step,\n        # cut bos token here as it's append later anyways\n        if (labels[:, 0] == self.processor.tokenizer.bos_token_id).all().cpu().item():\n            labels = labels[:, 1:]\n\n        batch[\"labels\"] = labels\n        \n        torch.cuda.empty_cache()\n\n        return batch","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:02.043578Z","iopub.execute_input":"2024-04-07T13:17:02.044072Z","iopub.status.idle":"2024-04-07T13:17:02.056251Z","shell.execute_reply.started":"2024-04-07T13:17:02.044034Z","shell.execute_reply":"2024-04-07T13:17:02.054553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_collator = DataCollatorSpeechSeq2SeqWithPadding(processor=processor)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:04.298398Z","iopub.execute_input":"2024-04-07T13:17:04.298846Z","iopub.status.idle":"2024-04-07T13:17:04.30552Z","shell.execute_reply.started":"2024-04-07T13:17:04.298811Z","shell.execute_reply":"2024-04-07T13:17:04.30371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prepare_dataset(example):\n    audio_path = example[\"file_path\"]\n    \n    # load the audio using librosa or torch audio (as you wish)\n    audio, sr = librosa.load(audio_path, sr=16_000)\n    \n    example[\"input_features\"] = feature_extractor(audio, sampling_rate=sr).input_features[0]\n    \n    example[\"labels\"] = tokenizer(f\"{example['transcripts']}\", max_length=448, padding=True, truncation=True).input_ids\n    \n    return example\n\n\ndef filter_inputs(input_audio):\n    \"\"\"filter inputs with zero input length\"\"\"\n    return 0 < len(input_audio)\n\n\ndef filter_labels(input_labels):\n    \"\"\"filter empty label sequences\"\"\"\n    return 0 < len(input_labels)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:05.473581Z","iopub.execute_input":"2024-04-07T13:17:05.474005Z","iopub.status.idle":"2024-04-07T13:17:05.483424Z","shell.execute_reply.started":"2024-04-07T13:17:05.473975Z","shell.execute_reply":"2024-04-07T13:17:05.482318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = data[data[\"split\"] == \"train\"]","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:06.410059Z","iopub.execute_input":"2024-04-07T13:17:06.410453Z","iopub.status.idle":"2024-04-07T13:17:06.427375Z","shell.execute_reply.started":"2024-04-07T13:17:06.410425Z","shell.execute_reply":"2024-04-07T13:17:06.426059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\n    adjust test size accordingly.\n\"\"\"\ntrain_df, eval_df = train_test_split(train_df, test_size=0.20, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:07.330565Z","iopub.execute_input":"2024-04-07T13:17:07.330989Z","iopub.status.idle":"2024-04-07T13:17:07.344307Z","shell.execute_reply.started":"2024-04-07T13:17:07.330958Z","shell.execute_reply":"2024-04-07T13:17:07.342928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_df), len(eval_df)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:08.952299Z","iopub.execute_input":"2024-04-07T13:17:08.952681Z","iopub.status.idle":"2024-04-07T13:17:08.960091Z","shell.execute_reply.started":"2024-04-07T13:17:08.952653Z","shell.execute_reply":"2024-04-07T13:17:08.958908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ben_reg_voice_ds = DatasetDict()\n\ntrain_split = DS.from_pandas(train_df)\neval_split = DS.from_pandas(eval_df)\n\nds_splits = DatasetDict({\n    'train': train_split,\n    'eval': eval_split\n})","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:10.137349Z","iopub.execute_input":"2024-04-07T13:17:10.137736Z","iopub.status.idle":"2024-04-07T13:17:10.22733Z","shell.execute_reply.started":"2024-04-07T13:17:10.137707Z","shell.execute_reply":"2024-04-07T13:17:10.226056Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_splits = ds_splits.remove_columns([\"split\"])","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:11.205329Z","iopub.execute_input":"2024-04-07T13:17:11.20575Z","iopub.status.idle":"2024-04-07T13:17:11.216308Z","shell.execute_reply.started":"2024-04-07T13:17:11.20572Z","shell.execute_reply":"2024-04-07T13:17:11.215333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(ds_splits)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:12.486515Z","iopub.execute_input":"2024-04-07T13:17:12.487343Z","iopub.status.idle":"2024-04-07T13:17:12.494646Z","shell.execute_reply.started":"2024-04-07T13:17:12.487296Z","shell.execute_reply":"2024-04-07T13:17:12.49343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.object = object","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:16.036923Z","iopub.execute_input":"2024-04-07T13:17:16.037385Z","iopub.status.idle":"2024-04-07T13:17:16.042488Z","shell.execute_reply.started":"2024-04-07T13:17:16.037352Z","shell.execute_reply":"2024-04-07T13:17:16.041302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_splits = ds_splits.map(prepare_dataset, remove_columns=ds_splits.column_names[\"train\"] # open for multithreadding\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:17:16.792442Z","iopub.execute_input":"2024-04-07T13:17:16.792876Z","iopub.status.idle":"2024-04-07T13:25:09.305565Z","shell.execute_reply.started":"2024-04-07T13:17:16.792842Z","shell.execute_reply":"2024-04-07T13:25:09.304077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ds_splits = ds_splits.filter(filter_inputs, input_columns=[\"input_features\"])\n# ds_splits = ds_splits.filter(filter_labels, input_columns=[\"labels\"])","metadata":{"execution":{"iopub.status.busy":"2024-04-04T11:31:51.111685Z","iopub.execute_input":"2024-04-04T11:31:51.112548Z","iopub.status.idle":"2024-04-04T11:31:51.116787Z","shell.execute_reply.started":"2024-04-04T11:31:51.11251Z","shell.execute_reply":"2024-04-04T11:31:51.115903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(ds_splits[\"train\"]), len(ds_splits[\"eval\"])","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:27:38.891148Z","iopub.execute_input":"2024-04-07T13:27:38.891649Z","iopub.status.idle":"2024-04-07T13:27:38.900475Z","shell.execute_reply.started":"2024-04-07T13:27:38.891609Z","shell.execute_reply":"2024-04-07T13:27:38.899042Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cer = CharErrorRate()\nwer = WordErrorRate()","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:27:40.142864Z","iopub.execute_input":"2024-04-07T13:27:40.143647Z","iopub.status.idle":"2024-04-07T13:27:40.159101Z","shell.execute_reply.started":"2024-04-07T13:27:40.143608Z","shell.execute_reply":"2024-04-07T13:27:40.15777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def compute_metrics(pred):\n    pred_ids = pred.predictions\n    label_ids = pred.label_ids\n\n    label_ids[label_ids == -100] = tokenizer.pad_token_id\n\n    pred_str = tokenizer.batch_decode(pred_ids, skip_special_tokens=True)\n    label_str = tokenizer.batch_decode(label_ids, skip_special_tokens=True)\n\n    wer_res = wer(pred_str, label_str)\n    cer_res = cer(pred_str, label_str)\n    \n    \"\"\"\n        uncomment the next 3 lines if you want to see how the examples look like during eval \n    \"\"\"\n    print(\"WER:\",wer_res,\"| CER:\", cer_res) # to show up during running logs\n    print(\"Pred:\",pred_str[0])\n    print(\"Label:\",label_str[0])\n    \n    return {\"wer\": wer_res, \"cer\": cer_res}","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:27:41.254429Z","iopub.execute_input":"2024-04-07T13:27:41.255172Z","iopub.status.idle":"2024-04-07T13:27:41.262827Z","shell.execute_reply.started":"2024-04-07T13:27:41.255135Z","shell.execute_reply":"2024-04-07T13:27:41.26198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = WhisperForConditionalGeneration.from_pretrained(MODEL_PATH, device_map=\"auto\")","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:33:16.706264Z","iopub.execute_input":"2024-04-07T13:33:16.706707Z","iopub.status.idle":"2024-04-07T13:33:17.677891Z","shell.execute_reply.started":"2024-04-07T13:33:16.706676Z","shell.execute_reply":"2024-04-07T13:33:17.676492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_id = \"whisper-reg-ben\"","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:28:02.936978Z","iopub.execute_input":"2024-04-07T13:28:02.93738Z","iopub.status.idle":"2024-04-07T13:28:02.943356Z","shell.execute_reply.started":"2024-04-07T13:28:02.93735Z","shell.execute_reply":"2024-04-07T13:28:02.942084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training_args = Seq2SeqTrainingArguments(\n    output_dir=model_id,\n    per_device_train_batch_size=4,\n    per_device_eval_batch_size=4,\n    gradient_accumulation_steps=1,\n    gradient_checkpointing=True,\n    fp16=True,\n    learning_rate=5e-5,\n    weight_decay=1e-2,\n    warmup_steps=100,\n    num_train_epochs=2,\n    evaluation_strategy=\"epoch\", # or \"epochs\"\n    save_strategy=\"epoch\",\n    predict_with_generate=True,\n    generation_max_length=448,\n#     save_steps=2976,\n#     eval_steps=32,\n#     logging_steps=1000,\n    save_total_limit=1,\n    load_best_model_at_end=True,\n    metric_for_best_model=\"wer\",\n    greater_is_better=False,\n    push_to_hub=False,\n    report_to=\"none\",\n    remove_unused_columns=False,\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:41:50.744491Z","iopub.execute_input":"2024-04-07T13:41:50.745069Z","iopub.status.idle":"2024-04-07T13:41:50.993683Z","shell.execute_reply.started":"2024-04-07T13:41:50.745028Z","shell.execute_reply":"2024-04-07T13:41:50.992018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.generation_config.language = \"bn\"\nmodel.generation_config.task = \"transcribe\"\n\nmodel.generation_config.forced_decoder_ids = None\nmodel.config.suppress_tokens = [] # added later","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:28:19.475903Z","iopub.execute_input":"2024-04-07T13:28:19.476442Z","iopub.status.idle":"2024-04-07T13:28:19.483062Z","shell.execute_reply.started":"2024-04-07T13:28:19.476406Z","shell.execute_reply":"2024-04-07T13:28:19.482053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from transformers import AdamW\noptimizer = AdamW(model.parameters(), lr=training_args.learning_rate)\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainer = Seq2SeqTrainer(\n    args=training_args,\n    model=model,\n    train_dataset=ds_splits[\"train\"],\n    eval_dataset=ds_splits[\"eval\"],\n    data_collator=data_collator,\n    tokenizer=processor.feature_extractor,\n    compute_metrics=compute_metrics,\n    optimizers=(optimizer, None),\n#     callbacks=[EarlyStoppingCallback(2, 1.0)]\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:28:23.822213Z","iopub.execute_input":"2024-04-07T13:28:23.82332Z","iopub.status.idle":"2024-04-07T13:28:23.896838Z","shell.execute_reply.started":"2024-04-07T13:28:23.823272Z","shell.execute_reply":"2024-04-07T13:28:23.89515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainer.train()\n\n# to use the high-level pipeline, ensure both the processor outputs and model outputs exist in the same dir\ntrainer.save_model(training_args.output_dir)\nprocessor.save_pretrained(training_args.output_dir)","metadata":{"execution":{"iopub.status.busy":"2024-04-04T19:00:25.673498Z","iopub.execute_input":"2024-04-04T19:00:25.674762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"out_logs = pd.DataFrame(trainer.state.log_history)\nout_logs.to_csv(\"logs.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc\n\ndel ds_splits\n\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:28:37.889991Z","iopub.execute_input":"2024-04-07T13:28:37.890464Z","iopub.status.idle":"2024-04-07T13:28:38.503566Z","shell.execute_reply.started":"2024-04-07T13:28:37.890428Z","shell.execute_reply":"2024-04-07T13:28:38.502205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"torch.cuda.empty_cache()","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:28:39.542661Z","iopub.execute_input":"2024-04-07T13:28:39.543548Z","iopub.status.idle":"2024-04-07T13:28:39.549399Z","shell.execute_reply.started":"2024-04-07T13:28:39.543501Z","shell.execute_reply":"2024-04-07T13:28:39.547928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pipe = pipeline(\n    \"automatic-speech-recognition\",\n    model=model_id,\n    chunk_length_s=30,\n    device=0,\n)","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:30:22.674453Z","iopub.execute_input":"2024-04-07T13:30:22.67521Z","iopub.status.idle":"2024-04-07T13:30:23.297474Z","shell.execute_reply.started":"2024-04-07T13:30:22.67515Z","shell.execute_reply":"2024-04-07T13:30:23.295432Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def pretty_sort(filename):\n    name, number_str = filename.split(\" (\")\n    number = int(number_str.split(\")\")[0])\n    return name, number","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:30:07.640519Z","iopub.execute_input":"2024-04-07T13:30:07.642045Z","iopub.status.idle":"2024-04-07T13:30:07.649541Z","shell.execute_reply.started":"2024-04-07T13:30:07.641971Z","shell.execute_reply":"2024-04-07T13:30:07.648114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids = []\npreds = []","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for root, dirs, files in os.walk(\"/kaggle/input/ben10/ben10/16_kHz_valid_audio\"):\n    files = sorted(files, key=pretty_sort)\n    \n#     print(files.index(\"valid_sandwip (1).wav\"))\n#     print(files.index(\"valid_sandwip (132).wav\"))\n    \n#     put swandip first\n    shift = files[1070 : 1202]\n    \n    files = shift + files[:1070] + files[1202:]\n    ids = files.copy()\n    \n    for file in files:\n        composed_path = f\"{test_data_dir}{file}\"\n        audio, sr = librosa.load(composed_path, sr=16_000)\n        text = pipe(audio)[\"text\"]\n        preds.append(text)","metadata":{"execution":{"iopub.status.busy":"2024-04-06T19:21:10.531808Z","iopub.execute_input":"2024-04-06T19:21:10.532162Z","iopub.status.idle":"2024-04-06T19:21:18.724129Z","shell.execute_reply.started":"2024-04-06T19:21:10.532135Z","shell.execute_reply":"2024-04-06T19:21:18.722932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2024-04-07T13:37:08.345065Z","iopub.execute_input":"2024-04-07T13:37:08.345491Z","iopub.status.idle":"2024-04-07T13:37:27.132851Z","shell.execute_reply.started":"2024-04-07T13:37:08.345459Z","shell.execute_reply":"2024-04-07T13:37:27.131487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df = pd.DataFrame()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df[\"id\"] = ids\nsub_df[\"sentence\"] = preds","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df.head(20)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}