|
WPF – 음성인식 |
작성일 : 2012-05-14 |
작성자 : 김용운 |
실행결과 |
- 컴퓨터 라고 말했을 때의 인식 결과
정확하게 발음했을 경우 인식률은 90%정도로 인식률이 꽤나 높다. |
음성인식 절차 |
1. Microsoft.Speech 어셈블리 참조 – System.Speech가 아니다. 2. SpeechRecognitionEngine 인스턴스 생성 3. 음성인식이 될 단어들을 적절하게 제시한 "Grammar" 지정 4. 음성인식 입력 소스 지정 5. SpeechRecognized 이벤트를 구독 6. 음성인식 시작 |
- 기본적으로 마이크와 스피커가 필요하다.
음성인식을 하기 전에
Microsoft Speech Platform - Runtime 11.0
- http://go.microsoft.com/fwlink/?LinkID=223568&clcid=0x409
Microsoft Speech Platform - Server SDK
- http://go.microsoft.com/fwlink/?LinkID=223570&clcid=0x409
위 주소에서 파일들을 설치한다.
음성인식 - US |
using System; using System.Speech.Recognition;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string enUsEngine = string.Empty; foreach (RecognizerInfo ri in SpeechRecognitionEngine.InstalledRecognizers()) { if (ri.Culture.Name.Equals("en-US") == true) { enUsEngine = ri.Id; } Console.WriteLine("Culture: " + ri.Culture + ", EngineId: " + ri.Id) ; }
if (string.IsNullOrEmpty(enUsEngine) == true) { Console.WriteLine("No engine for English"); return; } using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(enUsEngine)) { Grammar grammar = new Grammar("test.xml");
recognizer.LoadGrammar(grammar); recognizer.SetInputToDefaultAudioDevice();//컴퓨터에 연결된 마이크로부터 입력 받는다. //recognizer.SetInputToWaveFile(“test.wav”); : test.wav로 부터 입력 받는다. recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); recognizer.RecognizeAsync(RecognizeMode.Multiple);
while (true) {//프로그램이 끝나지 않도록 무한루프 Console.ReadLine(); } } }
static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { if (e.Result.Text == "Computer") { Console.WriteLine("Computer”); return; } else if (e.Result.Text == "Face") { Console.WriteLine("Face"); return; } else if (e.Result.Text == "Mike") { Console.WriteLine("Mike"); return; } } } } |
test.xml 구성 |
<grammar version="1.0" sapi:alphabet="x-microsoft-ups" xml:lang="en-us" root="Command" tag-format="semantics-ms/1.0" xmlns="http://www.w3.org/2001/06/grammar" xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions"> <rule id="Command" scope="public"> <one-of> <item>Computer</item> <item>Face</item> <item>Mike</item> </one-of> </rule> </grammar> |
- xml에 등록된 단어만이 인식이 가능하다.
문자열 읽기 - US |
SpeechSynthesizer tts = new SpeechSynthesizer(); tts.SetOutputToDefaultAudioDevice(); tts.Speak("Hello"); |
테스트 결과: 인식은 잘 되지만 발음이 많이 좋지 않다...
음성인식 - KOR |
1. 위 사이트에서 파일 두 개를 설치한다. Microsoft Speech Platform - Runtime Languages (Version 11) - http://www.microsoft.com/download/en/details.aspx?id=27224
한글 음성인식: MSSpeech_SR_ko-KR_TELE.msi 한글 TTS: MSSpeech_TTS_ko-KR_Heami.msi
2. test.xml을 수정한다.
<grammar version="1.0" sapi:alphabet="x-microsoft-ups" xml:lang="ko-KR" root="Command" tag-format="semantics-ms/1.0" xmlns="http://www.w3.org/2001/06/grammar" xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions"> <rule id="Command" scope="public"> <one-of> <item>컴퓨터</item> <item>얼굴</item> <item>마이크</item> </one-of> </rule> </grammar>
3. SpeechRecognitionEngine 생성자 recognizer = new SpeechRecognitionEngine("SR_MS_ko-KR_TELE_11.0");
4. recognizer_SpeechRecognized 이벤트 핸들러를 수정한다
static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) { if (e.Result.Text == "컴퓨터”) { Console.WriteLine("컴퓨터"); return; } if (e.Result.Text == "얼굴”) { Console.WriteLine("얼굴"); return; } if (e.Result.Text == "마이크”) { Console.WriteLine("마이크"); return; } } |
문자열 읽기 - KOR |
SpeechSynthesizer tts = new SpeechSynthesizer(); tts.SelectVoice("Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)"); tts.SetOutputToDefaultAudioDevice(); tts.Speak("하이"); |
테스트 결과: 인식률도 상당하고 읽기는 한글이 훨씬 더 정확한 발음을 구사한다.
reference: 성태의 닷넷 이야기
WPF - 음성인식 date 2012.05.14.docx