-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathproyectovocales.py
131 lines (103 loc) · 5.05 KB
/
proyectovocales.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 29 10:17:05 2022
@author: garzo
"""
# Importar librerías necesarias para el proyecto
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import librosa # En Anaconda Promp: conda install -c conda-forge librosa
import csv
import os
import pandas as pd
from sklearn import preprocessing
#------------------------- EXTRACCIÓN Y PREPARACIÓN DE LOS DATOS ------------------------------------------------
# Las funciones utilizadas para esta sección "extraccionArchivosWAV" y "preProcessDatos" son adaptaciones de las funciones
# extractWavFeatures y preProcessData del proyecto Spoken Digits Recognition https://github.com/ravasconcelos/spoken-digits-recognition
# Función para convertir las características de los archivos WAV en datos en formato csv
def extraccionArchivosWAV(carpetaDeArchivos, ArchivoCSV):
print("las características de los archivos en la carpeta "+carpetaDeArchivos+" se están guardando en el archivo "+ArchivoCSV)
header = 'filename chroma_stft rmse spectral_centroid spectral_bandwidth rolloff zero_crossing_rate'
for i in range(1, 21):
header += f' mfcc{i}'
header += ' label'
header = header.split()
#print('CSV Header: ', header)
file = open(ArchivoCSV, 'w', newline='')
writer = csv.writer(file)
writer.writerow(header)
#vocales = 'a e i o u'.split()
for filename in os.listdir(carpetaDeArchivos):
letra = f'{carpetaDeArchivos}/{filename}'
y, sr = librosa.load(letra, mono=True, duration=30)
# Quitar ruidos y silencios de los archivos
y, index = librosa.effects.trim(y)
chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
rmse = librosa.feature.rms(y=y)
spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
zcr = librosa.feature.zero_crossing_rate(y)
mfcc = librosa.feature.mfcc(y=y, sr=sr)
to_append = f'{filename} {np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}'
for e in mfcc:
to_append += f' {np.mean(e)}'
writer.writerow(to_append.split())
file.close()
print("Fin de extracción de los archivos")
# Función de preprocesamiento de los datos
def preProcessDatos(ArchivoCSV):
print("procesando "+ArchivoCSV)
data = pd.read_csv(ArchivoCSV)
data['letra'] = data['filename'].str[:1]
#Eliminando columnas innecesarias
data = data.drop(['filename'],axis=1)
data = data.drop(['label'],axis=1)
data = data.drop(['chroma_stft'],axis=1)
data.shape
print("Los datos han sido preprocesados")
print(data.head())
return data
# Definir los nombre de los archivos csv
train_csv = "train.csv"
test_csv = "test.csv"
# Creación de archivos CSV
crear_csv = True # Si es True, los valores de los audios se guardaran en un archivo csv
# Como es una tarea que consume mucho tiempo, se dejará en False si ya se tienen los archivos
if (crear_csv == True):
print("Extrayendo archivos de audio")
extraccionArchivosWAV("sonidos vocales test", test_csv)
extraccionArchivosWAV("sonidos vocales train", train_csv)
print("Se han creado los archivos csv")
else:
print("Se ha omitido la creación de archivos csv")
# Preprocesamiento y creación de datasets
trainData = preProcessDatos(train_csv)
testData = preProcessDatos(test_csv)
# -------------- ENTENDER LOS DATOS DE AUDIO Y HABLAR SOBRE COMO SE EXPRESAN LAS VOCALES ------------------
# Tomar un audio por ejemplo y graficarlo
# Explicar que significa cada una de las características del audio
# Determinar características importantes en la clasificación de vocales y características que podemos omitir
# ----------------------------- DEFINIR DATOS DE VALIDACIÓN, TRAIN Y TEST ---------------------------------
from sklearn.model_selection import train_test_split
X = np.array(trainData.iloc[:, :-1], dtype = float)
y = trainData.iloc[:, -1]
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3, random_state=42)
X_test = np.array(testData.iloc[:, :-1], dtype = float)
y_test = testData.iloc[:, -1]
# Normalización de los datos con preprocessing
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform( X_train )
X_val = scaler.transform( X_val )
X_test = scaler.transform( X_test )
# ver graficas de datos procesados y averiguar si se requiere algún ajuste
# ----------------------------------------- CREACIÓN DEL MODELO ---------------------------------------------
import keras
from keras import models
from keras import layers
# ------------------------------------------ TEST Y RESULTADOS ----------------------------------------------
# matriz de confusión
# Reporte de clasificación
# Accuracy - Performance