{"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":"someone has to figure out:  \n~~1. install nemo without internet ~~  \n~~2. how to configure nemo to use local files for tokenizer, etc ...~~    \n\nWith 'Conformer-CTC-BPE.nemo', it achieve  WER 0.2600063794449883 for 29587 mp3 files in the kaggle validation split of train.csv kaggle dataset\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-07-19T03:11:21.095059Z","iopub.execute_input":"2023-07-19T03:11:21.095657Z","iopub.status.idle":"2023-07-19T03:12:11.985528Z","shell.execute_reply.started":"2023-07-19T03:11:21.095615Z","shell.execute_reply":"2023-07-19T03:12:11.984197Z"}}},{"cell_type":"code","source":"# with internet \n\n# ! apt-get install sox libsox-fmt-mp3 -y\n# #!apt-get install ffmpeg\n# #!apt-get install libsndfile1\n# #!pip install Cython\n# !pip install nemo_toolkit['all']\n# print('INSTALL OK !!!!!')","metadata":{"execution":{"iopub.status.busy":"2023-07-20T05:26:32.405205Z","iopub.execute_input":"2023-07-20T05:26:32.40582Z","iopub.status.idle":"2023-07-20T05:26:32.411653Z","shell.execute_reply.started":"2023-07-20T05:26:32.405787Z","shell.execute_reply":"2023-07-20T05:26:32.410683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from IPython.display import clear_output\nimport sys, os\n\nif 1: \n    !cp -r '/kaggle/input/nemo-non-wheels' '/kaggle/working/' \n    #os.chdir('/kaggle/working/non-wheels')\n    #!pwd\n    #!ls\n    \n    non_wheel_dir = '/kaggle/working/nemo-non-wheels'\n    for d in[\n        f'{non_wheel_dir}/wget-3.2/wget-3.2',\n        f'{non_wheel_dir}/sacremoses-0.0.53/sacremoses-0.0.53',\n        #'/youtokentome-1.0.6/youtokentome-1.0.6',  \n        f'{non_wheel_dir}/kaldi-python-io-1.2.2/kaldi-python-io-1.2.2',\n        #'/antlr4-python3-runtime-4.9.3/antlr4-python3-runtime-4.9.3',\n        f'{non_wheel_dir}/Distance-0.1.3/distance',\n        f'{non_wheel_dir}/rouge_score-0.1.2/rouge_score-0.1.2',\n        f'{non_wheel_dir}/sentence-transformers-2.2.2/sentence-transformers-2.2.2', \n        f'{non_wheel_dir}/progress-1.6/progress-1.6',\n\n        f'{non_wheel_dir}/cdifflib-1.2.6/cdifflib-1.2.6',\n        f'{non_wheel_dir}/audioread-3.0.0/audioread-3.0.0',\n        f'{non_wheel_dir}/docopt-0.6.2/docopt-0.6.2',\n        f'{non_wheel_dir}/ipadic-1.0.0/ipadic-1.0.0',\n        f'{non_wheel_dir}/jieba-0.42.1/jieba-0.42.1',\n        f'{non_wheel_dir}/pathtools-0.1.2/pathtools-0.1.2',\n        f'{non_wheel_dir}/lit-16.0.6/lit-16.0.6',\n        #note: i skip fasttext, i.e not installed\n    ] :\n        os.chdir(d)\n        !python setup.py install \n    clear_output(wait=True)\n    \n    #-----------------------------------------------------------------------\n    os.chdir(f'{non_wheel_dir}/nemo_toolkit-1.20.0rc0/nemo_toolkit') \n    !pip install -e .[all] --no-index --find-links /kaggle/input/nemo-wheels\n    clear_output(wait=True)\n\n    \n#check\nimport nemo\nprint('nemo', nemo.__version__)\nprint('nemo', nemo.__file__)\nimport nemo.collections.asr as nemo_asr\n\n#!rm -rf /kaggle/working/non-wheels\n\nos.chdir('/kaggle/working')\n!pwd\n!ls\nprint('ok!!!')","metadata":{"execution":{"iopub.status.busy":"2023-07-20T06:44:16.491467Z","iopub.execute_input":"2023-07-20T06:44:16.493891Z","iopub.status.idle":"2023-07-20T06:46:47.023211Z","shell.execute_reply.started":"2023-07-20T06:44:16.493819Z","shell.execute_reply":"2023-07-20T06:46:47.020311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# bert-base-cased tokenizer\n\n# https://stackoverflow.com/questions/63312859/how-to-change-huggingface-transformers-default-cache-directory\n# https://github.com/huggingface/transformers/blob/6112b1c6442aaf7affd2b0676a1cd4eee30c45cf/src/transformers/utils/hub.py#L100\n# https://huggingface.co/docs/huggingface_hub/guides/manage-cache \n\n#!rm -rf '/kaggle/working/hf_cache'\n\nif 1:\n    hf_dir = '/root/.cache/huggingface'\n        \n    !cp -r '/kaggle/input/local-nemo-installer/hf_cache/hub' $hf_dir\n    os.chdir(f'{hf_dir}')\n    !pwd\n    !ls -all\n    \n    # i think kaggle cannot upload empty folder and symbolic links ????\n    !mkdir '/root/.cache/huggingface/hub/models--bert-base-cased/snapshots'\n    !mkdir '/root/.cache/huggingface/hub/models--bert-base-cased/snapshots/5532cc56f74641d4bb33641f5c76a55d11f846e0' \n    !mkdir '/root/.cache/huggingface/hub/models--bert-base-cased/.no_exist'\n    !mkdir '/root/.cache/huggingface/hub/models--bert-base-cased/.no_exist/5532cc56f74641d4bb33641f5c76a55d11f846e0' \n    !touch '/root/.cache/huggingface/hub/models--bert-base-cased/.no_exist/5532cc56f74641d4bb33641f5c76a55d11f846e0/added_tokens.json'\n    !touch '/root/.cache/huggingface/hub/models--bert-base-cased/.no_exist/5532cc56f74641d4bb33641f5c76a55d11f846e0/special_tokens_map.json'\n \n    for source_file, symbolic_link in [\n        ['107460496b431545e4f921afb3fd5486fd2ae79d', 'config.json'],\n        ['e3c6d456fb2616f01a9a6cd01a1be1a36353ed22', 'tokenizer_config.json'],\n        ['2ea941cc79a6f3d7985ca6991ef4f67dad62af04', 'vocab.txt'],\n    ]:\n        source_file = \\\n            f'{hf_dir}/hub/models--bert-base-cased/blobs/{source_file}'\n        symbolic_link = \\\n            f'{hf_dir}/hub/models--bert-base-cased/snapshots/5532cc56f74641d4bb33641f5c76a55d11f846e0/{symbolic_link}'\n        !ln -s $source_file $symbolic_link\n        \n    #check \n    os.chdir(f'{hf_dir}/hub/models--bert-base-cased/snapshots/5532cc56f74641d4bb33641f5c76a55d11f846e0')\n    !pwd\n    !ls -all\n    print('')\n\n \n#check   \nfrom huggingface_hub import scan_cache_dir\nhf_cache_info = scan_cache_dir()\nprint(hf_cache_info.__dict__) \nprint('')\n\nos.chdir('/kaggle/working')\n!pwd\n!ls","metadata":{"execution":{"iopub.status.busy":"2023-07-20T06:48:08.813987Z","iopub.execute_input":"2023-07-20T06:48:08.814676Z","iopub.status.idle":"2023-07-20T06:48:26.941611Z","shell.execute_reply.started":"2023-07-20T06:48:08.814611Z","shell.execute_reply":"2023-07-20T06:48:26.939754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# <todo> for now we replace sox with librosa \n\n# ! apt-get install sox libsox-fmt-mp3 -y\n\n# for d in [\n#     '/kaggle/input/sox-deb/libmagic1_13a5.38-4_amd64.deb',\n#     '/kaggle/input/sox-deb/libsox3_14.4.2git20190427-2deb11u2build0.20.04.1_amd64.deb',\n#     '/kaggle/input/sox-deb/libsox-fmt-base_14.4.2git20190427-2deb11u2build0.20.04.1_amd64.deb',\n#     '/kaggle/input/sox-deb/libsox-fmt-alsa_14.4.2git20190427-2deb11u2build0.20.04.1_amd64.deb',\n#     '/kaggle/input/sox-deb/sox_14.4.2git20190427-2deb11u2build0.20.04.1_amd64.deb',\n# ]:      \n#     !dpkg -i $d \n\n# print('ok!!!')\n# #clear_output(wait=True)\n\nif 0:\n    from sox import Transformer\n    tfm = Transformer()\n    tfm.rate(samplerate=16000)\n    tfm.channels(n_channels=1)\n\n    mp3_dir = f'/kaggle/input/bengaliai-speech/train_mp3s'\n    id = '000005f3362c'\n    mp3_file  = f'{mp3_dir}/{id}.mp3'    \n\n    !pwd\n    print(tfm.build(input_filepath=mp3_file, output_filepath='temp.wav')) ","metadata":{"execution":{"iopub.status.busy":"2023-07-20T05:32:07.08409Z","iopub.execute_input":"2023-07-20T05:32:07.084849Z","iopub.status.idle":"2023-07-20T05:32:07.097115Z","shell.execute_reply.started":"2023-07-20T05:32:07.084806Z","shell.execute_reply":"2023-07-20T05:32:07.09599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import nemo\nprint('nemo', nemo.__version__)\nprint('nemo', nemo.__file__)\nimport nemo.collections.asr as nemo_asr\n\nfrom omegaconf import DictConfig, OmegaConf\n\nimport numpy as np\nimport pandas as pd\nimport jiwer\n\n#from sox import Transformer\nimport librosa\nimport soundfile as sf\nimport pydub\nfrom pydub import AudioSegment\n\nmode='debug'\nif mode=='debug':\n    mp3_dir = f'/kaggle/input/bengaliai-speech/train_mp3s'\n    valid_df = pd.read_csv('/kaggle/input/bengaliai-speech/train.csv')\n    valid_df = valid_df[:10]\nif mode=='submit':\n    mp3_dir = f'/kaggle/input/bengaliai-speech/test_mp3s'\n    valid_df = pd.read_csv('/kaggle/input/bengaliai-speech/sample_submission.csv')\n    \nprint(len(valid_df))\nprint(valid_df['id'][:25].tolist())\n\n#########################################################################\n# tfm = Transformer()\n# tfm.rate(samplerate=16000)\n# tfm.channels(n_channels=1)\n\ncheckpoint_file = \\\n    '/kaggle/input/local-nemo-installer/Conformer-CTC-BPE.nemo'\n\n#tokenizer_dir = '/kaggle/input/local-nemo-installer/tokenizer/banglabert_large'\n#config_yaml   = '/kaggle/input/local-nemo-installer/model_config.yaml'\n#cfg = OmegaConf.load(config_yaml)\n#cfg.tokenizer.vocab_path=f'{tokenizer_dir}/vocab.txt'\n#cfg.tokenizer.dir=tokenizer_dir\n#cfg.train_ds.manifest_filepath='null'\n#cfg.validation_ds.manifest_filepath='null'\n#print(cfg)\n#asr_model = nemo_asr.models.EncDecCTCModelBPE(cfg=cfg)\n\nasr_model = nemo_asr.models.EncDecCTCModelBPE.restore_from(\n\trestore_path=checkpoint_file,\n\t#override_config_path=cfg\n)\n\nif mode=='submit':\n    asr_model.cuda()\n    \npredict=[]\nfor t, d in valid_df.iterrows():\n    print('\\r', t, d['id'], end='')\n    #print(t, d['id'])\n    mp3_file  = f'{mp3_dir}/{d[\"id\"]}.mp3'\n    \n    #tfm.build(input_filepath=mp3_file, output_filepath='temp.wav')\n    sound = AudioSegment.from_mp3(mp3_file)\n    sound.export('temp.wav', format=\"wav\") \n    y, sr = librosa.load('temp.wav')\n    y = librosa.resample(y, orig_sr=sr, target_sr=16000)\n    y = librosa.to_mono(y)\n    sf.write('temp.wav', y, 16000, 'PCM_16') #PCM_16\n     \n    p = asr_model.transcribe(paths2audio_files=['temp.wav', ], batch_size=1)[0] \n    p = p[:-2]+p[-1] ##?\n    predict.append(p)\n    \n    if mode=='debug':\n        print(p)\n        print(d.sentence)\n        print('')\n\nif mode=='debug':\n    score = jiwer.wer(valid_df['sentence'].to_list(), predict)\n    print('jiwer', score)\n    \nprint('')\nsubmit_df = valid_df.copy()\nsubmit_df.loc[:,'sentence']=predict\nsubmit_df.to_csv('submission.csv',index=False)\nprint(submit_df)\nprint('SUBMIT DONE !!!!!!!')\n\n\n# from huggingface_hub import scan_cache_dir\n# hf_cache_info = scan_cache_dir()\n# pprint.pprint(hf_cache_info.__dict__)","metadata":{"execution":{"iopub.status.busy":"2023-07-20T06:55:23.774890Z","iopub.execute_input":"2023-07-20T06:55:23.775445Z","iopub.status.idle":"2023-07-20T06:57:24.917114Z","shell.execute_reply.started":"2023-07-20T06:55:23.775404Z","shell.execute_reply":"2023-07-20T06:57:24.916031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!rm -rf /kaggle/working/nemo-non-wheels\n#must delete ... it is  a bug that kaggler server cannot \n# find submission.csv if there are too many files in /kaggle/working/\n\nos.chdir('/kaggle/working')\n!pwd\n!ls","metadata":{"execution":{"iopub.status.busy":"2023-07-20T05:32:03.799852Z","iopub.execute_input":"2023-07-20T05:32:03.801229Z","iopub.status.idle":"2023-07-20T05:32:07.069673Z","shell.execute_reply.started":"2023-07-20T05:32:03.80119Z","shell.execute_reply":"2023-07-20T05:32:07.068389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"### helper functionc ####\n\nimport subprocess\nfrom IPython.display import FileLink, display\n\ndef download_file(path, download_zip_file_name):\n    os.chdir('/kaggle/working/')\n    zip_name = f\"/kaggle/working/{download_zip_file_name}\"\n    command = f\"zip {zip_name} {path} -r\"\n    print('zip ...')\n    result = subprocess.run(command, shell=True, capture_output=True, text=True)\n    if result.returncode != 0:\n        print(\"Unable to run zip command!\")\n        print(result.stderr)\n        return\n    display(FileLink(f'{download_zip_file_name}'))\nif 0:   \n    download_file('/kaggle/working/hf_cache', 'hf_cache.out.zip')","metadata":{"execution":{"iopub.status.busy":"2023-07-20T05:32:07.098885Z","iopub.execute_input":"2023-07-20T05:32:07.099658Z","iopub.status.idle":"2023-07-20T05:32:07.110772Z","shell.execute_reply.started":"2023-07-20T05:32:07.099621Z","shell.execute_reply":"2023-07-20T05:32:07.109701Z"},"trusted":true},"execution_count":null,"outputs":[]}]}