{"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"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":52324,"databundleVersionId":6229904,"sourceType":"competition"},{"sourceId":4143520,"sourceType":"datasetVersion","datasetId":2447262},{"sourceId":5671261,"sourceType":"datasetVersion","datasetId":3260216},{"sourceId":6271580,"sourceType":"datasetVersion","datasetId":3605423},{"sourceId":6283276,"sourceType":"datasetVersion","datasetId":3612988},{"sourceId":6325940,"sourceType":"datasetVersion","datasetId":3640849},{"sourceId":6346454,"sourceType":"datasetVersion","datasetId":3654479},{"sourceId":6357242,"sourceType":"datasetVersion","datasetId":3661679},{"sourceId":6362161,"sourceType":"datasetVersion","datasetId":3664920},{"sourceId":6407607,"sourceType":"datasetVersion","datasetId":3695009},{"sourceId":6418259,"sourceType":"datasetVersion","datasetId":3702060},{"sourceId":6419132,"sourceType":"datasetVersion","datasetId":3702712},{"sourceId":6419181,"sourceType":"datasetVersion","datasetId":3702741},{"sourceId":6419246,"sourceType":"datasetVersion","datasetId":3702783},{"sourceId":6419278,"sourceType":"datasetVersion","datasetId":3702811},{"sourceId":6420339,"sourceType":"datasetVersion","datasetId":3703596},{"sourceId":6420454,"sourceType":"datasetVersion","datasetId":3703682},{"sourceId":6422622,"sourceType":"datasetVersion","datasetId":3705054},{"sourceId":6422630,"sourceType":"datasetVersion","datasetId":3705060},{"sourceId":6423597,"sourceType":"datasetVersion","datasetId":3705699},{"sourceId":6426657,"sourceType":"datasetVersion","datasetId":3707841},{"sourceId":6428249,"sourceType":"datasetVersion","datasetId":3708858},{"sourceId":6429063,"sourceType":"datasetVersion","datasetId":3709402},{"sourceId":6431509,"sourceType":"datasetVersion","datasetId":3711228},{"sourceId":6432259,"sourceType":"datasetVersion","datasetId":3711718},{"sourceId":6433893,"sourceType":"datasetVersion","datasetId":3712711},{"sourceId":6435227,"sourceType":"datasetVersion","datasetId":3713642},{"sourceId":6436410,"sourceType":"datasetVersion","datasetId":3714458},{"sourceId":6437890,"sourceType":"datasetVersion","datasetId":3715409},{"sourceId":6438002,"sourceType":"datasetVersion","datasetId":3715472},{"sourceId":6440894,"sourceType":"datasetVersion","datasetId":3717292},{"sourceId":6441933,"sourceType":"datasetVersion","datasetId":3718037},{"sourceId":6443047,"sourceType":"datasetVersion","datasetId":3718836},{"sourceId":6444274,"sourceType":"datasetVersion","datasetId":3719638},{"sourceId":6445378,"sourceType":"datasetVersion","datasetId":3720429},{"sourceId":6446875,"sourceType":"datasetVersion","datasetId":3721501},{"sourceId":6447938,"sourceType":"datasetVersion","datasetId":3722264},{"sourceId":6448284,"sourceType":"datasetVersion","datasetId":3722503},{"sourceId":6449647,"sourceType":"datasetVersion","datasetId":3723322},{"sourceId":6451852,"sourceType":"datasetVersion","datasetId":3724858},{"sourceId":6454157,"sourceType":"datasetVersion","datasetId":3726542},{"sourceId":6456094,"sourceType":"datasetVersion","datasetId":3727756},{"sourceId":6458146,"sourceType":"datasetVersion","datasetId":3729236},{"sourceId":6458262,"sourceType":"datasetVersion","datasetId":3729314},{"sourceId":6459327,"sourceType":"datasetVersion","datasetId":3730099},{"sourceId":6460288,"sourceType":"datasetVersion","datasetId":3730735},{"sourceId":6462363,"sourceType":"datasetVersion","datasetId":3732054},{"sourceId":6465595,"sourceType":"datasetVersion","datasetId":3734193},{"sourceId":6466512,"sourceType":"datasetVersion","datasetId":3734827},{"sourceId":6470587,"sourceType":"datasetVersion","datasetId":3737197},{"sourceId":6471756,"sourceType":"datasetVersion","datasetId":3738041},{"sourceId":6478079,"sourceType":"datasetVersion","datasetId":3742445},{"sourceId":6479202,"sourceType":"datasetVersion","datasetId":3743205},{"sourceId":6481282,"sourceType":"datasetVersion","datasetId":3744533},{"sourceId":6483222,"sourceType":"datasetVersion","datasetId":3745870},{"sourceId":6484209,"sourceType":"datasetVersion","datasetId":3746528},{"sourceId":6484710,"sourceType":"datasetVersion","datasetId":3746845},{"sourceId":6486311,"sourceType":"datasetVersion","datasetId":3747810},{"sourceId":6489208,"sourceType":"datasetVersion","datasetId":3749932},{"sourceId":6491038,"sourceType":"datasetVersion","datasetId":3751119},{"sourceId":6494418,"sourceType":"datasetVersion","datasetId":3753529},{"sourceId":6496765,"sourceType":"datasetVersion","datasetId":3755007},{"sourceId":6496771,"sourceType":"datasetVersion","datasetId":3755012},{"sourceId":6499218,"sourceType":"datasetVersion","datasetId":3756672},{"sourceId":6499837,"sourceType":"datasetVersion","datasetId":3757147},{"sourceId":6501153,"sourceType":"datasetVersion","datasetId":3758076},{"sourceId":6502678,"sourceType":"datasetVersion","datasetId":3758996},{"sourceId":6503904,"sourceType":"datasetVersion","datasetId":3759854},{"sourceId":6506196,"sourceType":"datasetVersion","datasetId":3761521},{"sourceId":6507431,"sourceType":"datasetVersion","datasetId":3762333},{"sourceId":6508698,"sourceType":"datasetVersion","datasetId":3763090},{"sourceId":6510244,"sourceType":"datasetVersion","datasetId":3764104},{"sourceId":6514206,"sourceType":"datasetVersion","datasetId":3766385},{"sourceId":6516327,"sourceType":"datasetVersion","datasetId":3767150},{"sourceId":6521039,"sourceType":"datasetVersion","datasetId":3769997},{"sourceId":6528300,"sourceType":"datasetVersion","datasetId":3774047},{"sourceId":6529215,"sourceType":"datasetVersion","datasetId":3774594},{"sourceId":6532568,"sourceType":"datasetVersion","datasetId":3776642},{"sourceId":6534546,"sourceType":"datasetVersion","datasetId":3777742},{"sourceId":6536696,"sourceType":"datasetVersion","datasetId":3779026},{"sourceId":6539613,"sourceType":"datasetVersion","datasetId":3780562},{"sourceId":6540131,"sourceType":"datasetVersion","datasetId":3780812},{"sourceId":6542513,"sourceType":"datasetVersion","datasetId":3781759},{"sourceId":6546239,"sourceType":"datasetVersion","datasetId":3783705},{"sourceId":6546576,"sourceType":"datasetVersion","datasetId":3783882},{"sourceId":6546647,"sourceType":"datasetVersion","datasetId":3783920},{"sourceId":6546758,"sourceType":"datasetVersion","datasetId":3783972},{"sourceId":6546880,"sourceType":"datasetVersion","datasetId":3784047},{"sourceId":6546943,"sourceType":"datasetVersion","datasetId":3784079},{"sourceId":6547248,"sourceType":"datasetVersion","datasetId":3784249},{"sourceId":6548917,"sourceType":"datasetVersion","datasetId":3785101},{"sourceId":6550770,"sourceType":"datasetVersion","datasetId":3785828},{"sourceId":6554880,"sourceType":"datasetVersion","datasetId":3787787},{"sourceId":6560119,"sourceType":"datasetVersion","datasetId":3790275},{"sourceId":6560769,"sourceType":"datasetVersion","datasetId":3790644},{"sourceId":6564947,"sourceType":"datasetVersion","datasetId":3792820},{"sourceId":6566976,"sourceType":"datasetVersion","datasetId":3793642},{"sourceId":140325995,"sourceType":"kernelVersion"}],"dockerImageVersionId":30528,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Reference\n\nFirstly, Please upvote/refer to [@tawara's](https://www.kaggle.com/ttahara) discussions and inference [notebook](https://www.kaggle.com/code/ttahara/bengali-sr-public-wav2vec2-0-w-lm-baseline).\n\n","metadata":{}},{"cell_type":"markdown","source":"## What this notebook features??\n- I wanted to showcase the impact of finetuning the models on competition dataset.\n- Current version comprises of finetuned model only with 10% of competition training data.\n- I will publish the training code in upcoming days. You can refer to this [dataset]()\n\n\n\nPublic models from hugging faces:\n* `https://huggingface.co/ai4bharat/indicwav2vec_v1_bengali` for Wav2vec2CTC Model only\n* `https://huggingface.co/arijitx/wav2vec2-xls-r-300m-bengali` for Language Model\n\nI didn't trained these models using the competitaion data at all. I just want to know public models score as baseline.  \n\nSo we may get higher and higher score by fine-tuning on competition data.\n\n### Note: I only finetuned the indicwav2vec_v1_bengali which is a CTC model. I am still using the public LM model mentioned above.","metadata":{}},{"cell_type":"code","source":"'''\nimport sys\nsys.path.append('/kaggle/input/puncts-models/punctuation-restoration/src/')\nimport re\nimport torch\n\nimport argparse\nfrom model import DeepPunctuation, DeepPunctuationCRF\nfrom config import *\npretrained_model=\"xlm-roberta-large\"\nweight_path=\"/kaggle/input/puncts-models/punctuation-restoration/src/xlm-roberta-large-bn.pt\"\n# tokenizer\nprint (MODELS[pretrained_model][1])\ntokenizer = XLMRobertaTokenizer.from_pretrained('/kaggle/input/xlm-new/')\ntoken_style = MODELS[pretrained_model][3]\nlstm_dim = -1\ncuda = True\n# logs\nmodel_save_path = weight_path\n\n# Model\ndevice = torch.device('cuda' if (cuda and torch.cuda.is_available()) else 'cpu')\n#if args.use_crf:\n#    deep_punctuation = DeepPunctuationCRF(pretrained_model, freeze_bert=False, lstm_dim=lstm_dim)\n\ndeep_punctuation = DeepPunctuation(pretrained_model, freeze_bert=False, lstm_dim=lstm_dim)\ndeep_punctuation.to(device)\n'''","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:15:38.57345Z","iopub.execute_input":"2023-09-26T15:15:38.574086Z","iopub.status.idle":"2023-09-26T15:15:38.589948Z","shell.execute_reply.started":"2023-09-26T15:15:38.574048Z","shell.execute_reply":"2023-09-26T15:15:38.588861Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#!pip install /kaggle/input/sacremoses-0053-py3-none-any/sacremoses-0.0.53-py3-none-any.whl\n#!pip install /kaggle/input/dependencies-tar/pytorch_crf-0.7.2-py3-none-any.whl\n#!pip install /kaggle/input/dependencies-tar/sentencepiece-0.1.99-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\n","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:15:38.592277Z","iopub.execute_input":"2023-09-26T15:15:38.592668Z","iopub.status.idle":"2023-09-26T15:15:38.599018Z","shell.execute_reply.started":"2023-09-26T15:15:38.592611Z","shell.execute_reply":"2023-09-26T15:15:38.597889Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Import","metadata":{}},{"cell_type":"code","source":"!cp -r ../input/python-packages2 ./\n\n\n\n!tar xvfz ./python-packages2/jiwer.tgz\n!pip install ./jiwer/jiwer-2.3.0-py3-none-any.whl -f ./ --no-index\n!tar xvfz ./python-packages2/normalizer.tgz\n!pip install ./normalizer/bnunicodenormalizer-0.0.24.tar.gz -f ./ --no-index\n!tar xvfz ./python-packages2/pyctcdecode.tgz\n!pip install ./pyctcdecode/attrs-22.1.0-py2.py3-none-any.whl -f ./ --no-index --no-deps\n!pip install ./pyctcdecode/exceptiongroup-1.0.0rc9-py3-none-any.whl -f ./ --no-index --no-deps\n!pip install ./pyctcdecode/hypothesis-6.54.4-py3-none-any.whl -f ./ --no-index --no-deps\n!pip install ./pyctcdecode/numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl -f ./ --no-index --no-deps\n!pip install ./pyctcdecode/pygtrie-2.5.0.tar.gz -f ./ --no-index --no-deps\n!pip install ./pyctcdecode/sortedcontainers-2.4.0-py2.py3-none-any.whl -f ./ --no-index --no-deps\n!pip install ./pyctcdecode/pyctcdecode-0.4.0-py2.py3-none-any.whl -f ./ --no-index --no-deps\n\n!tar xvfz ./python-packages2/pypikenlm.tgz\n!pip install ./pypikenlm/pypi-kenlm-0.1.20220713.tar.gz -f ./ --no-index --no-deps","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-09-26T15:15:38.600623Z","iopub.execute_input":"2023-09-26T15:15:38.601043Z","iopub.status.idle":"2023-09-26T15:16:50.468998Z","shell.execute_reply.started":"2023-09-26T15:15:38.600993Z","shell.execute_reply":"2023-09-26T15:16:50.467884Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rm -r python-packages2 jiwer normalizer pyctcdecode pypikenlm","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:16:50.472163Z","iopub.execute_input":"2023-09-26T15:16:50.472575Z","iopub.status.idle":"2023-09-26T15:16:51.430924Z","shell.execute_reply.started":"2023-09-26T15:16:50.472529Z","shell.execute_reply":"2023-09-26T15:16:51.429638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import typing as tp\nfrom pathlib import Path\nfrom functools import partial\nfrom dataclasses import dataclass, field\nimport Levenshtein\nimport pandas as pd\nimport pyctcdecode\nimport numpy as np\nfrom tqdm.notebook import tqdm\nimport torchaudio\nimport torchaudio.functional as F\nimport torchaudio.transforms as T\nimport librosa\nfrom typing import Dict, List, Tuple, Any, Union, Optional\nfrom pydub import AudioSegment\nimport re\nimport pyctcdecode\nimport kenlm\nimport torch\nfrom transformers import Wav2Vec2Processor, Wav2Vec2ProcessorWithLM, Wav2Vec2ForCTC\nfrom bnunicodenormalizer import Normalizer\n\nimport cloudpickle as cpkl","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-26T15:16:51.432728Z","iopub.execute_input":"2023-09-26T15:16:51.433125Z","iopub.status.idle":"2023-09-26T15:17:03.04874Z","shell.execute_reply.started":"2023-09-26T15:16:51.433088Z","shell.execute_reply":"2023-09-26T15:17:03.047794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ROOT = Path.cwd().parent\nINPUT = ROOT / \"input\"\nDATA = INPUT / \"bengaliai-speech\"\nTRAIN = DATA / \"train_mp3s\"\nTEST = DATA / \"test_mp3s\"\n\nSAMPLING_RATE = 16_000\nMODEL_PATHS = INPUT / \"3rdsept-indicawav2vec-35600iterationstest/\"\nMODEL_PATH = \"/kaggle/input/28sept-indicawav2vec-320000iterations/\" \nLM_PATH = INPUT / \"bengali-sr-download-public-trained-models/wav2vec2-xls-r-300m-bengali/language_model/\"\nprocessor_name = '/kaggle/input/18aug-sharukmodel'","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:17:03.050424Z","iopub.execute_input":"2023-09-26T15:17:03.050841Z","iopub.status.idle":"2023-09-26T15:17:03.057709Z","shell.execute_reply.started":"2023-09-26T15:17:03.050803Z","shell.execute_reply":"2023-09-26T15:17:03.056563Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### load model, processor, decoder","metadata":{}},{"cell_type":"code","source":"model = Wav2Vec2ForCTC.from_pretrained(MODEL_PATH)\nprocessor = Wav2Vec2Processor.from_pretrained(MODEL_PATH)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:17:03.059041Z","iopub.execute_input":"2023-09-26T15:17:03.059775Z","iopub.status.idle":"2023-09-26T15:17:14.241982Z","shell.execute_reply.started":"2023-09-26T15:17:03.059703Z","shell.execute_reply":"2023-09-26T15:17:14.240974Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from pyctcdecode import build_ctcdecoder\n\nvocab_dict = processor.tokenizer.get_vocab()\nsorted_vocab_dict = {k: v for k, v in sorted(vocab_dict.items(), key=lambda item: item[1])}\n\ndecoder = build_ctcdecoder(\n    labels=list(sorted_vocab_dict.keys()),\n    kenlm_model_path=\"/kaggle/input/25sept-commonvoicewithbninbn5percenttraindata/dlsprint-data-lm.6.arpa\",       # 8sept-6gram,19sept-commonvoicewithbntraindata\n       # 8sept-6gram,19sept-commonvoicewithbntraindata\n \n)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:17:14.24342Z","iopub.execute_input":"2023-09-26T15:17:14.243961Z","iopub.status.idle":"2023-09-26T15:26:41.108896Z","shell.execute_reply.started":"2023-09-26T15:17:14.243926Z","shell.execute_reply":"2023-09-26T15:26:41.107828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n\nprocessor_with_lm = Wav2Vec2ProcessorWithLM(\n    feature_extractor=processor.feature_extractor,\n    tokenizer=processor.tokenizer,\n    decoder=decoder\n)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.11473Z","iopub.execute_input":"2023-09-26T15:26:41.115184Z","iopub.status.idle":"2023-09-26T15:26:41.123317Z","shell.execute_reply.started":"2023-09-26T15:26:41.115156Z","shell.execute_reply":"2023-09-26T15:26:41.122114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AudioConverter:\n    \"\"\"\n    AudioConverter offers methods to load, transcode and augment\n    audio data in various ways.\n    \"\"\"\n\n    # Configurations for parameters used in torchaudio's resampling kernel.\n    resampleFilterParams = {\n        \"fast\": {  # Fast and less accurate but still MSE = ~2e-5 compared to librosa.\n            \"lowpass_filter_width\": 16,\n            \"rolloff\": 0.85,\n            \"resampling_method\": \"kaiser_window\",\n            \"beta\": 8.555504641634386,\n        },\n        \"best\": { # Twice as slow, and a little bit more accurate.\n            \"lowpass_filter_width\": 64,\n            \"rolloff\": 0.9475937167399596,\n            \"resampling_method\": \"kaiser_window\",\n            \"beta\": 14.769656459379492,       \n        },\n    }\n\n    def __init__(\n        self,\n        sampleRate: int,\n    ):\n        \"\"\"\n        Initializes AudioConverter.\n\n        Parameters\n        ----------\n        sampleRate: int\n            Sampling rate to convert audio to, if required.\n        \"\"\"\n        self.sampleRate = sampleRate\n\n    @classmethod\n    def loadAudio(\n        cls, audioPath: str, sampleRate: int = None, returnTensor: bool = True, resampleType: str = \"fast\",\n    ) -> Union[torch.Tensor, np.ndarray]:\n        \"\"\"\n        Uses torchaudio to load and resample (if necessary) audio files and returns\n        audio samples as either a numpy.float32 array or a torch.Tensor.\n        \n        Parameters\n        ----------\n        audioPath: str\n            Path to audio file file (wav / mp3 / flac).\n        \n        sampleRate: int, optional\n            Sampling rate to convert audio to. If None,\n            audio is not resampled.\n        \n        returnTensor: bool, optional\n            If True, the audio samples are returned as a torch.Tensor.\n            Otherwise, the samples are returned as a numpy.float32 array.\n            \n        resampleType: str, optional\n            Either \"fast\" or \"best\" - sets the quality of resampling.\n            \"best\" is twice as slow as \"fast\" but more accurate. \"fast\"\n            is still comparable to librosa's resampled output though,\n            in terms of MSE.\n\n        Returns\n        -------\n        Union[torch.Tensor, np.ndarray]\n            Audio waveform scaled between +/- 1.0 as either a numpy.float32 array,\n            or torch.Tensor, with shape (channels, numSamples)\n        \"\"\"\n        x, sr = torchaudio.load(audioPath)\n        if sampleRate is not None or sr != sampleRate:\n            x = F.resample(x, sr, sampleRate,**cls.resampleFilterParams[resampleType] ) #\n        \n        if returnTensor:\n            return x\n        \n        return x.numpy()","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.124886Z","iopub.execute_input":"2023-09-26T15:26:41.12527Z","iopub.status.idle":"2023-09-26T15:26:41.14053Z","shell.execute_reply.started":"2023-09-26T15:26:41.125236Z","shell.execute_reply":"2023-09-26T15:26:41.139516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## prepare dataloader","metadata":{}},{"cell_type":"code","source":"class BengaliSRTestDataset(torch.utils.data.Dataset):\n    \n    def __init__(\n        self,\n        audio_paths: list[str],\n        sampling_rate: int\n    ):\n        self.audio_paths = audio_paths\n        self.sampling_rate = sampling_rate\n        \n    def __len__(self,):\n        return len(self.audio_paths)\n    \n    def __getitem__(self, index: int):\n        audio_path = self.audio_paths[index]\n        print (audio_path)\n        sr = self.sampling_rate\n        #song = AudioSegment.from_mp3(audio_path)\n        #song.export(\"/kaggle/working/out.wav\", format=\"wav\")\n\n        #w = AudioConverter.loadAudio(\"/kaggle/working/out.wav\", sampleRate=16000, returnTensor=False)[0]\n        w = librosa.load(audio_path, sr=sr, mono=False)[0]\n        \n        return w","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.142079Z","iopub.execute_input":"2023-09-26T15:26:41.142428Z","iopub.status.idle":"2023-09-26T15:26:41.154849Z","shell.execute_reply.started":"2023-09-26T15:26:41.142395Z","shell.execute_reply":"2023-09-26T15:26:41.153819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = pd.read_csv(DATA / \"sample_submission.csv\", dtype={\"id\": str})\nprint(test.head())","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.156284Z","iopub.execute_input":"2023-09-26T15:26:41.156628Z","iopub.status.idle":"2023-09-26T15:26:41.225504Z","shell.execute_reply.started":"2023-09-26T15:26:41.156594Z","shell.execute_reply":"2023-09-26T15:26:41.224518Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_audio_paths = [str(TEST / f\"{aid}.mp3\") for aid in test[\"id\"].values]","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.226763Z","iopub.execute_input":"2023-09-26T15:26:41.228737Z","iopub.status.idle":"2023-09-26T15:26:41.23436Z","shell.execute_reply.started":"2023-09-26T15:26:41.2287Z","shell.execute_reply":"2023-09-26T15:26:41.233188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = BengaliSRTestDataset(\n    test_audio_paths, SAMPLING_RATE\n)\n\ncollate_func = partial(\n    processor_with_lm.feature_extractor,\n    return_tensors=\"pt\", sampling_rate=SAMPLING_RATE,\n    padding=True,\n)\n\ntest_loader = torch.utils.data.DataLoader(\n    test_dataset, batch_size=1, shuffle=False,\n    num_workers=1, collate_fn=collate_func, drop_last=False,\n    pin_memory=True,\n)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.235938Z","iopub.execute_input":"2023-09-26T15:26:41.236814Z","iopub.status.idle":"2023-09-26T15:26:41.251369Z","shell.execute_reply.started":"2023-09-26T15:26:41.236781Z","shell.execute_reply":"2023-09-26T15:26:41.2504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Inference","metadata":{}},{"cell_type":"code","source":"if not torch.cuda.is_available():\n    device = torch.device(\"cpu\")\nelse:\n    device = torch.device(\"cuda\")\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.254559Z","iopub.execute_input":"2023-09-26T15:26:41.255222Z","iopub.status.idle":"2023-09-26T15:26:41.440354Z","shell.execute_reply.started":"2023-09-26T15:26:41.255196Z","shell.execute_reply":"2023-09-26T15:26:41.43931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = model.to(device)\nmodel = model.eval()\nmodel = model.half()\nbest_params = {'alpha': 0.3802723523729998, 'beta': 0.053996879617918436, 'beam_width': 512}","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:41.442148Z","iopub.execute_input":"2023-09-26T15:26:41.442759Z","iopub.status.idle":"2023-09-26T15:26:47.029703Z","shell.execute_reply.started":"2023-09-26T15:26:41.442723Z","shell.execute_reply":"2023-09-26T15:26:47.028696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_sentence_list = []\n\nwith torch.no_grad():\n    for batch in tqdm(test_loader):\n        x = batch[\"input_values\"]\n        x = x.to(device, non_blocking=True)\n        with torch.cuda.amp.autocast(True):\n            y = model(x).logits\n        y = y.detach().cpu().numpy()\n        \n        for l in y:  \n            sentence = processor_with_lm.decode(l, beam_width = 512).text   #beam_width = 512\n            pred_sentence_list.append(sentence)","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:26:47.031057Z","iopub.execute_input":"2023-09-26T15:26:47.03206Z","iopub.status.idle":"2023-09-26T15:27:01.158513Z","shell.execute_reply.started":"2023-09-26T15:26:47.031999Z","shell.execute_reply":"2023-09-26T15:27:01.157204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Make Submission","metadata":{}},{"cell_type":"code","source":"bnorm = Normalizer()\n'''\ndef postprocess(sentence):\n    period_set = set([\".\", \"?\", \"!\", \"।\"])\n    _words = [bnorm(word)['normalized']  for word in sentence.split()]\n    sentence = \" \".join([word for word in _words if word is not None])\n    try:\n        if sentence[-1] not in period_set:\n            sentence+=\"।\"\n    except:\n        # print(sentence)\n        sentence = \"।\"\n    return sentence\n'''\ndef handle_compound_words(sentence: str) -> str:\n    # Extended dictionary of common compound words in Bengali\n    compound_words_dict = {\n    \"চোখ পেতে\": \"চোখপেতে\",\n    \"হাত দেওয়া\": \"হাতদেওয়া\",\n    \"বাড়ি ফেরা\": \"বাড়িফেরা\",\n    \"জান দেওয়া\": \"জানদেওয়া\",\n    \"মুখ ফেরা\": \"মুখফেরা\",\n    \"গাড়ি চালানো\": \"গাড়িচালানো\",\n    \"প্রশ্ন করা\": \"প্রশ্নকরা\",\n    \"স্থান পাল্টা\": \"স্থানপাল্টা\",\n    \"মন দেওয়া\": \"মনদেওয়া\",\n    \"কাজ করা\": \"কাজকরা\",\n    \"সময় কাটা\": \"সময়কাটা\",\n    \"মাথা নড়া\": \"মাথানড়া\",\n    \"পা দেওয়া\": \"পাদেওয়া\",\n    \"চোখ মেলা\": \"চোখমেলা\",\n    \"কথা বলা\": \"কথাবলা\",\n    \"কান দেওয়া\": \"কানদেওয়া\",\n    \"নাম নেওয়া\": \"নামনেওয়া\",\n    \"দেশ ছাড়া\": \"দেশছাড়া\",\n    \"পানি খাওয়া\": \"পানিখাওয়া\",\n    \"চোখ বন্ধ\": \"চোখবন্ধ\",\n    \"পেট ভরা\": \"পেটভরা\",\n    \"মুখ খোলা\": \"মুখখোলা\",\n    \"হাত মেলা\": \"হাতমেলা\",\n    \"কান পেতে\": \"কানপেতে\",\n    \"চোখ দেখা\": \"চোখদেখা\",\n    \"মাথা ভাঙ্গা\": \"মাথাভাঙ্গা\",\n    \"পা ফেলা\": \"পাফেলা\",\n    \"হাত তোলা\": \"হাততোলা\",\n    \"কাজ শেষ\": \"কাজশেষ\",\n    \"গলা কাটা\": \"গলাকাটা\",\n    \"হৃদয় ভেঙ্গে\": \"হৃদয়ভেঙ্গে\",\n    \"চোখ ঝলকানো\": \"চোখঝলকানো\",\n    \"পেট বেঁধে\": \"পেটবেঁধে\",\n    \"মুখ মেটানো\": \"মুখমেটানো\",\n    \"কান সাঁতানো\": \"কানসাঁতানো\",\n    \"হাত ধরা\": \"হাতধরা\",\n    \"পা তোলা\": \"পাতোলা\",\n    \"চোখ বুজানো\": \"চোখবুজানো\",\n    \"হাত ছাওয়া\": \"হাতছাওয়া\",\n    \"কথা শোনা\": \"কথাশোনা\",\n    \"মুখ ভরা\": \"মুখভরা\",\n    \"গান গাওয়া\": \"গানগাওয়া\",\n    \"বই পড়া\": \"বইপড়া\",\n    \"চল ফেরা\": \"চলফেরা\",\n    \"ঘুম পাড়া\": \"ঘুমপাড়া\",\n    \"পা দেওয়া\": \"পাদেওয়া\",\n}\n\n\n    for compound, combined in compound_words_dict.items():\n        sentence = sentence.replace(compound, combined)\n\n    return sentence\n\n\ndef postprocess(sentence):\n    period_set = set([\".\", \"?\", \"!\", \"।\"])\n    \n    # Normalize words\n    _words = [bnorm(word)['normalized'] for word in sentence.split() if bnorm(word)['normalized'] is not None]\n    sentence = \" \".join(_words)\n    \n    # Handle common ASR errors specific to Bengali\n    \n\n    # Handle Compound Words (pseudo-code, replace with your implementation)\n    #sentence = handle_compound_words(sentence)\n    \n    # Remove extra spaces before punctuation\n    for punct in period_set:\n        sentence = sentence.replace(\" \" + punct, punct)\n    \n    # Append a period (Dari) if necessary\n    if not sentence or sentence[-1] not in period_set:\n        sentence += \"।\"\n    \n    return sentence\n","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:27:01.160971Z","iopub.execute_input":"2023-09-26T15:27:01.161892Z","iopub.status.idle":"2023-09-26T15:27:01.179063Z","shell.execute_reply.started":"2023-09-26T15:27:01.161846Z","shell.execute_reply":"2023-09-26T15:27:01.177443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pp_pred_sentence_list = [\n    postprocess(s) for s in tqdm(pred_sentence_list)]","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:27:01.180989Z","iopub.execute_input":"2023-09-26T15:27:01.181458Z","iopub.status.idle":"2023-09-26T15:27:01.250244Z","shell.execute_reply.started":"2023-09-26T15:27:01.18142Z","shell.execute_reply":"2023-09-26T15:27:01.249091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test[\"sentence\"] = pp_pred_sentence_list\n\ntest.to_csv(\"submission.csv\", index=False)\n\nprint(test.head())","metadata":{"execution":{"iopub.status.busy":"2023-09-26T15:27:01.251891Z","iopub.execute_input":"2023-09-26T15:27:01.252354Z","iopub.status.idle":"2023-09-26T15:27:01.271898Z","shell.execute_reply.started":"2023-09-26T15:27:01.252319Z","shell.execute_reply":"2023-09-26T15:27:01.270698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## EOF","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}