2013-07-26 18 views
7

Właśnie zacząłem wypróbowywać możliwości Windows Speech to Text w C# .Net. Obecnie mam działające podstawy (IE - Powiedz coś, a to zapewni dane wyjściowe na podstawie tego, co mówisz). Jednak staram się dowiedzieć, jak właściwie odbierać dane wejściowe od użytkownika jako zmienną.Pobierz dane użytkownika z Mowy?

Co mam na myśli to, że na przykład. Jeśli użytkownik mówi:

"Call me John" 

Następnie chcę, aby móc wziąć słowo John jako zmienna, a następnie zapisać jako powiedzmy, że nazwę użytkownika osoby.

Mój obecny SpeechRecognized wydarzenie następująco:

void zeusSpeechRecognised(object sender, SpeechRecognizedEventArgs e) 
    { 
     writeConsolas(e.Result.Text, username); 
     switch (e.Result.Grammar.RuleName) 
     { 
      case "settingsRules": 
       switch (e.Result.Text) 
       { 
        case "test": 
         writeConsolas("What do you want me to test?", me); 
         break; 
        case "change username": 
         writeConsolas("What do you want to be called?", me); 
         break; 
        case "exit": 
         writeConsolas("Do you wish me to exit?", me); 
         break; 
       } 
       break; 
     } 
    } 

UWAGA:writeConsolas tylko uwielbiony linia Dołącz do RichTextBox.

chciałbym dodać kolejny case który wykonuje następujące czynności:

case "call me" 
    username = e.Result.GetWordFollowingCallMe() //Obv not a method, but thats the general idea. 
    break; 

Oczywiście, nie ma takiej metody, ale to jest ogólna idea, że ​​chcę do wdrożenia. Czy istnieje sposób, aby wyszukać określone wyrażenia (IE: Call me) i wziąć następujące słowo?

EDIT: Należy zauważyć, że e.Result.Text zwraca tylko słowa, które może dopasować do tekstu w słowniku.

+0

+1 za interesującą intelektualnie programowania pytanie, ale tylko moje 2 centy: jeżeli komputer pyta mnie o moje imię, moje pierwszym odruchem byłoby odpowiedzieć _just moim Nazwa _, głośno i wyraźnie. Nie "Zadzwoń do mnie Ishmael" lub "Mam na imię Błoto" lub coś w tym stylu ... co możesz chcieć sprawdzić, jeśli zejdziesz tą drogą "Zadzwoń do mnie" :) –

+1

@MiklosAubert Dzięki za radę. Jednak planuję go wdrożyć, aby użytkownik zaczął od powiedzenia "Call me blah", zamiast być monitowany – JosephGarrone

Odpowiedz

4

To nie wygląda na to, że w twojej sytuacji e.Result.Text reprezentuje coś, co możesz wyliczyć: sprawdzasz słowa, które rozpoczynają tekst, a nie cały tekst. W takich przypadkach nie należy używać switch i przejdź do łańcucha if - then - else s zamiast:

var text = e.Result.Text; 
if (text.StartsWith("test")) { 
    writeConsolas("What do you want me to test?", me); 
} else if (text.StartsWith("change username")) { 
    writeConsolas("What do you want to be called?", me); 
} else if (text.StartsWith("exit")) { 
    writeConsolas("Do you wish me to exit?", me); 
} else if (text.StartsWith("call me")) { 
    // Here you have the whole text. Chop off the "call me" part, 
    // using Substring(), and do whatever you need to do with the rest of it 
} else 
    ... 
4

Dobrze, że nie może być stosowany w switch na e.Result.Text, jak będzie to przetestować na całej wartości: Call Me John.

Trzeba stan u default wypadku lub spoza switch

Ale ja naprawdę byłaby to wszystko, starając się uniknąć switch lub masywne if..else if...else

const string Callme = "call me"; 
var text = e.Result.Text; 

switch (text) 
    { 
    case "test": 
     writeConsolas("What do you want me to test?", me); 
    break; 
    case "change username": 
     writeConsolas("What do you want to be called?", me); 
    break; 
    case "exit": 
     writeConsolas("Do you wish me to exit?", me); 
    break; 

    } 
    if (text.StartsWith(CallMe) 
     userName = text.Replace(CallMe, string.Empty).Trim(); 
2

Chciałbym spojrzeć na aktualizację Twoja gramatyka do użycia SemanticValues, dzięki czemu możesz wyodrębnić wyniki bezpośrednio, zamiast analizować wyniki rozpoznawania. Jest to szybki przykład here który demonstruje SemanticValues, SemanticResultKeys i SemanticResultValues.

Powiązane problemy