Microsoft MVP성태의 닷넷 이야기
.NET Framework: 300. C#으로 만드는 음성인식/TTS 프로그램 [링크 복사], [링크+제목 복사]
조회: 52083
글쓴 사람
홈페이지
첨부 파일

C#으로 만드는 음성인식/TTS 프로그램

개발자로 일하면서 두번째로 일하게 되었던 직장이 바로 "L&H Korea" 였습니다. 그 당시에는 나름 음성인식/TTS(Text-to-Speech) 관련해서 유명했던 회사였지만, 그 보다는... 아마도 한국 지사의 분식회계로 벨기에 본사까지 파산시킨 사례로 더 유명했을 수도 있습니다. 아직도 그 시절의 기사가 검색되는 군요. ^^;

음성인식 전문기업 L&H 코리아 파산 
; http://www.lawtimes.co.kr/LawNews/News/NewsContents.aspx?kind=AA&serial=4831

기존의 국내 음성인식 회사였던 '범일 정보 통신'을 벨기에의 "L&H" 가 인수해서 운영하던 지사였는데, 나름 외국계 회사라 근무 환경도 그 당시의 다른 IT업체와 비교해서 꽤 좋았던 걸로 기억합니다. 예를 들어, 한 달에 한번씩 맥주집을 통째로 빌려서 전 직원들 모두 서로 간에 가볍게 술한잔 하며 인사를 나눌 수 있는 복지정책도 있었는데... 아... 그 시절 생각하니 (현재 다나와에 계신) 임진배 소장님이 생각나는 군요. ^^

암튼... 제 경우에는 당시에 음성인식의 핵심 내부엔진을 다루는 연구소에서 (한국말은 끝까지 들어봐야 한다는) 일하지는 못했고 '웹 음성 인식 사이트'를 다루는 파트에서 일하게 되었더랬습니다. 당시에는 COM 개체가 생소했고, 회사의 음성인식을 다루는 엔진이 COM 개체로도 제공되긴 했지만 사용하기 어려워서 제가 임의로 좀 더 사용하기 편하게 COM 개체로 만들었고, 그것을 같이 일하던 웹 프로그래머가 HTML 웹 페이지에서 사용할 수 있도록 제공을 해서... 나름 재미있는 아이디어들이 피어나고 있었는데... 왠일인지 사업부 전체가 개편되면서 제가 있던 팀 자체가 해체되는 일이 발생했고, 저는 그 틈을 타서 자연스럽게 (현재 옥션에 계신) 김현승 수석님의 부름을 받아 가온아이(http://www.kaoni.com/)라는 회사에 이직을 하게 되었습니다.
아... 그 시절 생각하니 또 옛 추억에 잠기게 되는 군요. ^^

그나저나 오늘은 왜캐 서론이 길죠? ^^;

정신차리고... 본론으로 돌아와서, 제 기억으로는 그 유명했던 L&H 의 음성인식 엔진이 그 이후 윈도우의 기본 음성인식 엔진으로는 명맥을 이어갔다는 소식이 있었습니다. (현재의 윈도우에 있는 음성인식 엔진이 L&H 의 것인지는 모르겠습니다.)

물론, 윈도우 내에서만 사용할 수 있도록 숨겨져 있지는 않고 C# 으로도 이미 사용법이 잘 공개되어 있습니다.

Speech 101, Part 2 - Using C# to Recognize “Hello World”
; http://blogs.msdn.com/b/rlucero/archive/2012/01/10/speech-101-part-2-using-c-to-recognize-hello-world.aspx

SpeechRecognitionEngine Class
; http://msdn.microsoft.com/en-us/library/system.speech.recognition.speechrecognitionengine.aspx

위의 글에서도 잘 소개되어 있지만, 음성 인식 응용 프로그램을 만드려면 다음과 같은 단계를 밟아주면 됩니다.

  1. System.Speech 어셈블리 참조
  2. SpeechRecognitionEngine 인스턴스 생성
  3. 음성인식이 될 단어들을 적절하게 제시한 "Grammar" 지정
  4. 음성인식 입력 소스 지정
  5. SpeechRecognized 이벤트를 구독
  6. 음성인식 시작

SpeechRecognitionEngine 인스턴스야 그냥 new 하면 되는데요. 이 때, 음성인식에 사용될 '언어'를 지정해 주어야 합니다. 즉, 영어인지 한글인지를 지정해 주어야 하는데, 이를 알기 위해서는 현재의 윈도우에 어떤 언어의 음성인식 엔진이 설치되어 있는지 확인하는 방법이 필요합니다. 바로 이 때, SpeechRecognitionEngine.InstalledRecognizers 메서드를 이용하실 수 있습니다.

foreach (RecognizerInfo ri in SpeechRecognitionEngine.InstalledRecognizers())
{
    Console.WriteLine(ri.Culture);
}

// 영문 윈도우 7 Ultimate 버전에서는 다음과 같이 출력되었고,
en-US
en-GB

// 한글 윈도우 7 에서는 아무런 출력도 없었습니다.

기본값으로는 운영체제의 언어설정을 따라가니, 다음과 같이 빈 생성자로 초기화 해 줄 수도 있습니다.

using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine())
{
}

그 다음은 인식될 단어들에 대한 후보를 명시해 주어야 합니다. "Speech 101, Part 2 - Using C# to Recognize “Hello World”" 글에서는 XML 파일을 이용한 방법을 설명하고 있고, "SpeechRecognitionEngine Class" 글에서는 코딩을 이용한 방법이 설명되고 있습니다.

처음에는 "SpeechRecognitionEngine Class" 글을 보고 코드로 직접 입력해 보려고 했는데, 아쉽게도 SetDictationContext 호출 코드에서 예외가 발생했습니다.

DictationGrammar grammar = new DictationGrammar("grammar:dictation");
grammar.Name = "question dictation";
grammar.SetDictationContext("Computer, hibernate yourself", null); <=== 예외: "Grammar is not loaded into this recognizer"
grammar.SetDictationContext("Yes", null);
grammar.Enabled = true;

recognizer.LoadGrammar(grammar);

단서가 많지 않았기 때문에 할 수 없이 XML 파일로 방향을 돌려야 했습니다. 그래서, 다음과 같이 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, hibernate yourself</item>
              <item>Yes</item>
              <item>No</item>
          </one-of>
     </rule>
</grammar>

음성인식 엔진에 적용을 시켰습니다.

Grammar grammar = new Grammar("computer.xml");
recognizer.LoadGrammar(grammar);

그 다음으로 할 일이, 음성을 입력받을 Source 를 지정해 주어야 하는데요. WAV 파일로부터도 입력을 받을 수 있고,

recognizer.SetInputToWaveFile("helloworld.wav");

컴퓨터에 연결된 마이크로폰으로부터도 입력 받을 수 있습니다. (여기서는 마이크로부터 입력받을 것입니다.)

recognizer.SetInputToDefaultAudioDevice();

이제 마지막으로, 음성인식이 된 경우 컴퓨터가 인식된 '텍스트'를 구할 수 있도록 이벤트 핸들러를 지정한 후, 음성인식 엔진을 시작시키면 됩니다.

recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);

recognizer.RecognizeAsync(RecognizeMode.Multiple);

while (true)
{
    Console.ReadLine();
}

static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    Console.WriteLine("Recognized text: " + e.Result.Text);
}

컴파일 하고 실행한 후, 컴퓨터에 달린 마이크에 "Computer, hibernate yourself" 라고 말하면 콘솔 화면에 "Recognized text: Computer, hibernate yourself"라고 찍힙니다.




음성인식과 쌍을 이루는 TTS 엔진도 마저 간단하게 살펴볼텐데요. 동일하게 System.Speech 어셈블리에서 제공되며 다음과 같이 음성출력을 할 수 있습니다.

SpeechSynthesizer tts = new SpeechSynthesizer();
tts.SetOutputToDefaultAudioDevice();
tts.Speak("Are you sure?");

그렇게 훌륭한 품질의 음성 출력은 아니지만... ^^; 좀 견딜만은 합니다.

자... 그럼, 음성인식과 출력을 곁들여서 다음과 같이 예제 제작을 해보면 어떨까요? 컴퓨터를 최대절전모드로 진입시키는 작업을 음성인식으로 할 수 있습니다. ^^

static RecognitionState current = RecognitionState.None;

static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (e.Result.Text == "Computer, hibernate yourself" &&
        current == RecognitionState.None)
    {
        current = RecognitionState.Question;

        System.Speech.Synthesis.SpeechSynthesizer tts = new System.Speech.Synthesis.SpeechSynthesizer();
        tts.SetOutputToDefaultAudioDevice();
        tts.Speak("Are you sure?");
        Console.WriteLine("Are you sure?");
        return;
    }

    if (current == RecognitionState.Question)
    {
        current = RecognitionState.None;
        if (e.Result.Text == "Yes")
        {
            Console.WriteLine("hibernating...");
            DoHibernation();
        }
        else
        {
            Console.WriteLine("Canceled.");
        }
    }
}

private static void DoHibernation()
{
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.Arguments = "/h /f";
    psi.FileName = "c:\\windows\\system32\\shutdown.exe";
    Process.Start(psi);
}

public enum RecognitionState
{
    None,
    Question,
}




그런데, 한글 음성인식은 안 되는 걸까요? 이를 위해서는 별도로 "Microsoft Speech Platform - Runtime 11.0" 을 설치해야 하고, 그 버전에 맞는 한글 음성인식 데이터 파일을 설치해 주어야 합니다. (물론, TTS 도 필요하다면.)

그래서, 각각 다음의 경로에서 먼저 파일들을 다운로드 받아서 설치합니다.

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

이어서, 한글에 대한 음성인식과 TTS 데이터 파일을 다운로드/설치하고,

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

이제 위에서 만든 예제 프로젝트에 약간의 변화를 가해주어야 합니다. 우선, System.Speech 어셈블리를 참조해제하고, 대신 "Microsoft Speech Platform - Server SDK" 의 설치 폴더로부터 "C:\Program Files\Microsoft SDKs\Speech\v11.0\Assembly\Microsoft.Speech.dll" 파일을 복사해서 참조 추가합니다.

이후, 코드에서 사용된 네임스페이스를 각각 다음과 같이 바꿔주어야 합니다.

System.Speech.Recognition ==> Microsoft.Speech.Recognition
System.Speech.Synthesis ==> Microsoft.Speech.Synthesis

음성인식을 위해 설정한 computer.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>

마지막으로, SpeechRecognized 이벤트 핸들러 내의 코드를 다음과 같이 바꿔줍니다.

static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (e.Result.Text == "컴퓨터, 최대 절전 모드로 들어가" &&
        current == RecognitionState.None)
    {
        current = RecognitionState.Question;

        SpeechSynthesizer tts = new SpeechSynthesizer();
        tts.SelectVoice("Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)");
        tts.SetOutputToDefaultAudioDevice();
        tts.Speak("정말?");
        Console.WriteLine("정말?");
        return;
    }

    if (current == RecognitionState.Question)
    {
        current = RecognitionState.None;
        if (e.Result.Text == "응")
        {
            Console.WriteLine("hibernating...");
            DoHibernation();
        }
        else
        {
            Console.WriteLine("Canceled.");
        }
    }
}

전체적으로 소스 코드의 호환성은 System.Speech.dll 과 Microsoft.Speech.dll 에서 지켜지는 편인데, 단지 영문/한글에 대한 부분만 살짝 바꿔주기만 하면 됩니다.




가장 중요한 것! 그래서 한글 음성인식이나 TTS가 어느 정도냐 하는 것인데요. 음... 그냥 '무료'라는 점을 감안하라는 조언만 드리고 싶군요. ^^

* 첨부파일은 2가지 예제 프로젝트를 압축한 것입니다.

  • basic_version: System.Speech.dll 사용 예제 (영문 음성인식/TTS)
  • ms_speech_server_version: Microsoft.Speech.dll 사용 예제 (한글 음성인식/TTS)






이 글과 관련해서 오류가 발생한다면, 다음의 글을 참고하세요.

SpeechRecognitionEngine 사용시 오류 유형 2가지
; https://www.sysnet.pe.kr/2/0/1449

SpeechRecognitionEngine.SetInputToDefaultAudioDevice 호출 시 System.InvalidOperationException 예외 발생
; https://www.sysnet.pe.kr/2/0/1317


[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]





[최초 등록일: ]
[최종 수정일: 12/21/2017 ]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer@outlook.com

비밀번호

댓글 쓴 사람
 



2012-02-21 09시16분
[나그네] 안녕하세요.. ^^;;
그대로 따라하는데


 Name: Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)
 Culture: ko-KR
 Age: Adult
 Gender: Female
 Description: Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)
 ID: TTS_MS_ko-KR_Heami_10.0
 Enabled: True
 No supported audio formats found
 Additional Info - :
  Age: Adult
  Gender: Female
  Language: 412
  Name: Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)
  Vendor: Microsoft
  Version: 10.0


SR_MS_ZXX_Lightweight_v10.0:



안되는 이유는 몰까요;;;
[손님]
2012-02-22 11시23분
"No Supported audio formats found" 라는 글귀가 인상적이군요. ^^; 글쎄요. 일단 재현이 제 컴퓨터에서 안되니 현재로써는 단정지을 수 없지만, 혹시 적절한 Recording/Audio device 가 없는 것이 아닌가 싶은데요. 혹시 트레이에서 스피커 아이콘을 오른쪽 버튼 클릭해서, "Recording devices" 메뉴를 선택하면 "Sound" 창에 "Recording" 탭이 나옵니다. 거기에 적절한 장치들이 있는지 한번 확인해 보시겠어요. (Audio 가 안되는 컴퓨터에서 하셨을 리는 없을 것 같고... 어쨌든 판단이 안되는 군요. ^^;)
정성태
2012-02-23 01시01분
[나그네] ㅋㅋㅋ 감사합니다. ^^
답변 감사드려요 항상 ㅋㅋ 도움은 드리지 못하고 받는거 같아.. 죄송할 뿐입니다.
네 우선 마이크와 오디오가 잘 되는 거 확인했습니다.
곰플레이어에서 제공되는 녹음플레이어까지 해봐지만 .. 되지 않습니다.;;
다시 확인해 봐야겠습니다. ^^ 답변 감사합니다.
[손님]
2012-02-24 12시55분
[Robert Lucero] Awesome post! I like how you used different grammar contexts for the hibernation questions!
--
-Robert Lucero
Speech@Microsoft
[손님]
2012-03-03 06시41분
Walkthrough: Microsoft Translator in a C# Console Application
; http://code.msdn.microsoft.com/Walkthrough-Translator-in-7e0be0f7

정성태
2012-03-09 11시48분
Text to Speech in .Net and .Net Micro Framework, with translation too!
; http://channel9.msdn.com/coding4fun/blog/Text-to-Speech-in-Net-and-Net-Micro-Framework-with-translation-too
정성태
2012-04-08 01시00분
[윤인호] 안녕하세요 코드를 그대로 따라해 보았는데, 음성인식 엔진을 생성하는 부분에서 에러가 나더라고요, 그래서 예제를 다운받아 실행시켜보니 콘솔창에
"처리되지 않은 예외 : System.Runtime.InteropServices.ComException: COM 구성요소 호출에서 HRESULT E_FAIL 오류가 반환되었습니다. "
라고 뜨며 런타임 에러가 납니다. 왜그런 걸까요..?
[손님]
2012-04-09 11시08분
"윤인호"님 PC 와의 환경 차이에서 발생하는 문제인 듯 한데, 아쉽게도 밝혀내기가 난감하군요. ^^ 일단, 보내주신 이미지로 봐서는 en-US 엔진이 2개 있는 것 같고, grammar 로 지정된 xml 파일에 en-US라고 지정되어 있기 때문에 어느 엔진을 로드해야 하는지 판단하지 못하는 것이 아닌가 생각됩니다.

코드를 다음과 같이 바꾸셔서, 해당 en-US 엔진을 콕 집어서 선택하도록 해보세요.

            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))
            {
...


해보시고, 피드백 부탁드립니다. ^^
정성태
2012-05-13 08시27분
[개발자지망생] 안녕하세요 음성인식 관련 프로그램 제작해보려고 하는데 기초지식이 거의 전무하여 여기 예제로 올려두신 프로그램으로 시작해보려 합니다. 근데 올려두신 프로젝트중 영문 음성인식 프로그램이 컴파일을 하면 콘솔창이 떴다가 1초도 안되서 컴파일이 종료되어 버리는데 도대체 이유가 뭔지 궁금합니다. 저희집 컴퓨터 문제인가요?
[손님]
2012-05-14 08시55분
일단, 그 정도의 정보만으로는 제가 답변드릴 것이 없습니다.

아래의 글을 한번 읽어보신 후 다시 한번 질문을 해주세요.

질문 하시기 전에, 반드시 읽어주십시오.
; http://www.sysnet.pe.kr/Default.aspx?mode=3&sub=0&pageno=0&detail=1&wid=-1

사실, 저렇게 자세히 올려주셔도... 환경상의 특이점으로 나타나는 문제는 저도 해결이 안됩니다. ^^ (저도 간단하게 실습을 해본 것일뿐, 다른 사람의 컴퓨터에 설치해가면서 다양한 시행착오를 겪은 적이 없기 때문입니다.)
정성태
2012-05-18 10시45분
[개발자지망생] 다시 읽고 질문드립니다
제가 C# 윈폼에 맞게 코드를 수정하여 사용했는데 recognizer.LoadGrammar(grammar);
이 부분에서 "이 의미 해석 형식 'tag-format'은 이 음성 플랫폼 버전에서 지원되지 않습니다."
라는 에러가 뜹니다
운영체제는 윈도우xp 사용하고 있고 visual Studio2010 버전 사용중입니다.
혹시 xp에서는 사용할 수 없는건가요?

[손님]
2012-05-20 11시18분
foreach (RecognizerInfo ri in SpeechRecognitionEngine.InstalledRecognizers())
{
    Console.WriteLine(ri.Culture);
}

위와 같이 해서, 어떤 결과가 나오는지 알려주세요. Windows XP 의 경우에는, 일단 문서가 정확하다면 Windows XP SP3부터 지원한다고 되어 있습니다.

SpeechRecognitionEngine Class
; http://msdn.microsoft.com/en-us/library/system.speech.recognition.speechrecognitionengine.aspx
정성태
2012-07-11 06시15분
[ertr2] 안녕하세요!!!
너무 많은 도움이 되었습니다.
윈도우7에서 계속 안되서 이유를 모르고있었는데 언어때문이었군요..ㅎㅎ
sdk11깔아서 하니 잘되네요..그런데 집 컴퓨터가 두대가 있는데 데스크탑에서는 언어팩 설치가 잘되는데
노트북에서는 MSSpeech_SR_ko-KR_TELE.msi하고 MSSpeech_TTS_ko-KR_Heami.msi 이 두 파일이 죽어도 설치가 안되네요..ㅠㅠ쩝
왜그런지 혹시 아시나요??
[손님]
2012-07-12 12시54분
글쎄요. ^^ 언어팩이 설치 안되는 이유는 저도 잘 모르겠습니다. ^^

MSI 설치시 로그 파일 생성하는 레지스트리 설정
; http://www.sysnet.pe.kr/2/0/416

위의 글에 보시면, msi 설치 시 로그를 남길 수 있는 옵션이 마지막에 설명되어 있습니다. 그걸 보시고 한번 해결해 보세요. ^^
정성태
2013-05-01 02시24분
[도움받은이] 음성인식 코드를 작성하는데 상당히 도움이 될 것 같습니다.
단순한 예제가 아니라 실제 동작하는 코드만한게 없죠.
감사합니다. ^^
[손님]
2013-05-24 01시14분
[이영주] 안녕하세요 이 글이 매우 큰 도움이 되었습니다.
Windows8 에서는 한국어 기본 으로 지원하는데 (System.Speech)
Windows7 에서는 안되었는데 이글을 참초로 해결하였습니다.
근데 recognizer_SpeechRecognized 를 사용할때 소리만 나면 recognizer 의 Grammer의 단어중 하나로 인식하던데....마이크 문제일지도...

[손님]
2013-05-25 05시41분
@이영주 님, noise가 인식될 수 있는데 그런 경우에는, SpeechRecognized 이벤트 핸들러의 e 인자에서 Confidence 값으로 조절을 해주시면 됩니다. 예를 들어, 아래와 같이 해주시면,

if (e.Result.Confidence < 50)
{
    return;
}

50% 아래로 확실하다고 판단되는 단어 인식은 버려지게 됩니다. 이 값을 적절하게 조절하면 그나마 안정적인 인식률로 조정할 수 있습니다.
정성태
2013-05-29 08시18분
[학생] 안녕하세요~ 윈도우8 애플리케이션을 개발하려고 합니다.
윈도우8 앱에서 음성인식을 사용하고 싶은데 speech recognition을 사용해서
작성하였더니 오류가 나고 지원이 안되는 것인지 실행이 안됩니다.ㅜㅜ
윈도우8앱에서는 다른 음성인식 기술을 사용해야 하는 것인지 궁금합니다~
초보여서 질문이 많이 부족할지 모르겠지만 답변해주시면 정말 감사드리겠습니다!!
[손님]
2013-05-30 01시58분
"윈도우 8 애플리케이션"이라는 것이 "Windows Store App"을 의미하는 듯 한데요. 아직 store app용으로는 음성인식 지원이 추가되지 않고 있습니다. 보다 자세한 답변은 다음의 글을 참고하세요.

Microsoft Speech API with Windows Store App yet?
; http://stackoverflow.com/questions/15008058/microsoft-speech-api-with-windows-store-app-yet/15009710#15009710

정성태
2013-06-23 12시19분
[송준영] 안녕하세요. 여러 명령을 사용 가능하게 할 수는 없을까요?
아, 그리고 디버그시 using (SpeechSynthesizer synth = new SpeechSynthesizer())에서 에러가 나네요.
[손님]
2013-06-24 12시57분
여러 명령이라면, xml 내에 여러 개의 단어를 등록하면 되지 않을까요? 그리고 new 에서 에러가 난다는 정도로는 제가 도움드릴 수 있는 것이 없습니다. 좀더 자세한 오류 메시지를 알려주세요. (근데요, 릴리즈 시에는 오류가 안 난다는 건가요? ^^)
정성태
2014-09-21 04시44분
[이동호] 아무말을 하지않아도 콘솔에 단어들이 입력됩니다.
왜 그런걸까요
[손님]
2014-09-22 01시25분
원래 이 분야가 확률에 기반하기 때문에 직접적인 단어 소리가 없어도 주변의 노이즈로 인해 판단이 될 수도 있습니다.

이런 경우 위의 소스 코드에서 recognizer_SpeechRecognized의 인자로 들어오는 SpeechRecognizedEventArgs 타입의 Result 멤버가 다시 RecognitionResult 타입으로 나오는데요. 해당 타입에 float형의 Confidence 속성값이 제공됩니다. 예를 들어 80%의 신뢰도를 갖고 인식된 단어만 처리하고 싶다면 Confidence > 0.8 이라는 조건으로 recognizer_SpeechRecognized 핸들러에서 코드를 추가해 처리해 주시면 됩니다.

(이 글의 덧글에 달린 이영주님의 의견과 그에 대해 제가 답변을 달은 것을 참고하세요.)
정성태
2014-09-23 05시25분
[이동호] 댓글 감사합니다만 e.Result.Confidence 값을 콘솔창에 출력해보니 -1이 나오는데요
입력이 되지 않고 있다는 뜻이겟죠 ?..
혹시 computer.xml처럼 문법을 별도로 작성하지 않고
 말하는 그대로 text로 바꿔줄 방법은 없나요 ?
[손님]
2014-09-23 10시38분
자유 dictation의 경우에는 이 제품으로는 무리입니다. 좀더 좋은 제품으로 알아보시는 것이 좋습니다. (아마, 대개의 경우에는 상용 제품일 것입니다.)
정성태
2014-09-23 10시49분
죄송합니다만 .. 어떤 제품을 말씀하시는건지 잘모르겠네요 ㅎㅎ ..
speechrecognitionengine클래스를 사용할때 grammar를 선언해주어야 하는데
그 문법을 computer.xml을 통해서 해주었습니다만 저는 별도의 문법을 xml이나 choice 등등으로 선언하지 않고
말하는 그대로을 출력해주는 방식이 있는지 궁금합니다. ㅎㅎ ㅜㅜ
Dongho Lee
2015-07-29 04시06분
정성태
2015-08-20 01시47분
Assistive Context-Aware Toolkit (The open source app used by Professor Stephen Hawking)
; https://channel9.msdn.com/coding4fun/blog/Assistive-Context-Aware-Toolkit-The-open-source-app-used-by-Professor-Stephen-Hawking
정성태
2015-09-17 08시15분
[김태현] windows server 를 구성해서 tts 서비스를 구성할 예정인데요.
위에 있는 한글 TTS 인 heami 를 상용으로 사용해도 되는건가요?
무료인가요?

[손님]
2015-09-17 11시04분
Microsoft Speech Platform - Software Development Kit (SDK) (Version 11)
; http://www.microsoft.com/en-us/download/details.aspx?id=27226

위의 링크로부터 "Microsoft Speech Platform SDK 11 License.rtf" 파일을 다운로드할 수 있는데, 거기에 자세한 라이선스가 있습니다. (간단히 말해, 무료입니다.)
정성태
2015-10-27 01시35분
[123] 학생입니다.

음성인식으로 프로그램 하나만들고 싶어서 어찌 어찌하다가 여기까지왔는데 좋은 정보가 많아서 감사합니다.

위 글중에서 Grammar에 등록하고 사용하시는데

Grammar 에 등록 되지 않은 단어나 문자을 텍스트로 변환하는 방법은 없는건가요 ?
[손님]
2015-10-27 02시07분
@123 Free Dictation을 할 수는 있는데 인식율이 과히 좋지는 않습니다. 방법이 거의 비슷한데 다음의 글을 참고하세요.

Using C# to do Voice Recognition using the built in SpeechRecognitionEngine Class
; http://www.codeproject.com/Tips/437916/Using-Csharp-to-do-Voice-Recognition-using-the-bui
정성태
2015-12-14 12시17분
Microsoft Speech Server v11.1 이 나왔습니다. 그래도 꾸준히 릴리즈하는군요. ^^ (현재 MSDN 구독자에게만 다운로드가 풀렸지만, 조만간 공개로도 풀릴 것입니다.)
정성태
2016-01-02 02시06분
[학생] 안녕하세요! 음성인식에 대한 것을 찾아보다가 좋은 글을 발견하고 들어왔습니다

실행은 잘되는거같은데 제가 초보가 정확히 어떻게 동작해야 하는지 잘 모르겠습니다.
컴파일 후 실행하고 말하면 그냥 동작이 되는것인지.. 실행하고 창뜨고 말해도 아무 반응이없으니 뭔가 다른
문제인지는 모르겠으나 동작시켜보고 싶습니다.

 Name: Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)
 Culture: ko-KR
 Age: Adult
 Gender: Female
 Description: Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)
 ID: TTS_MS_ko-KR_Heami_11.0
 Enabled: True
 Audio formats: Pcm
 Additional Info - :
  Age: Adult
  AudioFormats: 6
  Gender: Female
  Language: 412
  Name: Microsoft Server Speech Text to Speech Voice (ko-KR, Heami)
  Vendor: Microsoft
  Version: 11.0

SR_MS_ko-KR_TELE_11.0: ko-KR
SR_MS_ZXX_Lightweight_v11.0:

실행 화면입니다만..
[손님]
2016-01-04 12시13분
그러니까, 이 글에 첨부된 예제를 실행시킨거죠? 글쎄요... 출력으로 보면 딱히 이상은 없어보이는데요. 동작 여부는 recognizer_SpeechRecognized 이벤트 핸들러에 BP를 걸어보면 알 수 있습니다.
정성태
2016-01-18 01시30분
[학생] 답변 감사합니다~ㅜ 많은 도움이 되네요
혹시 앵무새처럼 제가 말한말을 컴퓨터가 말하게 만들려고 쪼금고쳐보는데
저는 그래머에 다 추가해서 말하게 하는 방법밖에 모르겠는데 다른 방법이 있을까요?
[손님]
2016-01-19 12시34분
컴퓨터가 (미리 지정하지 않았던) 같은 말을 하게 한다는 것은 결국 내가 말한 단어를 컴퓨터가 정확하게 인식해야 합니다. 따라서 이 문제는 위의 덧글들에서도 나오고 있지만 Free Dictation의 문제입니다. 그리고 아주 많은 단어들 속에서 찾는 것이기 때문에 당연히 인식율이 낮을 수 밖에 없습니다. 방법은 위에서도 써놨지만... 그 글이 현재 지워졌으니 다음의 글을 참고하세요.

Speech recognition, speech to text, text to speech, and speech synthesis in C#
; http://www.codeproject.com/Articles/483347/Speech-recognition-speech-to-text-text-to-speech-a
 
위의 글에서 "Dictation: to recognize ALL speech" 부분을 참조하시면 됩니다.
정성태
2016-02-03 01시54분
[베로] 안녕하세요 ! 음성인식 처음 도전해보는데 ㅠ ㅠ 게시물이 도움이 많이 되었습니다. 감사합니다.

여쭤보고싶은게 있는데, 제 컴퓨터 상에서 Microsoft.speech 를 사용하여 음성인식하는것은 가능한데
System.speech 는 Access 권한이 없다고 해서 visual studio 를 관리자 권한으로 실행했더니
이번에는 인식기가 없다고 나오네요..
System.speech 를 사용하기 위한 인식기가 따로 있나요? 설치해야하나요? flatform 등은 전부 깔았습니다.

혹시라도, 지금 제가 windows7 pro 한글판 os를 사용중인데, windows 에서 지원하는 음성인식 기능은
영어, 중국어 등이 있고 한국어가 없더라구요
그래서 windows 내에 있는 시작->보조프로그램->접근성->음성인식 이 현재 언어로는 불가능하다 라고 뜨거든요.
이것과 연관이 있는지..

또, Microsoft.Speech 에서 AppendDictation으로 Grammar를 만들어서 dictation 을 하려고 햇는데,
(https://msdn.microsoft.com/en-us/library/office/dd167762(v=office.14).aspx 참고함)
loadGrammar 하는 과정에서 파일이 없다는 에러가 뜨네요. xml 등의 파일을 생성하여 부른 것도 아닌데 말이죠..

Microsoft.Speech 의 AppendDictation을 이용해서 dictation 하는 방법이나
System.speech를 제가 정상적으로 사용할 수 있는 방법이 있을까요?

허접한 구글링 실력때문에 송구스럽게 여쭤보게되었네요 ㅠㅠ 답변 부탁드립니다.

[손님]
2016-02-03 02시44분
1. access 권한이 없다고 하는 것은... 글쎄요. 제가 관련해서 경험해 본 적이 없어서 딱히 할 말이 없습니다. ^^;

2. 어떻게 바뀌었을지는 모르겠지만 System.Speech는 한글이 없었고 본문에서 설명하고 있는 설치 파일을 이용해 별도로 한글이 지원되는 Microsoft.Speech를 설치해야 했습니다. (제가 영문 버전 윈도우만 거의 사용해 봐서 장담은 못하겠지만... 한글 버전에서는 한글 음성인식이 기본 내장되어 있지 않을까 싶은데... 100%는 그렇다고 말은 못하겠습니다. ^^;)

3. AppendDictation 관련해서는 저도 해본 적이 없어서 역시 답변을 드릴 수 없습니다.


관련해서 베로님이 ^^ 해결하셔서 멋진 글을 통해 공유해 주시면 좋을 듯 합니다.
정성태
2016-02-15 02시16분
정성태
2016-09-02 02시48분
[김진호] 안녕하세요
혹시 아직도 이 글을 살펴 보실지는 모르겠지만 질문 하나만 드립니다.
sre_SpeechRecognized 이벤트가 xml에 등록된 단어에 대한 소리가 들어왔을때만 발생하는 것인가요?
[손님]
2016-09-02 08시49분
넵. 등록된 단어중 확률이 높은 것이 선택되어 이벤트가 발생하고, 그 확률은 이벤트의 인자 값으로 함께 넘어옵니다.
정성태
2017-12-20 03시18분
윈도우 10 환경이라면 다음의 글을 참고하세요.

C# - Windows 10 운영체제의 데스크탑 앱에서 TTS(SpeechSynthesizer) 사용하는 방법
; http://www.sysnet.pe.kr/2/0/11412
정성태
2018-06-28 04시21분
[isaiah] 오래된 스레드 라서 질문들이기 망설였는데.. 여기 말고 딱히 이것 관련된 글을 못찾아서 질문들여 봅니다..
 마이크로소프트에서 제공하는 c++ 예제를 거의 그대로 이용해서 간단한 음성인식 정도 구현 하려고 하는데요..
 명령어 모드는 별 문제 없이 작동하는데... 받아쓰기 모드는 정상적으로 작동을 하지 않더라고요...
 영어든 한국어든 ISpRecoGrammar 생성하고 LoadDictation(NULL, SPLO_STATIC); 을 실행하면 음성 인식이 멈춰 버리더라고요... HRESULT 로 반환하는 결과값은 전부 s-ok가 뜨는데도 그냥 서버립니다
 혹시 짐작가는 부분이 있으신가요??
[손님]
2018-06-28 04시27분
[isaiah] 처음엔 지원 안하는 한국어를 지원 안해서 그런가 하고 생각했는데... 영어 언어를 바꾸고 해도 마찬가지더라고요..
 거의 예제 고스란히 컴파일 한 건데.. 그 부분만 안되니 어떤 부분이 문제인지 모르겠습니다.
스위치 플레폼은 한참동안 갱신이 안되고 같은 기능의 에저 기반 speech api를 밀고 있던것 같은데 운영체제 환경 때문일까요??
[손님]
2018-06-28 09시52분
글쎄요. C++로는 저도 해본 적이 없어서 관련한 시행 착오가 없습니다. 제 생각에는 아마 여전히 지원은 문제없이 될 것이므로 코드 상의 어떤 오류가 있는 것으로 봅니다. 만약 받아 쓰기 모드의 동작 가능한 C++ 예제 코드가 있다면 아마도 구현하신 방법과는 뭔가 다르지 않을까... 싶군요. ^^
정성태
2018-06-29 10시19분
[isaiah] 음.. 감사합니다. 차근차근 확인해 봐야겠네요 쩝...
[손님]

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
12076정성태12/12/201954디버깅 기술: 142. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅 - 배포 방법에 따른 차이
12075정성태12/12/201964디버깅 기술: 141. Linux - lldb 환경에서 sos 확장 명령어를 이용한 닷넷 프로세스 디버깅
12074정성태12/11/201949디버깅 기술: 140. windbg/Visual Studio - 값이 변경된 경우를 위한 정지점(BP) 설정(Data Breakpoint)
12073정성태12/10/201966Linux: 24. Linux/C# - 실행 파일이 아닌 스크립트 형식의 명령어를 Process.Start로 실행하는 방법
12072정성태12/9/201938오류 유형: 583. iisreset 수행 시 "No such interface supported" 오류
12071정성태12/9/201941오류 유형: 582. 리눅스 디스크 공간 부족 및 safemode 부팅 방법
12070정성태12/9/201936오류 유형: 581. resize2fs: Bad magic number in super-block while trying to open /dev/.../root
12069정성태12/2/2019155디버깅 기술: 139. windbg - x64 덤프 분석 시 메서드의 인자 또는 로컬 변수의 값을 확인하는 방법
12068정성태11/28/2019165디버깅 기술: 138. windbg와 Win32 API로 알아보는 Windows Heap 정보 분석 [1]파일 다운로드2
12067정성태11/27/2019147디버깅 기술: 137. 실제 사례를 통해 Debug Diagnostics 도구가 생성한 닷넷 웹 응용 프로그램의 성능 장애 보고서 설명 [1]파일 다운로드1
12066정성태11/27/201988디버깅 기술: 136. windbg - C# PInvoke 호출 시 마샬링을 담당하는 함수 분석 - OracleCommand.ExecuteReader에서 OpsSql.Prepare2 PInvoke 호출 분석
12065정성태11/25/2019108디버깅 기술: 135. windbg - C# PInvoke 호출 시 마샬링을 담당하는 함수 분석파일 다운로드1
12064정성태11/25/201973오류 유형: 580. HTTP Error 500.0/500.33 - ANCM In-Process Handler Load Failure
12063정성태11/21/2019108디버깅 기술: 134. windbg - RtlReportCriticalFailure로부터 parameters 정보 찾는 방법
12062정성태11/21/2019103디버깅 기술: 133. windbg - CoTaskMemFree/FreeCoTaskMem에서 발생한 덤프 분석 사례 - 두 번째 이야기
12061정성태11/20/201998Windows: 165. CoTaskMemAlloc/CoTaskMemFree과 윈도우 Heap의 관계
12060정성태11/21/2019124디버깅 기술: 132. windbg/Visual Studio - HeapFree x64의 동작 분석
12059정성태11/20/2019124디버깅 기술: 131. windbg/Visual Studio - HeapFree x86의 동작 분석
12058정성태11/19/2019126디버깅 기술: 130. windbg - CoTaskMemFree/FreeCoTaskMem에서 발생한 덤프 분석 사례
12057정성태11/18/201979오류 유형: 579. Visual Studio - Memory 창에서 유효한 주소 영역임에도 "Unable to evaluate the expression." 오류 출력
12056정성태11/18/2019140개발 환경 구성: 464. "Microsoft Visual Studio Installer Projects" 프로젝트로 EXE 서명 및 MSI 파일 서명 방법파일 다운로드1
12055정성태11/17/201987개발 환경 구성: 463. Visual Studio의 Ctrl + Alt + M, 1 (Memory 1) 등의 단축키가 동작하지 않는 경우
12054정성태11/15/2019296.NET Framework: 869. C# - 일부러 GC Heap을 깨뜨려 GC 수행 시 비정상 종료시키는 예제
12053정성태11/15/201990Windows: 164. 윈도우 10 - 명령행 창(cmd.exe) 속성에 (DotumChe, GulimChe, GungsuhChe 등의) 한글 폰트가 없는 경우
12052정성태11/15/201984오류 유형: 578. Azure - 일정(schedule)에 등록한 runbook이 1년 후 실행이 안 되는 문제(Reason - The key used is expired.)
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...