2010-09-24 27 views
5

Tôi hiện đang cố gắng triển khai nhận dạng giọng nói cơ bản trong AS3. Tôi cần điều này là hoàn toàn phía khách hàng, vì vậy tôi không thể truy cập các công cụ nhận dạng giọng nói phía máy chủ mạnh mẽ. Ý tưởng tôi có là phát hiện âm tiết trong một từ, và sử dụng nó để xác định từ được nói. Tôi biết rằng điều này sẽ grealty giới hạn năng lực để công nhận, nhưng tôi chỉ cần nhận ra một vài từ khóa và tôi có thể chắc chắn rằng tất cả họ đều có một số âm tiết khác nhau.1D phát hiện nhiều đỉnh?

Tôi hiện có thể tạo ra một mảng giọng nói 1D cho một từ được nói, và tôi có thể thấy rõ ràng, nếu tôi bằng cách nào đó vẽ nó, có các đỉnh khác nhau cho các âm tiết trong hầu hết các trường hợp. Tuy nhiên, tôi hoàn toàn bị mắc kẹt như thế nào tôi sẽ tìm ra những đỉnh núi. Tôi chỉ thực sự cần đếm, nhưng tôi giả sử rằng đi kèm với việc tìm kiếm chúng. Lúc đầu, tôi nghĩ đến việc lấy một vài giá trị tối đa và so sánh chúng với giá trị trung bình nhưng tôi đã quên về đỉnh đó lớn hơn các giá trị khác và như vậy, tất cả "đỉnh" của tôi nằm trên một đỉnh cao thực tế.

Tôi tình cờ gặp some Matlab code trông gần như quá ngắn là đúng, nhưng tôi không thể làm điều đó vì tôi không thể chuyển đổi nó sang bất kỳ ngôn ngữ nào mà tôi biết. Tôi đã thử AS3 và C#. Vì vậy, tôi tự hỏi nếu các bạn có thể bắt đầu tôi trên con đường bên phải hoặc có bất kỳ mã giả để phát hiện cao điểm?

Trả lời

4

Mã matlab khá đơn giản. Tôi sẽ cố gắng dịch nó sang một cái gì đó giả tạo hơn.

Dễ dàng dịch sang ActionScript/C#, bạn nên thử điều này và đăng câu hỏi tiếp theo với mã của bạn nếu bạn gặp khó khăn, bằng cách này bạn sẽ có hiệu quả học tập tốt nhất.

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

Tìm các đỉnh và thung lũng của đường cong tất cả là nhìn vào độ dốc của đường kẻ. Tại vị trí đó độ dốc là 0. Khi tôi đoán đường cong giọng nói rất bất thường, trước tiên nó phải được làm nhẵn, cho đến khi chỉ có các đỉnh núi đáng kể tồn tại.

Vì vậy, khi tôi thấy đường cong cần được thực hiện như một tập hợp các điểm. Các nhóm điểm cần được tính trung bình để tạo ra một đường cong trơn tru đơn giản. Sau đó, sự khác biệt của mỗi điểm cần được so sánh, và các điểm không khác biệt nhiều với nhau và các khu vực được xác định là đỉnh, thung lũng hoặc cao nguyên.

1

Nếu bất cứ ai muốn mã cuối cùng trong AS3, ở đây nó là:

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

Chức năng này không trả lại bất cứ điều gì nhưng nếu nó đã làm, nó sẽ không chỉ trả lại chỉ số của đỉnh cao nhất - không phải tất cả các đỉnh? – Matt

Các vấn đề liên quan