{"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":"import numpy as np\nimport pandas as pd\nimport os\nfrom pydub import AudioSegment\nfrom glob import glob\nfrom scipy.io import wavfile\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.metrics import accuracy_score\n\n#Amostra os sinais de áudio\ndef amostrar(sinal:np.array, L:int):\n\n    amostras = []\n    step = int(len(sinal) / L)\n\n    for i in range(0, len(sinal), step):\n        if type(sinal[i]) == np.ndarray:\n            amostras.append(np.mean(sinal[i]))\n        else:\n            amostras.append(sinal[i])\n\n    if len(amostras) > L:\n        while len(amostras) > L:\n            amostras.remove(amostras[-1])\n\n    return amostras\n\n# Calcula a Transformada de Fourier do sinal e desloca o intervalo\ndef Fourier(sinal, L):\n\n    fft_sinal = np.fft.fft(sinal, L)           # Calculando a FFT \n    fft_sinal = np.fft.fftshift(fft_sinal)     # Ajustando para intervalo de -pi a pi\n\n    return fft_sinal\n\n\nL = 13                     # Número de amostras para sinal amostrado\nchaves = ['f_'+str(x) for x in range(L)]\nfrequencias = {}\nfor chave in chaves:\n    frequencias[chave] = []\nfrequencias['passaro'] = []\n\n\narquivos = glob('/kaggle/input/birdclef-2023/train_audio/*/*.ogg')\n\n# Vasculha os arquivos de áudio dos pássaros\nfor i in range(len(arquivos)):\n    \n    nome = str(arquivos[i])\n    wav = nome[:-4] + '.wav'    \n    sound = AudioSegment.from_ogg(nome)      # Lê o arquivo .ogg\n    sound.export(wav, format=\"wav\")          # Cria um .wav a partir do .ogg\n    _, sinal = wavfile.read(wav)             # Salva o .wav para manipulá-lo\n              \n    sinal_amostrado = amostrar(sinal, L)\n    sinal_transformado = Fourier(sinal_amostrado, L)\n    sinal_magnitude = np.abs(sinal_transformado)      # Calcula o valor absoluto da transformada\n\n    for index, valor in enumerate(sinal_magnitude):\n        frequencias['f_' + str(index)].append(valor)  # Preenche as entradas da tabela de frequências\n    \n    frequencias['passaro'].append(nome.split('/')[5]) # Preenche a saída da tabela de frequências\n    os.remove(wav)\n\n#Cria dataset e o exporta como .csv para fácil manipulação\ndataset = pd.DataFrame(frequencias)\ndataset.to_csv('dataset.csv')\n\n#Carrega o .csv\ndataset = pd.read_csv('dataset.csv')\n\n#Separa a tabela em entrada e saída\nX = dataset.iloc[:, :-1].values\ny = dataset.iloc[:, -1].values\n\n#Divide entrada e saída em treino e teste\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)\n\n#Instancia o modelo KNN com 5 vizinhos e distância euclidiana e o treina\nclassifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)\nclassifier.fit(X_train, y_train)\n\n# Faz previsão e depois compara com o teste\ny_pred = classifier.predict(X_test)\naccuracy_score(y_test, y_pred)\n\n#Gera arquivo de previsões(resposta)\nsubmission = pd.DataFrame(y_pred)\nsubmission.to_csv('submission', index=False)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-27T02:16:01.306842Z","iopub.execute_input":"2023-03-27T02:16:01.308071Z","iopub.status.idle":"2023-03-27T02:16:05.71537Z","shell.execute_reply.started":"2023-03-27T02:16:01.308022Z","shell.execute_reply":"2023-03-27T02:16:05.713214Z"},"trusted":true},"execution_count":null,"outputs":[]}]}