2010-06-15 23 views
11

Tôi thực sự thích các dịch vụ nhận dạng giọng nói mới nhất của Microsofts (và SpeechSynthesis).Cách kết hợp Ngữ pháp (Quy tắc) & Chính tả (Tự do ngôn luận) với SpeechRecognizer trong C#

http://msdn.microsoft.com/en-us/library/ms554855.aspx

http://estellasays.blogspot.com/2009/04/speech-recognition-in-cnet.html

Tuy nhiên tôi cảm thấy như tôi là hơi bị hạn chế khi sử dụng ngữ pháp.

Đừng hiểu sai ngữ pháp là điều tuyệt vời khi nói nhận dạng giọng nói chính xác những từ/cụm từ cần tìm, tuy nhiên nếu tôi muốn nó nhận ra điều gì đó, tôi đã không đưa nó lên? Hoặc tôi muốn phân tích một cụm từ mà một nửa tên được xác định trước và một nửa từ ngẫu nhiên?

Ví dụ ..

Kịch bản A - Tôi nói "Google [Dầu Tràn]" và tôi muốn nó mở Google với kết quả tìm kiếm cho thuật ngữ trong ngoặc đơn mà có thể là bất cứ điều gì.

Kịch bản B - Tôi nói "Xác định vị trí [Manchester]" và tôi muốn nó để tìm kiếm Manchester trong Google Maps hay bất cứ điều gì khác không được xác định trước

Tôi muốn nó biết rằng 'Google' và ' Xác định vị trí 'là các lệnh và những gì đến sau khi nó là các tham số (và có thể là bất cứ điều gì).

Câu hỏi: Có ai biết cách kết hợp sử dụng các ngữ pháp được xác định trước (các từ nhận dạng giọng nói nên nhận ra) và các từ không có trong ngữ pháp được xác định trước của nó không?

mảnh Mã ..

using System.Speech.Recognition; 

... 
... 

SpeechRecognizer rec = new SpeechRecognizer(); 
rec.SpeechRecognized += rec_SpeechRecognized; 

var c = new Choices(); 
c.Add("search"); 

var gb = new GrammarBuilder(c); 
var g = new Grammar(gb); 
rec.LoadGrammar(g); 
rec.Enabled = true; 

... 
... 

void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    if (e.Result.Text == "search") 
    { 
     string query = "How can I get a word not defined in Grammar recognised and passed into here!"; 

     launchGoogle(query); 
    } 
} 

... 
... 


private void launchGoogle(string term) 
{ 
    Process.Start("IEXPLORE", "google.com?q=" + term); 
} 
+2

Bạn đã viết sai chính tả 'Ngữ pháp '. – SLaks

Trả lời

4

Bạn có hai lựa chọn:

  1. Bạn có thể sử dụng các nút chính tả cho văn bản miễn phí sử dụng GrammarBuilder::AppendDictation. Vấn đề là vì trình nhận dạng không có bất kỳ ngữ cảnh nào, các nhận dạng không phải là chất lượng cao nhất.
  2. Bạn có thể sử dụng nút chặn văn bản và cung cấp một bộ mục sử dụng GrammarBuilder::Append(String, SubsetMatchingMode). Điều này sẽ cung cấp cho người nhận đủ bối cảnh để có được sự công nhận chất lượng tốt mà không cần phải xây dựng lại toàn bộ cây ngữ pháp mỗi lần.
+0

Chúc mừng Eric. Tôi sẽ thử những thứ này. Bạn có bất kỳ ví dụ nào về cách triển khai không? như tài liệu msdn cho System.Speech.Recognition là một chút thưa thớt. –

+0

Tôi quen thuộc hơn với phần gốc (C++). Tôi đã mở một lỗi với MSDN về các mô tả còn thiếu. Trong khi chờ đợi, tài liệu cho Microsoft.Speech.Recognition.GrammarBuilder dường như đang hoạt động và hầu hết các chi tiết đều hoạt động trong cả hai môi trường. (Microsoft.Speech.Recognition là giao diện được quản lý cho các công cụ Server SR & TTS.) –

+0

Tôi sẽ thử mẫu tại đây http://msdn.microsoft.com/en-us/library/dd167810%28v=office .13% 29.aspx sau. Chúc mừng –

4

Bạn có thể thử một cái gì đó như thế này ... Nó chỉ định danh sách các lệnh đã biết .. nhưng cũng cho phép bạn sử dụng chính tả mở sau đó. Nó hy vọng sẽ có một lệnh được đưa ra trước khi mở chính tả .. nhưng bạn có thể đảo ngược điều này ... và nối thêm Tuy nhiên, bằng cách thêm vào chỗ trống trong loại lệnh ("") nó cũng sẽ cho phép bạn đến thẳng phần chính tả.

Choices commandtype = new Choices(); 
commandtype.Add("search"); 
commandtype.Add("print"); 
commandtype.Add("open"); 
commandtype.Add("locate"); 

SemanticResultKey srkComtype = new SemanticResultKey("comtype",commandtype.ToGrammarBuilder()); 

GrammarBuilder gb = new GrammarBuilder(); 
gb.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB"); 
gb.Append(srkComtype); 
gb.AppendDictation(); 

Grammar gr = new Grammar(gb); 

đó trở đi nhận dạng của bạn chỉ cần sử dụng kết quả văn bản vv

private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    System.Console.WriteLine(e.Result.Text); 

} 

Bạn có thể thêm tùy chọn lựa chọn hơn, và SemanticResultKeys cấu trúc để thực hiện mô hình phức tạp hơn nếu bạn muốn. Cũng là một ký tự đại diện (ví dụ: gb.AppendWildcard();).

+0

Tôi sẽ thử lại nhưng chương trình vẫn bị treo khi gọi gb.AppendDictation(); –

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