<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394624</guid>
        <pubDate>Sat, 04 Jan 2014 09:43:23 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394624</link>
        <description><![CDATA[nsh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Максимальное число гауссианов, которое мне удалось сделать - 3. </div></div><br>
<br>
Хорошо. В литературе рекомендуют диагональные распределения использовать. Но 3 гауссиана тоже неплохо.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Значения Likelihood не сильно отличаются, особенно для тех пользователей, которых нет в UBM (user4,user5,user6,user7 - не зарегистрированные пользователи). <br>
</div></div><br>
<br>
Ну как-то так. Просто пользователей нужно побольше в базе и для UBM. Скачайте rusdictors здесь:<br>
<br>
<a class='tag-url' href='http://www.repository.voxforge1.org/downloads/Russian/Trunk/Audio/Original/16kHz_16bit/rdc.tgz' target='_blank'>http://www.repository.voxforge1.org/downlo...z_16bit/rdc.tgz</a><br>
<br>
там пользователей около 100.]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394569</guid>
        <pubDate>Fri, 03 Jan 2014 20:47:32 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394569</link>
        <description><![CDATA[serious911: <strong class='tag-b'>nsh</strong>, большое спасибо за то, что посмотрели код&#33;<br>
<br>
В Comirva явно проблемы MFCC. Я переписал код для получения MFCC коэффициентов (остался тот вариант, который использовал до Comirva), сделал нормализацию MFCC по средним значениям:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;private void doCepstralMeanNormalization() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double sum;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double mean;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double mCeps[][] = new double[noOfFrames][numCepstra - 1];// same size</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// as mfcc</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// 1.loop through each mfcc coeff</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i &#60; numCepstra - 1; i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// calculate mean</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sum = 0.0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int j = 0; j &#60; noOfFrames; j++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sum += mfccFeature[j][i];// ith coeff of all frame</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mean = sum / noOfFrames;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// subtract</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int j = 0; j &#60; noOfFrames; j++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mCeps[j][i] = mfccFeature[j][i] - mean;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Вроде начали получаться адекватные результаты, но не совсем. Максимальное число гауссианов, которое мне удалось сделать - 3. Количество кепстральных коэффициентов - 13, размер фрейма 256 (примерно 32 ms при 8 кГц). Длина аудиозаписи для 1 пользователя 50-60сек вместе с тишиной, но я удаляю тишину.<br>
<br>
Likelihood делал так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">L = user1_gmm.getLogLikelihood(user1_auth1_pointList) / ubm_gmm.getLogLikelihood(user1_auth1_pointList);</div></ol></div></div></div></div><br>
<br>
<span class='tag-u'>Значения Likelihood не сильно отличаются</span>, особенно для тех пользователей, которых нет в UBM (user4,user5,user6,user7 - не зарегистрированные пользователи). <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Verify user1<br>
<strong class='tag-b'>LogLikelihood(user1): L=0.8249521641940379</strong><br>
LogLikelihood(user2): L=1.1039434059625899<br>
LogLikelihood(user3): L=1.020745193753429<br>
LogLikelihood(user4): L=1.0241411114917134<br>
LogLikelihood(user5): L=1.0805579201852602<br>
LogLikelihood(user6): L=1.0127635231868999<br>
LogLikelihood(user7): L=1.0356999111444292<br>
Verify user2<br>
LogLikelihood(user1): L=1.1695328088311627<br>
<strong class='tag-b'>LogLikelihood(user2): L=0.8453888963858318</strong><br>
LogLikelihood(user3): L=0.9834534072276123<br>
LogLikelihood(user4): L=0.8796451716059582<br>
LogLikelihood(user5): L=0.9084670757557486<br>
LogLikelihood(user6): L=0.9166752706497352<br>
LogLikelihood(user7): L=0.8799651912831838<br>
Verify user3<br>
LogLikelihood(user1): L=1.3761136000430545<br>
LogLikelihood(user2): L=1.2776926979500356<br>
<strong class='tag-b'>LogLikelihood(user3): L=1.0156711637686784</strong><br>
LogLikelihood(user4): L=1.1377308499139034<br>
LogLikelihood(user5): L=1.1814099472592825<br>
LogLikelihood(user6): L=1.1155796762381176<br>
LogLikelihood(user7): L=1.215022606631276</div></div><br>
<br>
А иногда получается так, что для незарегистрированного пользователя L меньше чем для зарегистрированного: <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Verify user3<br>
LogLikelihood(user1): L=1.1261525431561095<br>
LogLikelihood(user2): L=1.0537272429065274<br>
<strong class='tag-b'>LogLikelihood(user3): L=1.0128126733670213</strong> - зарегистрированный<br>
LogLikelihood(user4): L=1.0930707321101896<br>
LogLikelihood(user5): L=1.0314592923360855<br>
<strong class='tag-b'>LogLikelihood(user6): L=0.9491107399398667</strong> - не зарегистрированный<br>
LogLikelihood(user7): L=1.0422861426032701</div></div>]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394382</guid>
        <pubDate>Thu, 02 Jan 2014 14:42:09 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394382</link>
        <description><![CDATA[nsh: Посмотрел я код, проблем там много, в большей части в Comirva, но проблемы могут быть решаемы:<br>
<br>
1. MFCC почему-то иногда выдает фреймы с нулями в кепстре. Нужно разобраться откуда и по-хорошему решить эту проблему. Пока же можно их удалять:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (int z = 0; z &#60; user2_mfcc.size(); z++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;double[] vector = user2_mfcc.get(z);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (vector[0] &#60; 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ubm_pointList.add(vector);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
2. Пока можно нормализовать только средние, не делать нормализацию вариации.<br>
<br>
3. Точности реализации матричных операций не хватает. Все операции нужно делать в логарифмической шкале, во многих местах идет значительная потеря точности.<br>
<br>
4. Код по тренировке может быть таким, список точек обновляется по результатам exception, чтобы более стабильно тренировать. Тоже студент придумал такое, наверное:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;success = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while (!success) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;KMeansClustering kmeans_ubm = new KMeansClustering(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GAUSSIANS_NUM, ubm_pointList, false);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kmeans_ubm.run();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ubm_gmm = new GaussianMixture(kmeans_ubm.getClusterWeights(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kmeans_ubm.getMeans(), kmeans_ubm.getFullCovariances());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ubm_gmm.runEM(ubm_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} catch (CovarianceSingularityException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ubm_pointList = e.getCorrectedPointList();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} catch (Exception e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
Когда считается likelihood, по хорошему нужно считать в логарифмической шкале:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">logTotalFrameLikelihood = logadd(logTotalFrameLikelihhood, logComponentLikelihood);</div></ol></div></div></div></div><br>
где<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">logadd(x,y) = max(x,y) + log(1+e^(x-y))</div></ol></div></div></div></div><br>
<br>
Но на крайний случай можно хотя бы на 0 проверять:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;public double getLogLikelihood(PointList points)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;double p = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int j = 0; j &#60; points.size(); j++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;double pr = getProbability((Matrix) points.get(j));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (pr &#60; 1e-50) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;p += Math.log(pr);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return p;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><br>
<br>
5. Variance flooring нужно ещё делать, чтобы не было компонент с малой вариацией.<br>
<br>
<br>
Для полного счастья хорошо бы обработать напильником.]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394271</guid>
        <pubDate>Wed, 01 Jan 2014 23:12:49 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394271</link>
        <description><![CDATA[serious911: Проект Java Eclipse<br>
<br>
<a class='tag-url' href='https://www.dropbox.com/s/pay1jalcmimtfoj/VoiceTest.rar' target='_blank'>https://www.dropbox.com/s/pay1jalcmimtfoj/VoiceTest.rar</a> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2014-01-01T23:21:37+00:00">01.01.14, 23:21</time></span></span><br>
Основная часть кода в файле VoiceVerify.java.]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394265</guid>
        <pubDate>Wed, 01 Jan 2014 21:56:35 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394265</link>
        <description><![CDATA[nsh: Лучше весь проект выложить в архиве вместе с данными, чтобы воспроизвести проблему, а не один исходный файл.]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394261</guid>
        <pubDate>Wed, 01 Jan 2014 20:54:36 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394261</link>
        <description><![CDATA[serious911: Записал 2 аудио файла по 1 минуте каждый. Прочитал файлы с помощью AudioPreProcessor, получил MFCC, создал GMM для пользователя и UBM (сейчас только для 1 пользователя, но 2 разные аудиофайлы). Дальше пытаюсь получить LogLikelihood:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">double d1 = user1_gmm.getLogLikelihood(user2_pointList);</div><div class="code_line">double d2 = ubm_gmm.getLogLikelihood(user2_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">double L = user1_gmm.getLogLikelihood(user2_pointList) - ubm_gmm.getLogLikelihood(user2_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">System.out.println(&quot;LogLikelihood: d1=&quot;+Double.toString(d1)+&quot;; d2=&quot;+Double.toString(d2)+&quot;; L=&quot;+Double.toString(L));</div></ol></div></div></div></div><br>
<br>
В ответ получаю <strong class='tag-b'>LogLikelihood: d1=NaN; d2=NaN; L=NaN</strong>.  :-? <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
К операциям, приводящим к появлению NaN в качестве ответа, относятся:<br>
    -все математические операции, содержащие NaN в качестве одного из операндов;<br>
    -деление ноля на ноль;<br>
    -деление бесконечности на бесконечность;<br>
    -умножение ноля на бесконечность;<br>
    -сложение бесконечности с бесконечностью противоположного знака;<br>
    -вычисление квадратного корня отрицательного числа[1];<br>
    -логарифмирование отрицательного числа.<br>
</div></div><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Чтобы оценить 8 гауссианов нужна где-то минута записей. </div></div><br>
<br>
Длина записи 1 минута, но если увеличиваю количество гауссианов до 2, то получаю ошибку: mean and covariance matrix must have compatible shapes and the covarince matrix must not be singular.<br>
<br>
А тишину нужно удалять из файлов?<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">import java.io.File;</div><div class="code_line">import java.io.IOException;</div><div class="code_line">import java.util.Vector;</div><div class="code_line">&nbsp;</div><div class="code_line">import javax.sound.sampled.AudioInputStream;</div><div class="code_line">import javax.sound.sampled.AudioSystem;</div><div class="code_line">import javax.sound.sampled.UnsupportedAudioFileException;</div><div class="code_line">&nbsp;</div><div class="code_line">import net.mobfix.VoiceControl.audio.AudioRecorder;</div><div class="code_line">import net.mobfix.VoiceControl.audio.WaveData;</div><div class="code_line">import net.mobfix.VoiceControl.util.Graphics;</div><div class="code_line">import comirva.audio.util.AudioPreProcessor;</div><div class="code_line">import comirva.audio.util.MFCC;</div><div class="code_line">import comirva.audio.util.PointList;</div><div class="code_line">import comirva.audio.util.gmm.CovarianceSingularityException;</div><div class="code_line">import comirva.audio.util.gmm.GaussianMixture;</div><div class="code_line">import comirva.audio.util.kmeans.KMeansClustering;</div><div class="code_line">import comirva.audio.util.math.Matrix;</div><div class="code_line">&nbsp;</div><div class="code_line">public class VoiceTest {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//SAMPLE_RATE,WINDOW_SIZE,NUMCOEFICCIENT - window size = (1/22050)*512 = 23.2 ms</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int WINDOW_SIZE = 512;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int SAMPLE_RATE = 22050;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int MFCC_NUM = 13;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int GAUSSIANS_NUM = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public VoiceTest() </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//get input signal &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreProcessor audioPreProcessor1 = getAudioPreProcessor(&quot;user1_long_auth1.wav&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreProcessor audioPreProcessor2 = getAudioPreProcessor(&quot;user1_long_auth2.wav&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//get MFCC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MFCC mfcc = new MFCC(SAMPLE_RATE,WINDOW_SIZE,MFCC_NUM,true);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Vector&#60;double[]&#62; user1_mfcc = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Vector&#60;double[]&#62; user2_mfcc = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_mfcc = mfcc.process(audioPreProcessor1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user2_mfcc = mfcc.process(audioPreProcessor2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IllegalArgumentException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IOException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;////get GMM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//create a point list with appropriate dimensions &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointList user1_pointList = new PointList(MFCC_NUM);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointList user2_pointList = new PointList(MFCC_NUM);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointList ubm_pointList = new PointList(MFCC_NUM);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user1_mfcc.size();z++) {double [] vector = user1_mfcc.get(z); user1_pointList.add(vector);}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user2_mfcc.size();z++) {double [] vector = user2_mfcc.get(z); user2_pointList.add(vector);}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//add points to UBM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user1_mfcc.size();z++) {double [] vector = user1_mfcc.get(z); ubm_pointList.add(vector);}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user2_mfcc.size();z++) {double [] vector = user2_mfcc.get(z); ubm_pointList.add(vector);}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//z-normalization</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//The normalization is done for every coordinate by subtracting </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//the mean and dividing by the standard deviation.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;user1_pointList = user1_pointList.normalize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;user2_pointList = user2_pointList.normalize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ubm_pointList = ubm_pointList.normalize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GaussianMixture user1_gmm = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GaussianMixture user2_gmm = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GaussianMixture ubm_gmm = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//run k-means clustering algorithm to initialize the EM algorithem</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;KMeansClustering kmeans1 = new KMeansClustering(GAUSSIANS_NUM, user1_pointList, false);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;kmeans1.run(); &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;user1_gmm = new GaussianMixture(kmeans1.getClusterWeights(), kmeans1.getMeans(), kmeans1.getFullCovariances());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//UBM-GMM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;KMeansClustering kmeans_ubm = new KMeansClustering(GAUSSIANS_NUM, ubm_pointList, false);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;kmeans_ubm.run(); &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ubm_gmm = new GaussianMixture(kmeans_ubm.getClusterWeights(), kmeans_ubm.getMeans(), kmeans_ubm.getFullCovariances());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_gmm.runEM(user1_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ubm_gmm.runEM(ubm_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (CovarianceSingularityException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double d1 = user1_gmm.getLogLikelihood(user2_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double d2 = ubm_gmm.getLogLikelihood(user2_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double L = user1_gmm.getLogLikelihood(user2_pointList) - ubm_gmm.getLogLikelihood(user2_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;LogLikelihood: d1=&quot;+Double.toString(d1)+&quot;; d2=&quot;+Double.toString(d2)+&quot;; L=&quot;+Double.toString(L));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public AudioPreProcessor getAudioPreProcessor(String filename)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;File audiofile = new File(filename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioInputStream audioInputStream = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreProcessor audioPreProcessor = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;audioInputStream = AudioSystem.getAudioInputStream(audiofile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (UnsupportedAudioFileException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IOException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//check input type</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(audioInputStream == null || !(audioInputStream instanceof AudioInputStream))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalArgumentException(&quot;input type for the td feature extraction process should be AudioPreProcessor and must not be null&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;audioPreProcessor = new AudioPreProcessor((AudioInputStream) audioInputStream);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double sample_rate = audioPreProcessor.getSampleRate();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return audioPreProcessor;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394224</guid>
        <pubDate>Wed, 01 Jan 2014 16:48:46 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394224</link>
        <description><![CDATA[nsh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>mean and covariance matrix must have compatible shapes and the covarince matrix must not be singular.</div></div><br>
<br>
Слишком мало данных для тренировки. Comirva тренирует full-covariance GMM, ему нужно очень много данных. Или нужно диагональный GMM реализовать<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Сделал 1 гауссиан - вроде работает(без pointList.normalize), но когда уже 2 гауссиана - то Covariance matrix got singular.<br>
</div></div><br>
<br>
Для экспериментов попробуйте начать хотя бы с минуты записей для каждого человека. С одного слова ничего хорошего не получится<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Если я правильно понимаю, то для того, чтобы получить Lamda_UBM = {mu_i;w_i;sigma_i} - мне нужно получить GMM модель для всех пользователей, тоесть в PointList будут вектора коэффициентов MFCC для всех пользователей. </div></div><br>
<br>
Правильно]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394217</guid>
        <pubDate>Wed, 01 Jan 2014 15:52:50 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394217</link>
        <description><![CDATA[serious911: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>На окна нужно нарезать с перекрытием, лучше использовать AudioPreProcessor из comirva</div></div><br>
<br>
Переписал код с использованием AudioPreProcessor, стандартное перекрытие 50%. Раньше у меня было перекрытие 60% и я удалял тишину из файлов, но судя по исходниках AudioPreProcessor.java (<a class='tag-url' href='http://www.cp.jku.at/people/schedl/Research/Development/CoMIRVA/releases/0.36/CoMIRVA/doc/index.html' target='_blank'>http://www.cp.jku.at/people/schedl/Researc.../doc/index.html</a> и <a class='tag-url' href='http://code.google.com/p/mirlastfm/source/browse/trunk/CoMIRVA/src/comirva/audio/util/AudioPreProcessor.java?r=3' target='_blank'>http://code.google.com/p/mirlastfm/source/...cessor.java?r=3</a>) не удаляет фрагменты тишины из файлов.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Нужно делать нормализацию среднего коэффициентов MFCC (cepstral mean normalization, PointList.normalize()), что обеспечивает нормализацию амплитуды по различным частотным каналам, а не просто нормализовать амплитуду сигнала.<br>
</div></div><br>
<br>
Если делаю pointList.normalize(), то при создании GaussianMixture(kmeans.getClusterWeights(), kmeans.getMeans(), kmeans.getFullCovariances()) получаю IllegalArgumentException: mean and covariance matrix must have compatible shapes and the covarince matrix must not be singular.<br>
<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body">Exception in thread &quot;AWT-EventQueue-0&quot; java.lang.IllegalArgumentException: mean and covariance matrix must have compatible shapes and the covarince matrix must not be singular;<br>
	at comirva.audio.util.gmm.GaussianComponent.&lt;init&gt;(GaussianComponent.java:86)<br>
	at comirva.audio.util.gmm.GaussianMixture.&lt;init&gt;(GaussianMixture.java:94) </div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//z-normalization</div><div class="code_line">//The normalization is done for every coordinate by subtracting </div><div class="code_line">//the mean and dividing by the standard deviation.</div><div class="code_line">user1_pointList = user1_pointList.normalize();</div><div class="code_line">user2_pointList = user2_pointList.normalize();</div><div class="code_line">user3_pointList = user3_pointList.normalize();</div></ol></div></div></div></div><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Слишком много гауссианов, поэтому и не удаётся оценить GMM параметры. Попробуйте 1 гауссиан сначала или 2, если запись небольшая. Чтобы оценить 8 гауссианов нужна где-то минута записей. </div></div><br>
<br>
Сделал 1 гауссиан - вроде работает(без pointList.normalize), но когда уже 2 гауссиана - то Covariance matrix got singular.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package net.test.VoiceControl;</div><div class="code_line">&nbsp;</div><div class="code_line">import java.io.File;</div><div class="code_line">import java.io.IOException;</div><div class="code_line">import java.util.Vector;</div><div class="code_line">&nbsp;</div><div class="code_line">import javax.sound.sampled.AudioInputStream;</div><div class="code_line">import javax.sound.sampled.AudioSystem;</div><div class="code_line">import javax.sound.sampled.UnsupportedAudioFileException;</div><div class="code_line">&nbsp;</div><div class="code_line">import comirva.audio.util.AudioPreProcessor;</div><div class="code_line">import comirva.audio.util.MFCC;</div><div class="code_line">import comirva.audio.util.PointList;</div><div class="code_line">import comirva.audio.util.gmm.CovarianceSingularityException;</div><div class="code_line">import comirva.audio.util.gmm.GaussianMixture;</div><div class="code_line">import comirva.audio.util.kmeans.KMeansClustering;</div><div class="code_line">import comirva.audio.util.math.Matrix;</div><div class="code_line">&nbsp;</div><div class="code_line">public class VoiceTest {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//SAMPLE_RATE,WINDOW_SIZE,NUMCOEFICCIENT - window size = (1/22050)*512 = 23.2 ms</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int WINDOW_SIZE = 512;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int SAMPLE_RATE = 22050;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int MFCC_NUM = 13;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int GAUSSIANS_NUM = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public VoiceTest() </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//get input signal &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreProcessor audioPreProcessor1 = getAudioPreProcessor(&quot;user1_auth1.wav&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreProcessor audioPreProcessor2 = getAudioPreProcessor(&quot;user1_auth2.wav&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreProcessor audioPreProcessor3 = getAudioPreProcessor(&quot;user1_auth3.wav&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//get MFCC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MFCC mfcc = new MFCC(SAMPLE_RATE,WINDOW_SIZE,MFCC_NUM,true);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Vector&#60;double[]&#62; user1_mfcc = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Vector&#60;double[]&#62; user2_mfcc = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Vector&#60;double[]&#62; user3_mfcc = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_mfcc = mfcc.process(audioPreProcessor1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user2_mfcc = mfcc.process(audioPreProcessor2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user3_mfcc = mfcc.process(audioPreProcessor3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IllegalArgumentException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IOException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;////get GMM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//create a point list with appropriate dimensions</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointList user1_pointList = new PointList(user1_mfcc.get(0).length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointList user2_pointList = new PointList(user2_mfcc.get(0).length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointList user3_pointList = new PointList(user3_mfcc.get(0).length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user1_mfcc.size();z++) {double [] vector = user1_mfcc.get(z); user1_pointList.add(vector);}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user2_mfcc.size();z++) {double [] vector = user2_mfcc.get(z); user2_pointList.add(vector);}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user3_mfcc.size();z++) {double [] vector = user3_mfcc.get(z); user3_pointList.add(vector);}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//z-normalization</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//The normalization is done for every coordinate by subtracting </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//the mean and dividing by the standard deviation.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;user1_pointList = user1_pointList.normalize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;user2_pointList = user2_pointList.normalize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;user3_pointList = user3_pointList.normalize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GaussianMixture user1_gmm = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GaussianMixture user2_gmm = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GaussianMixture user3_gmm = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//run k-means clustering algorithm to initialize the EM algorithem</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;KMeansClustering kmeans = new KMeansClustering(GAUSSIANS_NUM, user1_pointList, false);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;kmeans.run();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;user1_gmm = new GaussianMixture(kmeans.getClusterWeights(), kmeans.getMeans(), kmeans.getFullCovariances());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_gmm.runEM(user1_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (CovarianceSingularityException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// TODO Auto-generated catch block</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double d1 = user1_gmm.getLogLikelihood(user1_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double d2 = user1_gmm.getLogLikelihood(user2_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double d3 = user1_gmm.getLogLikelihood(user3_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;LogLikelihood: d1=&quot;+Double.toString(d1)+&quot;; d2=&quot;+Double.toString(d2)+&quot;; d3=&quot;+Double.toString(d3));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public float [] getSignalFromFile(String filename) </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;File audiofile = new File(filename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WaveData waveData = new WaveData();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float[] signal = waveData.extractAmplitudeFromFile(audiofile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;////Input signal normalization</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreprocessor audioPreprocessor = new AudioPreprocessor();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] del_mic = audioPreprocessor.deleteMICEffects(signal,500); //delete MIC effect</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//authAudioRecorder.DisplayAmplitude(del_mic);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] zero_amplitudes = audioPreprocessor.ZeroNormalization(del_mic);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//authAudioRecorder.DisplayAmplitude(zero_amplitudes);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] norm_amplitudes = audioPreprocessor.amplitudeNormalize(zero_amplitudes);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//AudioRecorder.DisplayAmplitude(norm_amplitudes); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] no_silence = audioPreprocessor.GauseSilenceRemover(norm_amplitudes, 22050);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//AudioRecorder.DisplayAmplitude(no_silence);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return no_silence;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public AudioPreProcessor getAudioPreProcessor(String filename)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;File audiofile = new File(filename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioInputStream audioInputStream = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreProcessor audioPreProcessor = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;audioInputStream = AudioSystem.getAudioInputStream(audiofile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (UnsupportedAudioFileException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IOException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//check input type</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(audioInputStream == null || !(audioInputStream instanceof AudioInputStream))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalArgumentException(&quot;input type for the td feature extraction process should be AudioPreProcessor and must not be null&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;audioPreProcessor = new AudioPreProcessor((AudioInputStream) audioInputStream);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double sample_rate = audioPreProcessor.getSampleRate();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return audioPreProcessor;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
LogLikelihood: d1=-527.3006807672704; d2=-3111.5296058075746; d3=-Infinity<br>
<br>
Если я правильно понимаю, то для того, чтобы получить Lamda_UBM = {mu_i;w_i;sigma_i} - мне нужно получить GMM модель для всех пользователей, тоесть в PointList будут вектора коэффициентов MFCC для всех пользователей. У меня будет GMM модель пользователя Lamda_user = {mu_i;w_i;sigma_i}, а дальше нужно получить LogLikelihood(gmm.getLogLikelihood(pointList)):<br>
<br>
S = log[P(X|Lamda_user)] - log[P(X|Lamda_UBM)];<br>
<br>
Если S &lt; меньше порогового значения Q, то данный фрагмент речи не принадлежит человеку.]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394186</guid>
        <pubDate>Wed, 01 Jan 2014 11:20:15 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3394186</link>
        <description><![CDATA[nsh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>        float [] norm_amplitudes = audioPreprocessor.amplitudeNormalize(zero_amplitudes);</div></div><br>
<br>
Нужно делать нормализацию среднего коэффициентов MFCC (cepstral mean normalization, PointList.normalize()), что обеспечивает нормализацию амплитуды по различным частотным каналам, а не просто нормализовать амплитуду сигнала.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>        for(int z=0;z&lt;size*WINDOW_SIZE;z++) inputData1[z] = signal1[z];<br>
</div></div><br>
<br>
На окна нужно нарезать с перекрытием, лучше использовать AudioPreProcessor из comirva<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>    private final int GAUSSIANS_NUM = 16;<br>
</div></div><br>
<br>
Слишком много гауссианов, поэтому и не удаётся оценить GMM параметры. Попробуйте 1 гауссиан сначала или 2, если запись небольшая. Чтобы оценить 8 гауссианов нужна где-то минута записей.]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393916</guid>
        <pubDate>Mon, 30 Dec 2013 20:32:58 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393916</link>
        <description><![CDATA[serious911: Пытаюсь использовать для GMM библиотеку Comirva: подключил библиотеку и с ее помощью получил MFCC коэффициенты. Дальше пытаюсь получить GMM так как показано в примерах, но почему-то возникает CovarianceSingularityException на этой строчке кода:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">user1_gmm.runEM(user1_pointList); //запуск Expectation-Maximization</div></ol></div></div></div></div><br>
<br>
user1_pointList - список векторов с MFCC коэффициентами.<br>
<br>
Согласно <a class='tag-url' href='http://www.cp.jku.at/people/schedl/research/development/comirva/releases/0.36/CoMIRVA/doc/index.html?comirva/audio/util/gmm/GaussianMixture.html' target='_blank'>http://www.cp.jku.at/people/schedl/researc...ianMixture.html</a><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
 Covariance Singularity Exception<br>
<br>
Description:<br>
This class indicates that during the EM training algorithm of a Gaussian Mixture Model one of the components got singular. A corrected list of points Might be passed through this exception, such that one can rerun the EM algorithm with the corrected list of points. </div></div><br>
<br>
Сделал еще один try/catch с getCorrectedPointList(), но все равно не работает - снова возникает Covariance Singularity Exception.<br>
<br>
<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package net.test.VoiceControl;</div><div class="code_line">&nbsp;</div><div class="code_line">import java.io.File;</div><div class="code_line">import java.io.IOException;</div><div class="code_line">&nbsp;</div><div class="code_line">import net.test.VoiceControl.audio.AudioRecorder;</div><div class="code_line">import net.test.VoiceControl.audio.WaveData;</div><div class="code_line">import comirva.audio.util.MFCC;</div><div class="code_line">import comirva.audio.util.PointList;</div><div class="code_line">import comirva.audio.util.gmm.CovarianceSingularityException;</div><div class="code_line">import comirva.audio.util.gmm.GaussianMixture;</div><div class="code_line">import comirva.audio.util.kmeans.KMeansClustering;</div><div class="code_line">&nbsp;</div><div class="code_line">public class VoiceTest {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//SAMPLE_RATE,WINDOW_SIZE,NUMCOEFICCIENT - window size = (1/22050)*512 = 23.2 ms</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int WINDOW_SIZE = 512;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int SAMPLE_RATE = 22050;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int MFCC_NUM = 13;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private final int GAUSSIANS_NUM = 16;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public VoiceTest() </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//get input signal</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] signal1 = getSignalFromFile(&quot;user1_auth1.wav&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//cut signal</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int size = size = signal1.length / WINDOW_SIZE;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double [] inputData1 = new double[size * WINDOW_SIZE];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;size*WINDOW_SIZE;z++) inputData1[z] = signal1[z];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//get MFCC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;MFCC mfcc = new MFCC(SAMPLE_RATE,WINDOW_SIZE,MFCC_NUM,true);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;double [][] user1_mfcc = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_mfcc = mfcc.process(inputData1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IllegalArgumentException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IOException e) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e.printStackTrace();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;////get GMM</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//create a point list with appropriate dimensions</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PointList user1_pointList = new PointList(user1_mfcc[0].length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(int z=0;z&#60;user1_mfcc.length;z++) {double [] vector = user1_mfcc[z]; user1_pointList.add(vector);}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GaussianMixture user1_gmm = null;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//run k-means clustering algorithm to initialize the EM algorithem</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;KMeansClustering kmeans = new KMeansClustering(GAUSSIANS_NUM, user1_pointList, false);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kmeans.run();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//run EM algorithem for gaussian mixture model</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_gmm = new GaussianMixture(kmeans.getClusterWeights(), kmeans.getMeans(), kmeans.getFullCovariances());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_gmm.runEM(user1_pointList);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;catch(CovarianceSingularityException cse)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//try to do the whole stuff once more with the corrected pointset</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//run k-means clustering algorithm to initialize the EM algorithem</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;KMeansClustering kmeans = new KMeansClustering(GAUSSIANS_NUM, cse.getCorrectedPointList(), false);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kmeans.run();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//run EM algorithem for gaussian mixture model</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_gmm = new GaussianMixture(kmeans.getClusterWeights(), kmeans.getMeans(), kmeans.getFullCovariances());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user1_gmm.runEM(cse.getCorrectedPointList());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;catch(CovarianceSingularityException cse2)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//well at this point we give up, we don&#39;t try further</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new IllegalArgumentException(&quot;cannot create GMM for this song;&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;ok&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public float [] getSignalFromFile(String filename) </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;File audiofile = new File(filename);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WaveData waveData = new WaveData();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float[] signal = waveData.extractAmplitudeFromFile(audiofile);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;////Input signal normalization</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;AudioPreprocessor audioPreprocessor = new AudioPreprocessor();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] del_mic = audioPreprocessor.deleteMICEffects(signal,500); //delete MIC effect</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//authAudioRecorder.DisplayAmplitude(del_mic);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] zero_amplitudes = audioPreprocessor.ZeroNormalization(del_mic);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//authAudioRecorder.DisplayAmplitude(zero_amplitudes);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] norm_amplitudes = audioPreprocessor.amplitudeNormalize(zero_amplitudes);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//AudioRecorder.DisplayAmplitude(norm_amplitudes); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;float [] no_silence = audioPreprocessor.GauseSilenceRemover(norm_amplitudes, 22050);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//AudioRecorder.DisplayAmplitude(no_silence);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return no_silence;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div></div></div>]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393370</guid>
        <pubDate>Sun, 29 Dec 2013 17:11:39 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393370</link>
        <description><![CDATA[nsh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>В чем отличия при использовании MFCC+GMM для распознавания человека по голосу и распознавания слов? </div></div><br>
<br>
При распознавании слов MFCC+GMM недостаточно, кроме выделения классов (звуков) нужно ещё и найти эти классы во времени (где каждый звук находится, какая последовательность звуков). Для распознавания речи используется MFCC + GMM + HMM (скрытая марковскаям модель). Именно использование скрытой марковской модели позволяет находить слова в непрерывном потоке речи. При распознавании человека не нужно выделять человека в потоке речи, записи каждого отдельного человека уже доступны. Достаточно их классифицировать (понять, к какому классу каждый образе относится).<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Если я правильно понимаю, то алгоритм примерно тот, же: нормалиация-&gt;FFT-&gt;log-&gt;DCT-&gt;MFCC-&gt;GMM. </div></div><br>
<br>
Алгоритм на этом не заканчивается - следующий этап это принятие решение о классификации. Если у нас есть набор распределений GMM, соответствующих классам, и тестовый образец, нам нужно сравнить оценки P(образец|GMM_i) и выбрать наилучший. Это и будет распознанный клас.<br>
<br>
Алгоритм одинаковый, и на странице matlab он изложен хорошо.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Дальше у меня будут, например, тестовые вектора, которые я хочу сравнить. А как это сделать?</div></div><br>
<br>
Нужно построить набор GMM сначала для каждого человека. Затем вычислить P(образец|GMM_i), найти наилучший. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2013-12-29T17:40:55+00:00">29.12.13, 17:40</time></span></span><br>
Weka не очень удобный инструмент для таких задач, по большому счету он не подходит, например, в Weka нет многомерных векторов в качестве признаков, только одномерные.<br>
<br>
Чтобы поэкспериментировать с классификацией в weka нужно создать один большой файл следующего формата с фреймами разных человек:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class_label1, feature1, feature2, feature3, feature4</div><div class="code_line">class_label1, feature1, feature2, feature3, feature4</div><div class="code_line">class_label2, feature1, feature2, feature3, feature4</div><div class="code_line">class_label2, feature1, feature2, feature3, feature4</div></ol></div></div></div></div><br>
<br>
И запускать на закладке classify разные методы по классификации class_label по данным feature. Тестовый файл в подобном формате можно приложить тоже. Попробовать можно libSVM, но ничего хорошего не будет.<br>
<br>
Лучше использовать приведённый выше пример на matlab или, например, более продвинутые инструменты для машинного обучения - scikit-learn <a class='tag-url' href='http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GMM.html' target='_blank'>http://scikit-learn.org/stable/modules/gen...ixture.GMM.html</a> (python) или на java что-нибудь поискать. Реализаций много, но толковых мало. Comirva можно посмотеть, там вроде было <a class='tag-url' href='http://www.cp.jku.at/people/schedl/Research/Development/CoMIRVA/webpage/CoMIRVA.html' target='_blank'>http://www.cp.jku.at/people/schedl/Researc...ge/CoMIRVA.html</a>]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393332</guid>
        <pubDate>Sun, 29 Dec 2013 14:38:05 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393332</link>
        <description><![CDATA[serious911: В этой статье <a class='tag-url' href='http://www.mathworks.com/company/newsletters/articles/developing-an-isolated-word-recognition-system-in-matlab.html' target='_blank'>http://www.mathworks.com/company/newslette...-in-matlab.html</a> для распознавания слов также используют MFCC+GMM.<br>
<br>
В чем отличия при использовании MFCC+GMM для распознавания человека по голосу и распознавания слов? <br>
<br>
Если я правильно понимаю, то алгоритм примерно тот, же: нормалиация-&gt;FFT-&gt;log-&gt;DCT-&gt;MFCC-&gt;GMM. <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>В WEKA, например, можно использовать csv файлы вместо ARFF (текстовый файл со значениями, разделённый запятыми).<br>
<br>
<a class='tag-url' href='http://weka.wikispaces.com/Can+I+use+CSV+files%3F' target='_blank'>http://weka.wikispaces.com/Can+I+use+CSV+files%3F</a></div></div><br>
<br>
Проблема у меня не в формате файла (CSV, ARFF), а в том как правильно создать этот файл и что дальше делать.<br>
<br>
Я создал такой файл (формат согласно <a class='tag-url' href='http://www.cs.waikato.ac.nz/~ml/weka/arff.html):' target='_blank'>http://www.cs.waikato.ac.nz/~ml/weka/arff.html):</a><br>
<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
@RELATION train_mfcc<br>
<br>
@ATTRIBUTE k1 NUMERIC<br>
@ATTRIBUTE k2 NUMERIC<br>
@ATTRIBUTE k3 NUMERIC<br>
@ATTRIBUTE k4 NUMERIC<br>
@ATTRIBUTE k5 NUMERIC<br>
@ATTRIBUTE k6 NUMERIC<br>
@ATTRIBUTE k7 NUMERIC<br>
@ATTRIBUTE k8 NUMERIC<br>
@ATTRIBUTE k9 NUMERIC<br>
@ATTRIBUTE k10 NUMERIC<br>
@ATTRIBUTE k11 NUMERIC<br>
@ATTRIBUTE k12 NUMERIC<br>
@ATTRIBUTE k13 NUMERIC<br>
@ATTRIBUTE k14 NUMERIC<br>
@ATTRIBUTE k15 NUMERIC<br>
@ATTRIBUTE k16 NUMERIC<br>
@ATTRIBUTE k17 NUMERIC<br>
@ATTRIBUTE k18 NUMERIC<br>
@ATTRIBUTE k19 NUMERIC<br>
@ATTRIBUTE k20 NUMERIC<br>
<br>
@DATA   <br>
-32.3498, 4.0605, 5.8301, 3.0689, -2.8713, 4.5942, 1.2795, 4.3517, 0.5966, 1.0423, 0.2772, 1.8529, -0.3554, 0.682, -1.1851, 0.5094, -0.3388, -0.447, -0.477, -0.1983<br>
-22.1714, 11.6567, 0.9019, 3.1513, -4.0799, -0.1471, 0.0523, 3.1226, 0.4186, 0.3383, -0.1819, 0.2799, 0.9002, -0.1322, -0.0654, -0.4336, 0.0645, 0.0541, -0.4947, 0.4486<br>
-17.7415, 12.9399, -1.1669, 4.0394, -4.5064, -0.848, 0.8684, 3.3472, 0.1241, 0.7678, -0.437, 1.142, 1.1662, -0.4765, 0.1562, -0.6562, 0.1151, -0.4745, -0.2884, 0.5798 <br>
-15.7587, 11.7175, -1.3064, 3.4384, -4.5473, 0.0878, -0.0937, 3.8573, -0.9389, 0.5959, -1.583, 2.5714, 0.0397, 0.1557, -0.2259, -0.5382, 0.0895, -0.5952, -0.1294, 0.5923 <br>
-14.8299, 11.5163, -0.8506, 2.6221, -3.7514, -1.5211, 0.0827, 2.8456, -0.3039, -0.2845, -0.4518, 1.9514, 1.0591, -0.4259, -0.0208, -0.9849, 0.2597, -0.1178, 0.0367, 0.5465 <br>
-16.5354, 13.0119, -0.7588, 2.7527, -4.0031, -1.4531, -0.014, 1.9984, -0.2771, -0.7085, -0.2466, 1.4909, 0.9616, -0.9521, -0.2399, -0.6355, 0.0683, 0.4254, -0.2596, 0.5112 <br>
-17.0784, 12.9701, -0.3731, 3.6204, -4.8669, -0.7527, -0.0437, 2.3372, -0.9504, 0.6396, -1.045, 1.9671, 0.3374, -0.8312, 0.1097, -0.8346, 0.2744, -0.299, 0.1362, 0.584<br>
17.8279, 11.8431, -0.0373, 3.2749, -5.9843, -0.5036, -0.0407, 1.9581, -0.9016, -0.0151, -0.3362, 2.2256, 0.8158, -1.1666, -0.0412, -0.2118, 0.1392, -0.0786, -0.195, 0.3339 <br>
-17.5583, 14.0317, 0.6605, 2.9566, -5.1855, 1.2289, 0.342, 1.768, -0.5752, -0.7489, 0.0884, 2.3976, 0.7062, -0.7034, -0.1701, 0.1148, -0.2311, 0.3706, -0.4088, 0.0948 <br>
-14.2456, 11.5991, -0.8751, 2.7092, -5.1847, 1.0162, -0.1195, 1.3294, -1.4993, -0.5606, -0.3121, 2.1927, 0.5673, -0.3341, -0.7374, 0.2916, -0.3252, 0.368, -0.3364, 0.0532 <br>
-14.96, 12.7157, -1.6107, 3.1761, -4.815, 1.2706, -0.0858, 1.4589, -1.7943, -0.3679, -0.0455, 1.2875, 0.6884, -0.5105, -1.2056, 0.1294, -0.3311, 0.3149, 0.0293, -0.1 <br>
-16.1005, 13.5202, -1.0193, 4.1524, -4.2875, 1.1936, 1.3232, 0.2577, -1.629, -0.1102, 0.8293, 2.0851, 0.804, -0.3667, -0.3707, -0.194, -0.2832, 0.7501, 0.5325, 0.1284<br>
-16.9499, 11.8779, -0.5173, 4.1349, -4.0047, -0.9061, 2.6433, -1.121, -1.4609, -0.7473, 0.0262, 2.1373, 0.4892, -0.2107, 0.3484, -0.6026, -0.5675, 0.517, 0.2577, -0.4453 <br>
-21.813, 12.656, -2.1174, 5.9518, -3.6495, -1.899, 1.914, -0.5438, -3.0692, -0.0507, -1.0886, 1.277, -0.535, -0.7092, 0.4369, -0.2334, -0.7128, 0.0336, 0.5755, 0.0062<br>
-29.7809, 10.5696, 1.8924, 4.8169, -0.6066, -1.1082, 2.8271, 0.4978, -1.384, 0.2966, 0.2374, 0.47, 1.0145, 0.3163, -0.3014, -0.5509, -0.9247, -0.0763, 0.3708, -0.2323<br>
-39.4665, 11.7038, 5.5216, 5.4122, 2.6301, 0.9113, 1.5733, 0.399, -0.6269, 0.9535, 0.7488, 0.5937, -0.1416, 0.2795, -0.2759, -0.4314, -0.2536, 0.5792, -0.3839, -0.8368 <br>
-40.1275, 10.5679, 5.5873, 4.7788, 1.537, 0.9708, 0.9561, 0.7576, -0.1029, 0.252, 0.4989, 0.6563, 0.2654, -0.6313, -0.4296, 0.1563, -0.154, -0.0511, -0.0243, -0.5802 <br>
-40.6595, 11.3106, 5.3157, 4.9205, 1.8858, 1.2899, 1.2226, 0.7896, -1.1021, -0.0255, 0.388, 1.4903, -0.946, -0.8741, -0.4228, -0.5073, -0.3334, 0.2134, 0.4922, 0.6576 <br>
-40.7937, 9.4612, 6.3366, 5.3235, 1.7335, 2.8178, 1.3118, -0.0597, -0.5287, 0.6929, 0.1539, 0.4845, -0.2175, -0.1465, 0.0515, 0.2726, 0.0592, -0.1556, 0.1291, -0.2017<br>
-41.1384, 11.4818, 5.6535, 4.7051, 1.9337, 2.4688, 1.5602, 0.8369, -0.1301, 0.9709, 0.56, 0.5075, -0.1387, -0.4169, 0.1217, 0.5877, -0.294, 0.1396, -0.0018, -0.2662 <br>
-40.8711, 10.9265, 6.0457, 5.6562, 2.0577, 1.0463, 0.546, 0.807, 0.6733, 1.3445, -0.2982, 0.0871, -0.4798, -0.1801, 0.5497, 0.607, -0.4527, -0.0106, -0.1941, -0.0726<br>
</div></div></div></div><br>
<br>
k1-k20 - это коэффициенты MFCC, каждая строка - это вектор, который я получаю для каждого фрейма.<br>
<br>
<img class='tag-img' src='http://koles0.ucoz.ru/grafic/22.png' alt='user posted image'><br>
<img class='tag-img' src='http://koles0.ucoz.ru/grafic/11.png' alt='user posted image'><br>
<br>
Log likelihood: -26.14818<br>
<br>
Дальше у меня будут, например, тестовые вектора, которые я хочу сравнить. А как это сделать?]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393184</guid>
        <pubDate>Sat, 28 Dec 2013 20:50:15 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393184</link>
        <description><![CDATA[nsh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>поделитесь, пожалуйста, простым для понимания исходником GMM, а то я не могу никак разобраться...</div></div><br>
<br>
Чтобы понимать GMM, нужно разобраться в теории сначала, в алгоритме EM (expectation maximization). Без понимания теории исходный код не понять.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Еще есть библиотека WEKA, но там непонятно как создавать *.arff файлы. Также встречал примеры с обработкой изображений с помощью GMM.</div></div><br>
<br>
В WEKA, например, можно использовать csv файлы вместо ARFF (текстовый файл со значениями, разделённый запятыми).<br>
<br>
<a class='tag-url' href='http://weka.wikispaces.com/Can+I+use+CSV+files%3F' target='_blank'>http://weka.wikispaces.com/Can+I+use+CSV+files%3F</a>]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393063</guid>
        <pubDate>Sat, 28 Dec 2013 15:24:11 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3393063</link>
        <description><![CDATA[serious911: поделитесь, пожалуйста, простым для понимания исходником GMM, а то я не могу никак разобраться...<br>
<br>
желательно на Java или С#. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2013-12-28T15:37:57+00:00">28.12.13, 15:37</time></span></span><br>
я долго искал примеры GMM:<br>
<br>
<a class='tag-url' href='http://staff.aist.go.jp/s.akaho/MixtureEM.html' target='_blank'>http://staff.aist.go.jp/s.akaho/MixtureEM.html</a><br>
<a class='tag-url' href='http://www.lix.polytechnique.fr/~nielsen/MEF/index_old.htm' target='_blank'>http://www.lix.polytechnique.fr/~nielsen/MEF/index_old.htm</a><br>
<a class='tag-url' href='http://www.scale.uni-saarland.de/cms/tl_files/scale/publications/Icassp10-sgmm.pdf' target='_blank'>http://www.scale.uni-saarland.de/cms/tl_fi...assp10-sgmm.pdf</a><br>
<a class='tag-url' href='http://consortium.simple4all.org/files/2013/01/ICASSP2013_mamiya_et_al.pdf' target='_blank'>http://consortium.simple4all.org/files/201...amiya_et_al.pdf</a><br>
и много других...<br>
<br>
Но везде или много непонятных формул без исходного кода, или есть код, но не понятно как его применить на практике.<br>
<br>
У меня есть массив коеф. MFCC:<br>
<br>
double [][] = new double[12][N];<br>
<br>
N - количество векторов<br>
12 - количество коеф. MFCC.<br>
<br>
Еще есть библиотека WEKA, но там непонятно как создавать *.arff файлы. Также встречал примеры с обработкой изображений с помощью GMM.]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3382110</guid>
        <pubDate>Mon, 02 Dec 2013 10:37:43 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3382110</link>
        <description><![CDATA[nsh: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '> В результате я получаю матрицу коэффициентов, а дальше скармливаю ее в алгоритм LBG и получаю на выходе кодовою книгу. Дальше я вычисляю расстояние Евклида и получаю некоторое значение. Если это значение минимально, то я примерно могу определить, кто говорил из зарегистрированных в базе пользователей. </div></div><br>
<br>
Нужно тренировать не кодовую книгу, а распределение GMM. В результате тогда будет получаться не расстояние Евклида, а вероятность. Преимущество GMM перед кодовой книгой в том, что кроме среднего GMM включает вариацию, что позволяет понимать, в каких пределах может изменяться сигнал. Или, кроме кодовой книги нужно вычислять границы изменения сигнала.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '> Но проблема в том, что таким способом я не смогу определить пользователя если в БД он не зарегистрирован.</div></div><br>
<br>
Для того, чтобы выделить пользователя от остальных нужно натренировать общее распределение сигнала для всех пользователей (UBM, или universal background model). Тогда можно принимать решение между гипотезами - пользователь ли это или другой человек, и оптимальное решение будет соотношением вероятностей P(пользователь)/P(все люди). GMM для всех людей будет иметь больший разброс по вариации и, таким образом, будет больше для человека со стороны.<br>
<br>
Про алгоритмы идентификации диктора можно прочесть в хорошей книге:<br>
<br>
<a class='tag-url' href='http://www.amazon.com/Fundamentals-Speaker-Recognition-Homayoon-Beigi/dp/0387775919' target='_blank'>http://www.amazon.com/Fundamentals-Speaker...i/dp/0387775919</a><br>
<br>
Скачать систему идентификации можно тут:<br>
<br>
<a class='tag-url' href='http://mistral.univ-avignon.fr/publi_en.html' target='_blank'>http://mistral.univ-avignon.fr/publi_en.html</a><br>
<br>
Там же в статьях можно прочесть подробные описания применяемых алгоритмов, например, тут <a class='tag-url' href='http://mistral.univ-avignon.fr/doc/publi/06_ODISSEY_Scheffer.pdf' target='_blank'>http://mistral.univ-avignon.fr/doc/publi/0...EY_Scheffer.pdf</a>]]></description>
        <author>nsh</author>
        <category>Речевые Технологии</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3381893</guid>
        <pubDate>Sun, 01 Dec 2013 19:09:57 +0000</pubDate>
        <title>Система авторизации</title>
        <link>https://forum.sources.ru/index.php?showtopic=384447&amp;view=findpost&amp;p=3381893</link>
        <description><![CDATA[serious911: Здравствуйте.<br>
<br>
Я делаю <span class='tag-u'>простую</span> систему авторизации по голосу. Я реализовал простенькую программу, которая разбивает аудиофайл на фреймы и вычисляет MFCC коэффициенты. В результате я получаю матрицу коэффициентов, а дальше скармливаю ее в алгоритм LBG и получаю на выходе кодовою книгу. Дальше я вычисляю расстояние Евклида и получаю некоторое значение. Если это значение минимально, то я примерно могу определить, кто говорил из зарегистрированных в базе пользователей. Но проблема в том, что таким способом я не смогу определить пользователя если в БД он не зарегистрирован. Т.е., чтобы предоставить пользователю доступ мне нужно сравнить кодовые книги 1 пользователя и принять решение о предоставлении доступа. Но как принять это решение?<br>
<br>
Подскажите, пожалуйста, какой-нибудь алгоритм, чтобы определить с какой вероятностью голос 2-х человек похож.<br>
<br>
<br>
P.S. Я понимаю, что это все очень сложно на самом деле, но я пытаюсь сделать очень простую систему.]]></description>
        <author>serious911</author>
        <category>Речевые Технологии</category>
      </item>
	
      </channel>
      </rss>
	