Como reconhecer e traduzir a fala

Pacote de documentação | de referência (NuGet) | Exemplos adicionais no GitHub

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

Consulte a visão geral da tradução de fala para obter mais informações sobre:

  • Traduzir fala em texto
  • Tradução de fala para vários idiomas de destino
  • Realizar tradução direta de fala para fala

Dados confidenciais e variáveis de ambiente

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a chave e a região do recurso de fala. A Program classe contém dois static readonly string valores atribuídos a partir das variáveis de ambiente da máquina host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambos os campos estão no escopo da classe, portanto, são acessíveis dentro dos 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 aplicativos.

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 SpeechTranslationConfig instância. Essa classe inclui informações sobre sua assinatura, como sua chave e região associada, ponto de extremidade, host ou token de autorização.

Gorjeta

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

Você pode inicializar SpeechTranslationConfig de algumas maneiras:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe em um ponto de extremidade do serviço de fala. Uma chave ou token de autorização é opcional.
  • Com um anfitrião: passe em um endereço de host. Uma chave ou 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 SpeechTranslationConfig instância usando uma chave e uma região. Obtenha a chave de recurso de Fala e a região 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 partida

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

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

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

A SpeechRecognitionLanguage propriedade espera uma cadeia de caracteres de formato de localidade de idioma. Consulte a lista de localidades de tradução de fala suportadas.

Adicionar um idioma de tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. Pelo menos um é necessário, mas múltiplos são suportados. O trecho de código a seguir define o francês e o alemão como destinos de idioma de 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");
}

A cada chamada para AddTargetLanguageo , um novo idioma de tradução de destino é especificado. Por outras palavras, quando a fala é reconhecida a partir da língua de partida, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Depois de criar uma SpeechTranslationConfig instância, a próxima etapa é inicializar TranslationRecognizero . Ao inicializar TranslationRecognizero , você precisa passar sua speechTranslationConfig instância. O objeto de configuração fornece as credenciais que o serviço de Fala requer para validar sua solicitação.

Se você estiver reconhecendo a fala usando o microfone padrão do dispositivo, veja como a TranslationRecognizer ocorrência deve parecer:

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 AudioConfig classe e fornecer o audioConfig parâmetro ao inicializar TranslationRecognizero .

Primeiro, faça referência ao AudioConfig objeto da seguinte forma:

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 audioConfig parâmetro. No entanto, quando você cria uma AudioConfig instância de classe, em vez de chamar FromDefaultMicrophoneInput, você chama FromWavFileInput e passa o filename parâmetro:

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 voz

Para traduzir voz, o SDK de Voz recorre a uma entrada de ficheiro áudio ou microfone. O reconhecimento de voz ocorre antes da tradução de voz. Depois que todos os objetos forem inicializados, chame a função recognize-once 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 conversão de fala em texto, consulte as noções básicas de reconhecimento de fala.

Tradução baseada em eventos

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

Nota

Os resultados da tradução intermédia não estão disponíveis quando utiliza a tradução de voz multilingue.

O exemplo a seguir imprime os resultados de tradução intermediários 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 voz bem-sucedido e respetiva tradução, o resultado contém todas as traduções num dicionário. A Translations chave do dicionário é o idioma de tradução de destino e o valor é o texto traduzido. A fala reconhecida pode ser traduzida e, em seguida, sintetizada em um idioma diferente (speech-to-speech).

Síntese baseada em eventos

O TranslationRecognizer objeto expõe um Synthesizing evento. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento de tradução. Se estiver a traduzir para vários idiomas, consulte Síntese manual.

Especifique a voz de síntese atribuindo uma VoiceName instância e forneça um manipulador de eventos para que o Synthesizing evento obtenha o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A síntese baseada em eventos funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o VoiceName valor deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" poderia 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

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

O exemplo a seguir se traduz para cinco idiomas. Cada tradução é entã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 síntese de fala, consulte as noções básicas de síntese de fala.

Tradução multilingue com identificação linguística

Em muitos cenários, talvez você não saiba quais idiomas de entrada especificar. Usando a identificação de idioma, você pode detetar até 10 idiomas de entrada possíveis e traduzir automaticamente para seus idiomas de destino.

O exemplo a seguir antecipa isso en-US ou zh-CN deve ser detetado porque eles são definidos em AutoDetectSourceLanguageConfig. Em seguida, o discurso é traduzido 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, consulte Identificação de idioma.

Tradução de fala multilingue sem candidatos à língua de partida

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 comutadores de idioma dentro da mesma sessão. Esses recursos permitem um novo nível de poderes de tradução de fala que podem ser implementados em seus produtos.

Atualmente, quando você usa Language ID com tradução de fala, você deve criar o SpeechTranslationConfig objeto a partir do ponto de extremidade v2. Substitua a cadeia de caracteres "YourServiceRegion" pela região de recurso de Fala (como "westus"). Substitua "YourSubscriptionKey" pela sua chave de 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");

Especificar as línguas de chegada da tradução. Substitua por idiomas de sua escolha. Você pode adicionar mais linhas.

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

Um dos principais diferenciais da tradução de fala multilíngue é que você não precisa especificar o idioma de origem. Isso ocorre porque o serviço detetará automaticamente o idioma de origem. Crie o AutoDetectSourceLanguageConfig objeto com o fromOpenRange método para informar ao serviço que você deseja usar tradução de fala multilíngue sem 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.

Pacote de documentação | de referência (NuGet) | Exemplos adicionais no GitHub

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

Consulte a visão geral da tradução de fala para obter mais informações sobre:

  • Traduzir fala em texto
  • Tradução de fala para vários idiomas de destino
  • Realizar tradução direta de fala para fala

Dados confidenciais e variáveis de ambiente

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a chave e a região do recurso de fala. O arquivo de código C++ contém dois valores de cadeia de caracteres atribuídos a partir das variáveis de ambiente da máquina host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambos os campos estão no escopo da classe, portanto, são acessíveis dentro dos 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 aplicativos.

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 SpeechTranslationConfig instância. Essa classe inclui informações sobre sua assinatura, como sua chave e região associada, ponto de extremidade, host ou token de autorização.

Gorjeta

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

Você pode inicializar SpeechTranslationConfig de algumas maneiras:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe em um ponto de extremidade do serviço de fala. Uma chave ou token de autorização é opcional.
  • Com um anfitrião: passe em um endereço de host. Uma chave ou 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 SpeechTranslationConfig instância usando uma chave e uma região. Obtenha a chave de recurso de Fala e a região 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 partida

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

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

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

A SpeechRecognitionLanguage propriedade espera uma cadeia de caracteres de formato de localidade de idioma. Consulte a lista de localidades de tradução de fala suportadas.

Adicionar um idioma de tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. Pelo menos um é necessário, mas múltiplos são suportados. O trecho de código a seguir define o francês e o alemão como destinos de idioma de tradução:

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

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

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

A cada chamada para AddTargetLanguageo , um novo idioma de tradução de destino é especificado. Por outras palavras, quando a fala é reconhecida a partir da língua de partida, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Depois de criar uma SpeechTranslationConfig instância, a próxima etapa é inicializar TranslationRecognizero . Ao inicializar TranslationRecognizero , você precisa passar sua translationConfig instância. O objeto de configuração fornece as credenciais que o serviço de Fala requer para validar sua solicitação.

Se você estiver reconhecendo a fala usando o microfone padrão do seu dispositivo, veja como TranslationRecognizer deve ser:

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 AudioConfig classe e fornecer o audioConfig parâmetro ao inicializar TranslationRecognizero .

Primeiro, faça referência ao AudioConfig objeto da seguinte forma:

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 audioConfig parâmetro. No entanto, quando você cria uma AudioConfig instância de classe, em vez de chamar FromDefaultMicrophoneInput, você chama FromWavFileInput e passa o filename parâmetro:

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 voz

Para traduzir voz, o SDK de Voz recorre a uma entrada de ficheiro áudio ou microfone. O reconhecimento de voz ocorre antes da tradução de voz. Depois que todos os objetos forem inicializados, chame a função recognize-once 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 conversão de fala em texto, consulte as noções básicas de reconhecimento de fala.

Sintetizar traduções

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

Síntese baseada em eventos

O TranslationRecognizer objeto expõe um Synthesizing evento. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento de tradução. Se estiver a traduzir para vários idiomas, consulte Síntese manual.

Especifique a voz de síntese atribuindo uma SetVoiceName instância e forneça um manipulador de eventos para que o Synthesizing evento obtenha o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A síntese baseada em eventos funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o SetVoiceName valor deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" poderia 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

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

O exemplo a seguir se traduz para cinco idiomas. Cada tradução é entã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 síntese de fala, consulte as noções básicas de síntese de fala.

Tradução multilingue com identificação linguística

Em muitos cenários, talvez você não saiba quais idiomas de entrada especificar. Usando a identificação de idioma, você pode detetar até 10 idiomas de entrada possíveis e traduzir automaticamente para seus idiomas de destino.

O exemplo a seguir antecipa isso en-US ou zh-CN deve ser detetado porque eles são definidos em AutoDetectSourceLanguageConfig. Em seguida, o discurso será traduzido 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, consulte Identificação de idioma.

Pacote de documentação | de referência (Go) | Amostras adicionais no GitHub

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

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

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

Consulte a visão geral da tradução de fala para obter mais informações sobre:

  • Traduzir fala em texto
  • Tradução de fala para vários idiomas de destino
  • Realizar tradução direta de fala para fala

Dados confidenciais e variáveis de ambiente

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a chave e a região do recurso de fala. O arquivo de código Java contém dois static final String valores que são atribuídos a partir das variáveis de ambiente da máquina host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambos os campos estão no escopo da classe, portanto, são acessíveis dentro dos 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 aplicativos.

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 SpeechTranslationConfig instância. Essa classe inclui informações sobre sua assinatura, como sua chave e região associada, ponto de extremidade, host ou token de autorização.

Gorjeta

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

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

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe em um ponto de extremidade do serviço de fala. Uma chave ou token de autorização é opcional.
  • Com um anfitrião: passe em um endereço de host. Uma chave ou 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 SpeechTranslationConfig instância usando uma chave e uma região. Obtenha a chave de recurso de Fala e a região 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 partida

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

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

A setSpeechRecognitionLanguage função espera uma cadeia de caracteres de formato idioma-localidade. Consulte a lista de localidades de tradução de fala suportadas.

Adicionar um idioma de tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. Pelo menos um é necessário, mas múltiplos são suportados. O trecho de código a seguir define o francês e o alemão como destinos de idioma de 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");
}

A cada chamada para addTargetLanguageo , um novo idioma de tradução de destino é especificado. Por outras palavras, quando a fala é reconhecida a partir da língua de partida, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Depois de criar uma SpeechTranslationConfig instância, a próxima etapa é inicializar TranslationRecognizero . Ao inicializar TranslationRecognizero , você precisa passar sua speechTranslationConfig instância. O objeto de configuração fornece as credenciais que o serviço de Fala requer para validar sua solicitação.

Se você estiver reconhecendo a fala usando o microfone padrão do seu dispositivo, veja como TranslationRecognizer deve ser:

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 AudioConfig classe e fornecer o audioConfig parâmetro ao inicializar TranslationRecognizero .

Primeiro, faça referência ao AudioConfig objeto da seguinte forma:

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 audioConfig parâmetro. No entanto, quando você cria uma AudioConfig instância de classe, em vez de chamar fromDefaultMicrophoneInput, você chama fromWavFileInput e passa o filename parâmetro:

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 voz

Para traduzir voz, o SDK de Voz recorre a uma entrada de ficheiro áudio ou microfone. O reconhecimento de voz ocorre antes da tradução de voz. Depois que todos os objetos forem inicializados, chame a função recognize-once 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 conversão de fala em texto, consulte as noções básicas de reconhecimento de fala.

Sintetizar traduções

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

Síntese baseada em eventos

O TranslationRecognizer objeto expõe um synthesizing evento. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento de tradução. Se estiver a traduzir para vários idiomas, consulte Síntese manual.

Especifique a voz de síntese atribuindo uma setVoiceName instância e forneça um manipulador de eventos para que o synthesizing evento obtenha o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A síntese baseada em eventos funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o setVoiceName valor deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" poderia 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 getTranslations função 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ê está criando uma SpeechSynthesizer instância, o SpeechConfig objeto precisa ter sua setSpeechSynthesisVoiceName propriedade definida para a voz desejada.

O exemplo a seguir se traduz para cinco idiomas. Cada tradução é entã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 síntese de fala, consulte as noções básicas de síntese de fala.

Pacote de documentação | de referência (npm) | Exemplos adicionais no código-fonte da Biblioteca GitHub |

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

Consulte a visão geral da tradução de fala para obter mais informações sobre:

  • Traduzir fala em texto
  • Tradução de fala para vários idiomas de destino
  • Realizar tradução direta de fala para fala

Criar uma configuração de tradução

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

Nota

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

Você pode inicializar SpeechTranslationConfig de algumas maneiras:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe em um ponto de extremidade do serviço de fala. Uma chave ou token de autorização é opcional.
  • Com um anfitrião: passe em um endereço de host. Uma chave ou 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 SpeechTranslationConfig instância usando uma chave e uma região. Obtenha a chave de recurso de Fala e a região no portal do Azure.

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

Inicializar um tradutor

Depois de criar uma SpeechTranslationConfig instância, a próxima etapa é inicializar TranslationRecognizero . Ao inicializar TranslationRecognizero , você precisa passar sua speechTranslationConfig instância. O objeto de configuração fornece as credenciais que o serviço de tradução requer para validar sua solicitação.

Se estiver a traduzir a voz fornecida através do microfone predefinido do seu dispositivo, eis o aspeto TranslationRecognizer que deve ter:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

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

Faça referência ao AudioConfig objeto da seguinte forma:

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 audioConfig parâmetro. No entanto, você pode fazer isso apenas quando estiver segmentando Node.js. Quando você cria uma AudioConfig instância de classe, em vez de chamar fromDefaultMicrophoneInput, você chama fromWavFileOutput e passa o filename parâmetro:

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

Traduzir voz

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

  • Tradução de captura única (assíncrona): Executa a tradução em um modo sem bloqueio (assíncrono). Traduz um único enunciado. 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 voz, consulte Introdução à conversão de voz em texto.

Especificar uma língua de chegada

Para traduzir, tem de especificar uma língua de partida e, pelo menos, uma língua de chegada.

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

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

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

Reconhecimento de tiro único

Aqui está um exemplo de tradução assíncrona de captura única via recognizeOnceAsync:

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

Você precisa escrever algum código para lidar com o resultado. Este exemplo avalia result.reason uma tradução para 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 enquanto a tradução está sendo processada. Você pode usar essas atualizações para fornecer feedback visual sobre o progresso da tradução. Este exemplo de Node.js JavaScript mostra esses tipos de atualizações. O código a seguir também exibe 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 envolvida do que o reconhecimento de uma única foto. Ele requer que você se inscreva no recognizing, recognizede canceled eventos para obter os resultados de reconhecimento. Para interromper a tradução, você deve ligar para stopContinuousRecognitionAsync.

Aqui está um exemplo de como a tradução contínua é realizada em um arquivo de entrada de áudio. Vamos começar definindo a entrada e inicializando TranslationRecognizer:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

No código a seguir, você se inscreve nos eventos enviados de TranslationRecognizer:

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

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

Escolha uma língua de partida

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

speechTranslationConfig.speechRecognitionLanguage = "it-IT";

A speechRecognitionLanguage propriedade espera uma cadeia de caracteres de formato de localidade de idioma. Consulte a lista de localidades de tradução de fala suportadas.

Escolha uma ou mais línguas de chegada

O SDK de fala pode traduzir para vários idiomas de destino em paralelo. As línguas de chegada disponíveis são um pouco diferentes da lista de línguas de partida. 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 a idiomas. Você também pode encontrar detalhes sobre a tradução para idiomas sintetizados lá.

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

speechTranslationConfig.addTargetLanguage("de");

Como várias traduções no idioma de destino são possíveis, seu código deve especificar o idioma de destino ao examinar o resultado. O código a seguir obtém resultados de tradução para 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
};

Pacote de documentação | de referência (Download) | Exemplos adicionais no GitHub

O SDK de fala para Objective-C suporta tradução de fala, mas ainda não incluímos um guia aqui. Selecione outra linguagem de programação para começar e aprender sobre os conceitos, ou veja a referência Objective-C e exemplos vinculados desde o início deste artigo.

Pacote de documentação | de referência (Download) | Exemplos adicionais no GitHub

O Speech SDK for Swift suporta tradução de fala, mas ainda não incluímos um guia aqui. Selecione outra linguagem de programação para começar e aprender sobre os conceitos, ou veja a referência Swift e exemplos vinculados desde o início deste artigo.

Pacote de documentação | de referência (PyPi) | Amostras adicionais no GitHub

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

Consulte a visão geral da tradução de fala para obter mais informações sobre:

  • Traduzir fala em texto
  • Tradução de fala para vários idiomas de destino
  • Realizar tradução direta de fala para fala

Dados confidenciais e variáveis de ambiente

O código-fonte de exemplo neste artigo depende de variáveis de ambiente para armazenar dados confidenciais, como a chave de assinatura e a região do recurso de fala. O arquivo de código Python contém dois valores que são atribuídos a partir das variáveis de ambiente da máquina host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Ambas as variáveis estão no escopo global, portanto, estão acessíveis dentro da definição de 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 aplicativos.

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 SpeechTranslationConfig instância. Essa classe inclui informações sobre sua assinatura, como sua chave e região associada, ponto de extremidade, host ou token de autorização.

Gorjeta

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

Você pode inicializar SpeechTranslationConfig de algumas maneiras:

  • Com uma assinatura: passe uma chave e a região associada.
  • Com um ponto de extremidade: passe em um ponto de extremidade do serviço de fala. Uma chave ou token de autorização é opcional.
  • Com um anfitrião: passe em um endereço de host. Uma chave ou 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 SpeechTranslationConfig instância usando uma chave e uma região. Obtenha a chave de recurso de Fala e a região 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 partida

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

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 speech_recognition_language propriedade espera uma cadeia de caracteres de formato de localidade de idioma. Consulte a lista de localidades de tradução de fala suportadas.

Adicionar um idioma de tradução

Outra tarefa comum da tradução de fala é especificar os idiomas de tradução de destino. Pelo menos um é necessário, mas múltiplos são suportados. O trecho de código a seguir define o francês e o alemão como destinos de idioma de 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")

A cada chamada para add_target_languageo , um novo idioma de tradução de destino é especificado. Por outras palavras, quando a fala é reconhecida a partir da língua de partida, cada tradução de destino está disponível como parte da operação de tradução resultante.

Inicializar um reconhecedor de tradução

Depois de criar uma SpeechTranslationConfig instância, a próxima etapa é inicializar TranslationRecognizero . Ao inicializar TranslationRecognizero , você precisa passar sua translation_config instância. O objeto de configuração fornece as credenciais que o serviço de Fala requer para validar sua solicitação.

Se você estiver reconhecendo a fala usando o microfone padrão do seu dispositivo, veja como TranslationRecognizer deve ser:

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 AudioConfig classe e fornecer o audio_config parâmetro ao inicializar TranslationRecognizero .

Primeiro, faça referência ao AudioConfig objeto da seguinte forma:

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 audioConfig parâmetro. No entanto, quando você cria uma AudioConfig instância de classe, em vez de chamar com use_default_microphone=True, você chama com filename="path-to-file.wav" e fornece o filename parâmetro:

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 voz

Para traduzir voz, o SDK de Voz recorre a uma entrada de ficheiro áudio ou microfone. O reconhecimento de voz ocorre antes da tradução de voz. Depois que todos os objetos forem inicializados, chame a função recognize-once 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 conversão de fala em texto, consulte as noções básicas de reconhecimento de fala.

Sintetizar traduções

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

Síntese baseada em eventos

O TranslationRecognizer objeto expõe um Synthesizing evento. O evento é acionado várias vezes e fornece um mecanismo para recuperar o áudio sintetizado do resultado do reconhecimento de tradução. Se estiver a traduzir para vários idiomas, consulte Síntese manual.

Especifique a voz de síntese atribuindo uma voice_name instância e forneça um manipulador de eventos para que o Synthesizing evento obtenha o áudio. O exemplo a seguir salva o áudio traduzido como um arquivo .wav.

Importante

A síntese baseada em eventos funciona apenas com uma única tradução. Não adicione vários idiomas de tradução de destino. Além disso, o voice_name valor deve ser o mesmo idioma que o idioma de tradução de destino. Por exemplo, "de" poderia 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

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

O exemplo a seguir se traduz para cinco idiomas. Cada tradução é entã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 síntese de fala, consulte as noções básicas de síntese de fala.

Tradução multilingue com identificação linguística

Em muitos cenários, talvez você não saiba quais idiomas de entrada especificar. Usando a identificação de idioma, você pode detetar até 10 idiomas de entrada possíveis e traduzir automaticamente para seus idiomas de destino.

Para obter um exemplo de código completo, consulte Identificação de idioma.

Referência | da API REST de fala para texto API REST de fala para texto para referência | de áudio curta Exemplos adicionais no GitHub

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

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

Consulte a visão geral da tradução de fala para obter mais informações sobre:

  • Traduzir fala em texto
  • Tradução de fala para vários idiomas de destino
  • Realizar tradução direta de fala para fala

Pré-requisitos

  • Subscrição do Azure - Crie uma gratuitamente.
  • Crie um recurso de Fala no portal do Azure.
  • Sua chave de recurso de fala e região. Depois que o recurso de Fala for implantado, selecione Ir para o recurso para exibir e gerenciar chaves. Para obter mais informações sobre os recursos dos serviços de IA do Azure, consulte Obter as chaves para o seu recurso.

Transferir 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 sua chave de recurso de fala e região. Substitua SUBSCRIPTION-KEY pela chave de recurso de Fala e substitua REGION pela região de recurso de Fala.

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

Definir idiomas de origem e de chegada

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óximos passos