Windows에서 .NET C#으로 음성 인식 서비스 라이브러리 시작하기

등록일시: 2018-02-08 08:00,  수정일시: 2018-02-08 08:00
조회수: 8,222
이 문서는 Cognitive Services 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 Speech Recognition 서비스 라이브러리를 사용해서 음성 오디오를 텍스트로 변환하는 기초적인 Windows 응용 프로그램의 개발 방법을 살펴봅니다.

음성 인식 서비스 라이브러리는 자체 클라우드 서비스를 보유하고 있고 해당 서비스에서 Speech Service를 호출하고자 하는 개발자를 위한 것입니다. 기기 한정 응용 프로그램에서 음성 인식 서비스를 호출하는 경우에는 이 SKD를 사용하지 않는 것이 좋습니다. (다른 클라이언트 라이브러리나 REST API를 사용하십시오.)

C# 서비스 라이브러리를 사용하려면 Microsoft.Bing.Speech NuGet 패키지를 설치해야 합니다. 라이브러리 API 참조는 Microsoft Speech C# service library 페이지를 참고하시기 바랍니다.

이어지는 절에서는 C# 서비스 라이브러리를 이용해서 C# 예제 응용 프로그램을 설치하고, 빌드하고, 실행하는 방법을 살펴봅니다.

요구 사항

플랫폼 요구 사항

다음 예제는 Visual Studio 2015, Community Edition을 사용해서 Windows 8 이상 및 .NET Framework 4.5 이상을 대상으로 개발되었습니다.

예제 응용 프로그램 가져오기

Speech C# service library sample 저장소에서 예제를 복제합니다.

Speech Recognition API 구독 및 무료 평가판 구독 키 발급받기

Speech API는 Microsoft Cognitive Services의 (구 프로젝트 Oxford) 일부분입니다. 무료 평가판 구독 키는 Cognitive Services 체험하기 페이지에서 발급받을 수 있습니다. 음성 탭에서 Bing Speech API를 선택한 다음, API 키 가져오기(Get API Key) 버튼을 클릭합니다. 그러면 기본 키와 보조 키가 발급됩니다. 두 키 모두 동일한 할당량에 연결되어 있으므로 두 키 중 아무 키나 사용해도 무방합니다.

중요
  • 구독 키 발급받기. Speech 서비스 라이브러리를 사용하려면 반드시 구독 키가 필요합니다.

  • 구독 키 사용하기. 제공되는 C# 서비스 라이브러리 예제 응용 프로그램을 실행할 때, 명령줄 매개 변수 중 하나로 발급받은 구독 키를 지정해야 합니다. 보다 자세한 정보는 예제 응용 프로그램 실행하기 절을 참고하시기 바랍니다.

단계 1: 예제 응용 프로그램 설치하기

  1. Visual Studio 2015를 실행하고 파일(File) > 열기(Open) > 프로젝트/솔루션(Project/Solution)을 선택합니다.

  2. SpeechClient.sln이라는 이름의 Visual Studio 2015 솔루션 (.sln) 파일을 더블 클릭합니다. 그러면 Visual Studio에 솔루션이 열립니다.

단계 2: 예제 응용 프로그램 빌드하기

Ctrl+Shift+B 키를 누르거나, 리본 메뉴에서 빌드(Build)를 선택한 다음, 솔루션 빌드(Build Solution)를 선택합니다.

단계 3: 예제 응용 프로그램 실행하기

  1. 빌드가 완료되면, F5 키를 누르거나 리본 메뉴에서 시작(Start)을 선택해서 예제 응용 프로그램을 실행합니다.

  2. 탐색기에서 예제의 출력 디렉터리를 엽니다 (예, SpeechClientSample\bin\Debug). 그리고 해당 폴더를 Shift 키를 누른 채로 마우스 오른쪽 버튼을 클릭한 다음, 여기서 명령창 열기(Open command window here)를 선택합니다.

  3. 다음 인자와 함께 SpeechClientSample.exe를 실행합니다:

    • Arg[0]: 입력 오디오 WAV 파일을 지정합니다.
    • Arg[1]: 오디오의 로케일을 지정합니다.
    • Arg[2]: 인식 모드를 지정합니다: ShortPhrase 모드를 사용하려면 Short을, LongDictation 모드를 지정하려면 Long을 지정합니다.
    • Arg[3]: 음성 인식 서비스에 접근하기 위한 구독 키를 지정합니다.
역주

가령, SpeechClientSample.exe "<path>\"<filename>.wav" en-us Long "<Subscription-Key>와 같은 형태로 입력하면 됩니다. 만약 일반 명령창 대신 PowerShell 창을 사용한다면 .\SpeechClientSample.exe ...처럼 앞에 .\를 추가해야 합니다.

예제 살펴보기

인식 모드

  • ShortPhrase 모드: 최대 15 초까지 말하거나 데이터를 전달할 수 있습니다. 데이터가 서버로 전송되면, 클라이언트는 여러 번의 부분 결과와 가장 신뢰값이 높은 단일 최종 결과를 반환받습니다.

  • LongDictation 모드: 최대 10 분까지 말하거나 데이터를 전달할 수 있습니다. 데이터가 서버로 전송되면, 클라이언트는 서버가 감지한 문장의 일시 중지 위치에 따라 여러 번의 부분 결과와 여러 번의 최종 결과를 반환받습니다.

지원되는 오디오 포멧

Speech API는 다음 코덱을 이용해서 오디오/WAV를 지원합니다:

  • PCM 단일 채널
  • Siren
  • SirenSR

Preferences 개체

SpeechClient를 생성하려면 먼저 Preferences 개체를 생성해야 합니다. Preferences 개체는 음성 서비스의 동작을 구성하는 매개 변수들의 집합으로, 다음 필드들로 구성됩니다:

  • SpeechLanguage: 음성 서비스로 전송되는 오디오의 로케일입니다.

  • ServiceUri: 음성 서비스의 호출에 사용되는 끝점입니다.

  • AuthorizationProvider: IAuthorizationProvider 구현은 음성 서비스에 접근하기 위해 필요한 토큰을 가져오기 위해서 사용됩니다. 본문의 예제에서는 Cognitive Services 권한 부여 공급자를 사용하고 있지만, 토큰 캐싱을 처리할 수 있는 구현을 직접 작성해서 사용하는 것을 강력히 권장합니다.

  • EnableAudioBuffering: 고급 옵션입니다. 연결 관리 절을 참고하시기 바랍니다.

음성 입력

SpeechInput 개체는 다음 두 필드로 구성되어 있습니다:

  • Audio: SDK가 오디오를 가져오는 여러분이 직접 선택한 스트림의 구현입니다. 읽기를 지원하는 모든 스트림을 선택할 수 있습니다.

    노트

    SDK는 스트림이 읽기에서 0을 반환하면 스트림이 끝난 것으로 간주합니다.

  • RequestMetadata: 음성 요청에 관한 메타데이터입니다. 보다 자세한 정보는 참조를 참고하시기 바랍니다.

음성 요청

SpeechClient 개체 및 SpeechInput 개체의 인스턴스를 생성한 다음, RecognizeAsync 메서드를 사용해서 Speech Service에 요청을 전송합니다.

var task = speechClient.RecognizeAsync(speechInput);

요청이 완료되면 RecognizeAsync 메서드에서 반환된 작업이 완료됩니다. 마지막 RecognitionResult는 인식의 끝입니다. 만약 서비스나 SDK가 예상하지 못한 이유로 실패할 경우, 작업에 실패할 수도 있습니다.

음성 인식 이벤트

부분 결과 이벤트

이 이벤트는 말하기를 멈추거나 (MicrophoneRecognitionClient를 사용할 경우) 데이터 전송을 마치지 않았어도 (DataRecognitionClient를 사용할 경우), 여러분이 말하는 내용을 Speech Service가 예측할 때마다 매번 호출됩니다. 이 이벤트는 SpeechClient.SubscribeToPartialResult()를 통해서 구독할 수 있습니다. 또는 공통 이벤트 구독 메서드인 SpeechClient.SubscribeTo<RecognitionPartialResult>()를 사용할 수도 있습니다.

반환 형식 설명
LexicalForm 이 형식은 처리되지 않은 원본 그대로의 RAW 음성 인식 결과가 필요한 응용 프로그램에서 사용하기에 적합합니다.
DisplayText 역 텍스트 정규화, 대문자 적용, 구두점 및 비속어 마스킹이 적용된 인식된 문장입니다. 비속어는 첫 문자 이후의 문자가 별표로 마스킹됩니다 (예: "d***"). 이 형식은 음성 인식 결과를 사용자에게 출력하는 응용 프로그램에서 사용하기에 적합합니다.
Confidence 관련 오디오를 나타내는 인식된 문장에 대해 음성 인식 서버가 정의한 신뢰 수준입니다.
MediaTime 오디오 스트림의 시작을 기준으로 한 현재 시간입니다 (100 나노초 단위).
MediaDuration 오디오 세그먼트를 기준으로 한 현재 문구의 기간/길이입니다 (100 나노초 단위).

결과 이벤트

말하기를 멈추면 이 이벤트가 호출됩니다 (ShortPhrase 모드의 경우). 그리고 결과로 n-BEST 선택 항목이 제공됩니다. LongDictation 모드에서는 서버가 문장의 일시 중단을 표시한 위치에 따라 이 이벤트가 여러 번 호출될 수 있습니다. 이 이벤트는 SpeechClient.SubscribeToRecognitionResult()를 통해서 구독할 수 있습니다. 또는 공통 이벤트 구독 메서드인 SpeechClient.SubscribeTo<RecognitionResult>()를 사용할 수도 있습니다.

반환 형식 설명
RecognitionStatus 인식이 만들어진 방법에 대한 상태입니다. 가령, 성공적인 인식 결과로 만들어진 것인지 또는 연결이 취소된 결과로 만들어진 것인지 등을 나타냅니다.
Phrases 인식 신뢰값과 함께 제공되는 n-BEST 인식 구문의 집합입니다.

인식 결과에 대한 더 자세한 내용은 Output format을 참고하시기 바랍니다.

음성 인식 응답

음성 응답 예제:

--- Partial result received by OnPartialResult  
---what  
--- Partial result received by OnPartialResult  
--what's  
--- Partial result received by OnPartialResult  
---what's the web  
--- Partial result received by OnPartialResult   
---what's the weather like  
---***** Phrase Recognition Status = [Success]   
***What's the weather like? (Confidence:High)  
What's the weather like? (Confidence:High)

연결 관리

API는 요청마다 하나의 WebSocket 연결을 사용합니다. 사용자 경험을 최적화하기 위해, SDK는 수신한 마지막 RecognitionResult에서 다시 Speech Service에 연결하고 인식을 시작하려고 시도합니다. 가령, 오디오 요청의 길이가 2분이고, SDK가 1분 시점에 RecognitionEvent를 수신하고, 그 5초 뒤에 네트워크 오류가 발생한다면, SDK는 1분 시점부터 시작하는 새 연결을 시작합니다.

노트

스트림이 검색을 지원하지 않을 수도 있기 때문에 SDK는 다시 1분 시점으로 돌아가지는 않습니다. 대신 SDK는 오디오를 버퍼링하기 위한 내부 버퍼를 유지하며, RecognitionResult 이벤트를 수신하면 이 버퍼를 지웁니다.

버퍼링 동작

기본적으로 SDK는 네트워크 인터럽트 발생 시 복구가 가능하도록 오디오를 버퍼링합니다. 네트워크 연결이 끊어졌을 때 손실된 오디오를 무시하고 다시 연결을 시작하는 방식이 적합한 시나리오에서는 Preferences 개체의 EnableAudioBufferingfalse로 설정해서 오디오 버퍼링을 사용하지 않는 것이 가장 바람직합니다.

Microsoft Speech C# service library reference