2010-09-24 42 views
5

我目前正試圖在AS3中實現基本的語音識別。我需要這是完全客戶端,因爲我不能訪問功能強大的服務器端語音識別工具。我的想法是用一個詞來檢測音節,並用它來確定所說的單詞。我知道這樣會嚴重影響識別能力,但我只需要識別幾個關鍵詞,我就可以確保它們都有不同數量的音節。1D多峯值檢測?

我目前能夠爲說出的單詞生成一維語音級別的數組,並且我可以清楚地看到,如果我以某種方式繪製它,在大多數情況下音節都有明顯的峯值。但是,我完全陷入瞭如何找出那些高峯。我只是真的需要伯爵,但我想這是找到他們。起初,我想抓住一些最大值,並將它們與平均值進行比較,但我忘記了比其他峯值更大的峯值,因此,我所有的「峯值」都位於一個實際峯值上。

我偶然發現some Matlab code看起來太短而不真實,但我不能那麼做,因爲我無法將它轉換成我知道的任何語言。我嘗試了AS3和C#。所以我想知道你們是否可以讓我走上正確的道路或者有任何僞碼來檢測峯值?

回答

4

matlab代碼非常簡單。我會盡量將它翻譯成更僞造的東西。

它應該很容易翻譯成ActionScript/C#,如果你遇到困難,你應該試試這個併發布後續問題,這樣你將獲得最好的學習效果。

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

查找曲線的峯值和谷值都是關於看線的斜率。在這樣的位置,斜率爲0.我猜測聲音曲線非常不規則,首先必須平滑,直到只有重要的峯值存在。

所以當我看到它的曲線應該被視爲一組點。點的組應該被平均以產生簡單的平滑曲線。然後比較每個點的差異,發現彼此並沒有很大差別,並將這些區域確定爲高峯,谷地或高原。

1

如果有人想在AS3最終代碼,那就是:

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

此函數不返回任何東西,但如果它這樣做,是不是隻是返回的索引最高峯 - 並非所有峯? – Matt 2011-03-31 05:54:15