1

Я пытаюсь разработать систему классификации аудио в java с использованием функций mfcc и скрытых марковских моделей. Я следую этой статье: http://acccn.net/cr569/Rstuff/keys/bathSoundMonitoring.pdf.Формат данных MFCC для обучения HMM

Он описывает алгоритм следующим образом:

Каждый звуковой файл, соответствующий образцу звукового события, был обработан в кадров предыскажений и оконным окном Хэмминга (25 мс) с перекрытием 50%. Функциональный вектор, состоящий из MFCC 13-го порядка, характеризуется кадром . Мы смоделировали каждый звук, используя непрерывную непрерывную плотность слева-направо, HMM без пропуска состояния. Каждое HMM-состояние состояло из двух гауссовых смесей . После того, как была выполнена стадия инициализации модели, все модели HMM прошли обучение в трех итерационных циклах.

У меня уже есть первая часть работы, которая является извлечением функции из образца звука. В результате я получаю 2d массив двойников, который состоит из 13 столбцов для каждой строки (каждая строка представляет собой кадр звука). Теперь моя проблема заключается в том, как обучать хм, используя эти данные.

Я использую библиотеку jahmm. До сих пор я разработал некоторый пример кода, чтобы иметь общее представление о том, как работает библиотека.

/**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); 
    } 

Мои вопросы:

Q1: В каком формате КМПЦ данные должны быть переданы для подготовки НММ? (См. Комментарии по строке realSeuqences)

Q2: При распознавании речи иногда нам нужно тренировать систему, повторяя одно и то же слово, скажем, 10 раз. Означает ли это, что он тренирует один хм с этими 10 образцами? Если да, то как тренировать один хмм с разными образцами одного и того же звука. Или это 10 отдельно подготовленных хмм, но помеченных этим словом?

Q3: Как сравнить две модели hmm с точки зрения распознавания звука. Лучше ли использовать viterbi или Kullback Leibler Distance?

ответ

2

Q1: В каком формате данные mfcc должны передаваться для обучения хм? (см комментарии по линии realSeuqences)

Данные, MFCC должны быть представлены в виде:

List<? extends List<ObservationVector>> sequences 

Это список последовательностей данных. Каждая последовательность соответствует образцу слова и представляет собой список векторов, каждый вектор представляет собой кадр и содержит 13 значений MFCC.

Q2: При распознавании речи иногда нам необходимо обучать систему , повторяя одно и то же слово, скажем, 10 раз. Означает ли это, что он обучает один хмм с этими 10 образцами?

Данные ввода - это список последовательностей для каждого слова. Этот список обрабатывается вместе.

Если да, то как обучить один хм с различными образцами одного и того же звука.Или это 10 отдельно обученных хмм, но помечены этим словом?

Это один из HMM. Алгоритм обучения hmm работает с несколькими образцами каждого слова. На самом деле это требует довольно много образцов, более 10.

Q3: Как сравнить две модели hmm с точки зрения распознавания звука. Это лучше использовать viterbi или Kullback Leibler Distance?

Не совсем понятно, что вы подразумеваете под «сравнением» здесь. Вы хотите, чтобы один HMM имел меньшее состояние, чем другое или что-то еще. Какую собственность вы хотите использовать для сравнения. Ответ зависит от этого.

И важно отметить, что обучение распознаванию речи в HMM имеет определенные особенности (как выбрать количество состояний, какие функции использовать, как инициализировать HMM). По этой причине для лучшей производительности лучше использовать специализированный инструментарий вроде CMUSphinx (http://cmusphinx.sourceforge.net), а не общий.

Смежные вопросы