На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: RaD, nsh
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Признаки для идентификации диктора
    Доброго времени. Какие признаки лучше всего использовать для идентификации диктора ??? Планирую использовать MFCC + LSTM.
      google: i-vector
        Google говорит, что схема следующая: MFCC -> GMM -> (обучение i-vector extractor) -> i-vector
        Готовая реализация, как я понял есть только в Kaldi (который под Linux) и пакетах python.
          Цитата Abraziv @
          Kaldi (который под Linux)


          Kaldi под Windows тоже хорошо работает, надо только по инструкции собрать.
          http://nshmyrev.blogspot.com
            Собрал Kaldi под Windows, вроде работает. Теперь нужно разобраться, как извлечь i-vector.
            Оказалось совсем не тривиально разобраться в Kaldi, а точнее в примерах, очень много не ясных этапов (шагов). Есть у кого реальный пример извлечения текстонезависимых признаков говорящего с помощью Kaldi???
              ExpandedWrap disabled
                    
                    extract-segments scp:$spk_dir/wav.scp $spk_dir/segments ark:- | \
                    compute-mfcc-feats --verbose=2 --config=$model_dir/conf/mfcc_xvector.conf ark:- ark:$xvector_dir/feats.ark
                    compute-vad --config=$model_dir/conf/vad.conf ark:$xvector_dir/feats.ark ark,scp:$xvector_dir/vad.ark,$xvector_dir/vad.scp
                 
                    feat="ark:apply-cmvn-sliding --norm-vars=false --center=true --cmn-window=300 ark:$xvector_dir/feats.ark ark:- | select-voiced-frames ark:- scp:$xvector_dir/vad.scp ark:- |"
                 
                    nnet3-xvector-compute --use-gpu=no --min-chunk-size=25 --chunk-size=-1 \
                     "nnet3-copy --nnet-config=$model_dir/xvector_speaker/extract.config $model_dir/xvector_speaker/final.raw - |" "$feat" ark,t,scp:$xvector_dir/xvector.ark,${xvector_dir}/xvector.scp
              http://nshmyrev.blogspot.com
                Спасибо за ответ. Надеялся увидеть код C++ =). Подвох везде. Откуда взялся этот скрипт ???)

                Хотел посоветоваться с профи. Пытался решить задачу распознавания тесктонезависимого диктора с помощью нейронной сети LSTM.
                Делал следующим образом. Брал массив аудио записей различных людей и массив интересующего диктора.
                Вычислял признаки MFCC (13, filter=24,prephase=0.96, lifter, перекрытие = 0.5) и обучал LSTM сеть (2 слоя 100->100).
                Для обучения подавал около 100 записей (MFCC) произвольных людей чередуемых с записями интересующего диктора (записей диктора меньше 100, поэтому циклически повторял). Самое интересное что для малого количества записей произвольных людей пропуск цели был всего 0.2, вероятность ложной тревоги 0.05, но мне этого показалось мало. Ошибку считал как суммарное превышение выходов сети на всем векторе MFCC (брал не последнее значение на выходе). Увеличил число записей людей со 100 до 200 и все перестало работать (пропуск цели 1). Только на некоторых дикторах работает, но с большим пропуском цели. Так же обучение доводил где то до 0.90-0.95, если обучить больше, то система начинает находить только те записи диктора на которых она училась и ВСЁ. Может есть у кого мысля, как побороть данное явление, работа проделана большая, не хочу все бросить и переключиться на Калди, с которой не факт, что разберусь. Время ограничено к сожалению.
                Сообщение отредактировано: Abraziv -
                  Цитата Abraziv @
                  Для обучения подавал около 100 записей (MFCC) произвольных людей чередуемых с записями интересующего диктора (записей диктора меньше 100, поэтому циклически повторял).


                  Этого мало для хороших моделей.
                  http://nshmyrev.blogspot.com
                    Спасибо за ответ. Я правильно понимаю, что количество записей влияет только на вероятность ложной тревоги?
                    Реализовал некоторое подобие x-vector extractor:
                    24 MFCC -> 100(LSTM) -> 100(LSTM) -> 2(FullyConnectedLinearLayer) -> Брал последние 100 значений с последнего слоя LSTM (с обученной предыдущей сети до 0.98), далее обучал -> 1024(DNN ReLU)->1024(DNN ReLU)->1024(DNN ReLU)->2(FullyConnectedLinearLayer)
                    обучал на 20 (10/10) записях. Вероятность пропуска цели на тестовых записях 0.4. Как-то не очень. Взял сейчас добавил дельт к MFCC и увеличил количество юнитов в слоях LSTM до 200, выборку обучения до 100(50/50). Не знаю что будет на выхлопе, но где-то систематическая ошибка мне кажется, что-то делаю не так.
                    Сообщение отредактировано: Abraziv -
                      Вообщем ерунда почему-то. Увеличение количества записей приводит к ухудшению работы системы. Как быть...
                        Можно ещё попробовать

                        https://github.com/WeidiXie/VGG-Speaker-Recognition

                        главное что базу на voxceleb надо учить, а не на 20 записях.
                        http://nshmyrev.blogspot.com
                          nsh, спасибо за ответ. Попробую то что по ссылке. Правда хочется довести своё до ума, это как бросить всё на пол пути...
                          Опять же, вы говорите, что нужно увеличить количество записей обучения, но это же влияет только на вероятность ложной тревоги (ошибку первого рода), а у меня как раз с этим проблема. Обучал и на 400, тогда система начинает искать только выборку (дикторов) на которой обучался, всё остальное относит к "не цель".
                          Сообщение отредактировано: Abraziv -
                            Цитата Abraziv @
                            но это же влияет только на вероятность ложной тревоги (ошибку первого рода), а у меня как раз с этим проблема


                            Нет конечно. На таких маленьких данных ничего просто не научится нормально, как раз и будет переобучаться. Кроме того из описания ничего мне не понятно, как делается собственно верификация, как используются результаты нейросети. Зачем столько LSTM уровеней и так далее.
                            http://nshmyrev.blogspot.com
                              Цитата nsh @
                              Нет конечно. На таких маленьких данных ничего просто не научится нормально, как раз и будет переобучаться. Кроме того из описания ничего мне не понятно, как делается собственно верификация, как используются результаты нейросети. Зачем столько LSTM уровеней и так далее.

                              А почему нет ? Я это проверял. Так и есть, сеть переобучается (overfitting), как это побороть, сложно представить. После каждого пакета прогонять на тестовых и ловить момент, когда на тестовых начнется рост ошибки (chekpoint) ???
                              Сейчас запускал обычную сеть с 1 скрытым слоем LSTM с 50 юнитами. Прогнал один раз на 1000 + 1000 записях (1000 разл людей + 10*100 (повторений) диктора), выходной слой 2 юнита FullyConnectedLinearLayer. Ошибка 2 рода 0.5, 1 рода 0.05. Практически такие же результаты получал на DNN с 4 H слоями по 300 юнитов, но обучалось значительно дольше и результат все же хуже чем у LSTM.
                              Сейчас, использовал (тестировал) модель след образом, подавал на вход тестовые записи и смотрел какой выход (из двух) превысит другой.

                              До этого, использовал описанную выше сеть следующим образом. Обучал две сети, делал на подобие x-vector extractor.

                              Первая (frame lavel) состояла из LSTM (300) и выходного слоя 2 FullyConnectedLinearLayer (два выхода с ReLU), после обучения выходной слой отбрасывался. Далее прогонял через обученную сеть фреймы (MFCC, пробовал и др), выход брал из LSTM (как и писал что откидывал FullyConnectedLinearLayer после обучения) и усреднял выходные кадры (наподобие statistic pooling), полученные усреднения сохранял в контейнер и учил на них следующую сеть.

                              Вторая сеть (Feature lavel) состояла из 2 FullyConnectedDNNLayer с ReLU по 300 юнитов каждый и выходной 2 FullyConnectedLinearLayer (два выхода с ReLU). После обучения второй сети, прогонял тестовые данные и брал с первого скрытого слоя (300 DNN который), далее считал коэф корреляции (вместо PLDA, хотя FullyConnectedLinearLayer считает ту же корреляцию), с сохраненным заранее усредненным вектором полученным на обучающих данных из этой же сети, но всё таки делал как делал. В общем пытался извлечь x-vector.
                              В итоге после обучения получилось две сети следующая одна за другой MFCC -> LSTM(300) -> DNN(300) -> коэф кор (> 0.5 ?).

                              Кстати пытался и совмещать обе сети, путем добавления слоя statistic pooling (embedded layer), но обучается такое очень тяжко, интересно во время обучения ошибка (loos error) на какое то время зависает на 0.5, потом как будто прорывает и быстренько добирается до заданного значения (0.05). Брал выход так же с Feature lavel первого скрытого слоя и так же считал корреляцию, но результат такой же.

                              Ответ на вопрос - почему было так много LSTM слоев, отвечаю, пытался делать как описано в статьях, но видать там делали немного иначе и это было описано, в статьях везде делаю выходной слой с 1000 (большим количеством) FullyConnectedLinearLayer, т.е. нужно уметь отличать каждого из 1000 дикторов. Мне же нужно отделить одного из 1000.
                              Сообщение отредактировано: Abraziv -
                                Ну что тут сказать, записей диктора всего 10. И как система должна учить тысячи параметров? Тут как не исхитряйся, ничего не получится. Мало данных - стандартное решение это предобучение на больших данных. Это и предлагаю. Работать будет хорошо, зуб даю.
                                http://nshmyrev.blogspot.com
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1142 ]   [ 14 queries used ]   [ Generated: 17.07.19, 16:43 GMT ]