PiEfSi de speech recognition

Started by Drumpi, February 12, 2010, 06:17:19 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Rein (K´)ah Al-Ghul

#15


drumpi, es algo asi lo que busncas verdad??
la vista de la derecha deberia ser en 3D, siendo la profundidad cada instante de tiempo...

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Drumpi

Grisendo: gracias, pero prefiero hacérmelo yo mismo, si me lo haces tu ¿qué hago yo? ;D
No, es broma, le echaré un vistazo, a ver si surgen ideas, pero de momento ya tengo una idea bastante clara de lo que quiero hacer.

Rein (K')ah Al-Ghul: (te voy a tener que buscar un mote, porque vaya apodo) Sí, más o menos es eso lo que ando buscando hacer, y que la segunda imagen varíe dinámicamente para ver los cambios, y luego poder hacer gráficas de las frecuencias que yo quiera en el tiempo. Veo que está hecho en Matlab, quizás debería plantearme seriamente usarlo, pero no se cómo pasar la señal del micro al programa, o cómo cargar los datos de un wav en un vector.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Aun así, ese espectro de la señal es bastante complejo, demasiado para lo que debo determinar, porque fijaos en la siguiente onda:



Ese soy yo diciendo "oooooo" (de "hola"). No creo que eso se descomponga en más de 20 senos sumados, y eso es lo que voy buscando, la frecuencia de esos senos para hacer el estudio.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

grisendo

Lo siento! Entendí que no sabías por donde cogerlo y me pasé de ayudarte :P

Esa es toda la onda que se produce al decir la letra "O"?
Me imagino que no, porque veo la barra horizontal de la aplicación movida... Pero si fuese esa, veo que se repite por todas partes!!!
A ver si puedes adjuntar el WAV :)

Yo con lo que sé de imágenes, lo que intentaría sería primero eliminar el ruido, luego normalizar los valores de amplitud de todas las ondas con las que trabajes (comprimirlas o estirarlas a lo alto para que todos sus valores estén entre -1 y 1, o los que quieras) para hacerla invariante ante volumen, igualar el tono de todas ellas (comprimirlas o estirarlas a lo largo para que la longitud de onda sea la misma en todas) y... si no quieres utilizar clasificadores y cosas así, ahí me quedo xDD. Aunque he de decirte que existen programas como Weka que llevan hechos miles de clasificadores y te evitan programarlos por ti mismo: http://www.cs.waikato.ac.nz/ml/weka/

Por cierto, he visto tu post de "dirty rects", veo que utilizas puntos... si vas a ver las ondas así siempre, vale, pero si quieres meterle "zoom", con los puntos cuando lo alejes no verás más que  nubes de puntos sin sentido, es mejor utilizar rectas como en mi segundo ejemplo ;)

Drumpi

Bueno, no es exactamente "ooooo", es parte de "hoooooooollllllaaaaaaaa..." ;D De todas formas te lo adjunto para que lo mires. Mientras se mantiene el tono y la amplitud, la señal es periódica perfecta y muy simple.
El problema viene a que la voz no es perfecta, nadie es capaz de mantener los músculos de la garganta inmóviles (aunque sea por el pulso) y la señal sufre de imperfecciones. Puedo tratarlo como "ruido" y filtrarlo, pero ya es mucho trabajo, confío en que eso sólo leve a pequeñísimas variaciones de frecuencia y amplitud.

Lo cierto es que me da igual la amplitud y los cambios de frecuencia, quiero hacer un análisis visual para ver los cámbios de frecuencias con los tonos.

Lo de los puntos, bueno, es sólo para ver lo que puedo hacer y no, ya lo "dejaré bonito" más tarde ;D

(Se va la luz)

Voy a hacer la FFT típica a ver qué sale con una señal "perfecta" (el sonido de una flauta que usé para el FrikiMusic, obtenida con un tracker), si no, empezaré a hacer números hasta que salga lo estudiado en clase (deltas aisladas).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Bien, empiezan los problemas... pero por desgracia son del código, no de lo principal.
Estoy aun liado con el IDE, con la carga de ficheros, y como soy tan así, he creado una lista enlazada para guardar los datos, en lugar de un vector definido (según mi cabeza, controlar cuales casillas están libres y cuales no es mucho más complicado que la susodicha lista).

Bien, pues os comento. Bennu me da un error rarísimo:
bgdi seasee.dcb
Assertion failed: code < string_allocated && code >= 0, file strings.c, line 264

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Como es lógico, me fallan los punteros.

He aislado el fallo hasta la función NUEVO_WAV del fichero MANAGE_FILE.INC (el código completo os lo pongo después para descargar)

[code language="bennu"]function nuevo_wav (string nw_dir)
private
    fichero_abierto pointer nw_ptr;
begin
    say("Abriendo wav");
    if (file_exists(nw_dir))
        nw_ptr=anadir_wav_lista();
        say("añadir wav lista: sucessful");
        say("dato: "+itoa(nw_ptr.id_wav));
       
        cargar_wav(nw_dir,nw_ptr.id_wav);
        say("cargar wav: sucessful");
        graph=new_map(1000,400,16);
        set_center(file,graph,0,0);
        draw_wav(nw_ptr.id_wav,file,graph,0,500);
        say("crear gráfica: sucessful");
        nw_ptr.id_onda=add_grafica(file,graph,0,0,0);
        graph=0;
        say("añadir gráfica a la lista: sucessful");
    end
end[/code]

El problema me lo da al usar la función CARGAR_WAV (RW_FILE.INC), función que iba perfectamente cuando le pasaba una variable directamente (id_wav es de un tipo definido por mi, y se ha añadido en una variable de otro tipo, FICHERO_ABIERTO, como el puntero auxiliar).

[code language="bennu"]type fichero_abierto
    info_wav id_wav;
   
    int id_onda;
    int onda_ini;
    int onda_max_amplitud;
   
    int id_espectro;
    int espectro_ini;
    int espectro_max;
   
    fichero_abierto pointer ptr_sig;
end[/code]

anadir_wav_lista (manage_file.inc) devuelve un puntero:

[code language="bennu"]function anadir_wav_lista ()
private
    fichero_abierto pointer awl_ptr;
begin
    (...)
    return (awl_ptr);
end[/code]

Por todo esto, sé que debería funcionar, pero no se que falla: he probado poniendo:

cargar_wav(nw_dir,&nw_ptr.id_wav);
cargar_wav(nw_dir,&(nw_ptr.id_wav));
cargar_wav(nw_dir,*nw_ptr.id_wav);

Pero nada (en el tercer caso hasta me da error de que se esperaba un puntero).

Si quereis ver el código completo, está AQUI, incluyendo hasta los archivos de sonido. Espero que me podais echar una mano, porque ya estoy de punteros hasta el gorro ^^U

Gracias.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

estas concatenando datos a una string no inicializada...

    //***********************************
    for (cont=0;cont<4;cont++)
        fread(wav_file,datob);
        cw_wav.riff+=chr(datob);
    end
    say("Cabecera RIFF: "+cw_wav.riff);

debe ser

    cw_wav.riff = "";

    //***********************************
    for (cont=0;cont<4;cont++)
        fread(wav_file,datob);
        cw_wav.riff+=chr(datob);
    end
    say("Cabecera RIFF: "+cw_wav.riff);
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Juer, pues sí, era eso, vaya tontería ¿no? eso pasa por acostumbrarnos a no inicializar las variables.
Lo que no entiendo es por qué antes funcionaba ¿tiene algo que ver que ahora los datos se obtengan mediante reserva de memoria en tiempo de ejecución?

Muchas gracias, Splinter, con el dolor de cabeza que me ha supuesto, te mereces un Karma.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Ahhh... ya veo, no es un dato creado por Bennu, sino que lo creas vos allocando memoria... claro, si alocas memoria para crear una estructura y dentro de esa estructura hay miembros strings, debes inicializar todas las strings.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

A mí me gustaría poder usar en un juego controles por voz:

QUIETO, CORRE, SALTA

¿Hay algo ya palpable en este módulo para usarlo?

Y me gustaría asociar esos controles con el módulo de reconocimiento facial de grisendo, me excitaría mucho, uuUuUUUUuUUuuuUHHHhHHHHhhh...

Sería en 3D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

hay un juego que lo hace, esos de estrategia, no recuerdo el nombre...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

si, es de la saga de los de Tom Clancy.

el Tom Clancy's End War, y la verdad que esta muy bueno, te crea un ambiente y una sensacion de realismo, o nose, una sensacion de que "la maquina esta jugando con vos" que es rara de sentir...
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

no sabia de ese juego... el que yo me referia es uno que se ve desde arriba... world of the warcraft, puede ser?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Al WoW le he metido varias horas de vida y que yo sepa no tiene de eso... Aunque tampoco me he puesto a mirar las opciones de accesibilidad...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2