2010-09-24 12 views
5

Obecnie próbuję wdrożyć podstawowe rozpoznawanie mowy w AS3. Potrzebuję tego po stronie klienta, ponieważ nie mam dostępu do wydajnych narzędzi rozpoznawania mowy po stronie serwera. Pomysł polegał na wykryciu sylab w słowie i wykorzystaniu go do określenia słowa. Jestem świadomy, że to pozwoli ograniczyć możliwości rozpoznawania, ale muszę tylko rozpoznać kilka słów kluczowych i mogę upewnić się, że wszystkie mają różną liczbę sylab.Wykrywanie wielu szczytów 1D?

Obecnie jestem w stanie wygenerować tablicę 1D poziomu głosu dla wypowiedzianego słowa i wyraźnie widzę, jeśli w jakiś sposób ją narysuję, że w większości przypadków istnieją wyraźne szczyty sylab. Jednak całkowicie utknąłem w kwestii tego, w jaki sposób poznam te szczyty. Naprawdę potrzebuję tylko liczenia, ale przypuszczam, że to przychodzi ze znalezieniem ich. Początkowo myślałem o złapaniu kilku maksymalnych wartości i porównaniu ich ze średnią wartości, ale zapomniałem o tym, że szczyt jest większy od innych i jako takie, wszystkie moje "szczyty" znajdowały się na jednym rzeczywistym piku.

Natknąłem się na some Matlab code, który wygląda prawie zbyt krótko, aby mógł być prawdziwy, ale nie mogę tego zrobić, ponieważ nie jestem w stanie przekonwertować go na język, który znam. Próbowałem AS3 i C#. Zastanawiam się więc, czy moglibyście uruchomić mnie na właściwej ścieżce, czy mielibyście pseudo-kod do detekcji pików?

Odpowiedz

4

Kod matlab jest dość prosty. Spróbuję przetłumaczyć to na coś bardziej pseudokodowanego.

Powinno być łatwo przetłumaczyć na ActionScript/C#, powinieneś wypróbować to i zamieścić dalsze pytania z kodem, jeśli utkniesz, w ten sposób uzyskasz najlepszy efekt uczenia się.

Param: delta (defines kind of a tolerance and depends on your data, try out different values) 
min = Inf (or some very high value) 
max = -Inf (or some very low value) 
lookformax = 1 
for every datapoint d [0..maxdata] in array arr do 
    this = arr[d] 
    if this > max 
    max = this 
    maxpos = d 
    endif 
    if this < min 
    min = this 
    minpos = d 
    endif 

    if lookformax == 1 
    if this < max-delta 
     there's a maximum at position maxpos 
     min = this 
     minpos = d 
     lookformax = 0 
    endif 
    else 
    if this > min+delta 
     there's a minimum at position minpos 
     max = this 
     maxpos = d 
     lookformax = 1 
    endif 
    endif 
1

Wyszukiwanie szczytów i dolin krzywej polega na spojrzeniu na nachylenie linii. W takim miejscu nachylenie wynosi 0. Ponieważ zgaduję, że krzywa głosu jest bardzo nieregularna, najpierw trzeba ją wygładzić, dopóki nie pojawią się tylko istotne piki.

Krzywa powinna być traktowana jako zbiór punktów. Grupy punktów powinny być uśrednione w celu uzyskania prostej gładkiej krzywej. Następnie należy porównać różnicę każdego punktu, a punkty nie różnią się bardzo od siebie i obszarów zidentyfikowanych jako szczyt, doliny lub płaskowyż.

1

Jeśli ktoś chce ostateczny kod w AS3, to jest tutaj:

function detectPeaks(values:Array, tolerance:int):void 
{ 


var min:int = int.MIN_VALUE; 
var max:int = int.MAX_VALUE; 
var lookformax:int = 1; 
var maxpos:int = 0; 
var minpos:int = 0; 

for(var i:int = 0; i < values.length; i++) 
{ 
    var v:int = values[i]; 
    if (v > max) 
    { 
     max = v; 
     maxpos = i; 
    } 
    if (v < min) 
    { 
     min = v; 
     minpos = i; 
    } 

    if (lookformax == 1) 
    { 
     if (v < max - tolerance) 
     { 
      canvas.graphics.beginFill(0x00FF00); 
      canvas.graphics.drawCircle(maxpos % stage.stageWidth, (1 - (values[maxpos]/100)) * stage.stageHeight, 5); 
      canvas.graphics.endFill(); 

      min = v; 
      minpos = i; 
      lookformax = 0; 
     } 
    } 
    else 
    { 
     if (v > min + tolerance) 
     { 
      canvas.graphics.beginFill(0xFF0000); 
      canvas.graphics.drawCircle(minpos % stage.stageWidth, (1 - (values[minpos]/100)) * stage.stageHeight, 5); 
      canvas.graphics.endFill(); 

      max = v; 
      maxpos = i; 
      lookformax = 1; 
     } 
    } 
} 

}

+1

Ta funkcja nie zwraca niczego, ale gdyby tak się stało, nie byłoby to po prostu wrócić indeks najwyższy szczyt - nie wszystkie szczyty? – Matt

Powiązane problemy