Formato de datos MFCC para entrenar HMM

Estoy tratando de desarrollar un sistema para la clasificación de audio en Java utilizando funciones de mfcc y modelos ocultos de Markov. Estoy siguiendo este trabajo de investigación: http://acccn.net/cr569/Rstuff/keys/bathSoundMonitoring.pdf .

Describe el algoritmo de la siguiente manera:

Cada archivo de sonido, correspondiente a una muestra de un evento de sonido, se procesó en cuadros previamente enfatizados y con una ventana de Hamming (25 ms) con una superposición del 50%. Un vector de características que consiste en un MFCC de 13 órdenes caracterizó cada cuadro. Modelamos cada sonido usando un HMM de densidad continua de seis estados de izquierda a derecha sin saltos de estado. Cada estado HMM estaba compuesto por dos componentes de mezcla gaussianos. Después de una etapa de inicialización del modelo, todos los modelos HMM fueron entrenados en tres ciclos iterativos.

Ya tengo la primera parte trabajando, que es la extracción de características de un sonido de muestra. Como resultado, obtengo una matriz 2D de dobles que consta de 13 columnas para cada fila (cada fila representa un cuadro del sonido). Ahora mi problema es cómo entrenar al hmm usando estos datos.

Estoy usando la biblioteca jahmm. Hasta ahora, he desarrollado un código de muestra para tener una comprensión general de cómo funciona la biblioteca.

/**Some sample data to act as the mfcc data. Here each line terminated by a new space
     * is one observation. I don't know whether each line should be one row from the mfcc values 
     * (representing one frame) or each line should be representing a set of features from one audio file.
     */
    String realSequences = "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
            + "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n";


    /**
     * This is the reader class that reads the data and puts then in a relevant collection format
     * 
     */
    Reader reader = new StringReader(realSequences);
    List<? extends List<ObservationReal>> sequences =
            ObservationSequencesReader.readSequences(new ObservationRealReader(), reader);
    reader.close();


    /**
     * As the description states that each state is composed of two Gaussian mixture components.
     */
    OpdfGaussianMixtureFactory gMixtureFactory = new OpdfGaussianMixtureFactory(2);

    /**
     * The manual for jahmm says that KMeans learner is a good way to initialize the hmm. It has 6 states
     * and uses the two gaussian mixture models created above.
     */
    KMeansLearner<ObservationReal> kml = new KMeansLearner<ObservationReal>(6, gMixtureFactory, sequences);
    Hmm<ObservationReal> initHmm = kml.iterate();


    /*
     * As the papers states the hmm is trained in 3 iterative cycles.
     */
    BaumWelchLearner bwl = new BaumWelchLearner();
    Hmm<ObservationReal> learntHmm = null;
    for (int i = 0; i < 3; i++) {
        learntHmm = bwl.iterate(initHmm, sequences);
    }

Mis preguntas son:

P1: ¿En qué formato se deben pasar los datos mfcc para entrenar el hmm? (Ver comentarios de la línea realSeuqences)

P2: En el reconocimiento de voz a veces necesitamos entrenar el sistema repitiendo la misma palabra, digamos 10 veces. ¿Significa que entrena un hmm con esas 10 muestras? En caso afirmativo, cómo entrenar un hmm con diferentes muestras del mismo sonido. ¿O son 10 hmm entrenados por separado pero etiquetados con esa palabra?

P3: Cómo comparar dos modelos hmm en términos de reconocimiento de sonido. ¿Es mejor usar viterbi o Kullback Leibler Distance?

Respuesta 1

Creo un TableLayout dinámicamente a través del código y quiero establecer un margen entre columnas. El único tipo de contenido que contienen mis TableRows son TextViews. Mi intención era poner un androide simple: ...

Creé las clases de entidad de mi base de datos con NetBeans. Creo que sé cómo usar EntityManager (Class) db.createNamedQuery (String name); pero no sé dónde poner la declaración (base de datos ...

Estoy usando JCChart para crear gráficos, al final tengo que crear una imagen a partir de este gráfico. Solicito el siguiente procedimiento. frame.add (gráfico); Imagen img = chart.createImage (600, 800); Gráficos g = imagen ....

Estoy desarrollando el complemento Eclipse, pero cuando quiero comenzar el modo de depuración, se detiene y muestra esto: http://i47.tinypic.com/oicbbp.png Y no sé qué hacer con él. ¿Hay alguna solución? [EDITAR] ...