{"cells":[{"metadata":{},"cell_type":"markdown","source":"Esse notebook foi feito para gerar mel-espectrogramas usando a biblioteca librosa."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"#Importando biblioteca utilizadas.\n\nimport os\nimport librosa as librosa\nimport numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport librosa.display\nimport warnings\nimport cv2\nimport timeit\nimport pandas as pd\n\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"A função abaixo recebe um mel-espectrograma gerado pelo librosa e retorna uma array que representa uma imagem. Será usado mais abaixo."},{"metadata":{"trusted":true},"cell_type":"code","source":"def mono_to_color(X: np.ndarray,\n                  mean=None,\n                  std=None,\n                  norm_max=None,\n                  norm_min=None,\n                  eps=1e-6):\n    \"\"\"\n    Code from https://www.kaggle.com/daisukelab/creating-fat2019-preprocessed-data\n    \"\"\"\n    # Stack X as [X,X,X]\n    #X = np.stack([X, X, X], axis=-1)\n\n    # Standardize\n    mean = mean or X.mean()\n    X = X - mean\n    std = std or X.std()\n    Xstd = X / (std + eps)\n    _min, _max = Xstd.min(), Xstd.max()\n    norm_max = norm_max or _max\n    norm_min = norm_min or _min\n    if (_max - _min) > eps:\n        # Normalize to [0, 255]\n        V = Xstd\n        V[V < norm_min] = norm_min\n        V[V > norm_max] = norm_max\n        V = 255 * (V - norm_min) / (norm_max - norm_min)\n        V = V.astype(np.uint8)\n    else:\n        # Just zero\n        V = np.zeros_like(Xstd, dtype=np.uint8)\n    return V","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"O código em baixo é uma maneira mais rápida de carregar os audios com o librosa"},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_clip_sr(path,offset=0,duration=None):\n    clip, sr_native = librosa.core.audio.__audioread_load(path, offset=offset, duration=duration, dtype=np.float32)\n    clip = librosa.to_mono(clip)\n    sr = 22050\n    if sr_native > 0:\n        clip = librosa.resample(clip, sr_native, sr, res_type='kaiser_fast')\n    return clip, sr","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Abaixo estou iterando por todos as linhas presentes no arquivo train.csv e extraindo os mel-espectrogramas e gerando imagens para os 5s iniciais de cada audios pertencente a primeira espécie."},{"metadata":{"trusted":true},"cell_type":"code","source":"#Definindo os caminhos dos audios e abrindo o arquivo csv\ndir = \"../input/segmentation-by-amplitude-signal-on-subsample/\"\nsets = ['val','test','train']\n\nt=0\nv=0\ne=0\ncnt = 0 \n\nfor _set in sets:\n    \n    path_set = os.path.join(dir,_set) \n    species = os.listdir(path_set)\n    print(len(species))\n    \n    os.mkdir(_set);\n    \n    species.sort()\n    \n    for sp in species:\n               \n        os.mkdir(os.path.join(_set,sp));        \n                \n        path_species = os.path.join(path_set,sp)\n        \n        if(not(os.path.isdir(path_species))):\n            continue\n        \n        audios = os.listdir(path_species)\n        \n        for audio in audios:\n            if(_set == 'train'):\n                t+=1;\n                \n            if(_set == 'val'):\n                v+=1;\n            \n            if(_set == 'test'):\n                e+=1;\n\n            full_path = os.path.join(path_species,audio)\n            \n            #Carregando os 5s iniciais do aúdio\n            y,sr =  get_clip_sr(full_path);\n\n            #Transformando em mel-spectrograma\n            S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=310,fmin=160,fmax=10300)\n            S_dB = librosa.power_to_db(S, ref=np.max)\n\n            #Ajustando imagem\n            im = mono_to_color(S_dB);\n            im = cv2.resize(im, (224,224))\n            im = cv2.flip(im, 0)\n\n            #Escrevendo imagem\n            cv2.imwrite('{}/{}/{}.png'.format(_set,sp,audio[:-4]),im)\n            cnt += 1\n            \n            \nprint('{} samples for train'.format(t))\nprint('{} samples for validation'.format(v))\nprint('{} samples for test'.format(e))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Exemplo de visualização das imagens geradas."},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.image as mpimg\nimg = mpimg.imread('./test/aldfly/6.png')\nimgplot = plt.imshow(img)","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}