다음을 통해 공유


음성을 인식하고 번역하는 방법

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

이 방법 가이드에서는 사람의 말을 인식하고 다른 언어로 번역하는 방법을 알아봅니다.

자세한 내용은 음성 번역 개요를 참조하세요.

  • 음성을 텍스트로 번역
  • 음성을 여러 대상 언어로 번역
  • 음성을 음성 번역으로 바로 수행

중요한 데이터 및 환경 변수

이 문서의 예제 소스 코드는 음성 리소스 키 및 지역과 같은 중요한 데이터 저장을 위한 환경 변수에 따라 달라집니다. Program 클래스에는 호스트 머신 환경 변수에서 할당된 두 개의 static readonly string 값, 즉 SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION이 포함되어 있습니다. 이러한 필드는 모두 클래스 범위에 있으므로 클래스의 메서드 본문 내에서 액세스할 수 있습니다.

public class Program
{
    static readonly string SPEECH__SUBSCRIPTION__KEY =
        Environment.GetEnvironmentVariable(nameof(SPEECH__SUBSCRIPTION__KEY));
    
    static readonly string SPEECH__SERVICE__REGION =
        Environment.GetEnvironmentVariable(nameof(SPEECH__SERVICE__REGION));

    static Task Main() => Task.CompletedTask;
}

환경 변수에 대한 자세한 내용은 환경 변수 및 애플리케이션 구성을 참조하세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같은 다른 위치에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

음성 번역 구성 만들기

음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechTranslationConfig 인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.

음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.

다음과 같은 몇 가지 방법으로 SpeechTranslationConfig를 초기화할 수 있습니다.

  • 구독 사용: 키 및 연결된 영역을 전달합니다.
  • 엔드포인트 사용: 음성 서비스 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 호스트 사용: 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 권한 부여 토큰 사용: 권한 부여 토큰 및 연결된 영역을 전달합니다.

키와 지역을 사용하여 SpeechTranslationConfig 인스턴스를 만드는 방법을 살펴보겠습니다. Azure Portal에서 Speech 리소스 키 및 지역을 가져옵니다.

public class Program
{
    static readonly string SPEECH__SUBSCRIPTION__KEY =
        Environment.GetEnvironmentVariable(nameof(SPEECH__SUBSCRIPTION__KEY));
    
    static readonly string SPEECH__SERVICE__REGION =
        Environment.GetEnvironmentVariable(nameof(SPEECH__SERVICE__REGION));

    static Task Main() => TranslateSpeechAsync();

    static async Task TranslateSpeechAsync()
    {
        var speechTranslationConfig =
            SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    }
}

원본 언어 변경

음성 번역에 대한 공통 작업 중 하나는 입력(또는 원본) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 이탈리아어로 변경하는 방법을 보여줍니다. 코드에서 SpeechRecognitionLanguage 속성에 할당하는 방식으로 SpeechTranslationConfig 인스턴스와 상호 작용합니다.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    // Source (input) language
    speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
}

SpeechRecognitionLanguage 속성에는 언어 로캘 형식 문자열이 필요합니다. 지원되는 음성 번역 로캘 목록을 참조하세요.

번역 언어 추가

음성 번역의 또 다른 일반적인 작업은 대상 번역 언어를 지정하는 것입니다. 하나 이상이 필요하지만 다중 항목이 지원됩니다. 다음 코드 조각은 프랑스어와 독일어를 모두 번역 언어 대상으로 설정합니다.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    speechTranslationConfig.SpeechRecognitionLanguage = "it-IT";
    
    speechTranslationConfig.AddTargetLanguage("fr");
    speechTranslationConfig.AddTargetLanguage("de");
}

AddTargetLanguage에 대한 모든 호출에서 새 대상 번역 언어가 지정됩니다. 즉, 소스 언어에서 음성이 인식될 때 각 대상 번역은 번역 작업의 일부로 사용할 수 있습니다.

번역 인식기 초기화

SpeechTranslationConfig 인스턴스를 만든 후에 수행할 단계는 TranslationRecognizer 초기화입니다. TranslationRecognizer를 초기화할 때 speechTranslationConfig 인스턴스를 전달해야 합니다. 구성 개체는 Speech Service가 요청의 유효성을 검사하는 데 필요한 자격 증명을 제공합니다.

디바이스의 기본 마이크를 사용하여 음성을 인식하는 경우 TranslationRecognizer 인스턴스의 모습은 다음과 같습니다.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
}

오디오 입력 디바이스를 지정하려면 AudioConfig 클래스 인스턴스를 만들고 TranslationRecognizer를 초기화할 때 audioConfig 매개 변수를 제공해야 합니다.

먼저 다음과 같이 AudioConfig 개체를 참조하세요.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
}

마이크를 사용하는 대신 오디오 파일을 제공하려는 경우에도 audioConfig 매개 변수를 제공해야 합니다. 그러나 FromDefaultMicrophoneInput을 호출하는 대신 AudioConfig 클래스 인스턴스를 만드는 경우 FromWavFileInput을 호출하고 filename 매개 변수를 전달합니다.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);
}

음성 변환

음성 번역을 위해 Speech SDK는 마이크 또는 오디오 파일 입력을 사용합니다. 음성 인식은 음성 번역 전에 이루어집니다. 모든 개체가 초기화된 후 recognize-once 함수를 호출하고 결과를 가져옵니다.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "it", "fr", "de" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

    Console.Write($"Say something in '{fromLanguage}' and ");
    Console.WriteLine($"we'll translate into '{string.Join("', '", toLanguages)}'.\n");
    
    var result = await translationRecognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        Console.WriteLine($"Recognized: \"{result.Text}\":");
        foreach (var element in result.Translations)
        {
            Console.WriteLine($"    TRANSLATED into '{element.Key}': {element.Value}");
        }
    }
}

음성 텍스트 변환에 대한 자세한 내용은 음성 인식의 기본 사항을 참조하세요.

이벤트 기반 번역

TranslationRecognizer 개체는 Recognizing 이벤트를 노출합니다. 이벤트는 여러 번 발생하고 중간 번역 결과를 검색하는 메커니즘을 제공합니다.

참고 항목

다국어 음성 번역을 사용하는 경우 중간 번역 결과를 사용할 수 없습니다.

다음 예에서는 중간 번역 결과를 콘솔에 인쇄합니다.

using (var audioInput = AudioConfig.FromWavFileInput(@"whatstheweatherlike.wav"))
{
    using (var translationRecognizer = new TranslationRecognizer(config, audioInput))
    {
        // Subscribes to events.
        translationRecognizer.Recognizing += (s, e) =>
        {
            Console.WriteLine($"RECOGNIZING in '{fromLanguage}': Text={e.Result.Text}");
            foreach (var element in e.Result.Translations)
            {
                Console.WriteLine($"    TRANSLATING into '{element.Key}': {element.Value}");
            }
        };

        translationRecognizer.Recognized += (s, e) => {
            if (e.Result.Reason == ResultReason.TranslatedSpeech)
            {
                Console.WriteLine($"RECOGNIZED in '{fromLanguage}': Text={e.Result.Text}");
                foreach (var element in e.Result.Translations)
                {
                    Console.WriteLine($"    TRANSLATED into '{element.Key}': {element.Value}");
                }
            }
            else if (e.Result.Reason == ResultReason.RecognizedSpeech)
            {
                Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
                Console.WriteLine($"    Speech not translated.");
            }
            else if (e.Result.Reason == ResultReason.NoMatch)
            {
                Console.WriteLine($"NOMATCH: Speech could not be recognized.");
            }
        };

        // Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
        Console.WriteLine("Start translation...");
        await translationRecognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);

        // Waits for completion.
        // Use Task.WaitAny to keep the task rooted.
        Task.WaitAny(new[] { stopTranslation.Task });

        // Stops translation.
        await translationRecognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
    }
}

번역 합성

음성 인식 및 번역이 성공적으로 완료되면 해당 결과에 사전에 있는 모든 번역이 포함됩니다. Translations 사전 키는 대상 번역 언어이고 값은 번역된 텍스트입니다. 인식된 음성은 번역한 다음, 다른 언어로 합성(음성-음성 번역)할 수 있습니다.

이벤트 기반 합성

TranslationRecognizer 개체는 Synthesizing 이벤트를 노출합니다. 이벤트는 여러 번 발생하며, 번역 인식 결과에서 합성된 오디오를 검색할 수 있는 메커니즘을 제공합니다. 여러 언어로 번역하는 경우 수동 합성을 참조하세요.

VoiceName 인스턴스를 할당하여 합성 음성을 지정하고 Synthesizing 이벤트에 대한 이벤트 처리기를 제공하여 오디오를 가져옵니다. 다음 예제에서는 번역된 오디오를 .wav 파일로 저장합니다.

Important

이벤트 기반 합성은 단일 번역에서만 작동합니다. 여러 대상 번역 언어를 추가하지 마세요. 또한 VoiceName 값은 대상 번역 언어와 동일한 언어여야 합니다. 예를 들어 "de""de-DE-Hedda"에 매핑할 수 있습니다.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    var fromLanguage = "en-US";
    var toLanguage = "de";
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    speechTranslationConfig.AddTargetLanguage(toLanguage);

    speechTranslationConfig.VoiceName = "de-DE-Hedda";

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

    translationRecognizer.Synthesizing += (_, e) =>
    {
        var audio = e.Result.GetAudio();
        Console.WriteLine($"Audio synthesized: {audio.Length:#,0} byte(s) {(audio.Length == 0 ? "(Complete)" : "")}");

        if (audio.Length > 0)
        {
            File.WriteAllBytes("YourAudioFile.wav", audio);
        }
    };

    Console.Write($"Say something in '{fromLanguage}' and ");
    Console.WriteLine($"we'll translate into '{toLanguage}'.\n");

    var result = await translationRecognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        Console.WriteLine($"Recognized: \"{result.Text}\"");
        Console.WriteLine($"Translated into '{toLanguage}': {result.Translations[toLanguage]}");
    }
}

수동 합성

Translations 사전을 사용하여 번역 텍스트에서 오디오를 합성할 수 있습니다. 각 번역을 반복하고 합성합니다. SpeechSynthesizer 인스턴스를 만들 때 SpeechConfig 개체의 SpeechSynthesisVoiceName 속성을 원하는 음성으로 설정해야 합니다.

다음 예제는 5개 언어로 번역됩니다. 각 번역은 해당 인공신경망 언어에서 오디오 파일로 합성됩니다.

static async Task TranslateSpeechAsync()
{
    var speechTranslationConfig =
        SpeechTranslationConfig.FromSubscription(SPEECH__SERVICE__KEY, SPEECH__SERVICE__REGION);

    var fromLanguage = "en-US";
    var toLanguages = new List<string> { "de", "en", "it", "pt", "zh-Hans" };
    speechTranslationConfig.SpeechRecognitionLanguage = fromLanguage;
    toLanguages.ForEach(speechTranslationConfig.AddTargetLanguage);

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

    Console.Write($"Say something in '{fromLanguage}' and ");
    Console.WriteLine($"we'll translate into '{string.Join("', '", toLanguages)}'.\n");

    var result = await translationRecognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        var languageToVoiceMap = new Dictionary<string, string>
        {
            ["de"] = "de-DE-KatjaNeural",
            ["en"] = "en-US-AriaNeural",
            ["it"] = "it-IT-ElsaNeural",
            ["pt"] = "pt-BR-FranciscaNeural",
            ["zh-Hans"] = "zh-CN-XiaoxiaoNeural"
        };

        Console.WriteLine($"Recognized: \"{result.Text}\"");

        foreach (var (language, translation) in result.Translations)
        {
            Console.WriteLine($"Translated into '{language}': {translation}");

            var speechConfig =
                SpeechConfig.FromSubscription(
                    SPEECH__SERVICE__KEY, SPEECH__SERVICE__REGION);
            speechConfig.SpeechSynthesisVoiceName = languageToVoiceMap[language];

            using var audioConfig = AudioConfig.FromWavFileOutput($"{language}-translation.wav");
            using var speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
            
            await speechSynthesizer.SpeakTextAsync(translation);
        }
    }
}

음성 합성에 대한 자세한 내용은 음성 합성의 기본 사항을 참조하세요.

언어 식별을 통한 다국어 번역

대부분의 시나리오에서는 어떤 입력 언어를 지정할지 모를 수 있습니다. 언어 식별을 사용하면 최대 10개의 가능한 입력 언어를 검색하고 대상 언어로 자동 번역할 수 있습니다.

다음 예에서는 en-US 또는 zh-CNAutoDetectSourceLanguageConfig에 정의되어 있으므로 검색되어야 한다고 예상합니다. 그런 다음, AddTargetLanguage() 호출에 지정된 대로 음성이 defr로 번역됩니다.

speechTranslationConfig.AddTargetLanguage("de");
speechTranslationConfig.AddTargetLanguage("fr");
var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromLanguages(new string[] { "en-US", "zh-CN" });
var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);

전체 코드 샘플은 언어 식별을 참조하세요.

소스 언어 응시자가 없는 다국어 음성 번역

다국어 음성 번역은 지정된 입력 언어가 없고 동일한 세션 내에서 언어 전환을 처리하는 등 다양한 기능을 내보이는 새로운 수준의 음성 번역 기술을 구현합니다. 이러한 기능을 사용하면 제품에 구현할 수 있는 새로운 수준의 음성 번역 기능이 가능해집니다.

현재 음성 번역에 언어 ID를 사용하는 경우 v2 엔드포인트에서 SpeechTranslationConfig 개체를 만들어야 합니다. "YourServiceRegion" 문자열을 음성 리소스 지역(예: "westus")으로 바꿉니다. "YourSubscriptionKey"를 음성 리소스 키로 바꿉니다.

var v2EndpointInString = String.Format("wss://{0}.stt.speech.microsoft.com/speech/universal/v2", "YourServiceRegion");
var v2EndpointUrl = new Uri(v2EndpointInString);
var speechTranslationConfig = SpeechTranslationConfig.FromEndpoint(v2EndpointUrl, "YourSubscriptionKey");

번역 대상 언어를 지정합니다. 원하는 언어로 바꿉니다. 더 많은 줄을 추가할 수 있습니다.

config.AddTargetLanguage("de");
config.AddTargetLanguage("fr");

다국어 음성 번역의 주요 차이점은 소스 언어를 지정할 필요가 없다는 것입니다. 이는 서비스가 자동으로 소스 언어를 검색하기 때문입니다. 지정된 소스 언어 없이 다국어 음성 번역을 사용하려고 함을 서비스에 알리려면 fromOpenRange 메서드로 AutoDetectSourceLanguageConfig 개체를 만듭니다.

AutoDetectSourceLanguageConfig autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.fromOpenRange(); 
var translationRecognizer = new TranslationRecognizer(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);

Speech SDK가 포함된 전체 코드 샘플은 GitHub의 음성 번역 샘플을 참조하세요.

음성 번역에서 커스텀 번역 사용

음성 번역의 커스텀 번역 기능은 Azure Custom Translation Service와 원활하게 통합하여 더 정확한 맞춤형 번역 결과를 얻을 수 있도록 지원합니다. 통합에서는 Azure 커스텀 번역 서비스의 기능을 직접 활용하므로 전체 기능 집합이 올바르게 작동하게 하려면 여러 서비스 리소스를 사용해야 합니다. 자세한 지침은 Azure AI 서비스에 대한 다중 서비스 리소스 만들기 가이드를 참조하세요.

또한 커스텀 번역기의 오프라인 학습 및 "범주 ID"를 얻으려면 빠른 시작: 사용자 지정 모델 빌드, 배포 및 사용 - 커스텀 번역기에서 제공하는 단계별 스크립트를 참조하세요.

// Creates an instance of a translation recognizer using speech translation configuration
// You should use the same subscription key, which you used to generate the custom model before.
// V2 endpoint is required for the “Custom Translation” feature. Example: "wss://westcentralus.stt.speech.microsoft.com/speech/universal/v2"

try (SpeechTranslationConfig config = SpeechTranslationConfig.fromEndpoint(URI.create(endpointUrl), speechSubscriptionKey)) {

            // Sets source and target language(s).
           ….

            // Set the category id
            config.setCustomModelCategoryId("yourCategoryId");

       ….
}

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

이 방법 가이드에서는 사람의 말을 인식하고 다른 언어로 번역하는 방법을 알아봅니다.

자세한 내용은 음성 번역 개요를 참조하세요.

  • 음성을 텍스트로 번역
  • 음성을 여러 대상 언어로 번역
  • 음성을 음성 번역으로 바로 수행

중요한 데이터 및 환경 변수

이 문서의 예제 소스 코드는 음성 리소스 키 및 지역과 같은 중요한 데이터 저장을 위한 환경 변수에 따라 달라집니다. C++ 코드 파일에는 호스트 컴퓨터 환경 변수에서 할당된 두 개의 문자열 값, 즉 SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION가 포함되어 있습니다. 이러한 필드는 모두 클래스 범위에 있으므로 클래스의 메서드 본문 내에서 액세스할 수 있습니다.

auto SPEECH__SUBSCRIPTION__KEY = getenv("SPEECH__SUBSCRIPTION__KEY");
auto SPEECH__SERVICE__REGION = getenv("SPEECH__SERVICE__REGION");

환경 변수에 대한 자세한 내용은 환경 변수 및 애플리케이션 구성을 참조하세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같은 다른 위치에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

음성 번역 구성 만들기

음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechTranslationConfig 인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.

음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.

다음과 같은 몇 가지 방법으로 SpeechTranslationConfig를 초기화할 수 있습니다.

  • 구독 사용: 키 및 연결된 영역을 전달합니다.
  • 엔드포인트 사용: 음성 서비스 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 호스트 사용: 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 권한 부여 토큰 사용: 권한 부여 토큰 및 연결된 영역을 전달합니다.

키와 지역을 사용하여 SpeechTranslationConfig 인스턴스를 만드는 방법을 살펴보겠습니다. Azure Portal에서 Speech 리소스 키 및 지역을 가져옵니다.

auto SPEECH__SUBSCRIPTION__KEY = getenv("SPEECH__SUBSCRIPTION__KEY");
auto SPEECH__SERVICE__REGION = getenv("SPEECH__SERVICE__REGION");

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
}

int main(int argc, char** argv) {
    setlocale(LC_ALL, "");
    translateSpeech();
    return 0;
}

원본 언어 변경

음성 번역에 대한 공통 작업 중 하나는 입력(또는 원본) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 이탈리아어로 변경하는 방법을 보여줍니다. 코드에서 SetSpeechRecognitionLanguage 메서드를 호출하는 방식으로 SpeechTranslationConfig 인스턴스와 상호 작용합니다.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    // Source (input) language
    speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");
}

SpeechRecognitionLanguage 속성에는 언어 로캘 형식 문자열이 필요합니다. 지원되는 음성 번역 로캘 목록을 참조하세요.

번역 언어 추가

음성 번역의 또 다른 일반적인 작업은 대상 번역 언어를 지정하는 것입니다. 하나 이상이 필요하지만 다중 항목이 지원됩니다. 다음 코드 조각은 프랑스어와 독일어를 모두 번역 언어 대상으로 설정합니다.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    speechTranslationConfig->SetSpeechRecognitionLanguage("it-IT");

    speechTranslationConfig->AddTargetLanguage("fr");
    speechTranslationConfig->AddTargetLanguage("de");
}

AddTargetLanguage에 대한 모든 호출에서 새 대상 번역 언어가 지정됩니다. 즉, 소스 언어에서 음성이 인식될 때 각 대상 번역은 번역 작업의 일부로 사용할 수 있습니다.

번역 인식기 초기화

SpeechTranslationConfig 인스턴스를 만든 후에 수행할 단계는 TranslationRecognizer 초기화입니다. TranslationRecognizer를 초기화할 때 translationConfig 인스턴스를 전달해야 합니다. 구성 개체는 Speech Service가 요청의 유효성을 검사하는 데 필요한 자격 증명을 제공합니다.

디바이스의 기본 마이크를 사용하여 음성을 인식하는 경우 TranslationRecognizer의 모습은 다음과 같습니다.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguages = { "it", "fr", "de" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);
}

오디오 입력 디바이스를 지정하려면 AudioConfig 클래스 인스턴스를 만들고 TranslationRecognizer를 초기화할 때 audioConfig 매개 변수를 제공해야 합니다.

먼저 다음과 같이 AudioConfig 개체를 참조하세요.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguages = { "it", "fr", "de" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig, audioConfig);
}

마이크를 사용하는 대신 오디오 파일을 제공하려는 경우에도 audioConfig 매개 변수를 제공해야 합니다. 그러나 FromDefaultMicrophoneInput을 호출하는 대신 AudioConfig 클래스 인스턴스를 만드는 경우 FromWavFileInput을 호출하고 filename 매개 변수를 전달합니다.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguages = { "it", "fr", "de" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig, audioConfig);
}

음성 변환

음성 번역을 위해 Speech SDK는 마이크 또는 오디오 파일 입력을 사용합니다. 음성 인식은 음성 번역 전에 이루어집니다. 모든 개체가 초기화된 후 recognize-once 함수를 호출하고 결과를 가져옵니다.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    string fromLanguage = "en-US";
    string toLanguages[3] = { "it", "fr", "de" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);
    cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";

    auto result = translationRecognizer->RecognizeOnceAsync().get();
    if (result->Reason == ResultReason::TranslatedSpeech)
    {
        cout << "Recognized: \"" << result->Text << "\"" << std::endl;
        for (auto pair : result->Translations)
        {
            auto language = pair.first;
            auto translation = pair.second;
            cout << "Translated into '" << language << "': " << translation << std::endl;
        }
    }
}

음성 텍스트 변환에 대한 자세한 내용은 음성 인식의 기본 사항을 참조하세요.

번역 합성

음성 인식 및 번역이 성공적으로 완료되면 해당 결과에 사전에 있는 모든 번역이 포함됩니다. Translations 사전 키는 대상 번역 언어이고 값은 번역된 텍스트입니다. 인식된 음성은 번역한 다음, 다른 언어로 합성(음성-음성 번역)할 수 있습니다.

이벤트 기반 합성

TranslationRecognizer 개체는 Synthesizing 이벤트를 노출합니다. 이벤트는 여러 번 발생하며, 번역 인식 결과에서 합성된 오디오를 검색할 수 있는 메커니즘을 제공합니다. 여러 언어로 번역하는 경우 수동 합성을 참조하세요.

SetVoiceName 인스턴스를 할당하여 합성 음성을 지정하고 Synthesizing 이벤트에 대한 이벤트 처리기를 제공하여 오디오를 가져옵니다. 다음 예제에서는 번역된 오디오를 .wav 파일로 저장합니다.

Important

이벤트 기반 합성은 단일 번역에서만 작동합니다. 여러 대상 번역 언어를 추가하지 마세요. 또한 SetVoiceName 값은 대상 번역 언어와 동일한 언어여야 합니다. 예를 들어 "de""de-DE-Hedda"에 매핑할 수 있습니다.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguage = "de";
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    speechTranslationConfig->AddTargetLanguage(toLanguage);

    speechTranslationConfig->SetVoiceName("de-DE-Hedda");

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);
    translationRecognizer->Synthesizing.Connect([](const TranslationSynthesisEventArgs& e)
        {
            auto audio = e.Result->Audio;
            auto size = audio.size();
            cout << "Audio synthesized: " << size << " byte(s)" << (size == 0 ? "(COMPLETE)" : "") << std::endl;

            if (size > 0) {
                ofstream file("translation.wav", ios::out | ios::binary);
                auto audioData = audio.data();
                file.write((const char*)audioData, sizeof(audio[0]) * size);
                file.close();
            }
        });

    cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";

    auto result = translationRecognizer->RecognizeOnceAsync().get();
    if (result->Reason == ResultReason::TranslatedSpeech)
    {
        cout << "Recognized: \"" << result->Text << "\"" << std::endl;
        for (auto pair : result->Translations)
        {
            auto language = pair.first;
            auto translation = pair.second;
            cout << "Translated into '" << language << "': " << translation << std::endl;
        }
    }
}

수동 합성

Translations 사전을 사용하여 번역 텍스트에서 오디오를 합성할 수 있습니다. 각 번역을 반복하고 합성합니다. SpeechSynthesizer 인스턴스를 만들 때 SpeechConfig 개체의 SetSpeechSynthesisVoiceName 속성을 원하는 음성으로 설정해야 합니다.

다음 예제는 5개 언어로 번역됩니다. 각 번역은 해당 인공신경망 언어에서 오디오 파일로 합성됩니다.

void translateSpeech() {
    auto speechTranslationConfig =
        SpeechTranslationConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    auto fromLanguage = "en-US";
    auto toLanguages = { "de", "en", "it", "pt", "zh-Hans" };
    speechTranslationConfig->SetSpeechRecognitionLanguage(fromLanguage);
    for (auto language : toLanguages) {
        speechTranslationConfig->AddTargetLanguage(language);
    }

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);

    cout << "Say something in '" << fromLanguage << "' and we'll translate...\n";

    auto result = translationRecognizer->RecognizeOnceAsync().get();
    if (result->Reason == ResultReason::TranslatedSpeech)
    {
        map<string, string> languageToVoiceMap;
        languageToVoiceMap["de"] = "de-DE-KatjaNeural";
        languageToVoiceMap["en"] = "en-US-AriaNeural";
        languageToVoiceMap["it"] = "it-IT-ElsaNeural";
        languageToVoiceMap["pt"] = "pt-BR-FranciscaNeural";
        languageToVoiceMap["zh-Hans"] = "zh-CN-XiaoxiaoNeural";

        cout << "Recognized: \"" << result->Text << "\"" << std::endl;
        for (auto pair : result->Translations)
        {
            auto language = pair.first;
            auto translation = pair.second;
            cout << "Translated into '" << language << "': " << translation << std::endl;

            auto speechConfig =
                SpeechConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
            speechConfig->SetSpeechSynthesisVoiceName(languageToVoiceMap[language]);

            auto audioConfig = AudioConfig::FromWavFileOutput(language + "-translation.wav");
            auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig, audioConfig);

            speechSynthesizer->SpeakTextAsync(translation).get();
        }
    }
}

음성 합성에 대한 자세한 내용은 음성 합성의 기본 사항을 참조하세요.

언어 식별을 통한 다국어 번역

대부분의 시나리오에서는 어떤 입력 언어를 지정할지 모를 수 있습니다. 언어 식별을 사용하면 최대 10개의 가능한 입력 언어를 검색하고 대상 언어로 자동 번역할 수 있습니다.

다음 예에서는 en-US 또는 zh-CNAutoDetectSourceLanguageConfig에 정의되어 있으므로 검색되어야 한다고 예상합니다. 그런 다음 AddTargetLanguage() 호출에 지정된 대로 음성이 defr로 번역됩니다.

speechTranslationConfig->AddTargetLanguage("de");
speechTranslationConfig->AddTargetLanguage("fr");
auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromLanguages({ "en-US", "zh-CN" });
auto translationRecognizer = TranslationRecognizer::FromConfig(speechTranslationConfig, autoDetectSourceLanguageConfig, audioConfig);

전체 코드 샘플은 언어 식별을 참조하세요.

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

Go용 Speech SDK는 음성 번역을 지원하지 않습니다. 다른 프로그래밍 언어를 선택하거나 이 문서의 앞 부분에서 링크된 Go 참조 및 샘플을 참조하세요.

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

이 방법 가이드에서는 사람의 말을 인식하고 다른 언어로 번역하는 방법을 알아봅니다.

자세한 내용은 음성 번역 개요를 참조하세요.

  • 음성을 텍스트로 번역
  • 음성을 여러 대상 언어로 번역
  • 음성을 음성 번역으로 바로 수행

중요한 데이터 및 환경 변수

이 문서의 예제 소스 코드는 음성 리소스 키 및 지역과 같은 중요한 데이터 저장을 위한 환경 변수에 따라 달라집니다. Java 코드 파일에는 호스트 컴퓨터 환경 변수에서 할당된 두 개의 static final String 값, 즉 SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION이 포함되어 있습니다. 이러한 필드는 모두 클래스 범위에 있으므로 클래스의 메서드 본문 내에서 액세스할 수 있습니다.

public class App {

    static final String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SUBSCRIPTION__KEY");
    static final String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");

    public static void main(String[] args) { }
}

환경 변수에 대한 자세한 내용은 환경 변수 및 애플리케이션 구성을 참조하세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같은 다른 위치에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

음성 번역 구성 만들기

음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechTranslationConfig 인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.

음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.

다음과 같은 몇 가지 방법으로 SpeechTranslationConfig 인스턴스를 초기화할 수 있습니다.

  • 구독 사용: 키 및 연결된 영역을 전달합니다.
  • 엔드포인트 사용: 음성 서비스 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 호스트 사용: 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 권한 부여 토큰 사용: 권한 부여 토큰 및 연결된 영역을 전달합니다.

키와 지역을 사용하여 SpeechTranslationConfig 인스턴스를 만드는 방법을 살펴보겠습니다. Azure Portal에서 Speech 리소스 키 및 지역을 가져옵니다.

public class App {

    static final String SPEECH__SUBSCRIPTION__KEY = System.getenv("SPEECH__SERVICE__KEY");
    static final String SPEECH__SERVICE__REGION = System.getenv("SPEECH__SERVICE__REGION");

    public static void main(String[] args) {
        try {
            translateSpeech();
            System.exit(0);
        } catch (Exception ex) {
            System.out.println(ex);
            System.exit(1);
        }
    }

    static void translateSpeech() {
        SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
            SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    }
}

원본 언어 변경

음성 번역에 대한 공통 작업 중 하나는 입력(또는 원본) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 이탈리아어로 변경하는 방법을 보여줍니다. 코드에서 setSpeechRecognitionLanguage 메서드를 호출하는 방식으로 SpeechTranslationConfig 인스턴스와 상호 작용합니다.

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    // Source (input) language
    speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");
}

setSpeechRecognitionLanguage 함수에는 언어 로캘 형식 문자열이 필요합니다. 지원되는 음성 번역 로캘 목록을 참조하세요.

번역 언어 추가

음성 번역의 또 다른 일반적인 작업은 대상 번역 언어를 지정하는 것입니다. 하나 이상이 필요하지만 다중 항목이 지원됩니다. 다음 코드 조각은 프랑스어와 독일어를 모두 번역 언어 대상으로 설정합니다.

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    speechTranslationConfig.setSpeechRecognitionLanguage("it-IT");

    // Translate to languages. See https://aka.ms/speech/sttt-languages
    speechTranslationConfig.addTargetLanguage("fr");
    speechTranslationConfig.addTargetLanguage("de");
}

addTargetLanguage에 대한 모든 호출에서 새 대상 번역 언어가 지정됩니다. 즉, 소스 언어에서 음성이 인식될 때 각 대상 번역은 번역 작업의 일부로 사용할 수 있습니다.

번역 인식기 초기화

SpeechTranslationConfig 인스턴스를 만든 후에 수행할 단계는 TranslationRecognizer 초기화입니다. TranslationRecognizer를 초기화할 때 speechTranslationConfig 인스턴스를 전달해야 합니다. 구성 개체는 Speech Service가 요청의 유효성을 검사하는 데 필요한 자격 증명을 제공합니다.

디바이스의 기본 마이크를 사용하여 음성을 인식하는 경우 TranslationRecognizer의 모습은 다음과 같습니다.

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
    }
}

오디오 입력 디바이스를 지정하려면 AudioConfig 클래스 인스턴스를 만들고 TranslationRecognizer를 초기화할 때 audioConfig 매개 변수를 제공해야 합니다.

먼저 다음과 같이 AudioConfig 개체를 참조하세요.

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig)) {
        
    }
}

마이크를 사용하는 대신 오디오 파일을 제공하려는 경우에도 audioConfig 매개 변수를 제공해야 합니다. 그러나 fromDefaultMicrophoneInput을 호출하는 대신 AudioConfig 클래스 인스턴스를 만드는 경우 fromWavFileInput을 호출하고 filename 매개 변수를 전달합니다.

static void translateSpeech() {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig)) {
        
    }
}

음성 변환

음성 번역을 위해 Speech SDK는 마이크 또는 오디오 파일 입력을 사용합니다. 음성 인식은 음성 번역 전에 이루어집니다. 모든 개체가 초기화된 후 recognize-once 함수를 호출하고 결과를 가져옵니다.

static void translateSpeech() throws ExecutionException, InterruptedException {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "it", "fr", "de" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
        System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);

        TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
            for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
                System.out.printf("Translated into '%s': %s\n", pair.getKey(), pair.getValue());
            }
        }
    }
}

음성 텍스트 변환에 대한 자세한 내용은 음성 인식의 기본 사항을 참조하세요.

번역 합성

음성 인식 및 번역이 성공적으로 완료되면 해당 결과에 사전에 있는 모든 번역이 포함됩니다. getTranslations 함수는 키를 대상 번역 언어로 사용하고, 값을 번역된 텍스트로 사용하는 사전을 반환합니다. 인식된 음성은 번역한 다음, 다른 언어로 합성(음성-음성 번역)할 수 있습니다.

이벤트 기반 합성

TranslationRecognizer 개체는 synthesizing 이벤트를 노출합니다. 이벤트는 여러 번 발생하며, 번역 인식 결과에서 합성된 오디오를 검색할 수 있는 메커니즘을 제공합니다. 여러 언어로 번역하는 경우 수동 합성을 참조하세요.

setVoiceName 인스턴스를 할당하여 합성 음성을 지정하고 synthesizing 이벤트에 대한 이벤트 처리기를 제공하여 오디오를 가져옵니다. 다음 예제에서는 번역된 오디오를 .wav 파일로 저장합니다.

Important

이벤트 기반 합성은 단일 번역에서만 작동합니다. 여러 대상 번역 언어를 추가하지 마세요. 또한 setVoiceName 값은 대상 번역 언어와 동일한 언어여야 합니다. 예를 들어 "de""de-DE-Hedda"에 매핑할 수 있습니다.

static void translateSpeech() throws ExecutionException, FileNotFoundException, InterruptedException, IOException {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);

    String fromLanguage = "en-US";
    String toLanguage = "de";
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    speechTranslationConfig.addTargetLanguage(toLanguage);

    // See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
    speechTranslationConfig.setVoiceName("de-DE-Hedda");

    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
        translationRecognizer.synthesizing.addEventListener((s, e) -> {
            byte[] audio = e.getResult().getAudio();
            int size = audio.length;
            System.out.println("Audio synthesized: " + size + " byte(s)" + (size == 0 ? "(COMPLETE)" : ""));

            if (size > 0) {
                try (FileOutputStream file = new FileOutputStream("translation.wav")) {
                    file.write(audio);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);

        TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
            for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
                String language = pair.getKey();
                String translation = pair.getValue();
                System.out.printf("Translated into '%s': %s\n", language, translation);
            }
        }
    }
}

수동 합성

getTranslations 함수는 번역 텍스트에서 오디오를 합성하는 데 사용할 수 있는 사전을 반환합니다. 각 번역을 반복하고 합성합니다. SpeechSynthesizer 인스턴스를 만들 때 SpeechConfig 개체의 setSpeechSynthesisVoiceName 속성을 원하는 음성으로 설정해야 합니다.

다음 예제는 5개 언어로 번역됩니다. 각 번역은 해당 인공신경망 언어에서 오디오 파일로 합성됩니다.

static void translateSpeech() throws ExecutionException, InterruptedException {
    SpeechTranslationConfig speechTranslationConfig = SpeechTranslationConfig.fromSubscription(
        SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    
    String fromLanguage = "en-US";
    String[] toLanguages = { "de", "en", "it", "pt", "zh-Hans" };
    speechTranslationConfig.setSpeechRecognitionLanguage(fromLanguage);
    for (String language : toLanguages) {
        speechTranslationConfig.addTargetLanguage(language);
    }

    try (TranslationRecognizer translationRecognizer = new TranslationRecognizer(speechTranslationConfig)) {
        System.out.printf("Say something in '%s' and we'll translate...", fromLanguage);

        TranslationRecognitionResult translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
            // See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
            Map<String, String> languageToVoiceMap = new HashMap<String, String>();
            languageToVoiceMap.put("de", "de-DE-KatjaNeural");
            languageToVoiceMap.put("en", "en-US-AriaNeural");
            languageToVoiceMap.put("it", "it-IT-ElsaNeural");
            languageToVoiceMap.put("pt", "pt-BR-FranciscaNeural");
            languageToVoiceMap.put("zh-Hans", "zh-CN-XiaoxiaoNeural");

            System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
            for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
                String language = pair.getKey();
                String translation = pair.getValue();
                System.out.printf("Translated into '%s': %s\n", language, translation);

                SpeechConfig speechConfig =
                    SpeechConfig.fromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
                speechConfig.setSpeechSynthesisVoiceName(languageToVoiceMap.get(language));

                AudioConfig audioConfig = AudioConfig.fromWavFileOutput(language + "-translation.wav");
                try (SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig)) {
                    speechSynthesizer.SpeakTextAsync(translation).get();
                }
            }
        }
    }
}

음성 합성에 대한 자세한 내용은 음성 합성의 기본 사항을 참조하세요.

참조 설명서 | 패키지(npm) | GitHub의 추가 샘플 | 라이브러리 소스 코드

이 방법 가이드에서는 사람의 말을 인식하고 다른 언어로 번역하는 방법을 알아봅니다.

자세한 내용은 음성 번역 개요를 참조하세요.

  • 음성을 텍스트로 번역
  • 음성을 여러 대상 언어로 번역
  • 음성을 음성 번역으로 바로 수행

번역 구성 만들기

음성 SDK를 사용하여 번역 서비스를 호출하려면 SpeechTranslationConfig 인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.

참고 항목

음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.

다음과 같은 몇 가지 방법으로 SpeechTranslationConfig를 초기화할 수 있습니다.

  • 구독 사용: 키 및 연결된 영역을 전달합니다.
  • 엔드포인트 사용: 음성 서비스 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 호스트 사용: 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 권한 부여 토큰 사용: 권한 부여 토큰 및 연결된 영역을 전달합니다.

키와 지역을 사용하여 SpeechTranslationConfig 인스턴스를 만드는 방법을 살펴보겠습니다. Azure Portal에서 Speech 리소스 키 및 지역을 가져옵니다.

const speechTranslationConfig = SpeechTranslationConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");

번역기 초기화

SpeechTranslationConfig 인스턴스를 만든 후에 수행할 단계는 TranslationRecognizer 초기화입니다. TranslationRecognizer를 초기화할 때 speechTranslationConfig 인스턴스를 전달해야 합니다. 구성 개체는 번역 서비스가 요청의 유효성을 검사하는 데 필요한 자격 증명을 제공합니다.

디바이스의 기본 마이크를 통해 제공되는 음성을 번역하는 경우 TranslationRecognizer의 모습은 다음과 같습니다.

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

오디오 입력 디바이스를 지정하려면 AudioConfig 클래스 인스턴스를 만들고 TranslationRecognizer를 초기화할 때 audioConfig 매개 변수를 제공해야 합니다.

다음과 같이 AudioConfig 개체를 참조하세요.

const audioConfig = AudioConfig.fromDefaultMicrophoneInput();
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);

마이크를 사용하는 대신 오디오 파일을 제공하려는 경우에도 audioConfig 매개 변수를 제공해야 합니다. 그러나 Node.js를 대상으로 하는 경우에만 이 작업을 수행할 수 있습니다. fromDefaultMicrophoneInput을 호출하는 대신 AudioConfig 클래스 인스턴스를 만드는 경우 fromWavFileOutput을 호출하고 filename 매개 변수를 전달합니다.

const audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
const translationRecognizer = new TranslationRecognizer(speechTranslationConfig, audioConfig);

음성 변환

JavaScript용 Speech SDK의 TranslationRecognizer 클래스는 음성 번역에 사용할 수 있는 메서드를 공개합니다.

  • 단일 샷 번역(비동기): 비차단(비동기) 모드에서 번역을 수행합니다. 단일 발화를 번역합니다. 끝에서 무음을 수신하거나 최대 15초의 오디오가 처리될 때까지 대기하여 단일 발화의 끝을 결정합니다.
  • 연속 번역(비동기): 연속 번역 작업을 비동기적으로 시작합니다. 사용자는 이벤트에 등록하고 다양한 애플리케이션 상태를 처리합니다. 비동기 연속 번역을 중지하려면 stopContinuousRecognitionAsync를 호출합니다.

음성 인식 모드를 선택하는 방법에 대한 자세한 내용은 음성 텍스트 변환 시작을 참조하세요.

대상 언어 지정

번역하려면 소스 언어와 하나 이상의 대상 언어를 지정해야 합니다.

음성 번역 테이블에 나열된 로캘을 사용하여 소스 언어를 선택할 수 있습니다. 동일한 링크에서 번역된 언어에 대한 옵션을 찾습니다.

텍스트를 보거나 합성 번역된 음성을 들으려는 경우 대상 언어에 대한 옵션이 다릅니다. 영어에서 독일어로 번역하려면 번역 구성 개체를 수정합니다.

speechTranslationConfig.speechRecognitionLanguage = "en-US";
speechTranslationConfig.addTargetLanguage("de");

단일 샷 인식

다음은 recognizeOnceAsync를 통한 비동기 단일 샷 번역의 예입니다.

translationRecognizer.recognizeOnceAsync(result => {
    // Interact with result
});

결과를 처리하는 코드를 작성해야 합니다. 이 샘플은 독일어로 번역을 위해 result.reason을 평가합니다.

translationRecognizer.recognizeOnceAsync(
  function (result) {
    let translation = result.translations.get("de");
    window.console.log(translation);
    translationRecognizer.close();
  },
  function (err) {
    window.console.log(err);
    translationRecognizer.close();
});

코드는 번역이 처리되는 동안 제공되는 업데이트도 처리할 수 있습니다. 이러한 업데이트를 사용하여 번역 진행률에 대한 시각적 피드백을 제공할 수 있습니다. 이 JavaScript Node.js 예제에서는 이러한 종류의 업데이트를 보여줍니다. 다음 코드는 번역 프로세스 중 생성되는 세부 정보도 표시합니다.

translationRecognizer.recognizing = function (s, e) {
    var str = ("(recognizing) Reason: " + SpeechSDK.ResultReason[e.result.reason] +
            " Text: " +  e.result.text +
            " Translation:");
    str += e.result.translations.get("de");
    console.log(str);
};
translationRecognizer.recognized = function (s, e) {
    var str = "\r\n(recognized)  Reason: " + SpeechSDK.ResultReason[e.result.reason] +
            " Text: " + e.result.text +
            " Translation:";
    str += e.result.translations.get("de");
    str += "\r\n";
    console.log(str);
};

연속 번역

연속 번역은 단일 샷 인식보다 약간 더 복잡합니다. recognizing, recognizedcanceled 이벤트를 구독하여 인식 결과를 얻어야 합니다. 번역을 중지하려면 stopContinuousRecognitionAsync를 호출해야 합니다.

다음은 오디오 입력 파일에서 연속 번역이 수행되는 방식을 보여주는 예입니다. 먼저 입력을 정의하고 TranslationRecognizer를 초기화하겠습니다.

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

다음 코드에서는 TranslationRecognizer에서 보낸 이벤트를 구독합니다.

  • recognizing: 중간 번역 결과가 포함된 이벤트에 대한 신호입니다.
  • recognized: 최종 번역 결과가 포함된 이벤트에 대한 신호입니다. 이러한 결과는 성공적인 번역 시도를 나타냅니다.
  • sessionStopped: 번역 세션(작업)의 끝을 나타내는 이벤트에 대한 신호입니다.
  • canceled: 취소된 번역 결과가 포함된 이벤트에 대한 신호입니다. 이러한 이벤트는 결과적으로 또는 직접 취소로 취소된 번역 시도를 나타냅니다. 또는 전송 또는 프로토콜 오류를 나타냅니다.
translationRecognizer.recognizing = (s, e) => {
    console.log(`TRANSLATING: Text=${e.result.text}`);
};
translationRecognizer.recognized = (s, e) => {
    if (e.result.reason == ResultReason.RecognizedSpeech) {
        console.log(`TRANSLATED: Text=${e.result.text}`);
    }
    else if (e.result.reason == ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be translated.");
    }
};
translationRecognizer.canceled = (s, e) => {
    console.log(`CANCELED: Reason=${e.reason}`);
    if (e.reason == CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you set the speech resource key and region values?");
    }
    translationRecognizer.stopContinuousRecognitionAsync();
};
translationRecognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    translationRecognizer.stopContinuousRecognitionAsync();
};

모든 설정이 끝났으면 startContinuousRecognitionAsync를 호출할 수 있습니다.

// Starts continuous recognition. Uses stopContinuousRecognitionAsync() to stop recognition.
translationRecognizer.startContinuousRecognitionAsync();
// Something later can call. Stops recognition.
// translationRecognizer.StopContinuousRecognitionAsync();

소스 언어 선택

음성 번역에 대한 일반적인 작업 중 하나는 입력(또는 소스) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 이탈리아어로 변경하는 방법을 보여줍니다. 코드에서 SpeechTranslationConfig 인스턴스를 찾아서 바로 아래에 다음 줄을 추가합니다.

speechTranslationConfig.speechRecognitionLanguage = "it-IT";

speechRecognitionLanguage 속성에는 언어 로캘 형식 문자열이 필요합니다. 지원되는 음성 번역 로캘 목록을 참조하세요.

하나 이상의 대상 언어 선택

Speech SDK는 여러 대상 언어로 동시에 번역할 수 있습니다. 사용 가능한 대상 언어는 소스 언어 목록과 약간 다릅니다. 로캘이 아닌 언어 코드를 사용하여 대상 언어를 지정합니다.

텍스트 대상에 대한 언어 코드 목록은 언어 지원 페이지의 음성 번역 표를 참조하세요. 합성 언어로 번역에 대한 세부 정보도 찾을 수 있습니다.

다음 코드는 독일어를 대상 언어로 추가합니다.

speechTranslationConfig.addTargetLanguage("de");

여러 대상 언어 번역이 가능하므로 결과를 검사할 때 코드에서 대상 언어를 지정해야 합니다. 다음 코드는 독일어 번역 결과를 가져옵니다.

translationRecognizer.recognized = function (s, e) {
    var str = "\r\n(recognized)  Reason: " +
            sdk.ResultReason[e.result.reason] +
            " Text: " + e.result.text + " Translations:";
    var language = "de";
    str += " [" + language + "] " + e.result.translations.get(language);
    str += "\r\n";
    // show str somewhere
};

참조 설명서 | 패키지(다운로드) | GitHub의 추가 샘플

Objective-C용 음성 SDK는 음성 번역을 지원하지만 아직 가이드가 여기에 포함되지 않았습니다. 다른 프로그래밍 언어를 선택해서 작업을 시작하고 개념을 알아보거나 이 문서의 앞 부분에 링크된 Objective-C 참조 및 샘플을 참조하세요.

참조 설명서 | 패키지(다운로드) | GitHub의 추가 샘플

Swift용 음성 SDK는 음성 번역을 지원하지만 아직 가이드가 여기에 포함되지 않았습니다. 다른 프로그래밍 언어를 선택해서 작업을 시작하고 개념을 알아보거나 이 문서의 앞 부분에 링크된 Swift 참조 및 샘플을 참조하세요.

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

이 방법 가이드에서는 사람의 말을 인식하고 다른 언어로 번역하는 방법을 알아봅니다.

자세한 내용은 음성 번역 개요를 참조하세요.

  • 음성을 텍스트로 번역
  • 음성을 여러 대상 언어로 번역
  • 음성을 음성 번역으로 바로 수행

중요한 데이터 및 환경 변수

이 문서의 예제 소스 코드는 음성 리소스 구독 키 및 지역과 같은 중요한 데이터 저장을 위한 환경 변수에 따라 달라집니다. Python 코드 파일에는 호스트 컴퓨터 환경 변수에서 할당된 두 개의 값, 즉 SPEECH__SUBSCRIPTION__KEYSPEECH__SERVICE__REGION이 포함되어 있습니다. 두 변수 모두 전역 범위에 있으므로 코드 파일의 함수 정의 내에서 액세스할 수 있습니다.

speech_key, service_region = os.environ['SPEECH__SUBSCRIPTION__KEY'], os.environ['SPEECH__SERVICE__REGION']

환경 변수에 대한 자세한 내용은 환경 변수 및 애플리케이션 구성을 참조하세요.

Important

API 키를 사용하는 경우 Azure Key Vault와 같은 다른 위치에 안전하게 저장합니다. API 키를 코드에 직접 포함하지 말고, 공개적으로 게시하지 마세요.

AI 서비스 보안에 대한 자세한 내용은 Azure AI 서비스에 대한 요청 인증을 참조하세요.

음성 번역 구성 만들기

음성 SDK를 사용하여 Speech Service를 호출하려면 SpeechTranslationConfig 인스턴스를 만들어야 합니다. 이 클래스에는 키 및 연결된 지역, 엔드포인트, 호스트 또는 권한 부여 토큰과 같은 구독에 대한 정보가 포함됩니다.

음성 인식, 음성 합성, 번역 또는 의도 인식을 수행하고 있는지 여부에 관계없이 항상 구성을 만들게 됩니다.

다음과 같은 몇 가지 방법으로 SpeechTranslationConfig를 초기화할 수 있습니다.

  • 구독 사용: 키 및 연결된 영역을 전달합니다.
  • 엔드포인트 사용: 음성 서비스 엔드포인트를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 호스트 사용: 호스트 주소를 전달합니다. 키 또는 권한 부여 토큰은 선택 사항입니다.
  • 권한 부여 토큰 사용: 권한 부여 토큰 및 연결된 영역을 전달합니다.

키와 지역을 사용하여 SpeechTranslationConfig 인스턴스를 만드는 방법을 살펴보겠습니다. Azure Portal에서 Speech 리소스 키 및 지역을 가져옵니다.

from_language, to_language = 'en-US', 'de'

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

원본 언어 변경

음성 번역에 대한 공통 작업 중 하나는 입력(또는 원본) 언어를 지정하는 것입니다. 다음 예제에서는 입력 언어를 이탈리아어로 변경하는 방법을 보여줍니다. 코드에서 speech_recognition_language 속성에 할당하는 방식으로 SpeechTranslationConfig 인스턴스와 상호 작용합니다.

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    # Source (input) language
    from_language = "it-IT"
    translation_config.speech_recognition_language = from_language

speech_recognition_language 속성에는 언어 로캘 형식 문자열이 필요합니다. 지원되는 음성 번역 로캘 목록을 참조하세요.

번역 언어 추가

음성 번역의 또 다른 일반적인 작업은 대상 번역 언어를 지정하는 것입니다. 하나 이상이 필요하지만 다중 항목이 지원됩니다. 다음 코드 조각은 프랑스어와 독일어를 모두 번역 언어 대상으로 설정합니다.

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = "it-IT"

    # Translate to languages. See, https://aka.ms/speech/sttt-languages
    translation_config.add_target_language("fr")
    translation_config.add_target_language("de")

add_target_language에 대한 모든 호출에서 새 대상 번역 언어가 지정됩니다. 즉, 소스 언어에서 음성이 인식될 때 각 대상 번역은 번역 작업의 일부로 사용할 수 있습니다.

번역 인식기 초기화

SpeechTranslationConfig 인스턴스를 만든 후에 수행할 단계는 TranslationRecognizer 초기화입니다. TranslationRecognizer를 초기화할 때 translation_config 인스턴스를 전달해야 합니다. 구성 개체는 Speech Service가 요청의 유효성을 검사하는 데 필요한 자격 증명을 제공합니다.

디바이스의 기본 마이크를 사용하여 음성을 인식하는 경우 TranslationRecognizer의 모습은 다음과 같습니다.

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config)

오디오 입력 디바이스를 지정하려면 AudioConfig 클래스 인스턴스를 만들고 TranslationRecognizer를 초기화할 때 audio_config 매개 변수를 제공해야 합니다.

먼저 다음과 같이 AudioConfig 개체를 참조하세요.

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    for lang in to_languages:
        translation_config.add_target_language(lang)

    audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)
    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config, audio_config=audio_config)

마이크를 사용하는 대신 오디오 파일을 제공하려는 경우에도 audioConfig 매개 변수를 제공해야 합니다. 하지만 use_default_microphone=True로 호출하는 대신 AudioConfig 클래스를 만드는 경우 filename="path-to-file.wav"로 호출하고 filename 매개 변수를 전달합니다.

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    for lang in to_languages:
        translation_config.add_target_language(lang)

    audio_config = speechsdk.audio.AudioConfig(filename="path-to-file.wav")
    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config, audio_config=audio_config)

음성 변환

음성 번역을 위해 Speech SDK는 마이크 또는 오디오 파일 입력을 사용합니다. 음성 인식은 음성 번역 전에 이루어집니다. 모든 개체가 초기화된 후 recognize-once 함수를 호출하고 결과를 가져옵니다.

import os
import azure.cognitiveservices.speech as speechsdk

speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_languages = 'en-US', 'de'

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config)
    
    print('Say something...')
    translation_recognition_result = translation_recognizer.recognize_once()
    print(get_result_text(reason=translation_recognition_result.reason, result=translation_recognition_result))

def get_result_text(reason, translation_recognition_result):
    reason_format = {
        speechsdk.ResultReason.TranslatedSpeech:
            f'RECOGNIZED "{from_language}": {translation_recognition_result.text}\n' +
            f'TRANSLATED into "{to_language}"": {translation_recognition_result.translations[to_language]}',
        speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{translation_recognition_result.text}"',
        speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {translation_recognition_result.no_match_details}',
        speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {translation_recognition_result.cancellation_details}'
    }
    return reason_format.get(reason, 'Unable to recognize speech')

translate_speech_to_text()

음성 텍스트 변환에 대한 자세한 내용은 음성 인식의 기본 사항을 참조하세요.

번역 합성

음성 인식 및 번역이 성공적으로 완료되면 해당 결과에 사전에 있는 모든 번역이 포함됩니다. translations 사전 키는 대상 번역 언어이고 값은 번역된 텍스트입니다. 인식된 음성은 번역한 다음, 다른 언어로 합성(음성-음성 번역)할 수 있습니다.

이벤트 기반 합성

TranslationRecognizer 개체는 Synthesizing 이벤트를 노출합니다. 이벤트는 여러 번 발생하며, 번역 인식 결과에서 합성된 오디오를 검색할 수 있는 메커니즘을 제공합니다. 여러 언어로 번역하는 경우 수동 합성을 참조하세요.

voice_name 인스턴스를 할당하여 합성 음성을 지정하고 Synthesizing 이벤트에 대한 이벤트 처리기를 제공하여 오디오를 가져옵니다. 다음 예제에서는 번역된 오디오를 .wav 파일로 저장합니다.

Important

이벤트 기반 합성은 단일 번역에서만 작동합니다. 여러 대상 번역 언어를 추가하지 마세요. 또한 voice_name 값은 대상 번역 언어와 동일한 언어여야 합니다. 예를 들어 "de""de-DE-Hedda"에 매핑할 수 있습니다.

import os
import azure.cognitiveservices.speech as speechsdk

speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_language = 'en-US', 'de'

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

    # See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
    translation_config.voice_name = "de-DE-Hedda"

    translation_recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config)

    def synthesis_callback(evt):
        size = len(evt.result.audio)
        print(f'Audio synthesized: {size} byte(s) {"(COMPLETED)" if size == 0 else ""}')

        if size > 0:
            file = open('translation.wav', 'wb+')
            file.write(evt.result.audio)
            file.close()

    translation_recognizer.synthesizing.connect(synthesis_callback)

    print(f'Say something in "{from_language}" and we\'ll translate into "{to_language}".')

    translation_recognition_result = translation_recognizer.recognize_once()
    print(get_result_text(reason=translation_recognition_result.reason, result=translation_recognition_result))

def get_result_text(reason, translation_recognition_result):
    reason_format = {
        speechsdk.ResultReason.TranslatedSpeech:
            f'Recognized "{from_language}": {translation_recognition_result.text}\n' +
            f'Translated into "{to_language}"": {translation_recognition_result.translations[to_language]}',
        speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{translation_recognition_result.text}"',
        speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {translation_recognition_result.no_match_details}',
        speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {translation_recognition_result.cancellation_details}'
    }
    return reason_format.get(reason, 'Unable to recognize speech')

translate_speech_to_text()

수동 합성

translations 사전을 사용하여 번역 텍스트에서 오디오를 합성할 수 있습니다. 각 번역을 반복하고 합성합니다. SpeechSynthesizer 인스턴스를 만들 때 SpeechConfig 개체의 speech_synthesis_voice_name 속성을 원하는 음성으로 설정해야 합니다.

다음 예제는 5개 언어로 번역됩니다. 각 번역은 해당 인공신경망 언어에서 오디오 파일로 합성됩니다.

import os
import azure.cognitiveservices.speech as speechsdk

speech_key, service_region = os.environ['SPEECH__SERVICE__KEY'], os.environ['SPEECH__SERVICE__REGION']
from_language, to_languages = 'en-US', [ 'de', 'en', 'it', 'pt', 'zh-Hans' ]

def translate_speech_to_text():
    translation_config = speechsdk.translation.SpeechTranslationConfig(
            subscription=speech_key, region=service_region)

    translation_config.speech_recognition_language = from_language
    for lang in to_languages:
        translation_config.add_target_language(lang)

    recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config)
    
    print('Say something...')
    translation_recognition_result = translation_recognizer.recognize_once()
    synthesize_translations(result=translation_recognition_result)

def synthesize_translations(translation_recognition_result):
    language_to_voice_map = {
        "de": "de-DE-KatjaNeural",
        "en": "en-US-AriaNeural",
        "it": "it-IT-ElsaNeural",
        "pt": "pt-BR-FranciscaNeural",
        "zh-Hans": "zh-CN-XiaoxiaoNeural"
    }
    print(f'Recognized: "{translation_recognition_result.text}"')

    for language in translation_recognition_result.translations:
        translation = translation_recognition_result.translations[language]
        print(f'Translated into "{language}": {translation}')

        speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)
        speech_config.speech_synthesis_voice_name = language_to_voice_map.get(language)
        
        audio_config = speechsdk.audio.AudioOutputConfig(filename=f'{language}-translation.wav')
        speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
        speech_synthesizer.speak_text_async(translation).get()

translate_speech_to_text()

음성 합성에 대한 자세한 내용은 음성 합성의 기본 사항을 참조하세요.

언어 식별을 통한 다국어 번역

대부분의 시나리오에서는 어떤 입력 언어를 지정할지 모를 수 있습니다. 언어 식별을 사용하면 최대 10개의 가능한 입력 언어를 검색하고 대상 언어로 자동 번역할 수 있습니다.

전체 코드 샘플은 언어 식별을 참조하세요.

음성 텍스트 변환 REST API 참조 | 짧은 오디오 참조를 위한 음성 텍스트 변환 REST API | GitHub의 추가 샘플

음성 번역에 REST API를 사용할 수 있지만 아직 가이드가 여기에 포함되지 않았습니다. 다른 프로그래밍 언어를 선택하여 작업을 시작하고 개념에 대해 알아보세요.

이 방법 가이드에서는 사람의 말을 인식하고 다른 언어로 번역하는 방법을 알아봅니다.

자세한 내용은 음성 번역 개요를 참조하세요.

  • 음성을 텍스트로 번역
  • 음성을 여러 대상 언어로 번역
  • 음성을 음성 번역으로 바로 수행

필수 구성 요소

다운로드 및 설치

다음 단계를 수행합니다. 플랫폼에 대한 추가 요구 사항은 음성 CLI 빠른 시작을 참조하세요.

  1. 다음 .NET CLI 명령을 실행하여 음성 CLI를 설치합니다.

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. 다음 명령을 실행하여 음성 리소스 키 및 지역을 구성합니다. SUBSCRIPTION-KEY를 음성 리소스 키로 바꾸고, REGION을 음성 리소스 지역으로 바꿉니다.

    spx config @key --set SUBSCRIPTION-KEY
    spx config @region --set REGION
    

원본 및 대상 언어 설정

이 명령은 Speech CLI를 호출하여 마이크의 음성을 이탈리아어에서 프랑스어로 번역합니다.

spx translate --microphone --source it-IT --target fr

다음 단계