{"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":"!pip install -q git+https://github.com/mnansary/gsoc-wav2vec2.git","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference on wave2vec2 tf tpu arijitx transfer-learning\n* [Tfrecords creation Script](https://www.kaggle.com/code/nazmuddhohaansary/tfrecords-for-transferlearning/notebook)\n* [Training with TPU Script](https://www.kaggle.com/code/nazmuddhohaansary/wave2vec2-tpu-transfer-learning-dl-sprint)","metadata":{}},{"cell_type":"code","source":"#-------------------------------\n# imports\n#-------------------------------\nimport os\nos.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' \nimport tensorflow as tf\n\nimport pandas as pd \nimport warnings\nimport librosa\nimport numpy as np \n\nfrom tqdm.auto import tqdm\nfrom pandarallel import pandarallel\nfrom multiprocessing import Process\nfrom wav2vec2 import RobustWav2Vec2Config,Wav2Vec2\n\npandarallel.initialize(progress_bar=True,nb_workers=8)\ntqdm.pandas()\nwarnings.filterwarnings('ignore')\n\n#--------------------------------------------\n# vocab\n#--------------------------------------------\nVOCAB   =[' ', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', \n          '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', \n          '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', \n          '<empty>', '<empty>', '<empty>', '<empty>', '<empty>', '।', 'ঁ', 'ং', 'ঃ', 'অ', 'আ', 'ই', \n          'ঈ', 'উ', 'ঊ', 'ঋ', 'এ', 'ঐ', 'ও', 'ঔ', 'ক', 'খ', 'গ', 'ঘ', 'ঙ', 'চ', 'ছ', 'জ', 'ঝ', 'ঞ', \n          'ট', 'ঠ', 'ড', 'ঢ', 'ণ', 'ত', 'থ', 'দ', 'ধ', 'ন', 'প', 'ফ', 'ব', 'ভ', 'ম', 'য', 'র', 'ল',\n          'শ', 'ষ', 'স', 'হ', '<empty>', 'া', 'ি', 'ী', 'ু', 'ূ', 'ৃ', 'ে', 'ৈ', 'ো', 'ৌ', '্', 'ৎ', \n          '<empty>', 'ড়', 'ঢ়', 'য়', '০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯', '<empty>', '<empty>', \n          '\\u200d', '<empty>', '<empty>', '', '<s>', '</s>']\n\nprint(\"Vocab Len:\",len(VOCAB))\nprint(\"Pad Id:\",VOCAB.index(\"\"))\n#--------------------------------------------\n# config\n#--------------------------------------------\nconfig = RobustWav2Vec2Config()\nconfig.pad_id=VOCAB.index(\"\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modeling","metadata":{}},{"cell_type":"code","source":"class cfg:\n    audio_shape      =  (246000,)                   # this is actually fixed for the pretrained weights we are using -- highets audio length=15 secs\n    label_shape      =  (250,)                      # this is actually fixed for the pretrained weights we are using \n    sample_rate      =  16000\n    shuffle_buffer   =  1024\n    batch_size       =  12\n    vocab_len        =  len(VOCAB)                \n    embed_dim        =  1024\n    \ndef create_model(cfg):\n    inputs = tf.keras.Input(shape=cfg.audio_shape)\n    # avoid using spec augmentation\n    config.apply_spec_augment=False\n    states = Wav2Vec2(config)(inputs)\n    logits= tf.keras.layers.Dense(cfg.vocab_len,name=\"lm_head\")(states)\n    model = tf.keras.Model(inputs=inputs, outputs=logits)\n    return model\n\nmodel=create_model(cfg)\nmodel.layers[1].freeze_feature_extractor()\nmodel.load_weights(\"../input/arijitx-transfer-tf-weights/model.h5\")\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Datapipeline","metadata":{}},{"cell_type":"code","source":"sub=pd.read_csv(\"../input/dlsprint/sample_submission.csv\")\nsub","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TEST_WAVS=\"../input/test-wav-files-dl-sprint/test_files_wav\"\nPREDS=[]\nSAMPLE_RATE=16000\n\ndef load_data(path):\n    \"\"\"loads a wav\"\"\"\n    wave,_= librosa.load(path, sr=SAMPLE_RATE, mono=True)\n    wave=np.trim_zeros(wave)\n    return wave\n\ndef normalize(x):\n    # -> (1, seqlen)\n    mean = tf.reduce_mean(x, axis=-1, keepdims=True)\n    var = tf.math.reduce_variance(x, axis=-1, keepdims=True)\n    return tf.squeeze((x - mean) / tf.sqrt(var + 1e-5))\n\nfor idx in tqdm(range(0,len(sub),cfg.batch_size)):\n    batch=[]\n    for bi in range(idx,idx+cfg.batch_size):\n        _path=sub.iloc[bi,0]\n        _path=os.path.join(TEST_WAVS,_path).replace(\".mp3\",\".wav\")\n        signal=load_data(_path)\n        signal=normalize(signal)\n        pad=tf.cast([0.0 for _ in range(cfg.audio_shape[0]-signal.shape[0])],tf.float32)\n        signal=tf.concat([signal,pad],axis=-1)\n        batch.append(tf.expand_dims(signal,axis=0))\n    batch=tf.concat(batch,axis=0)\n    preds=model(batch,training=False)\n    for pred in preds:\n        out=np.argmax(pred,axis=-1)\n        text=[VOCAB[i] for i in out]\n        text=\"\".join(text)\n        PREDS.append(text)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub","metadata":{},"execution_count":null,"outputs":[]}]}