빠른 시작: 대화 언어 이해로 의도 인식

참조 설명서 | 패키지(NuGet) | GitHub의 추가 샘플

이 빠른 시작에서는 음성 및 언어 서비스를 사용하여 마이크에서 캡처한 오디오 데이터의 의도를 인식합니다. 특히 Speech Service를 사용하여 음성을 인식하고 CLU(대화 언어 이해) 모델을 사용하여 의도를 식별합니다.

Important

CLU(대화 언어 이해)는 Speech SDK 버전 1.25 이상에서 C# 및 C++로 사용할 수 있습니다.

필수 조건

환경 설정

음성 SDK는 NuGet 패키지로 사용할 수 있으며 .NET Standard 2.0을 구현합니다. 이 가이드의 뒷부분에서 Speech SDK를 설치하지만, 먼저 SDK 설치 가이드에서 더 많은 요구 사항을 확인합니다.

환경 변수 설정

이 예제에는 LANGUAGE_KEY, LANGUAGE_ENDPOINT, SPEECH_KEYSPEECH_REGION이라는 환경 변수가 필요합니다.

Azure AI 서비스 리소스에 액세스하려면 애플리케이션을 인증해야 합니다. 프로덕션의 경우 자격 증명을 안전하게 저장하고 액세스하는 방법을 사용합니다. 예를 들어, 음성 리소스에 대한 키를 가져온 후 애플리케이션을 실행하는 로컬 컴퓨터의 새 환경 변수에 이를 씁니다.

코드에 키를 직접 포함하지 말고 공개적으로 게시하지 마세요. Azure Key Vault와 같은 추가 인증 옵션은 Azure AI 서비스 보안 문서를 참조하세요.

환경 변수를 설정하려면 콘솔 창을 열고 운영 체제 및 개발 환경에 대한 지침을 따릅니다.

  • LANGUAGE_KEY 환경 변수를 설정하려면 your-language-key를 리소스에 대한 키 중 하나로 바꿉니다.
  • LANGUAGE_ENDPOINT 환경 변수를 설정하려면 your-language-endpoint을(를) 리소스에 대한 지역 중 하나로 바꿉니다.
  • SPEECH_KEY 환경 변수를 설정하려면 your-speech-key를 리소스에 대한 키 중 하나로 바꿉니다.
  • SPEECH_REGION 환경 변수를 설정하려면 your-speech-region을(를) 리소스에 대한 지역 중 하나로 바꿉니다.
setx LANGUAGE_KEY your-language-key
setx LANGUAGE_ENDPOINT your-language-endpoint
setx SPEECH_KEY your-speech-key
setx SPEECH_REGION your-speech-region

참고 항목

현재 실행 중인 콘솔에서만 환경 변수에 액세스해야 하는 경우 환경 변수를 setx 대신 set로 설정할 수 있습니다.

환경 변수를 추가한 후에는 콘솔 창을 포함하여 실행 중인 프로그램 중에서 환경 변수를 읽어야 하는 프로그램을 다시 시작해야 할 수도 있습니다. 예를 들어 편집기로 Visual Studio를 사용하는 경우 Visual Studio를 다시 시작한 후 예제를 실행합니다.

대화 언어 이해 프로젝트 만들기

언어 리소스를 만든 후에는 Language Studio에서 대화 언어 이해 프로젝트를 만듭니다. 프로젝트는 데이터를 기반으로 하는 사용자 지정 ML 모델을 빌드하기 위한 작업 영역입니다. 사용자 및 사용 중인 언어 리소스에 대해 액세스 권한이 있는 다른 사용자만 프로젝트에 액세스할 수 있습니다.

Language Studio로 이동하여 Azure 계정으로 로그인합니다.

대화 언어 이해 프로젝트 만들기

이 빠른 시작의 경우 이 샘플 홈 자동화 프로젝트를 다운로드하여 가져올 수 있습니다. 이 프로젝트는 조명 켜기 및 끄기와 같은 사용자 입력에서 의도한 명령을 예측할 수 있습니다.

  1. Language Studio의 질문 및 대화 언어 이해 섹션에서 대화 언어 이해를 선택합니다.

    A screenshot showing the location of Custom Language Understanding in the Language Studio landing page.

  2. 그러면 대화형 언어 이해 프로젝트 페이지로 이동합니다. 새 프로젝트 만들기 단추 옆에 있는 가져오기를 선택합니다.

    A screenshot showing the conversation project page in Language Studio.

  3. 표시되는 창에서 가져올 JSON 파일을 업로드합니다. 파일이 지원되는 JSON 형식을 따르는지 확인합니다.

업로드가 완료되면 스키마 정의 페이지가 표시됩니다. 이 빠른 시작의 경우 스키마가 이미 빌드되었으며 발화에는 이미 의도 및 엔터티로 레이블이 지정되어 있습니다.

모델 학습

일반적으로 프로젝트를 만든 후에는 스키마를 빌드하고 발화에 레이블을 지정해야 합니다. 이 빠른 시작에서는 빌드된 스키마와 레이블이 지정된 발화가 있는 준비된 프로젝트를 이미 가져왔습니다.

모델을 학습시키려면 학습 작업을 시작해야 합니다. 성공적인 학습 작업의 출력은 학습된 모델입니다.

Language Studio 내에서 모델 학습을 시작하려면 다음을 수행합니다.

  1. 왼쪽 메뉴에서 모델 학습을 선택합니다.

  2. 상단 메뉴에서 학습 작업 시작을 선택합니다.

  3. 새 모델 학습을 선택하고 텍스트 상자에 새 모델 이름을 입력합니다. 그렇지 않고 기존 모델을 새 데이터에 대해 학습된 모델로 바꾸려면 기존 모델 덮어쓰기를 선택한 다음, 기존 모델을 선택합니다. 학습된 모델을 덮어쓰는 것은 되돌릴 수 없지만, 새 모델을 배포할 때까지 배포된 모델에는 영향을 주지 않습니다.

  4. 학습 모드를 선택합니다. 더 빠른 학습을 위해 표준 학습을 선택할 수 있지만 영어로만 사용할 수 있습니다. 또는 다른 언어 및 다국어 프로젝트에 지원되는 고급 학습을 선택할 수 있지만 학습 시간이 더 오래 걸립니다. 학습 모드에 대해 자세히 알아봅니다.

  5. 데이터 분할 방법을 선택합니다. 학습 데이터에서 자동으로 테스트 세트 분할을 선택할 수 있습니다. 그러면 시스템에서 지정된 백분율에 따라 발화를 학습 세트와 테스트 세트 간에 분할합니다. 또는 학습 및 테스트 데이터의 수동 분할을 사용할 수 있습니다. 이 옵션은 레이블을 발화에 지정할 때 발화를 테스트 세트에 추가한 경우에만 사용할 수 있습니다.

  6. 학습 단추를 선택합니다.

    A screenshot showing the training page in Language Studio.

  7. 목록에서 학습 작업 ID를 선택합니다. 이 작업에 대한 학습 진행률, 작업 상태 및 기타 세부 정보를 확인할 수 있는 창이 표시됩니다.

    참고 항목

    • 성공적으로 완료된 학습 작업만 모델을 생성합니다.
    • 학습은 발화 수에 따라 몇 분에서 몇 시간까지 걸릴 수 있습니다.
    • 한 번에 하나의 학습 작업만 실행할 수 있습니다. 실행 중인 작업이 완료될 때까지 동일한 프로젝트 내에서 다른 학습 작업을 시작할 수 없습니다.
    • 모델을 학습시키는 데 사용되는 기계 학습은 정기적으로 업데이트됩니다. 이전 구성 버전에서 학습하려면 학습 작업 시작 페이지에서 여기를 선택하여 변경을 선택하고 이전 버전을 선택합니다.

모델 배포

일반적으로 모델을 학습시킨 후 평가 세부 정보를 검토합니다. 이 빠른 시작에서는 모델을 배포하고 Language Studio에서 사용해 볼 수 있도록 하거나, 예측 API를 호출할 수 있습니다.

Language Studio 내에서 모델을 배포하려면:

  1. 왼쪽 메뉴에서 모델 배포를 선택합니다.

  2. 배포 추가를 선택하여 배포 추가 마법사를 시작합니다.

    A screenshot showing the model deployment button in Language Studio.

  3. 새 배포 이름 만들기를 선택하여 새 배포를 만들고 아래 드롭다운에서 학습된 모델을 할당합니다. 그렇지 않으면 기존 배포 이름 덮어쓰기를 선택하여 기존 배포에서 사용하는 모델을 효과적으로 바꿀 수 있습니다.

    참고 항목

    기존 배포를 덮어쓸 때는 예측 API 호출을 변경할 필요가 없지만 새로 할당된 모델을 기반으로 결과를 얻을 수 있습니다.

    A screenshot showing the screen for adding a new deployment in Language Studio.

  4. 모델 드롭다운에서 학습된 모델을 선택합니다.

  5. 배포를 선택하여 배포 작업을 시작합니다.

  6. 배포에 성공하면 만료 날짜가 옆에 표시됩니다. 배포 만료는 배포된 모델을 예측에 사용할 수 없게 되는 때이며, 일반적으로 학습 구성이 만료된 후 12개월 후에 발생합니다.

다음 섹션에서 프로젝트 이름 및 배포 이름을 사용합니다.

마이크에서 의도 인식

다음 단계에 따라 새 콘솔 애플리케이션을 만들고 음성 SDK를 설치합니다.

  1. 새 프로젝트를 원하는 명령 프롬프트를 열고 .NET CLI를 사용하여 콘솔 애플리케이션을 만듭니다. Program.cs 파일은 프로젝트 디렉터리에 만들어야 합니다.

    dotnet new console
    
  2. .NET CLI를 사용하여 새 프로젝트에 음성 SDK를 설치합니다.

    dotnet add package Microsoft.CognitiveServices.Speech
    
  3. Program.cs의 내용을 다음 코드로 바꿉니다.

    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.CognitiveServices.Speech.Intent;
    
    class Program 
    {
        // This example requires environment variables named:
        // "LANGUAGE_KEY", "LANGUAGE_ENDPOINT", "SPEECH_KEY", and "SPEECH_REGION"
        static string languageKey = Environment.GetEnvironmentVariable("LANGUAGE_KEY");
        static string languageEndpoint = Environment.GetEnvironmentVariable("LANGUAGE_ENDPOINT");
        static string speechKey = Environment.GetEnvironmentVariable("SPEECH_KEY");
        static string speechRegion = Environment.GetEnvironmentVariable("SPEECH_REGION");
    
        // Your CLU project name and deployment name.
        static string cluProjectName = "YourProjectNameGoesHere";
        static string cluDeploymentName = "YourDeploymentNameGoesHere";
    
        async static Task Main(string[] args)
        {
            var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion);        
            speechConfig.SpeechRecognitionLanguage = "en-US";
    
            using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
    
            // Creates an intent recognizer in the specified language using microphone as audio input.
            using (var intentRecognizer = new IntentRecognizer(speechConfig, audioConfig))
            {
                var cluModel = new ConversationalLanguageUnderstandingModel(
                    languageKey,
                    languageEndpoint,
                    cluProjectName, 
                    cluDeploymentName);
                var collection = new LanguageUnderstandingModelCollection();
                collection.Add(cluModel);
                intentRecognizer.ApplyLanguageModels(collection);
    
                Console.WriteLine("Speak into your microphone.");
                var recognitionResult = await intentRecognizer.RecognizeOnceAsync().ConfigureAwait(false);
    
                // Checks result.
                if (recognitionResult.Reason == ResultReason.RecognizedIntent)
                {
                    Console.WriteLine($"RECOGNIZED: Text={recognitionResult.Text}");
                    Console.WriteLine($"    Intent Id: {recognitionResult.IntentId}.");
                    Console.WriteLine($"    Language Understanding JSON: {recognitionResult.Properties.GetProperty(PropertyId.LanguageUnderstandingServiceResponse_JsonResult)}.");
                }
                else if (recognitionResult.Reason == ResultReason.RecognizedSpeech)
                {
                    Console.WriteLine($"RECOGNIZED: Text={recognitionResult.Text}");
                    Console.WriteLine($"    Intent not recognized.");
                }
                else if (recognitionResult.Reason == ResultReason.NoMatch)
                {
                    Console.WriteLine($"NOMATCH: Speech could not be recognized.");
                }
                else if (recognitionResult.Reason == ResultReason.Canceled)
                {
                    var cancellation = CancellationDetails.FromResult(recognitionResult);
                    Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");
    
                    if (cancellation.Reason == CancellationReason.Error)
                    {
                        Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
                        Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
                        Console.WriteLine($"CANCELED: Did you update the subscription info?");
                    }
                }
            }
        }
    }
    
  4. Program.cs에서 cluProjectNamecluDeploymentName 변수를 프로젝트 및 배포의 이름으로 설정합니다. CLU 프로젝트 및 배포를 만드는 방법에 대한 자세한 내용은 대화 언어 이해 프로젝트 만들기를 참조하세요.

  5. 음성 인식 언어를 변경하려면 en-US를 다른 지원되는 언어로 바꿉니다. 예를 들어 스페인어(스페인)의 경우 es-ES입니다. 언어를 지정하지 않은 경우 기본 언어는 en-US입니다. 음성에 사용될 수 있는 여러 언어 중 하나를 식별하는 방법에 대한 자세한 내용은 언어 식별을 참조하세요.

새 콘솔 애플리케이션을 실행하여 마이크의 음성 인식을 시작합니다.

dotnet run

Important

위에서 설명한 대로 LANGUAGE_KEY, LANGUAGE_ENDPOINT, SPEECH_KEYSPEECH_REGION 환경 변수를 설정해야 합니다. 이 변수를 설정하지 않으면 샘플이 오류 메시지와 함께 실패합니다.

메시지가 표시되면 마이크에 말합니다. 말하는 내용이 텍스트로 출력되어야 합니다.

Speak into your microphone.
RECOGNIZED: Text=Turn on the lights.
    Intent Id: HomeAutomation.TurnOn.
    Language Understanding JSON: {"kind":"ConversationResult","result":{"query":"turn on the lights","prediction":{"topIntent":"HomeAutomation.TurnOn","projectKind":"Conversation","intents":[{"category":"HomeAutomation.TurnOn","confidenceScore":0.97712576},{"category":"HomeAutomation.TurnOff","confidenceScore":0.8431633},{"category":"None","confidenceScore":0.782861}],"entities":[{"category":"HomeAutomation.DeviceType","text":"lights","offset":12,"length":6,"confidenceScore":1,"extraInformation":[{"extraInformationKind":"ListKey","key":"light"}]}]}}}.

참고 항목

LanguageUnderstandingServiceResponse_JsonResult 속성을 통한 CLU에 대한 JSON 응답 지원이 Speech SDK 버전 1.26에 추가되었습니다.

의도는 가능성이 가장 높은 것부터 낮은 확률 순서로 반환됩니다. 다음은 topIntentHomeAutomation.TurnOn이고 신뢰도 점수가 0.97712576(97.71%)인 JSON 출력의 형식이 지정된 버전입니다. 두 번째로 가능성이 높은 의도는 신뢰도 점수가 0.8985081(84.31%)인 HomeAutomation.TurnOff일 수 있습니다.

{
  "kind": "ConversationResult",
  "result": {
    "query": "turn on the lights",
    "prediction": {
      "topIntent": "HomeAutomation.TurnOn",
      "projectKind": "Conversation",
      "intents": [
        {
          "category": "HomeAutomation.TurnOn",
          "confidenceScore": 0.97712576
        },
        {
          "category": "HomeAutomation.TurnOff",
          "confidenceScore": 0.8431633
        },
        {
          "category": "None",
          "confidenceScore": 0.782861
        }
      ],
      "entities": [
        {
          "category": "HomeAutomation.DeviceType",
          "text": "lights",
          "offset": 12,
          "length": 6,
          "confidenceScore": 1,
          "extraInformation": [
            {
              "extraInformationKind": "ListKey",
              "key": "light"
            }
          ]
        }
      ]
    }
  }
}

설명

이제 빠른 시작을 완료했으므로 다음과 같은 몇 가지 추가 고려 사항이 있습니다.

  • 이 예제에서는 RecognizeOnceAsync 작업을 사용하여 최대 30초의 발화를 기록하거나 침묵이 감지될 때까지 기록합니다. 다국어 대화를 포함한 더 긴 오디오에 대한 지속적인 인식에 대한 자세한 내용은 음성을 인식하는 방법을 참조하세요.
  • 오디오 파일에서 음성을 인식하려면 FromDefaultMicrophoneInput 대신 FromWavFileInput를 사용합니다.
    using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
    
  • MP4와 같은 압축 오디오 파일의 경우 GStreamer를 설치하고 PullAudioInputStream 또는 PushAudioInputStream을 사용합니다. 자세한 내용은 압축 입력 오디오 사용 방법을 참조하세요.

리소스 정리

Azure Portal 또는 Azure CLI(명령줄 인터페이스)를 사용하여 생성된 언어 및 음성 리소스를 제거할 수 있습니다.

참조 설명서 | 패키지(NuGet) | GitHub의 추가 샘플

이 빠른 시작에서는 음성 및 언어 서비스를 사용하여 마이크에서 캡처한 오디오 데이터의 의도를 인식합니다. 특히 Speech Service를 사용하여 음성을 인식하고 CLU(대화 언어 이해) 모델을 사용하여 의도를 식별합니다.

Important

CLU(대화 언어 이해)는 Speech SDK 버전 1.25 이상에서 C# 및 C++로 사용할 수 있습니다.

필수 조건

환경 설정

음성 SDK는 NuGet 패키지로 사용할 수 있으며 .NET Standard 2.0을 구현합니다. 이 가이드의 뒷부분에서 Speech SDK를 설치하지만, 먼저 SDK 설치 가이드에서 더 많은 요구 사항을 확인합니다.

환경 변수 설정

이 예제에는 LANGUAGE_KEY, LANGUAGE_ENDPOINT, SPEECH_KEYSPEECH_REGION이라는 환경 변수가 필요합니다.

Azure AI 서비스 리소스에 액세스하려면 애플리케이션을 인증해야 합니다. 프로덕션의 경우 자격 증명을 안전하게 저장하고 액세스하는 방법을 사용합니다. 예를 들어, 음성 리소스에 대한 키를 가져온 후 애플리케이션을 실행하는 로컬 컴퓨터의 새 환경 변수에 이를 씁니다.

코드에 키를 직접 포함하지 말고 공개적으로 게시하지 마세요. Azure Key Vault와 같은 추가 인증 옵션은 Azure AI 서비스 보안 문서를 참조하세요.

환경 변수를 설정하려면 콘솔 창을 열고 운영 체제 및 개발 환경에 대한 지침을 따릅니다.

  • LANGUAGE_KEY 환경 변수를 설정하려면 your-language-key를 리소스에 대한 키 중 하나로 바꿉니다.
  • LANGUAGE_ENDPOINT 환경 변수를 설정하려면 your-language-endpoint을(를) 리소스에 대한 지역 중 하나로 바꿉니다.
  • SPEECH_KEY 환경 변수를 설정하려면 your-speech-key를 리소스에 대한 키 중 하나로 바꿉니다.
  • SPEECH_REGION 환경 변수를 설정하려면 your-speech-region을(를) 리소스에 대한 지역 중 하나로 바꿉니다.
setx LANGUAGE_KEY your-language-key
setx LANGUAGE_ENDPOINT your-language-endpoint
setx SPEECH_KEY your-speech-key
setx SPEECH_REGION your-speech-region

참고 항목

현재 실행 중인 콘솔에서만 환경 변수에 액세스해야 하는 경우 환경 변수를 setx 대신 set로 설정할 수 있습니다.

환경 변수를 추가한 후에는 콘솔 창을 포함하여 실행 중인 프로그램 중에서 환경 변수를 읽어야 하는 프로그램을 다시 시작해야 할 수도 있습니다. 예를 들어 편집기로 Visual Studio를 사용하는 경우 Visual Studio를 다시 시작한 후 예제를 실행합니다.

대화 언어 이해 프로젝트 만들기

언어 리소스를 만든 후에는 Language Studio에서 대화 언어 이해 프로젝트를 만듭니다. 프로젝트는 데이터를 기반으로 하는 사용자 지정 ML 모델을 빌드하기 위한 작업 영역입니다. 사용자 및 사용 중인 언어 리소스에 대해 액세스 권한이 있는 다른 사용자만 프로젝트에 액세스할 수 있습니다.

Language Studio로 이동하여 Azure 계정으로 로그인합니다.

대화 언어 이해 프로젝트 만들기

이 빠른 시작의 경우 이 샘플 홈 자동화 프로젝트를 다운로드하여 가져올 수 있습니다. 이 프로젝트는 조명 켜기 및 끄기와 같은 사용자 입력에서 의도한 명령을 예측할 수 있습니다.

  1. Language Studio의 질문 및 대화 언어 이해 섹션에서 대화 언어 이해를 선택합니다.

    A screenshot showing the location of Custom Language Understanding in the Language Studio landing page.

  2. 그러면 대화형 언어 이해 프로젝트 페이지로 이동합니다. 새 프로젝트 만들기 단추 옆에 있는 가져오기를 선택합니다.

    A screenshot showing the conversation project page in Language Studio.

  3. 표시되는 창에서 가져올 JSON 파일을 업로드합니다. 파일이 지원되는 JSON 형식을 따르는지 확인합니다.

업로드가 완료되면 스키마 정의 페이지가 표시됩니다. 이 빠른 시작의 경우 스키마가 이미 빌드되었으며 발화에는 이미 의도 및 엔터티로 레이블이 지정되어 있습니다.

모델 학습

일반적으로 프로젝트를 만든 후에는 스키마를 빌드하고 발화에 레이블을 지정해야 합니다. 이 빠른 시작에서는 빌드된 스키마와 레이블이 지정된 발화가 있는 준비된 프로젝트를 이미 가져왔습니다.

모델을 학습시키려면 학습 작업을 시작해야 합니다. 성공적인 학습 작업의 출력은 학습된 모델입니다.

Language Studio 내에서 모델 학습을 시작하려면 다음을 수행합니다.

  1. 왼쪽 메뉴에서 모델 학습을 선택합니다.

  2. 상단 메뉴에서 학습 작업 시작을 선택합니다.

  3. 새 모델 학습을 선택하고 텍스트 상자에 새 모델 이름을 입력합니다. 그렇지 않고 기존 모델을 새 데이터에 대해 학습된 모델로 바꾸려면 기존 모델 덮어쓰기를 선택한 다음, 기존 모델을 선택합니다. 학습된 모델을 덮어쓰는 것은 되돌릴 수 없지만, 새 모델을 배포할 때까지 배포된 모델에는 영향을 주지 않습니다.

  4. 학습 모드를 선택합니다. 더 빠른 학습을 위해 표준 학습을 선택할 수 있지만 영어로만 사용할 수 있습니다. 또는 다른 언어 및 다국어 프로젝트에 지원되는 고급 학습을 선택할 수 있지만 학습 시간이 더 오래 걸립니다. 학습 모드에 대해 자세히 알아봅니다.

  5. 데이터 분할 방법을 선택합니다. 학습 데이터에서 자동으로 테스트 세트 분할을 선택할 수 있습니다. 그러면 시스템에서 지정된 백분율에 따라 발화를 학습 세트와 테스트 세트 간에 분할합니다. 또는 학습 및 테스트 데이터의 수동 분할을 사용할 수 있습니다. 이 옵션은 레이블을 발화에 지정할 때 발화를 테스트 세트에 추가한 경우에만 사용할 수 있습니다.

  6. 학습 단추를 선택합니다.

    A screenshot showing the training page in Language Studio.

  7. 목록에서 학습 작업 ID를 선택합니다. 이 작업에 대한 학습 진행률, 작업 상태 및 기타 세부 정보를 확인할 수 있는 창이 표시됩니다.

    참고 항목

    • 성공적으로 완료된 학습 작업만 모델을 생성합니다.
    • 학습은 발화 수에 따라 몇 분에서 몇 시간까지 걸릴 수 있습니다.
    • 한 번에 하나의 학습 작업만 실행할 수 있습니다. 실행 중인 작업이 완료될 때까지 동일한 프로젝트 내에서 다른 학습 작업을 시작할 수 없습니다.
    • 모델을 학습시키는 데 사용되는 기계 학습은 정기적으로 업데이트됩니다. 이전 구성 버전에서 학습하려면 학습 작업 시작 페이지에서 여기를 선택하여 변경을 선택하고 이전 버전을 선택합니다.

모델 배포

일반적으로 모델을 학습시킨 후 평가 세부 정보를 검토합니다. 이 빠른 시작에서는 모델을 배포하고 Language Studio에서 사용해 볼 수 있도록 하거나, 예측 API를 호출할 수 있습니다.

Language Studio 내에서 모델을 배포하려면:

  1. 왼쪽 메뉴에서 모델 배포를 선택합니다.

  2. 배포 추가를 선택하여 배포 추가 마법사를 시작합니다.

    A screenshot showing the model deployment button in Language Studio.

  3. 새 배포 이름 만들기를 선택하여 새 배포를 만들고 아래 드롭다운에서 학습된 모델을 할당합니다. 그렇지 않으면 기존 배포 이름 덮어쓰기를 선택하여 기존 배포에서 사용하는 모델을 효과적으로 바꿀 수 있습니다.

    참고 항목

    기존 배포를 덮어쓸 때는 예측 API 호출을 변경할 필요가 없지만 새로 할당된 모델을 기반으로 결과를 얻을 수 있습니다.

    A screenshot showing the screen for adding a new deployment in Language Studio.

  4. 모델 드롭다운에서 학습된 모델을 선택합니다.

  5. 배포를 선택하여 배포 작업을 시작합니다.

  6. 배포에 성공하면 만료 날짜가 옆에 표시됩니다. 배포 만료는 배포된 모델을 예측에 사용할 수 없게 되는 때이며, 일반적으로 학습 구성이 만료된 후 12개월 후에 발생합니다.

다음 섹션에서 프로젝트 이름 및 배포 이름을 사용합니다.

마이크에서 의도 인식

다음 단계에 따라 새 콘솔 애플리케이션을 만들고 음성 SDK를 설치합니다.

  1. Visual Studio Community 2022에서 SpeechRecognition이라는 새 C++ 콘솔 프로젝트를 만듭니다.

  2. NuGet 패키지 관리자를 사용하여 새 프로젝트에 음성 SDK를 설치합니다.

    Install-Package Microsoft.CognitiveServices.Speech
    
  3. SpeechRecognition.cpp의 내용을 다음 코드로 바꿉니다.

    #include <iostream> 
    #include <stdlib.h>
    #include <speechapi_cxx.h>
    
    using namespace Microsoft::CognitiveServices::Speech;
    using namespace Microsoft::CognitiveServices::Speech::Audio;
    using namespace Microsoft::CognitiveServices::Speech::Intent;
    
    std::string GetEnvironmentVariable(const char* name);
    
    int main()
    {
        // This example requires environment variables named:
        // "LANGUAGE_KEY", "LANGUAGE_ENDPOINT", "SPEECH_KEY", and "SPEECH_REGION"
        auto languageKey = GetEnvironmentVariable("LANGUAGE_KEY");
        auto languageEndpoint = GetEnvironmentVariable("LANGUAGE_ENDPOINT");
        auto speechKey = GetEnvironmentVariable("SPEECH_KEY");
        auto speechRegion = GetEnvironmentVariable("SPEECH_REGION");
    
        auto cluProjectName = "YourProjectNameGoesHere";
        auto cluDeploymentName = "YourDeploymentNameGoesHere";
    
        if ((size(languageKey) == 0) || (size(languageEndpoint) == 0) || (size(speechKey) == 0) || (size(speechRegion) == 0)) {
            std::cout << "Please set LANGUAGE_KEY, LANGUAGE_ENDPOINT, SPEECH_KEY, and SPEECH_REGION environment variables." << std::endl;
            return -1;
        }
    
        auto speechConfig = SpeechConfig::FromSubscription(speechKey, speechRegion);
    
        speechConfig->SetSpeechRecognitionLanguage("en-US");
    
        auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
        auto intentRecognizer = IntentRecognizer::FromConfig(speechConfig, audioConfig);
    
        std::vector<std::shared_ptr<LanguageUnderstandingModel>> models;
    
        auto cluModel = ConversationalLanguageUnderstandingModel::FromResource(
            languageKey,
            languageEndpoint,
            cluProjectName,
            cluDeploymentName);
    
        models.push_back(cluModel);
        intentRecognizer->ApplyLanguageModels(models);
    
        std::cout << "Speak into your microphone.\n";
        auto result = intentRecognizer->RecognizeOnceAsync().get();
    
        if (result->Reason == ResultReason::RecognizedIntent)
        {
            std::cout << "RECOGNIZED: Text=" << result->Text << std::endl;
            std::cout << "  Intent Id: " << result->IntentId << std::endl;
            std::cout << "  Intent Service JSON: " << result->Properties.GetProperty(PropertyId::LanguageUnderstandingServiceResponse_JsonResult) << std::endl;
        }
        else if (result->Reason == ResultReason::RecognizedSpeech)
        {
            std::cout << "RECOGNIZED: Text=" << result->Text << " (intent could not be recognized)" << std::endl;
        }
        else if (result->Reason == ResultReason::NoMatch)
        {
            std::cout << "NOMATCH: Speech could not be recognized." << std::endl;
        }
        else if (result->Reason == ResultReason::Canceled)
        {
            auto cancellation = CancellationDetails::FromResult(result);
            std::cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
    
            if (cancellation->Reason == CancellationReason::Error)
            {
                std::cout << "CANCELED: ErrorCode=" << (int)cancellation->ErrorCode << std::endl;
                std::cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
                std::cout << "CANCELED: Did you update the subscription info?" << std::endl;
            }
        }
    }
    
    std::string GetEnvironmentVariable(const char* name)
    {
    #if defined(_MSC_VER)
        size_t requiredSize = 0;
        (void)getenv_s(&requiredSize, nullptr, 0, name);
        if (requiredSize == 0)
        {
            return "";
        }
        auto buffer = std::make_unique<char[]>(requiredSize);
        (void)getenv_s(&requiredSize, buffer.get(), requiredSize, name);
        return buffer.get();
    #else
        auto value = getenv(name);
        return value ? value : "";
    #endif
    }
    
  4. SpeechRecognition.cpp에서 cluProjectNamecluDeploymentName 변수를 프로젝트 및 배포의 이름으로 설정합니다. CLU 프로젝트 및 배포를 만드는 방법에 대한 자세한 내용은 대화 언어 이해 프로젝트 만들기를 참조하세요.

  5. 음성 인식 언어를 변경하려면 en-US를 다른 지원되는 언어로 바꿉니다. 예를 들어 스페인어(스페인)의 경우 es-ES입니다. 언어를 지정하지 않은 경우 기본 언어는 en-US입니다. 음성에 사용될 수 있는 여러 언어 중 하나를 식별하는 방법에 대한 자세한 내용은 언어 식별을 참조하세요.

새 콘솔 애플리케이션을 작성하고 실행하여 마이크의 음성 인식을 시작합니다.

Important

위에서 설명한 대로 LANGUAGE_KEY, LANGUAGE_ENDPOINT, SPEECH_KEYSPEECH_REGION 환경 변수를 설정해야 합니다. 이 변수를 설정하지 않으면 샘플이 오류 메시지와 함께 실패합니다.

메시지가 표시되면 마이크에 말합니다. 말하는 내용이 텍스트로 출력되어야 합니다.

Speak into your microphone.
RECOGNIZED: Text=Turn on the lights.
    Intent Id: HomeAutomation.TurnOn.
    Language Understanding JSON: {"kind":"ConversationResult","result":{"query":"turn on the lights","prediction":{"topIntent":"HomeAutomation.TurnOn","projectKind":"Conversation","intents":[{"category":"HomeAutomation.TurnOn","confidenceScore":0.97712576},{"category":"HomeAutomation.TurnOff","confidenceScore":0.8431633},{"category":"None","confidenceScore":0.782861}],"entities":[{"category":"HomeAutomation.DeviceType","text":"lights","offset":12,"length":6,"confidenceScore":1,"extraInformation":[{"extraInformationKind":"ListKey","key":"light"}]}]}}}.

참고 항목

LanguageUnderstandingServiceResponse_JsonResult 속성을 통한 CLU에 대한 JSON 응답 지원이 Speech SDK 버전 1.26에 추가되었습니다.

의도는 가능성이 가장 높은 것부터 낮은 확률 순서로 반환됩니다. 다음은 topIntentHomeAutomation.TurnOn이고 신뢰도 점수가 0.97712576(97.71%)인 JSON 출력의 형식이 지정된 버전입니다. 두 번째로 가능성이 높은 의도는 신뢰도 점수가 0.8985081(84.31%)인 HomeAutomation.TurnOff일 수 있습니다.

{
  "kind": "ConversationResult",
  "result": {
    "query": "turn on the lights",
    "prediction": {
      "topIntent": "HomeAutomation.TurnOn",
      "projectKind": "Conversation",
      "intents": [
        {
          "category": "HomeAutomation.TurnOn",
          "confidenceScore": 0.97712576
        },
        {
          "category": "HomeAutomation.TurnOff",
          "confidenceScore": 0.8431633
        },
        {
          "category": "None",
          "confidenceScore": 0.782861
        }
      ],
      "entities": [
        {
          "category": "HomeAutomation.DeviceType",
          "text": "lights",
          "offset": 12,
          "length": 6,
          "confidenceScore": 1,
          "extraInformation": [
            {
              "extraInformationKind": "ListKey",
              "key": "light"
            }
          ]
        }
      ]
    }
  }
}

설명

이제 빠른 시작을 완료했으므로 다음과 같은 몇 가지 추가 고려 사항이 있습니다.

  • 이 예제에서는 RecognizeOnceAsync 작업을 사용하여 최대 30초의 발화를 기록하거나 침묵이 감지될 때까지 기록합니다. 다국어 대화를 포함한 더 긴 오디오에 대한 지속적인 인식에 대한 자세한 내용은 음성을 인식하는 방법을 참조하세요.
  • 오디오 파일에서 음성을 인식하려면 FromDefaultMicrophoneInput 대신 FromWavFileInput를 사용합니다.
    auto audioInput = AudioConfig::FromWavFileInput("YourAudioFile.wav");
    
  • MP4와 같은 압축 오디오 파일의 경우 GStreamer를 설치하고 PullAudioInputStream 또는 PushAudioInputStream을 사용합니다. 자세한 내용은 압축 입력 오디오 사용 방법을 참조하세요.

리소스 정리

Azure Portal 또는 Azure CLI(명령줄 인터페이스)를 사용하여 생성된 언어 및 음성 리소스를 제거할 수 있습니다.

참조 설명서 | GitHub의 추가 샘플

Java용 Speech SDK는 CLU(대화 언어 이해)를 사용한 의도 인식을 지원하지 않습니다. 다른 프로그래밍 언어를 선택하거나 이 문서의 앞 부분에서 링크된 Java 참조 및 샘플을 선택하세요.

다음 단계