{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport random\nimport tensorflow as tf\nimport re\nimport pandas as pd\nimport librosa   #for audio processing\nfrom scipy.io import wavfile #for audio processing\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nfrom pydub import AudioSegment\nfrom pydub.silence import split_on_silence\nimport subprocess\nimport glob\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelBinarizer\nimport keras\nfrom keras.layers import LSTM, Dense, Dropout, Flatten,Input, MaxPooling1D,Conv1D,Bidirectional,Attention,ELU\nfrom keras.models import Sequential,Model\nfrom keras.optimizers import Adam\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom tqdm.notebook import tqdm","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"# Import data\ntrain=os.listdir('../input/quran-asr-challenge/train_set')\n#test=os.listdir('../input/quran-asr-challenge/test_set')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"SEED = 2020\n#files = glob.glob('../input/quran-asr-challenge/train_set/' + \"*.mp3\")\nX_train, X_val = train_test_split(train, test_size=0.33, random_state=SEED)\n\nprint('# Training examples: {}'.format(len(X_train)))\nprint('# Validation examples: {}'.format(len(X_val)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dataset_det=pd.read_csv(\"../input/quran-asr-challenge/train_transcriptions.csv\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dataset_det.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"folder_name = \"./audios_wavs/\"\nif not os.path.isdir(folder_name):\n  os.mkdir(folder_name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#preprocess data to resample and save as wav\ndef read_audio(path):\n    '''\n    Reads in the audio file and returns\n    an array that we can turn into a melspectogram\n    '''\n    y, _ = librosa.core.load(path, sr=44100)\n    # trim silence\n    if 0 < len(y): # workaround: 0 length causes error\n        y, _ = librosa.effects.trim(y)\n    if len(y) > samples: # long enough\n        y = y[0:0+samples]\n    else: # pad blank\n        padding = samples - len(y)\n        offset = padding // 2\n        y = np.pad(y, (offset, samples - len(y) - offset), 'constant')\n    return y\n\ndef audio_to_melspectrogram(audio):\n    '''\n    Convert to melspectrogram after audio is read in\n    '''\n    spectrogram = librosa.feature.melspectrogram(audio, \n                                                 sr=sr,\n                                                 n_mels=n_mels,\n                                                 hop_length=hop_length,\n                                                 n_fft=n_fft,\n                                                 fmin=fmin,\n                                                 fmax=fmax)\n    return librosa.power_to_db(spectrogram).astype(np.float32)\n\ndef read_as_melspectrogram(path):\n    '''\n    Convert audio into a melspectrogram \n    so we can use machine learning\n    '''\n    mels = audio_to_melspectrogram(read_audio(path))\n    return mels\n\ndef convert_wav_to_image(df):\n    X = []\n    for row in tqdm(df):\n        #audio = AudioSegment.from_mp3('../input/quran-asr-challenge/train_set/'+row)\n        #audio = audio.set_frame_rate(8000)\n           \n       # audio.export('./audios_wavs/'+row.split('.')[0]+'.wav', format=\"wav\")\n        x = read_as_melspectrogram('./audios_wavs/'+row.split('.')[0]+'.wav')\n        X.append(x.transpose())\n    return X\n\ndef normalize(img):\n    '''\n    Normalizes an array \n    (subtract mean and divide by standard deviation)\n    '''\n    eps = 0.001\n    if np.std(img) != 0:\n        img = (img - np.mean(img)) / np.std(img)\n    else:\n        img = (img - np.mean(img)) / eps\n    return img\n\ndef normalize_dataset(X):\n    '''\n    Normalizes list of arrays\n    (subtract mean and divide by standard deviation)\n    \n    '''\n    normalized_dataset = []\n    for img in X:\n        normalized = normalize(img)\n        normalized_dataset.append(normalized)\n    return normalized_dataset","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#another function to preprocess depend on batch a dataset is big\ndef batch_generator(data, batch_size=10):\n    while 1:\n        random.shuffle(data)\n        X, y_er = [], []\n        for i in range(batch_size):\n            data\n            wav = data[i]\n            #audio = AudioSegment.from_mp3('../input/quran-asr-challenge/train_set/'+wav)\n            #audio = audio.set_frame_rate(8000)\n           \n            #audio.export('./audios_wavs/'+wav.split('.')[0]+'.wav', format=\"wav\")\n            \n            #wave, sr = librosa.load('./audios_wavs/'+wav.split('.')[0]+'.wav', mono=True)\n            #print(len(wave))\n            #wave = librosa.resample(wave, sr, 8000)\n            x_r=wav.split('.')[0]\n            label = dataset_det[dataset_det['audio_id']==int(x_r)]\n            label=np.array(label['text'])[0]\n            y_er.append(one_hot_encode([label]))\n            \n           # mfcc = librosa.feature.mfcc(wave, sr)\n            #mfcc = np.pad(mfcc, ((0,0), (0, max_length-\n            #len(mfcc[0]))), mode='constant', constant_values=0) \n            #X.append(np.array(mfcc))\n            ff=convert_wav_to_image('../input/quran-asr-challenge/train_set/'+wav)\n            #print(ff)\n            #print(y)\n            X.append(ff[0])\n            #X=np.array(X).reshape(-1,len(X),1)\n            #print(y_er)\n        yield np.array(X),y_er","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#for big dadtset we take 10000 sample to do the idea\nlabels=[]\nfor x in range(0,10000):\n    wav = X_train[x]\n    #audio = AudioSegment.from_mp3('../input/quran-asr-challenge/train_set/'+wav)\n    #audio = audio.set_frame_rate(8000)\n           \n    #audio.export('./audios_wavs/'+wav.split('.')[0]+'.wav', format=\"wav\")\n            \n    #wave, sr = librosa.load('./audios_wavs/'+wav.split('.')[0]+'.wav', mono=True)\n            #print(len(wave))\n   # wave = librosa.resample(wave, sr, 8000)\n    x_r=wav.split('.')[0]\n    label = dataset_det[dataset_det['audio_id']==int(x_r)]\n   # all_wave.append(wave)\n    labels.append(np.array(label['text'])[0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(labels)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#convert catgoraicl to label binariz\nlabel_binarizer = LabelBinarizer()\ny=label_binarizer.fit_transform(list((labels)))\n#y=le.fit_transform(all_label)\nclasses= list(label_binarizer.classes_)\n#def one_hot_encode(x): return label_binarizer.transform(x)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(classes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#call preprocess to extract data\nX = np.array(convert_wav_to_image(X_train[0:10000]))\nX = normalize_dataset(X)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Spilt to test and train\nX_tr, X_va,y_tr,y_te = train_test_split(X,y, test_size=0.11, random_state=SEED)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"es = EarlyStopping(monitor='val_acc', mode='max', verbose=1, patience=10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sr = 44100 # Sampling rate\nduration = 5\nhop_length = 347 # to make time steps 128\nfmin = 20\nfmax = sr // 2\nn_mels = 128\nn_fft = n_mels * 20\nsamples = sr * duration","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#lstm model structure\nlearning_rate = 0.001\nbatch_size = 64\nn_epochs = 50\ndropout = 0.5\ninput_shape = (636,128)\noptimizer = Adam(0.005, beta_1=0.1, beta_2=0.001, amsgrad=True)\nmodel_lst = Sequential()\nmodel_lst.add(LSTM(128, return_sequences=True, input_shape=input_shape,\n   dropout=dropout))\nmodel_lst.add(Flatten())\nmodel_lst.add(Dense(128, activation='relu'))\nmodel_lst.add(Dropout(dropout))\nmodel_lst.add(Dense(len(classes), activation='softmax'))\nmodel_lst.compile(loss='categorical_crossentropy',\n              optimizer=optimizer,\n              metrics=['acc'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"hist = model_lst.fit(np.array(X_tr),\n          np.array(y_tr),\n          batch_size=32,\n          epochs=300,\n          verbose=1 ,         \n          validation_data=(np.array(X_va), np.array(y_te)),\n          callbacks = [es])\n          ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Visualize loss\nloss = hist.history['loss']\nval_loss = hist.history['val_loss']\nstopped_epoch = es.stopped_epoch\nepochs = range(stopped_epoch+1)\n\nplt.figure(figsize=(15,5))\nplt.plot(epochs, loss)\nplt.plot(epochs, val_loss)\nplt.title('Loss over epochs', weight='bold', fontsize=22)\nplt.xlabel('Epochs', fontsize=16)\nplt.ylabel('Loss', fontsize=16)\nplt.legend(['Training loss', 'Validation loss'], fontsize=16)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Visualize Accuracy\nacc = hist.history['acc']\nval_acc = hist.history['val_acc']\nepochs = range(stopped_epoch+1)\n\nplt.figure(figsize=(15,5))\nplt.plot(epochs, acc)\nplt.plot(epochs, val_acc)\nplt.title('Accuracy over epochs', weight='bold', fontsize=22)\nplt.xlabel('Epochs', fontsize=16)\nplt.ylabel('Accuracy', fontsize=16)\nplt.legend(['Training accuracy', 'Validation accuracy'], fontsize=16)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#another cnn model with batch generator\ninputs = Input(shape=(636,128))\n\n#First Conv1D layer\nconv = Conv1D(8,13, padding='valid', activation='relu', strides=1)(inputs)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.3)(conv)\n\n#Second Conv1D layer\nconv = Conv1D(16, 11, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.3)(conv)\n\n#Third Conv1D layer\nconv = Conv1D(32, 9, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.3)(conv)\n\n#Fourth Conv1D layer\nconv = Conv1D(64, 7, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.3)(conv)\n\n#Flatten layer\nconv = Flatten()(conv)\n\n#Dense Layer 1\nconv = Dense(256, activation='relu')(conv)\nconv = Dropout(0.3)(conv)\n\n#Dense Layer 2\nconv = Dense(128, activation='relu')(conv)\nconv = Dropout(0.3)(conv)\n\noutputs = Dense(len(classes), activation='softmax')(conv)\n\nmodel_x = Model(inputs, outputs)\nmodel_x.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model_x.compile(loss='categorical_crossentropy',optimizer=optimizer,metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history=model_x.fit(np.array(X), np.array(y),verbose=1 ,epochs=50,  batch_size=32)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":" history = model_x.fit_generator(\n   generator=batch_generator(X_train, 32),\n   steps_per_epoch=50,\n   epochs=50,\n   verbose=1,\n   validation_data=batch_generator(X_val, 32),\n   validation_steps=5\n )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_audio_path = '../input/quran-asr-challenge/train_set/'\nsamples, sample_rate = librosa.load(train_audio_path+'15576775.mp3')\nprint(len(samples))\nprint(sample_rate)\nsample_rate=200448\nfig = plt.figure(figsize=(14, 8))\nax1 = fig.add_subplot(211)\nax1.set_title('Raw wave')\nax1.set_xlabel('time')\nax1.set_ylabel('Amplitude')\nax1.plot(np.linspace(0, sample_rate/len(samples), sample_rate), samples)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}