Como reconhecer e traduzir a fala

Documentação de referência | Pacotes (NuGet) | Exemplos adicionais no GitHub

Neste guia de instruções, você aprenderá a reconhecer a fala humana e a traduzi-la para outro idioma.

Confira a visão geral da tradução de fala para saber mais sobre:

  • Converter de fala em texto
  • Traduzir a fala para vários idiomas de destino
  • Execução de fala direta para tradução de fala

Variáveis de ambiente e dados confidenciais

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a região e a chave do recurso Fala. A classe Program contém dois valores static readonly string que são atribuídos das variáveis de ambiente do computador host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambos os campos estão no escopo da classe, portanto, podem ser acessados nos corpos de método da classe:

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;
}

Para obter mais informações sobre variáveis de ambiente, consulte Variáveis de ambiente e configuração de aplicativo.

Criar uma configuração de tradução de fala

Para chamar o serviço de Fala usando o SDK de Fala, você precisa criar uma instância SpeechTranslationConfig. Essa classe inclui informações sobre sua assinatura, como sua chave e região, ponto de extremidade, host ou token de autorização associados.

Dica

Independentemente se você estiver executando o reconhecimento de fala, a síntese de fala, tradução ou reconhecimento de intenção, você sempre criará uma configuração.

Há algumas formas de se inicializar SpeechTranslationConfig:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe um ponto de extremidade do serviço de Fala. Uma chave ou um token de autorização é opcional.
  • Com um host: passe um endereço de host. Uma chave ou um token de autorização é opcional.
  • Com um token de autorização: passe um token de autorização e a região associada.

Vamos ver como você cria uma instância SpeechTranslationConfig usando uma chave e uma região. Obtenha a chave e a região do recurso de Fala no portal do Azure.

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);
    }
}

Alterar o idioma de origem

Uma tarefa comum na tradução de fala é especificar o idioma da entrada (ou origem). O exemplo a seguir mostra como você pode alterar o idioma de entrada para Italiano. Em seu código, interaja com a instância SpeechTranslationConfig atribuindo-a à propriedade SpeechRecognitionLanguage:

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

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

A propriedade SpeechRecognitionLanguage espera uma cadeia de caracteres em formato idioma-localidade. Veja a lista de localidades de tradução de fala em texto com suporte.

Adicionar o idioma da tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. É necessário ao menos um, mas há suporte para vários. O trecho de código a seguir define o Francês e o Alemão como os idiomas de destino da tradução:

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

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

Com cada chamada para AddTargetLanguage, um novo idioma de destino da tradução é especificado. Em outras palavras, quando a fala é reconhecida a partir do idioma de origem, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Após criar uma instância SpeechTranslationConfig, a próxima etapa é inicializar TranslationRecognizer. Ao inicializar TranslationRecognizer, será necessário passar para a instância speechTranslationConfig. O objeto da configuração fornece as credenciais necessárias ao serviço de Fala para validar sua solicitação.

Se você estiver reconhecendo fala usando o microfone padrão do seu dispositivo, veja como deverá ser a instância 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);
}

Se você quiser especificar o dispositivo de entrada de áudio, precisará criar uma instância de classe AudioConfig e fornecer o parâmetro audioConfig ao inicializar TranslationRecognizer.

Primeiro, faça referência ao objeto AudioConfig conforme a seguir:

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);
}

Se você quiser fornecer um arquivo de áudio em vez de usar um microfone, ainda precisará fornecer um parâmetro audioConfig. No entanto, ao criar uma instância de classe AudioConfig, em vez de chamar FromDefaultMicrophoneInput, você chama FromWavFileInput e passa o parâmetro 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);
}

Traduzir fala

Para traduzir a fala, o SDK de Fala depende de um microfone ou de uma entrada de arquivo de áudio. O reconhecimento de fala ocorre antes da tradução de fala. Após todos os objetos serem inicializados, chame a função de reconhecimento único e obtenha o resultado:

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}");
        }
    }
}

Para obter mais informações sobre reconhecimento de fala, consulte noções básicas do reconhecimento de fala.

Tradução baseada em eventos

O objeto TranslationRecognizer expõe um evento Recognizing. O evento é acionado várias vezes e fornece um mecanismo para recuperar os resultados intermediários da tradução.

Observação

Os resultados da tradução intermediária não estão disponíveis quando você usa a tradução de fala multilíngue.

O exemplo a seguir imprime os resultados da tradução intermediária no console:

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);
    }
}

Sintetizar traduções

Após um reconhecimento de fala e uma tradução bem-sucedidos, o resultado contém todas as traduções em um dicionário. A chave de dicionário Translations é o idioma de tradução de destino e o valor é o texto traduzido. A fala reconhecida pode ser traduzida e sintetizada em um idioma diferente (fala a fala).

Síntese baseada em evento

O objeto TranslationRecognizer expõe um evento Synthesizing. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento da tradução. Se você estiver traduzindo para vários idiomas, consulte Sintetização manual.

Especifique a voz de sintetização atribuindo uma instância VoiceName e forneça um manipulador de eventos ao evento Synthesizing para obter o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A sintetização baseada em evento funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o valor VoiceName deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" pode mapear para "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]}");
    }
}

Síntese manual

O dicionário Translations pode ser usado para sintetizar o áudio do texto de tradução. Itere através de cada tradução e sintetize-a. Quando você estiver criando uma instância SpeechSynthesizer, o objeto SpeechConfig precisará ter sua propriedade SpeechSynthesisVoiceName definida para a voz desejada.

O exemplo a seguir traduz em cinco idiomas. Cada tradução é sintetizada em um arquivo de áudio na linguagem neural correspondente.

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);
        }
    }
}

Para obter mais informações sobre a síntese de fala, consulte noções básicas sobre a síntese de fala.

Tradução multilíngue com identificação de idioma

Em muitos cenários, talvez você não saiba quais idiomas de entrada devem ser especificados. O uso da identificação de idioma permite detectar até dez idiomas de entrada possíveis e traduzir automaticamente para os idiomas de destino.

O exemplo a seguir prevê que en-US ou zh-CN deve ser detectado porque estão definidos em AutoDetectSourceLanguageConfig. Em seguida, a fala é traduzida para de e fr, conforme especificado nas chamadas para AddTargetLanguage().

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

Para obter um exemplo de código completo, confira identificação de idioma.

Tradução de fala multilíngue sem candidatos ao idioma de origem

A tradução de fala multilíngue implementa um novo nível de tecnologia de tradução de fala que desbloqueia vários recursos, incluindo não ter um idioma de entrada especificado e lidar com trocas de idioma na mesma sessão. Esses recursos permitem um novo nível de capacidades de tradução de fala que podem ser implementados nos seus produtos.

Atualmente, ao usar a ID de Linguagem com a tradução de fala, você deve criar o objeto SpeechTranslationConfig do ponto de extremidade v2. Substitua a cadeia de caracteres "YourServiceRegion" pela sua região do Recurso de Fala (como "westus"). Substitua "YourSubscriptionKey" pela chave do Recurso de Fala.

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");

Especifique os idiomas de destino de tradução. Substitua pelos idiomas da sua escolha. Você pode adicionar mais linhas.

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

Um diferencial importante da tradução de fala multilíngue é que você não precisa especificar o idioma de origem. Isso ocorre porque o serviço detectará automaticamente o idioma de origem. Crie o objeto AutoDetectSourceLanguageConfig com o método fromOpenRange para informar ao serviço que você deseja usar a tradução de fala multilíngue sem nenhum idioma de origem especificado.

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

Para obter um exemplo de código completo com o SDK de Fala, consulte exemplos de tradução de fala no GitHub.

Documentação de referência | Pacotes (NuGet) | Exemplos adicionais no GitHub

Neste guia de instruções, você aprenderá a reconhecer a fala humana e a traduzi-la para outro idioma.

Confira a visão geral da tradução de fala para saber mais sobre:

  • Converter de fala em texto
  • Traduzir a fala para vários idiomas de destino
  • Execução de fala direta para tradução de fala

Variáveis de ambiente e dados confidenciais

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a região e a chave do recurso Fala. O arquivo de código C++ contém dois valores de cadeia de caracteres que são atribuídos das variáveis de ambiente do computador host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambos os campos estão no escopo da classe, portanto, podem ser acessados nos corpos de método da classe:

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

Para obter mais informações sobre variáveis de ambiente, consulte Variáveis de ambiente e configuração de aplicativo.

Criar uma configuração de tradução de fala

Para chamar o serviço de Fala usando o SDK de Fala, você precisa criar uma instância SpeechTranslationConfig. Essa classe inclui informações sobre sua assinatura, como sua chave e região, ponto de extremidade, host ou token de autorização associados.

Dica

Independentemente se você estiver executando o reconhecimento de fala, a síntese de fala, tradução ou reconhecimento de intenção, você sempre criará uma configuração.

Há algumas formas de se inicializar SpeechTranslationConfig:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe um ponto de extremidade do serviço de Fala. Uma chave ou um token de autorização é opcional.
  • Com um host: passe um endereço de host. Uma chave ou um token de autorização é opcional.
  • Com um token de autorização: passe um token de autorização e a região associada.

Vamos ver como você cria uma instância SpeechTranslationConfig usando uma chave e uma região. Obtenha a chave e a região do recurso de Fala no portal do Azure.

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;
}

Alterar o idioma de origem

Uma tarefa comum na tradução de fala é especificar o idioma da entrada (ou origem). O exemplo a seguir mostra como você pode alterar o idioma de entrada para Italiano. Em seu código, interaja com a instância SpeechTranslationConfig chamando o método SetSpeechRecognitionLanguage.

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

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

A propriedade SpeechRecognitionLanguage espera uma cadeia de caracteres em formato idioma-localidade. Veja a lista de localidades de tradução de fala em texto com suporte.

Adicionar o idioma da tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. É necessário ao menos um, mas há suporte para vários. O trecho de código a seguir define o Francês e o Alemão como os idiomas de destino da tradução:

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

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

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

Com cada chamada para AddTargetLanguage, um novo idioma de destino da tradução é especificado. Em outras palavras, quando a fala é reconhecida a partir do idioma de origem, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Após criar uma instância SpeechTranslationConfig, a próxima etapa é inicializar TranslationRecognizer. Ao inicializar TranslationRecognizer, será necessário passar para a instância translationConfig. O objeto da configuração fornece as credenciais necessárias ao serviço de Fala para validar sua solicitação.

Se você estiver reconhecendo fala usando o microfone padrão do seu dispositivo, veja como deverá ser 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);
}

Se você quiser especificar o dispositivo de entrada de áudio, precisará criar uma instância de classe AudioConfig e fornecer o parâmetro audioConfig ao inicializar TranslationRecognizer.

Primeiro, faça referência ao objeto AudioConfig conforme a seguir:

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);
}

Se você quiser fornecer um arquivo de áudio em vez de usar um microfone, ainda precisará fornecer um parâmetro audioConfig. No entanto, ao criar uma instância de classe AudioConfig, em vez de chamar FromDefaultMicrophoneInput, você chama FromWavFileInput e passa o parâmetro 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);
}

Traduzir fala

Para traduzir a fala, o SDK de Fala depende de um microfone ou de uma entrada de arquivo de áudio. O reconhecimento de fala ocorre antes da tradução de fala. Após todos os objetos serem inicializados, chame a função de reconhecimento único e obtenha o resultado:

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;
        }
    }
}

Para obter mais informações sobre reconhecimento de fala, consulte noções básicas do reconhecimento de fala.

Sintetizar traduções

Após um reconhecimento de fala e uma tradução bem-sucedidos, o resultado contém todas as traduções em um dicionário. A chave de dicionário Translations é o idioma de tradução de destino e o valor é o texto traduzido. A fala reconhecida pode ser traduzida e sintetizada em um idioma diferente (fala a fala).

Síntese baseada em evento

O objeto TranslationRecognizer expõe um evento Synthesizing. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento da tradução. Se você estiver traduzindo para vários idiomas, consulte Sintetização manual.

Especifique a voz de sintetização atribuindo uma instância SetVoiceName e forneça um manipulador de eventos ao evento Synthesizing para obter o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A sintetização baseada em evento funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o valor SetVoiceName deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" pode mapear para "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;
        }
    }
}

Síntese manual

O dicionário Translations pode ser usado para sintetizar o áudio do texto de tradução. Itere através de cada tradução e sintetize-a. Quando você estiver criando uma instância SpeechSynthesizer, o objeto SpeechConfig precisará ter sua propriedade SetSpeechSynthesisVoiceName definida para a voz desejada.

O exemplo a seguir traduz em cinco idiomas. Cada tradução é sintetizada em um arquivo de áudio na linguagem neural correspondente.

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();
        }
    }
}

Para obter mais informações sobre a síntese de fala, consulte noções básicas sobre a síntese de fala.

Tradução multilíngue com identificação de idioma

Em muitos cenários, talvez você não saiba quais idiomas de entrada devem ser especificados. O uso da identificação de idioma permite detectar até dez idiomas de entrada possíveis e traduzir automaticamente para os idiomas de destino.

O exemplo a seguir prevê que en-US ou zh-CN deve ser detectado porque estão definidos em AutoDetectSourceLanguageConfig. Em seguida, a fala será traduzida para de e fr, conforme especificado nas chamadas para AddTargetLanguage().

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

Para obter um exemplo de código completo, confira identificação de idioma.

Documentação de referência | Pacotes (Go) | Exemplos adicionais no GitHub

O SDK de Fala para Go não dá suporte à tradução de fala. Selecione outra linguagem de programação ou a referência do Go e exemplos vinculados no início deste artigo.

Documentação de referência | Amostras adicionais no GitHub

Neste guia de instruções, você aprenderá a reconhecer a fala humana e a traduzi-la para outro idioma.

Confira a visão geral da tradução de fala para saber mais sobre:

  • Converter de fala em texto
  • Traduzir a fala para vários idiomas de destino
  • Execução de fala direta para tradução de fala

Variáveis de ambiente e dados confidenciais

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a região e a chave do recurso Fala. O arquivo de código Java contém dois valores static final String que são atribuídos das variáveis de ambiente do computador host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambos os campos estão no escopo da classe, portanto, podem ser acessados nos corpos de método da classe:

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

Para obter mais informações sobre variáveis de ambiente, consulte Variáveis de ambiente e configuração de aplicativo.

Criar uma configuração de tradução de fala

Para chamar o serviço de Fala usando o SDK de Fala, você precisa criar uma instância SpeechTranslationConfig. Essa classe inclui informações sobre sua assinatura, como sua chave e região, ponto de extremidade, host ou token de autorização associados.

Dica

Independentemente se você estiver executando o reconhecimento de fala, a síntese de fala, tradução ou reconhecimento de intenção, você sempre criará uma configuração.

Você pode inicializar uma instância SpeechTranslationConfig de algumas maneiras:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe um ponto de extremidade do serviço de Fala. Uma chave ou um token de autorização é opcional.
  • Com um host: passe um endereço de host. Uma chave ou um token de autorização é opcional.
  • Com um token de autorização: passe um token de autorização e a região associada.

Vamos ver como você cria uma instância SpeechTranslationConfig usando uma chave e uma região. Obtenha a chave e a região do recurso de Fala no portal do Azure.

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);
    }
}

Alterar o idioma de origem

Uma tarefa comum na tradução de fala é especificar o idioma da entrada (ou origem). O exemplo a seguir mostra como você pode alterar o idioma de entrada para Italiano. Em seu código, interaja com a instância SpeechTranslationConfig chamando o método setSpeechRecognitionLanguage:

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

A propriedade setSpeechRecognitionLanguage espera uma cadeia de caracteres em formato idioma-localidade. Veja a lista de localidades de tradução de fala em texto com suporte.

Adicionar o idioma da tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. É necessário ao menos um, mas há suporte para vários. O trecho de código a seguir define o Francês e o Alemão como os idiomas de destino da tradução:

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");
}

Com cada chamada para addTargetLanguage, um novo idioma de destino da tradução é especificado. Em outras palavras, quando a fala é reconhecida a partir do idioma de origem, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Após criar uma instância SpeechTranslationConfig, a próxima etapa é inicializar TranslationRecognizer. Ao inicializar TranslationRecognizer, será necessário passar para a instância speechTranslationConfig. O objeto da configuração fornece as credenciais necessárias ao serviço de Fala para validar sua solicitação.

Se você estiver reconhecendo fala usando o microfone padrão do seu dispositivo, veja como deverá ser 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)) {
    }
}

Se você quiser especificar o dispositivo de entrada de áudio, precisará criar uma instância de classe AudioConfig e fornecer o parâmetro audioConfig ao inicializar TranslationRecognizer.

Primeiro, faça referência ao objeto AudioConfig conforme a seguir:

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

Se você quiser fornecer um arquivo de áudio em vez de usar um microfone, ainda precisará fornecer um parâmetro audioConfig. No entanto, ao criar uma instância de classe AudioConfig, em vez de chamar fromDefaultMicrophoneInput, você chama fromWavFileInput e passa o parâmetro 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)) {
        
    }
}

Traduzir fala

Para traduzir a fala, o SDK de Fala depende de um microfone ou de uma entrada de arquivo de áudio. O reconhecimento de fala ocorre antes da tradução de fala. Após todos os objetos serem inicializados, chame a função de reconhecimento único e obtenha o resultado:

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

Para obter mais informações sobre reconhecimento de fala, consulte noções básicas do reconhecimento de fala.

Sintetizar traduções

Após um reconhecimento de fala e uma tradução bem-sucedidos, o resultado contém todas as traduções em um dicionário. A função getTranslations retorna um dicionário com a chave como o idioma de tradução de destino e o valor é o texto traduzido. A fala reconhecida pode ser traduzida e sintetizada em um idioma diferente (fala a fala).

Síntese baseada em evento

O objeto TranslationRecognizer expõe um evento synthesizing. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento da tradução. Se você estiver traduzindo para vários idiomas, consulte Sintetização manual.

Especifique a voz de sintetização atribuindo uma instância setVoiceName e forneça um manipulador de eventos ao evento synthesizing para obter o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A sintetização baseada em evento funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o valor setVoiceName deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" pode mapear para "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 result = translationRecognizer.recognizeOnceAsync().get();
        if (result.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", result.getText());
            for (Map.Entry<String, String> pair : result.getTranslations().entrySet()) {
                String language = pair.getKey();
                String translation = pair.getValue();
                System.out.printf("Translated into '%s': %s\n", language, translation);
            }
        }
    }
}

Síntese manual

A função getTranslations retorna um dicionário que você pode usar para sintetizar o áudio do texto de tradução. Itere através de cada tradução e sintetize-a. Quando você estiver criando uma instância SpeechSynthesizer, o objeto SpeechConfig precisará ter sua propriedade setSpeechSynthesisVoiceName definida para a voz desejada.

O exemplo a seguir traduz em cinco idiomas. Cada tradução é sintetizada em um arquivo de áudio na linguagem neural correspondente.

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 result = translationRecognizer.recognizeOnceAsync().get();
        if (result.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", result.getText());
            for (Map.Entry<String, String> pair : result.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();
                }
            }
        }
    }
}

Para obter mais informações sobre a síntese de fala, consulte noções básicas sobre a síntese de fala.

Documentação de referência | Pacote (npm) | Exemplos adicionais no GitHub | Código-fonte de biblioteca

Neste guia de instruções, você aprenderá a reconhecer a fala humana e a traduzi-la para outro idioma.

Confira a visão geral da tradução de fala para saber mais sobre:

  • Converter de fala em texto
  • Traduzir a fala para vários idiomas de destino
  • Execução de fala direta para tradução de fala

Criar uma configuração de tradução

Para chamar o serviço de tradução usando o SDK de Fala, é necessário criar uma instância SpeechTranslationConfig. Essa classe inclui informações sobre sua assinatura, como sua chave e região, ponto de extremidade, host ou token de autorização associados.

Observação

Independentemente se você estiver executando o reconhecimento de fala, a síntese de fala, tradução ou reconhecimento de intenção, você sempre criará uma configuração.

Há algumas formas de se inicializar SpeechTranslationConfig:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe um ponto de extremidade do serviço de Fala. Uma chave ou um token de autorização é opcional.
  • Com um host: passe um endereço de host. Uma chave ou um token de autorização é opcional.
  • Com um token de autorização: passe um token de autorização e a região associada.

Vamos ver como você cria uma instância SpeechTranslationConfig usando uma chave e uma região. Obtenha a chave e a região do recurso de Fala no portal do Azure.

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

Inicializar um tradutor

Após criar uma instância SpeechTranslationConfig, a próxima etapa é inicializar TranslationRecognizer. Ao inicializar TranslationRecognizer, será necessário passar para a instância speechTranslationConfig. O objeto de configuração fornece as credenciais que o serviço de tradução requer para validar sua solicitação.

Se você estiver traduzindo a fala fornecida por meio do microfone padrão do seu dispositivo, veja como deverá ser TranslationRecognizer:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

Se você quiser especificar o dispositivo de entrada de áudio, precisará criar uma instância de classe AudioConfig e fornecer o parâmetro audioConfig ao inicializar TranslationRecognizer.

Referencie o objeto AudioConfig da seguinte maneira:

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

Se você quiser fornecer um arquivo de áudio em vez de usar um microfone, ainda precisará fornecer um parâmetro audioConfig. No entanto, você só poderá fazer isso quando estiver direcionando o Node.js. Ao criar uma instância de classe AudioConfig, em vez de chamar fromDefaultMicrophoneInput, você chama fromWavFileOutput e passa o parâmetro filename:

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

Traduzir fala

A classe TranslationRecognizer do SDK de Fala para JavaScript expõe métodos que você pode usar para tradução de fala:

  • Tradução pontual (assíncrono): realiza a tradução em um modo sem bloqueio (assíncrono). Traduz um único enunciado. Isso determina o fim de um único enunciado ouvindo o silêncio no final ou até que um máximo de 15 segundos de áudio seja processado.
  • Tradução contínua (assíncrona): Inicia de forma assíncrona uma operação de tradução contínua. O usuário se registra em eventos e lida com vários estados do aplicativo. Para interromper a tradução contínua assíncrona, chame stopContinuousRecognitionAsync.

Para saber mais sobre como escolher um modo de reconhecimento de fala, consulte Introdução ao reconhecimento de fala.

Especifique um idioma de destino

Para traduzir, você deve especificar um idioma de origem e pelo menos um idioma de destino.

Você pode escolher um idioma de origem usando uma localidade listada na Tabela de tradução de fala. Encontre suas opções de idioma traduzido no mesmo link.

Suas opções para idiomas de destino diferem quando você deseja visualizar o texto ou ouvir a fala traduzida sintetizada. Para traduzir do Inglês para o Alemão, modifique o objeto de configuração de tradução:

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

Reconhecimento pontual

Veja um exemplo de tradução assíncrona pontual por meio de recognizeOnceAsync:

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

Será necessário escrever algum código para lidar com o resultado. Esse exemplo avalia result.reason de uma tradução para o Alemão:

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

Seu código também pode lidar com atualizações fornecidas durante o processamento da tradução. Você pode usar essas atualizações para fornecer feedback visual sobre o andamento da tradução. Este exemplo de Node.js de JavaScript mostra esses tipos de atualizações. O código a seguir também exibe os detalhes produzidos durante o processo de tradução:

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);
};

Tradução contínua

A tradução contínua é um pouco mais envolvente do que o reconhecimento de uma única vez. É necessário assinar os eventos recognizing, recognized e canceled para obter os resultados do reconhecimento. Para parar a tradução, chame stopContinuousRecognitionAsync.

Veja um exemplo de como a tradução contínua é realizada em um arquivo de entrada de áudio. Comece definindo a entrada e inicializando TranslationRecognizer:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

No código a seguir, você assina os eventos enviados de TranslationRecognizer :

  • recognizing: sinal para os eventos que contêm os resultados intermediários de tradução.
  • recognized: sinal para os eventos que contêm resultados finais de tradução. Esses resultados indicam uma tentativa de tradução bem-sucedida.
  • sessionStopped: sinal para os eventos que indicam o fim de uma sessão de tradução (operação).
  • canceled: sinal para eventos que contêm os resultados de tradução cancelados. Esses eventos indicam uma tentativa de tradução que foi cancelada como resultado de um cancelamento direto. Como alternativa, eles indicam uma falha de protocolo ou transporte.
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();
};

Com tudo configurado, você poderá chamarstartContinuousRecognitionAsync:

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

Escolha um idioma de origem

Uma tarefa comum para tradução de fala é especificar o idioma de entrada (ou de origem). O exemplo a seguir mostra como você pode alterar o idioma de entrada para Italiano. Em seu código, encontre sua instância SpeechTranslationConfig e adicione a seguinte linha diretamente abaixo dela:

speechTranslationConfig.speechRecognitionLanguage = "it-IT";

A propriedade speechRecognitionLanguage espera uma cadeia de caracteres em formato idioma-localidade. Veja a lista de localidades de tradução de fala em texto com suporte.

Escolha um ou mais idiomas de destino

O SDK de Fala pode traduzir para vários idiomas de destino em paralelo. Os idiomas de destino disponíveis são um pouco diferentes da lista de idiomas de origem. Você especifica os idiomas de destino usando um código de idioma, em vez de uma localidade.

Para obter uma lista de códigos de idioma para destinos de texto, consulte a tabela de tradução de fala na página de suporte ao idioma. Você também pode encontrar detalhes sobre tradução para idiomas sintetizados lá.

O código a seguir adiciona o alemão como idioma de chegada:

speechTranslationConfig.addTargetLanguage("de");

Como várias traduções de idioma de destino são possíveis, seu código deverá especificar o idioma de destino ao examinar o resultado. O código a seguir obtém os resultados da tradução para o Alemão:

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
};

Documentação de referência | Pacotes (Download) | Exemplos adicionais no GitHub

O SDK de Fala para Objective-C dá suporte à tradução de fala, mas ainda não incluímos um guia a respeito. Selecione outra linguagem de programação para começar e saber mais sobre os conceitos ou confira a referência e exemplos em Objective-C vinculados no início deste artigo.

Documentação de referência | Pacotes (Download) | Exemplos adicionais no GitHub

O SDK de Fala para Swift dá suporte à tradução de fala, mas ainda não incluímos um guia a respeito. Selecione outra linguagem de programação para começar e saber mais sobre os conceitos ou confira a referência e exemplos em Swift vinculados no início deste artigo.

Documentação de referência | Pacotes (PyPi) | Exemplos adicionais no GitHub

Neste guia de instruções, você aprenderá a reconhecer a fala humana e a traduzi-la para outro idioma.

Confira a visão geral da tradução de fala para saber mais sobre:

  • Converter de fala em texto
  • Traduzir a fala para vários idiomas de destino
  • Execução de fala direta para tradução de fala

Variáveis de ambiente e dados confidenciais

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a região e a chave de assinatura do recurso do Serviço Cognitivo do Azure para Fala. O arquivo de código Python contém dois valores que são atribuídos das variáveis de ambiente do computador host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambas as variáveis estão no escopo global, portanto, podem ser acessadas na definição da função do arquivo de código:

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

Para obter mais informações sobre variáveis de ambiente, consulte Variáveis de ambiente e configuração de aplicativo.

Criar uma configuração de tradução de fala

Para chamar o serviço de Fala usando o SDK de Fala, você precisa criar uma instância SpeechTranslationConfig. Essa classe inclui informações sobre sua assinatura, como sua chave e região, ponto de extremidade, host ou token de autorização associados.

Dica

Independentemente se você estiver executando o reconhecimento de fala, a síntese de fala, tradução ou reconhecimento de intenção, você sempre criará uma configuração.

Há algumas formas de se inicializar SpeechTranslationConfig:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe um ponto de extremidade do serviço de Fala. Uma chave ou um token de autorização é opcional.
  • Com um host: passe um endereço de host. Uma chave ou um token de autorização é opcional.
  • Com um token de autorização: passe um token de autorização e a região associada.

Vamos ver como você pode criar uma instância SpeechTranslationConfig usando uma chave e uma região. Obtenha a chave e a região do recurso de Fala no portal do Azure.

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

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

Alterar o idioma de origem

Uma tarefa comum na tradução de fala é especificar o idioma da entrada (ou origem). O exemplo a seguir mostra como você pode alterar o idioma de entrada para Italiano. Em seu código, interaja com a instância SpeechTranslationConfig atribuindo-a à propriedade speech_recognition_language.

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

A propriedade speech_recognition_language espera uma cadeia de caracteres em formato idioma-localidade. Veja a lista de localidades de tradução de fala em texto com suporte.

Adicionar o idioma da tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. É necessário ao menos um, mas há suporte para vários. O trecho de código a seguir define o Francês e o Alemão como os idiomas de destino da tradução:

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")

Com cada chamada para add_target_language, um novo idioma de destino da tradução é especificado. Em outras palavras, quando a fala é reconhecida a partir do idioma de origem, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Após criar uma instância SpeechTranslationConfig, a próxima etapa é inicializar TranslationRecognizer. Ao inicializar TranslationRecognizer, será necessário passar para a instância translation_config. O objeto da configuração fornece as credenciais necessárias ao serviço de Fala para validar sua solicitação.

Se você estiver reconhecendo fala usando o microfone padrão do seu dispositivo, veja como deverá ser 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)

Se você quiser especificar o dispositivo de entrada de áudio, precisará criar uma instância de classe AudioConfig e fornecer o parâmetro audio_config ao inicializar TranslationRecognizer.

Primeiro, faça referência ao objeto AudioConfig conforme a seguir:

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)

Se você quiser fornecer um arquivo de áudio em vez de usar um microfone, ainda precisará fornecer um parâmetro audioConfig. No entanto, quando você cria uma instância de classe AudioConfig, em vez de chamar com use_default_microphone=True, você chama com filename="path-to-file.wav" e fornece o parâmetro 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)

Traduzir fala

Para traduzir a fala, o SDK de Fala depende de um microfone ou de uma entrada de arquivo de áudio. O reconhecimento de fala ocorre antes da tradução de fala. Após todos os objetos serem inicializados, chame a função de reconhecimento único e obtenha o resultado:

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...')
    result = translation_recognizer.recognize_once()
    print(get_result_text(reason=result.reason, result=result))

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

translate_speech_to_text()

Para obter mais informações sobre reconhecimento de fala, consulte noções básicas do reconhecimento de fala.

Sintetizar traduções

Após um reconhecimento de fala e uma tradução bem-sucedidos, o resultado contém todas as traduções em um dicionário. A chave de dicionário translations é o idioma de tradução de destino e o valor é o texto traduzido. A fala reconhecida pode ser traduzida e sintetizada em um idioma diferente (fala a fala).

Síntese baseada em evento

O objeto TranslationRecognizer expõe um evento Synthesizing. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento da tradução. Se você estiver traduzindo para vários idiomas, consulte Sintetização manual.

Especifique a voz de sintetização atribuindo uma instância voice_name e forneça um manipulador de eventos ao evento Synthesizing para obter o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A sintetização baseada em evento funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o valor voice_name deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" pode mapear para "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}".')

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

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

translate_speech_to_text()

Síntese manual

O dicionário translations pode ser usado para sintetizar o áudio do texto de tradução. Itere através de cada tradução e sintetize-a. Quando você estiver criando uma instância SpeechSynthesizer, o objeto SpeechConfig precisará ter sua propriedade speech_synthesis_voice_name definida para a voz desejada.

O exemplo a seguir traduz em cinco idiomas. Cada tradução é sintetizada em um arquivo de áudio na linguagem neural correspondente.

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...')
    result = translation_recognizer.recognize_once()
    synthesize_translations(result=result)

def synthesize_translations(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: "{result.text}"')

    for language in result.translations:
        translation = 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()

Para obter mais informações sobre a síntese de fala, consulte noções básicas sobre a síntese de fala.

Tradução multilíngue com identificação de idioma

Em muitos cenários, talvez você não saiba quais idiomas de entrada devem ser especificados. Usando a identificação de idioma você pode detectar até dez idiomas de entrada possíveis e traduzir automaticamente para os idiomas de destino.

Para obter um exemplo de código completo, confira identificação de idioma.

Referência da API REST de Conversão de fala em texto | Referência da API REST de Reconhecimento de fala para áudios curtos | Amostras adicionais no GitHub

Você pode usar a API REST para a tradução de fala, mas ainda não incluímos um guia a respeito. Selecione outra linguagem de programação para começar e saber mais sobre os conceitos.

Neste guia de instruções, você aprenderá a reconhecer a fala humana e a traduzi-la para outro idioma.

Confira a visão geral da tradução de fala para saber mais sobre:

  • Converter de fala em texto
  • Traduzir a fala para vários idiomas de destino
  • Execução de fala direta para tradução de fala

Pré-requisitos

Baixar e instalar

Siga estas etapas e consulte o início rápido da CLI de Fala para obter outros requisitos para sua plataforma.

  1. Execute o seguinte comando da CLI do .NET para instalar a CLI de Fala:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. Execute os comandos a seguir para configurar a chave e a região do recurso Fala. Substitua SUBSCRIPTION-KEY pela sua chave do recurso de Fala e substitua REGION pela sua região do recurso de Fala.

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

Definir idioma de origem e de destino

Este comando chama a CLI de Fala para traduzir a fala do microfone do Italiano para o Francês:

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

Próximas etapas