2012-08-11 15 views
1

제 쿼리를 검토해 주셔서 감사합니다. Expression Blend 4 및 Visual Studio 2010을 사용하는 C# WPF .NET 4 프로그램을 작성하고 있습니다. System.Speech.Recognition을 사용하여 사용자의 명령을 수신하고 작업을 수행합니다. 내 질문은;C# 음성 인식 - 음성 인식 및 작업 수행

SpeechRecognized 이벤트가 발생하고 작업을 수행 한 후에는 작업을 일시 중지하고 다른 명령을 음성으로 말한 후 이전 작업을 다시 시작하거나 취소 할 수 있습니까?

내 생각에는 현재로드 된 문법을 변경하고 새 명령을 받아들이고 이전 명령으로 다시 전달하는 것에 중점을 둡니다.

내가하려는 일에 대한 아이디어를 얻으려면 "컴퓨터, 시스템 상태가 무엇입니까?"와 같은 명령을 듣고 있습니다. 나는 (인증 코드 입력)과 같은 다른 명령을 요구하는 사용자에게 청취 가능한 응답을 재생하고 싶습니다. 사용자가이를 수행하면 특정 명령 (코드)이 반환 될 때 응답을 수행하거나 (예 : "감마 47 에코"), 명령 (코드) 또는 타임 아웃을 거부하고 이전 문법 (외부 XML 문법 파일 사용)을 다시로드하십시오.

이 코드를 PasteBin http://pastebin.com/X3vJJJrM에 업로드했습니다. Java에 대한 경험이있는 프로그래밍에 익숙하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

1

나는 논리가 너무 복잡하다고 믿습니다. 나는 지나치게 단순화시킬지도 모르지만 ... :)

하나의 파일에 모든 문법을 포함 할 수 있습니다. 초기 명령을 청취 할 때 코드에서 후속 조치를 수신 대기하는 플래그를 설정하십시오.

<grammar version="1.0" xml:lang="en-US" root="rootRule" tag-format="semantics/1.0" xmlns="http://www.w3.org/2001/06/grammar"> 
<rule id="rootRule"> 
    <one-of> 
    <item> 
     <tag>out.SysCommand = "STATUS";</tag> 
     Computer what is the system status 
    </item> 
    <item> 
     <tag>out.SysCommand = "PASSWORD";</tag> 
     Gamma 
     <one-of> 
     <item>Four</item> 
     <item>Forty</item> 
     </one-of> 
     Seven Echo 
    </item> 
    </one-of> 
</root> 
</grammar> 

콜백은 다음과 같을 수 있습니다 :

private void OnSpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
{ 
    if (e.Result.Confidence >= ConfidenceThreshold) 
    { 
    if (IsListening) 
    { 
     if (e.Result.Semantics["SysCommand"] != null) 
     { 
     switch (e.Result.Semantics["SysCommand"].Value.ToString()) 
     { 
      case "PASSWORD": 
      // The was waiting for this, now you can act on it 
      break; 
      default: 
      // something else was said, reset! 
      break; 
     } 
     } 
    } 
    else if (e.Result.Semantics["SysCommand"] != null) 
    { 
     if (e.Result.Semantics["SysCommand"].Value.ToString() == "STATUS") 
     { 
     // do stuff that prompts user for password 
     IsListening = true; 
     } 
    } 
    } 
} 

콜백은 "IsListening"플래그를 찾습니다 여기

은 (간체) 문법 세트입니다. 설정되지 않은 경우 상태 요청 여부를 확인합니다. 그렇게했다면 플래그를 설정하고 이제 비밀번호를 기다립니다.

위 코드를 간소화 할 수 있습니다. 나는 그것을 복사하고 내가했던 것과 비슷한 것을 빠르게 편집했다.

  1. 보여주는 시스템의 이름 ("플로이드")
  2. 설정 "IsListening"플래그
  3. 디스플레이 화면에 프롬프트 (가시성 플래그를 IsListening에 바인딩)를 수신 : 내 경우, 나는 다음을 수행 가능한 후속는
  4. 그 명령에 대해 듣고

당신은로드하고 필요에 따라 새로운 문법을 언로드하지만 문법 파일이 큰 도착하지 않는 한, 그로드/언로드의 오버 헤드 것 수있는 일 적절하게 행동 명령 하나의 세트에서 몇 가지 추가 문법 규칙을 빠르게 살펴볼 수 있습니다.