На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD, nsh
  
> Timit + Matlab
    Может реализовал кто разбиение Timit на фонемы в Matlabe?
    И делал простейший анализ этих фонем?
      Кто-то реализовал.

      Лучше задавать вопросы точнее.
        Ищи в Интернете:
        1. Алгоритмы пофонемной сегментации
        Дорохин О.А., Старушко Д.Г., Федоров Е.Е., Шелепов В.Ю. Институт проблем искусственного интеллекта Сегментация речевого сигнала
        450-458.pdf
        2.А.К. БУРИБАЕВА, Г.В. ДОРОХИНА, А.В. НИЦЕНКО, В.Ю. ШЕЛЕПОВ, СЕГМЕНТАЦИЯ И ДИФОННОЕ РАСПОЗНАВАНИЕ РЕЧЕВЫХ СИГНАЛОВ, 1776-1843-1-PB.pdf

        Я написал простую програмку в Matlab 7.0, сегментация по амплитуде:
        ExpandedWrap disabled
          clear all;
          close all;
          FileName =  'с:\123\test.wav';
          [signal, Fs] = wavread(FileName) ;
           
          F = (1:length(signal))*(Fs/2)/length(signal); %%частотная сетка
           
          d=length(signal);
          y=signal(1:d);
          z=signal(1:d);
           
           maxy=max(y);
           N=d/256
           
           for(i=1:N)
               p(i)=0;
               for(k=1:256)
                   j=i-1;
                  p(i)=p(i)+ y(j*256+k)^2;
               end;
               p(i)=p(i)^0.5/256;
              %fprintf('p(%d)=%f\n\r',i,p(i));
           end;
           
           s=0;
           for(i=1:N)
           s=s+p(i);
           end;    
           
           pp=s/N
           
           for(i=1:d)    
               if (abs(z(i))<=pp)
                   z(i)=0.3*pp;
               end;
           end;    
           
          wavwrite(z,Fs,'с:\123\_Out.wav');
           
           
           for(i=1:N)    
               if (abs(p(i))<pp)
                   fprintf('p(%d)=%f H \n\r',i,p(i));
               else
                   fprintf('p(%d)=%f B \n\r',i,p(i));
               end;
           end;  
           
          figure(1); plot(F,z);title(sprintf('%s, msec',FileName));
           grid on;
          Продолжение программы автоматической генерации меток в формате HTK. Публикуется в учебных целях, тк пример очень сырой.
          Метки выводятся на экран, после чего их можно скопировать в файл <имя_звукового файла>.lab

          продолжение файла для matlab
          % for(i=1:N)
          % if (abs(p(i))<pp)
          % fprintf('%d %d p(%d)=%f H \n',(i-1)*256,i*256,i,p(i))
          % else
          % fprintf('%d %d p(%d)=%f В \n',(i-1)*256,i*256,i,p(i))
          % end;
          % end;



          for (i=1:N)
          if (abs(p(i))<pp)
          t(i)='L';
          else
          t(i)='H';
          end;
          end;

          startpos=0; %start position


          % сохранить полученные метки в файл в формате HTK
          % константа 230 вычислена экспериментально для частоты дискретизации 48000 Гц
          % величина позиции из HSlab.exe поделена на число i*256


          if exist(FileLabName)
          delete(FileLabName);
          end;



          for(i=2:N)
          if (t(i)~= t(i-1))
          fprintf('%d %d %c \n',startpos,(i-1)*256*230, t(i-1)) % отладка
          %line = sprintf('%d %d %c \n',startpos,(i-1)*256*230, t(i-1));
          startpos = (i-1)*256*230;
          %save FileLabName '-append' '-ascii' startpos; %не работает
          end;
          end;

          fprintf('%d %d %c \n',startpos,i*256*230, t(i)) % отладка

          %save FileLabName startpos '-ascii'; %не работает
          Прикреплённый файлПрикреплённый файлtest.zip (40,79 Кбайт, скачиваний: 168)
            Скажем так, один человек, сказал мне, что если бы в 18-20 веке изобретатели получили бы современный компьютер, то автоматические печатные машинки появились бы спустя 8-10лет, а в наше время повсеместно на всех устройствах работал бы голосовой ввод команд. Если есть желание немного попрограммировать на с++ или матлаб, то напишите мне в личку.
              Во время тестирования участков с низкой амплитудой удобно определить и расставить паузы.
              Ампл. метод позволяет выделить шумные согласные, даже без фильтрации. Каждый участок может состоять из нескольких фонем с одинаковой амплитудой. Как описано в первой работе, необходимо применять фильтры ФНЧ и ФВЧ для дальнейшей сегментации.
              Следующий шаг после сегментации - распознавание фонем.
              Например, шумные согласные с, ш, ф, х на слух отличаются частотой (частотным диапазоном) шума, амплитудный метод как правило определяет их как низкоамплитудный участок. Признаки: нет основного тона, есть непрерывный широкополосный шум. Таким образом их можно классифицировать как фонемы одного класса.
              А как реализовать это распознавание программно? Анализ спектрограмм, применение гребенки фильтров и анализ энергии сигнала?
              Сообщение отредактировано: webcoder88 -
                Цитата
                Например, шумные согласные с, ш, ф, х на слух отличаются частотой (частотным диапазоном) шума, амплитудный метод как правило определяет их как низкоамплитудный участок. Признаки: нет основного тона, есть непрерывный широкополосный шум. Таким образом их можно классифицировать как фонемы одного класса.


                Спектрально энергия этих согласных действительно сфокусирована в высоких частотах, но всё-таки шумные согласные отличаются именно наличием шума. Апмлитуда у них весьма маленькая и зачастую и просто отсутствует. Один товарищ очень правильно на мой вгляд заметил, что в силу своей природы человек ленив и не сильно старается при произношении звуков.
                На мой взгляд минимальный набор признаков для сегментации речи алгоритмическим путём: энергия, уровень сигнал/шум, основной тон и время.
                Передовые технологии используют RNN вместо математики - http://habrahabr.ru/company/google/blog/269747/ - получается горазо лучше ;)


                Прикреплённый файлПрикреплённый файлspectrum3.png (74 Кбайт, скачиваний: 706)
                здесь сегментация с учётом только двух признаков: энергия и уровень синал/шум
                  Почитаю. Я специально выбрал эти фонемы, тк это струя воздуха, выходящая из трубы разного сечения. Поэтому теоретически у всех людей их спектр одинаков.
                  Звуки с, ш и Ф,х попадают в 2 подкласса. Далее подкласс ч и щ. Здесь, скорее всего, немного сложнее.

                  Добавлено
                  С др. стороны хотелось бы убрать далеко в сторону все мовременные модные методы, и уделить основное внимание самым простым алгоритмам. Образно говоря, из пункта А в пункт Б можно дойти пешком, доехать на велосипеде, на машине, на воздушной подушке, долететь на самолете, вертолете, ракете. Выбор средства передвижения зависит от удаленности пунктов. Не стоит забывать, как устроен слуховой аппарат человека. Ушная раковина - спектрограф. Далее пишут про 300-400Гц и счетные декады по 10шт. Здесь следует задуматься, в частотомере быстродействие первой декады должно быть максимальным, чтобы зарегистрировать все входящие импульсы, а быстродействие каждой последующей декады может уменьшаться в 10раз.

                  Добавлено
                  современные модные методы
                    Фильтр на матлабе

                    ExpandedWrap disabled
                          fcuts = [fstop1 fpass1 fpass2 fstop2]; % края частотных полос
                          [n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);
                          n = n + rem(n,2); % делаем порядок четным
                          hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');
                       
                          sn=filter(hh,1,y); %y - исх. сигнал из wav-файла
                       
                          E = norm(sn)^2; % или так: E0 = sum(y.^2); % код на матлабе см на стр. Теорема Парсеваля — Википедия


                    Во вложении (энерго-частотные) графики для 3-х фонем женского голоса Елена (Фестиваль). Каждая точка графика соответствует диапазону частот 1000Гц, поэтому максимум энергии приходится на диапазон 11-12кГц. Если сузить полосу фильтров до 500 или 100Гц, то картинка очень сильно меняется. Для др. голоса максимум будет лежать в др диапазоне, напр, для мужского голоса Александр в диапазоне 4-5кГц.
                    Прикреплённый файлПрикреплённый файлph_s.rar (63,51 Кбайт, скачиваний: 170)
                    Сообщение отредактировано: nsh -
                      Прошу прощения за монолог. Ш, ч, щ дают пик на частоте 3.5-4кГц пришаге в 1000Гц. В чистом виде этот способ не решает поставленной задачи.
                      Очень меня напрягает звук б. Если слушать часть фонемы без последнего взрывного всплеска, то слышиться невнятный приглушенный гласный.
                      Вся фонема воспринимается как бы произнесенной в обр. порядке.
                        Поправка к сообщению Сообщ. #4.
                        Константа должна вычисляться по следующей формуле: константа = индекс, полученный из wav-файла /частота дискретизации
                        Для Fs = 48000 это значение ~208, а не 230.
                        Метки в формате hts - это значения в секундах, умноженное на 1000000 и округленное до целого цисла. Поэтому одни и те же метки можно использовать для звуковых файлов с разной частотой дискретизации.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0311 ]   [ 21 queries used ]   [ Generated: 18.04.24, 23:22 GMT ]