.NET 표준에서 음성 인식 시도(System.Speech.Recognition)

소개



안녕하세요, 여유롭게 엔지니어의 츠츠입니다.
블로그 을 운영하고 있으므로 좋으면 봐 주세요.

대상물 호출과 그에 대한 지시를 동시에 인식하는 샘플을 써 보았습니다.
매우 쉽게 구현할 수 있으므로 꼭 시도해보십시오.

실행 결과


  • PC에 마이크 연결
  • "다나카 씨", "사토 씨", "사사키 씨"라고 말하면 "☆ 불렀습니다."
  • 「사토 씨 조용히 해」라고 말하면 「☆ 조용히하자!」가 표시됩니다.



    사용법


  • 프로젝트 참조 설정에서 アセンブリ에서 System.Speech를 추가하십시오.


  • Program.cs

  • VoiceCommand를 인스턴스화하고 Open() 메서드를 호출합니다.

    Program.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace test
    {
        public class Program
        {
            static void Main(string[] args)
            {
                using (var vc = new VoiceCommand())
                {
                    vc.Open();
                    System.Console.ReadKey();
                }
            }
        }
    }
    
  • VoiceCommand.cs

  • VoiceCommand.cs는 리소스를 사용하므로 IDispose를 구현하거나 Open/Close 메서드를 구현합니다.

    Choices를 사용하여 등록한 단어만 인식하고 있습니다 (자유 문법이라면 구문 분석이 필요하기 때문에). DictationGrammar 등을 사용하면 자유 문법으로 음성 인식이 가능합니다.

    VoiceCommand.cs
    using System;
    using System.Linq;
    using System.Speech.Recognition;
    
    namespace test
    {
        public class VoiceCommand : IDisposable
        {
            SpeechRecognitionEngine engine1;
            SpeechRecognitionEngine engine2;
    
            static string[] AwakeWord = new string[] { "佐藤さん", "田中さん", "佐々木さん" };
            static string[] SilentWords = new string[] { "静かにして", "黙って" };
            static string[] TalkWords = new string[] { "喋っていいよ", "声出していいよ" };
    
            public VoiceCommand()
            {
            }
    
            public void Open()
            {
                // 呼び出し
                Choices awake = new Choices(AwakeWord);
                this.engine1 = Open(new GrammarBuilder(awake));
    
                // 指示
                Choices actions = new Choices();
                actions.Add(SilentWords);
                actions.Add(TalkWords);
                GrammarBuilder gb = new GrammarBuilder();
                gb.Append(awake);
                gb.Append(actions);
                this.engine2 = Open(gb);
            }
    
            private SpeechRecognitionEngine Open(GrammarBuilder gb)
            {
                var engine = new SpeechRecognitionEngine();
    
                // 音声認識が認識処理を終えたときのイベントハンドラを設定する。
                engine.SpeechRecognized += recogEngine_SpeechRecognized;
    
                // 音声認識が推定処理を終えたときのイベントハンドラを設定する。
                engine.SpeechHypothesized += recogEngine_SpeechHypothesized;
    
                // SystemSpeech を利用したディクテーションを行う場合には、
                engine.LoadGrammar(new Grammar(gb));
    
                // 実行環境の標準の入力を音声認識エンジンの入力とする。
                engine.SetInputToDefaultAudioDevice();
    
                // 非同期の認識を継続して実行するようにして音声認識を開始する。
                engine.RecognizeAsync(RecognizeMode.Multiple);
    
                return engine;
            }
    
            public void Close()
            {
                if (this.engine2 != null)
                {
                    this.engine2.SpeechRecognized -= recogEngine_SpeechRecognized;
                    this.engine2.SpeechHypothesized -= recogEngine_SpeechHypothesized;
                    this.engine2.Dispose();
                    this.engine2 = null;
                }
    
                if (this.engine1 != null)
                {
                    this.engine1.SpeechRecognized -= recogEngine_SpeechRecognized;
                    this.engine1.SpeechHypothesized -= recogEngine_SpeechHypothesized;
                    this.engine1.Dispose();
                    this.engine1 = null;
                }
            }
    
            public void Dispose()
            {
                this.Close();
            }
    
            private void recogEngine_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
            {
                System.Console.WriteLine("○" + e.Result.Text + "(" + e.Result.Confidence + ")");
            }
    
            private void recogEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
            {
                System.Console.WriteLine("●" + e.Result.Text + "(" + e.Result.Confidence + ")");
    
                // 処理を分ける
                bool isSilent = SilentWords.Any(x => e.Result.Text.Contains(x));
                bool isTalk = TalkWords.Any(x => e.Result.Text.Contains(x));
                if (isSilent)
                    System.Console.WriteLine("☆静かにしよう!");
                else if (isTalk)
                    System.Console.WriteLine("☆話してOK!");
                else
                    System.Console.WriteLine("☆呼ばれましたよ");
            }
        }
    }
    

    끝에



    좋으면 블로그 「초보자용 Unity 정보 사이트」(분)편에도 여러가지 기재하고 있으므로 꼭 참조해 주시면 좋겠습니다.

    좋은 웹페이지 즐겨찾기