{"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":"code","source":"from transformers import WhisperFeatureExtractor, WhisperTokenizer, WhisperProcessor, WhisperForConditionalGeneration\nfeature_extractor = WhisperFeatureExtractor.from_pretrained('/kaggle/input/featureextractorconfig')\ntokenizer = WhisperTokenizer.from_pretrained('/kaggle/input/tokenizerconfig', language=\"bengali\", task=\"transcribe\")\nprocessor = WhisperProcessor.from_pretrained('/kaggle/input/processorconfig', language=\"bengali\", task=\"transcribe\")\nmodel = WhisperForConditionalGeneration.from_pretrained(\"/kaggle/input/checkpoint-200000\")","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:00.485761Z","iopub.execute_input":"2023-10-16T14:13:00.486520Z","iopub.status.idle":"2023-10-16T14:13:24.127026Z","shell.execute_reply.started":"2023-10-16T14:13:00.486489Z","shell.execute_reply":"2023-10-16T14:13:24.126004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def prepare_dataset(batch):\n    import librosa\n    audio = batch[\"audio\"] \n    audio , sr = librosa.load(audio, sr=16000)\n    batch[\"input_features\"] = feature_extractor(audio, sampling_rate=sr).input_features[0]\n    batch[\"labels\"] = tokenizer(batch[\"sentence\"]).input_ids\n    return batch","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:24.129085Z","iopub.execute_input":"2023-10-16T14:13:24.129467Z","iopub.status.idle":"2023-10-16T14:13:24.135260Z","shell.execute_reply.started":"2023-10-16T14:13:24.129435Z","shell.execute_reply":"2023-10-16T14:13:24.134042Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nfrom dataclasses import dataclass\nfrom typing import Any, Dict, List, Union\n@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        \n        features = list(map(prepare_dataset, features))\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        label_features = [{\"input_ids\": feature[\"labels\"]} for feature in features]\n        labels_batch = self.processor.tokenizer.pad(label_features, return_tensors=\"pt\")\n\n        labels = labels_batch[\"input_ids\"].masked_fill(labels_batch.attention_mask.ne(1), -100)\n\n       \n        if (labels[:, 0] == self.processor.tokenizer.bos_token_id).all().cpu().item():\n            labels = labels[:, 1:]\n\n        batch[\"labels\"] = labels\n\n        return batch","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:24.136603Z","iopub.execute_input":"2023-10-16T14:13:24.137544Z","iopub.status.idle":"2023-10-16T14:13:24.148729Z","shell.execute_reply.started":"2023-10-16T14:13:24.137503Z","shell.execute_reply":"2023-10-16T14:13:24.147659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_collator = DataCollatorSpeechSeq2SeqWithPadding(processor=processor)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:24.151328Z","iopub.execute_input":"2023-10-16T14:13:24.151766Z","iopub.status.idle":"2023-10-16T14:13:24.159095Z","shell.execute_reply.started":"2023-10-16T14:13:24.151745Z","shell.execute_reply":"2023-10-16T14:13:24.158181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer\n\ntraining_args = Seq2SeqTrainingArguments(\n    output_dir='/kaggle/working/openai/',  \n    per_device_train_batch_size=8,\n    gradient_accumulation_steps=1,  \n    learning_rate=1e-5,\n    warmup_steps=2,\n    max_steps=10000,\n    gradient_checkpointing=True,\n    evaluation_strategy=\"steps\",\n    per_device_eval_batch_size=8,\n    predict_with_generate=True,\n    generation_max_length=225,\n    save_steps=10,\n    eval_steps=10,\n    greater_is_better=False,\n    push_to_hub=False,\n    optim=\"adamw_torch\",\n    remove_unused_columns=False,\n    resume_from_checkpoint=True,\n    report_to=[\"tensorboard\"],\n)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:24.160829Z","iopub.execute_input":"2023-10-16T14:13:24.161122Z","iopub.status.idle":"2023-10-16T14:13:25.106601Z","shell.execute_reply.started":"2023-10-16T14:13:24.161095Z","shell.execute_reply":"2023-10-16T14:13:25.105674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from datasets import load_dataset,Dataset\nimport pandas as pd\npd_input = pd.read_csv('/kaggle/input/bengaliai-speech/train.csv')\npd_input = pd_input.assign(audio ='/kaggle/input/bengaliai-speech/train_mp3s/'+pd_input['id']+'.mp3') \ngrouped = pd_input.groupby(['split'])\ntrainset = grouped.get_group(\"train\")\nvalidationset=grouped.get_group(\"valid\")\naudio_val_dataset = Dataset.from_dict({\"audio\": validationset['audio'], \"sentence\":validationset[\"sentence\"]})\naudio_dataset = Dataset.from_dict({\"audio\": trainset['audio'], \"sentence\":trainset[\"sentence\"]})\n","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:25.108054Z","iopub.execute_input":"2023-10-16T14:13:25.108948Z","iopub.status.idle":"2023-10-16T14:13:31.375477Z","shell.execute_reply.started":"2023-10-16T14:13:25.108900Z","shell.execute_reply":"2023-10-16T14:13:31.374497Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainer = Seq2SeqTrainer(\n    args=training_args,\n    model=model,\n    train_dataset=audio_dataset,\n    eval_dataset=audio_val_dataset,\n    data_collator=data_collator,\n    tokenizer=processor.feature_extractor,\n)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:31.376869Z","iopub.execute_input":"2023-10-16T14:13:31.377253Z","iopub.status.idle":"2023-10-16T14:13:37.247881Z","shell.execute_reply.started":"2023-10-16T14:13:31.377173Z","shell.execute_reply":"2023-10-16T14:13:37.246931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test for domain-test data\nfrom datasets import load_dataset,  Dataset, Audio\nimport pandas as pd\nfrom PIL import Image\nimport csv\nimport os\nimport librosa\n\n\ntest_files = os.listdir(\"/kaggle/input/bengaliai-speech/test_mp3s\")\n        \npd_test_input = pd.DataFrame(\n                             {\n                                \"audio\": ['/kaggle/input/bengaliai-speech/test_mp3s/'+filename for filename in test_files],\n                                \"id\": [filename.replace('.wav','').replace('.mp3','') for filename in test_files] \n                             }\n                            )\n\naudio_test_dataset = Dataset.from_dict({\"audio\": pd_test_input['audio'], \"sentence\":['' for i in range(len(pd_test_input['audio']))]})\n\n\ndef load_audio(batch):\n    audio = batch[\"audio\"] \n    audio , sr = librosa.load(audio, sr=16000)\n    batch[\"input_features\"] = feature_extractor(audio, sampling_rate=sr).input_features[0]\n    batch[\"labels\"] = tokenizer(batch[\"sentence\"]).input_ids\n    return batch\n\naudio_test_dataset =audio_test_dataset.map(load_audio)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:37.249167Z","iopub.execute_input":"2023-10-16T14:13:37.250130Z","iopub.status.idle":"2023-10-16T14:13:45.826234Z","shell.execute_reply.started":"2023-10-16T14:13:37.250095Z","shell.execute_reply":"2023-10-16T14:13:45.825029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_submission(ids, pre_test_bengali):\n    import csv\n    with open('submission.csv','w',encoding=\"utf-8\") as f1:\n        writer = csv.writer(f1, delimiter=',',lineterminator='\\n')\n        writer.writerow(['id','sentence'])\n        for id, prediction in zip(ids, pre_test_bengali.predictions ):\n            predicted_tokens = tokenizer.convert_ids_to_tokens(prediction,skip_special_tokens=True)\n            predicted_string = tokenizer.convert_tokens_to_string(predicted_tokens)\n            writer.writerow([id, predicted_string])","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:45.831971Z","iopub.execute_input":"2023-10-16T14:13:45.835482Z","iopub.status.idle":"2023-10-16T14:13:45.847530Z","shell.execute_reply.started":"2023-10-16T14:13:45.835436Z","shell.execute_reply":"2023-10-16T14:13:45.846348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_test_bengali = trainer.predict(audio_test_dataset)\ncreate_submission(pd_test_input['id'], pre_test_bengali)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:45.856671Z","iopub.execute_input":"2023-10-16T14:13:45.859827Z","iopub.status.idle":"2023-10-16T14:13:59.687658Z","shell.execute_reply.started":"2023-10-16T14:13:45.859784Z","shell.execute_reply":"2023-10-16T14:13:59.686579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv('/kaggle/working/submission.csv')\nsubmission\n","metadata":{"execution":{"iopub.status.busy":"2023-10-16T14:13:59.689278Z","iopub.execute_input":"2023-10-16T14:13:59.689943Z","iopub.status.idle":"2023-10-16T14:13:59.705090Z","shell.execute_reply.started":"2023-10-16T14:13:59.689900Z","shell.execute_reply":"2023-10-16T14:13:59.704036Z"},"trusted":true},"execution_count":null,"outputs":[]}]}