Introducción a la traducción de vozGet started with speech translation

Una de las características principales del servicio de voz es la capacidad para reconocer la voz humana y traducirla a otros idiomas.One of the core features of the Speech service is the ability to recognize human speech and translate it to other languages. En este inicio rápido, aprenderá a usar Speech SDK en sus aplicaciones y productos para realizar la traducción de voz de alta calidad.In this quickstart you learn how to use the Speech SDK in your apps and products to perform high-quality speech translation. En este inicio rápido se tratan temas que incluyen:This quickstart covers topics including:

  • Traducción de voz a textoTranslating speech-to-text
  • Traducción de voz a varios idiomas de destinoTranslating speech to multiple target languages
  • Realizar la traducción de voz a voz directaPerforming direct speech-to-speech translation

Pasar a los ejemplos en GitHubSkip to samples on GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de C# en GitHub.If you want to skip straight to sample code, see the C# quickstart samples on GitHub.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK.Before you can do anything, you'll need to install the Speech SDK. Dependiendo de la plataforma, siga las instrucciones de la sección Obtención del SDK de Voz del artículo Acerca del SDK de Voz.Depending on your platform, follow the instructions under the Get the Speech SDK section of the About the Speech SDK article.

Dependencias de importaciónImport dependencies

Para ejecutar los ejemplos de este artículo, incluya las siguientes instrucciones using al principio del archivo Program.cs.To run the examples in this article, include the following using statements at the top of the Program.cs file.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.Translation;

Datos confidenciales y variables de entornoSensitive data and environment variables

El código fuente de ejemplo de este artículo depende de las variables de entorno para almacenar datos confidenciales, como la región y la clave de suscripción del recurso de Voz.The example source code in this article depends on environment variables for storing sensitive data, such as the Speech resource subscription key and region. La clase Program contiene dos valores static readonly string que se asignan a las variables de entorno de las máquinas host, es decir, SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION.The Program class contains two static readonly string values that are assigned from the host machines environment variables, namely SPEECH__SUBSCRIPTION__KEY and SPEECH__SERVICE__REGION. Ambos campos se encuentran en el ámbito de clase, lo que les permite tener acceso a ellos en los cuerpos de método de la clase.Both of these fields are at the class scope, making them accessible within method bodies of the class. Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.For more information on environment variables, see environment variables and application configuration.

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

Creación de una configuración de traducción de vozCreate a speech translation configuration

Para llamar al servicio de voz con Speech SDK, debe crear un elemento SpeechTranslationConfig.To call the Speech service using the Speech SDK, you need to create a SpeechTranslationConfig. Esta clase incluye información sobre la suscripción, como la clave, la región asociada, el punto de conexión, el host o el token de autorización.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Sugerencia

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Existen diversas maneras para inicializar un elemento SpeechTranslationConfig:There are a few ways that you can initialize a SpeechTranslationConfig:

  • Con una suscripción: pase una clave y la región asociada.With a subscription: pass in a key and the associated region.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz.With an endpoint: pass in a Speech service endpoint. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un host: pase una dirección de host.With a host: pass in a host address. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un token de autorización: pase el token de autorización y la región asociada.With an authorization token: pass in an authorization token and the associated region.

Vamos a echar un vistazo al procedimiento de creación de un elemento SpeechTranslationConfig con una clave y una región.Let's take a look at how a SpeechTranslationConfig is created using a key and region. Para obtener estas credenciales, siga los pasos descritos en Prueba gratuita del servicio Voz.Get these credentials by following steps in Try the Speech service for free.

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 translationConfig =
            SpeechTranslationConfig.FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    }
}

Cambio del idioma de origenChange source language

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen).One common task of speech translation is specifying the input (or source) language. Echemos un vistazo a cómo se cambiaría el idioma de entrada a italiano.Let's take a look at how you would change the input language to Italian. En el código, interactúe con la instancia SpeechTranslationConfig, asignándola a la propiedad SpeechRecognitionLanguage.In your code, interact with the SpeechTranslationConfig instance, assigning to the SpeechRecognitionLanguage property.

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

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

La propiedad SpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma.The SpeechRecognitionLanguage property expects a language-locale format string. En la columna Locale , puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.You can provide any value in the Locale column in the list of supported locales/languages.

Incorporación del idioma de traducciónAdd translation language

Otra tarea común de la traducción de voz es especificar los idiomas de traducción de destino; se requiere al menos uno, pero se admiten varios.Another common task of speech translation is to specify target translation languages, at least one is required but multiples are supported. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción.The following code snippet sets both French and German as translation language targets.

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

    translationConfig.SpeechRecognitionLanguage = "it-IT";
    
    // Translate to languages. See, https://aka.ms/speech/sttt-languages
    translationConfig.AddTargetLanguage("fr");
    translationConfig.AddTargetLanguage("de");
}

Con cada llamada a AddTargetLanguage, se especifica un nuevo idioma de traducción de destino.With every call to AddTargetLanguage, a new target translation language is specified. En otras palabras, cuando se reconoce la voz del lenguaje de origen, cada traducción de destino está disponible como parte de la operación de traducción resultante.In other words, when speech is recognized from the source language, each target translation is available as part of the resulting translation operation.

Inicialización de un reconocedor de traducciónInitialize a translation recognizer

Una vez creado un elemento SpeechTranslationConfig, el paso siguiente consiste en inicializar un elemento TranslationRecognizer.After you've created a SpeechTranslationConfig, the next step is to initialize a TranslationRecognizer. Al inicializar un elemento TranslationRecognizer, deberá pasar el elemento translationConfig.When you initialize a TranslationRecognizer, you'll need to pass it your translationConfig. El objeto de configuración proporciona las credenciales que necesita el servicio de voz para validar la solicitud.The configuration object provides the credentials that the speech service requires to validate your request.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, el elemento TranslationRecognizer debería ser similar a:If you're recognizing speech using your device's default microphone, here's what the TranslationRecognizer should look like:

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

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

    using var recognizer = new TranslationRecognizer(translationConfig);
}

Si desea especificar el dispositivo de entrada de audio, deberá crear un elemento AudioConfig y proporcionar el parámetro audioConfig al inicializar el elemento TranslationRecognizer.If you want to specify the audio input device, then you'll need to create an AudioConfig and provide the audioConfig parameter when initializing your TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:First, you'll reference the AudioConfig object as follows:

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

    using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
    using var recognizer = new TranslationRecognizer(translationConfig, audioConfig);
}

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, deberá proporcionar un elemento audioConfig.If you want to provide an audio file instead of using a microphone, you'll still need to provide an audioConfig. Sin embargo, cuando se crea un elemento AudioConfig, en lugar de llamar a FromDefaultMicrophoneInput, llamará a FromWavFileInput y pasará el parámetro filename.However, when you create an AudioConfig, instead of calling FromDefaultMicrophoneInput, you'll call FromWavFileInput and pass the filename parameter.

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

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

Traducir vozTranslate speech

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio.To translate speech, the Speech SDK relies on a microphone or an audio file input. El reconocimiento de voz tiene lugar antes de la traducción de voz.Speech recognition occurs before speech translation. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado.After all objects have been initialized, call the recognize-once function and get the result.

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

    using var recognizer = new TranslationRecognizer(translationConfig);

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

Para más información acerca de la conversión de voz a texto, consulte Aspectos básicos del reconocimiento de voz.For more information about speech-to-text, see the basics of speech recognition.

Síntesis de traduccionesSynthesize translations

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario.After a successful speech recognition and translation, the result contains all the translations in a dictionary. La clave del diccionario Translations es el idioma de traducción de destino y el valor es el texto traducido.The Translations dictionary key is the target translation language and the value is the translated text. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).Recognized speech can be translated, then synthesized in a different language (speech-to-speech).

Síntesis basada en eventosEvent-based synthesis

El objeto TranslationRecognizer expone un evento Synthesizing.The TranslationRecognizer object exposes a Synthesizing event. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción.The event fires several times, and provides a mechanism to retrieve the synthesized audio from the translation recognition result. Si va a traducir a varios idiomas, consulte Síntesis manual.If you're translating to multiple languages, see manual synthesis. Especifique la voz de síntesis asignando un VoiceName y proporcione un controlador de eventos para el evento de Synthesizing y obtenga el audio.Specify the synthesis voice by assigning a VoiceName and provide an event handler for the Synthesizing event, get the audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.The following example saves the translated audio as a .wav file.

Importante

La síntesis basada en eventos solo funciona con una sola traducción, no agrega varios idiomas de traducción de destino.The event-based synthesis only works with a single translation, do not add multiple target translation languages. Además, el objeto VoiceName debe ser el mismo idioma que el idioma de traducción de destino; por ejemplo, "de" podría asignarse a "de-DE-Hedda".Additionally, the VoiceName should be the same language as the target translation language, for example; "de" could map to "de-DE-Hedda".

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

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

    using var recognizer = new TranslationRecognizer(translationConfig);

    recognizer.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 recognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        Console.WriteLine($"Recognized: \"{result.Text}\"");
        Console.WriteLine($"Translated into '{toLanguage}': {result.Translations[toLanguage]}");
    }
}

Síntesis manualManual synthesis

El diccionario Translations se puede usar para sintetizar el audio desde el texto de traducción.The Translations dictionary can be used to synthesize audio from the translation text. Recorra en iteración cada traducción y sintetice la traducción.Iterate through each translation, and synthesize the translation. Al crear una instancia de SpeechSynthesizer, el objeto SpeechConfig debe tener su propiedad SpeechSynthesisVoiceName establecida en la voz deseada.When creating a SpeechSynthesizer instance, the SpeechConfig object needs to have its SpeechSynthesisVoiceName property set to the desired voice. El siguiente ejemplo se traduce a cinco idiomas y, a continuación, cada conversión se sintetiza en un archivo de audio en el idioma neuronal correspondiente.The following example translates to five languages, and each translation is then synthesized to an audio file in the corresponding neural language.

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

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

    using var recognizer = new TranslationRecognizer(translationConfig);

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

    var result = await recognizer.RecognizeOnceAsync();
    if (result.Reason == ResultReason.TranslatedSpeech)
    {
        // See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
        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 synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
            
            await synthesizer.SpeakTextAsync(translation);
        }
    }
}

Para más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.For more information about speech synthesis, see the basics of speech synthesis.

Una de las características principales del servicio de voz es la capacidad para reconocer la voz humana y traducirla a otros idiomas.One of the core features of the Speech service is the ability to recognize human speech and translate it to other languages. En este inicio rápido, aprenderá a usar Speech SDK en sus aplicaciones y productos para realizar la traducción de voz de alta calidad.In this quickstart you learn how to use the Speech SDK in your apps and products to perform high-quality speech translation. En este inicio rápido se tratan temas que incluyen:This quickstart covers topics including:

  • Traducción de voz a textoTranslating speech-to-text
  • Traducción de voz a varios idiomas de destinoTranslating speech to multiple target languages
  • Realizar la traducción de voz a voz directaPerforming direct speech-to-speech translation

Pasar a los ejemplos en GitHubSkip to samples on GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de C++ en GitHub.If you want to skip straight to sample code, see the C++ quickstart samples on GitHub.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK.Before you can do anything, you'll need to install the Speech SDK. Dependiendo de la plataforma, siga las instrucciones de la sección Obtención del SDK de Voz del artículo Acerca del SDK de Voz.Depending on your platform, follow the instructions under the Get the Speech SDK section of the About the Speech SDK article.

Dependencias de importaciónImport dependencies

Para ejecutar los ejemplos de este artículo, incluya las siguientes instrucciones #include y using al principio del archivo de código C++.To run the examples in this article, include the following #include and using statements at the top of the C++ code file.

#include <iostream> // cin, cout
#include <fstream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <speechapi_cxx.h>

using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Audio;
using namespace Microsoft::CognitiveServices::Speech::Translation;

Datos confidenciales y variables de entornoSensitive data and environment variables

El código fuente de ejemplo de este artículo depende de las variables de entorno para almacenar datos confidenciales, como la región y la clave de suscripción del recurso de voz.The example source code in this article depends on environment variables for storing sensitive data, such as the Speech resource subscription key and region. El archivo de código C++ contiene dos valores de cadena que se asignan a las variables de entorno de las máquinas host, es decir, SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION.The C++ code file contains two string values that are assigned from the host machines environment variables, namely SPEECH__SUBSCRIPTION__KEY and SPEECH__SERVICE__REGION. Ambos campos se encuentran en el ámbito de clase, lo que les permite tener acceso a ellos en los cuerpos de método de la clase.Both of these fields are at the class scope, making them accessible within method bodies of the class. Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.For more information on environment variables, see environment variables and application configuration.

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

Creación de una configuración de traducción de vozCreate a speech translation configuration

Para llamar al servicio de voz con Speech SDK, debe crear un elemento SpeechTranslationConfig.To call the Speech service using the Speech SDK, you need to create a SpeechTranslationConfig. Esta clase incluye información sobre la suscripción, como la clave, la región asociada, el punto de conexión, el host o el token de autorización.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Sugerencia

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Existen diversas maneras para inicializar un elemento SpeechTranslationConfig:There are a few ways that you can initialize a SpeechTranslationConfig:

  • Con una suscripción: pase una clave y la región asociada.With a subscription: pass in a key and the associated region.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz.With an endpoint: pass in a Speech service endpoint. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un host: pase una dirección de host.With a host: pass in a host address. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un token de autorización: pase el token de autorización y la región asociada.With an authorization token: pass in an authorization token and the associated region.

Vamos a echar un vistazo al procedimiento de creación de un elemento SpeechTranslationConfig con una clave y una región.Let's take a look at how a SpeechTranslationConfig is created using a key and region. Para obtener estas credenciales, siga los pasos descritos en Prueba gratuita del servicio Voz.Get these credentials by following steps in Try the Speech service for free.

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

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

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

Cambio del idioma de origenChange source language

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen).One common task of speech translation is specifying the input (or source) language. Echemos un vistazo a cómo se cambiaría el idioma de entrada a italiano.Let's take a look at how you would change the input language to Italian. En el código, interactúe con la instancia SpeechTranslationConfig, mediante la llamada al método SetSpeechRecognitionLanguage.In your code, interact with the SpeechTranslationConfig instance, calling the SetSpeechRecognitionLanguage method.

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

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

La propiedad SpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma.The SpeechRecognitionLanguage property expects a language-locale format string. En la columna Locale , puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.You can provide any value in the Locale column in the list of supported locales/languages.

Incorporación del idioma de traducciónAdd translation language

Otra tarea común de la traducción de voz es especificar los idiomas de traducción de destino; se requiere al menos uno, pero se admiten varios.Another common task of speech translation is to specify target translation languages, at least one is required but multiples are supported. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción.The following code snippet sets both French and German as translation language targets.

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

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

    // Translate to languages. See, https://aka.ms/speech/sttt-languages
    translationConfig->AddTargetLanguage("fr");
    translationConfig->AddTargetLanguage("de");
}

Con cada llamada a AddTargetLanguage, se especifica un nuevo idioma de traducción de destino.With every call to AddTargetLanguage, a new target translation language is specified. En otras palabras, cuando se reconoce la voz del lenguaje de origen, cada traducción de destino está disponible como parte de la operación de traducción resultante.In other words, when speech is recognized from the source language, each target translation is available as part of the resulting translation operation.

Inicialización de un reconocedor de traducciónInitialize a translation recognizer

Una vez creado un elemento SpeechTranslationConfig, el paso siguiente consiste en inicializar un elemento TranslationRecognizer.After you've created a SpeechTranslationConfig, the next step is to initialize a TranslationRecognizer. Al inicializar un elemento TranslationRecognizer, deberá pasar el elemento translationConfig.When you initialize a TranslationRecognizer, you'll need to pass it your translationConfig. El objeto de configuración proporciona las credenciales que necesita el servicio de voz para validar la solicitud.The configuration object provides the credentials that the speech service requires to validate your request.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, el elemento TranslationRecognizer debería ser similar a:If you're recognizing speech using your device's default microphone, here's what the TranslationRecognizer should look like:

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

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

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

Si desea especificar el dispositivo de entrada de audio, deberá crear un elemento AudioConfig y proporcionar el parámetro audioConfig al inicializar el elemento TranslationRecognizer.If you want to specify the audio input device, then you'll need to create an AudioConfig and provide the audioConfig parameter when initializing your TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:First, you'll reference the AudioConfig object as follows:

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

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

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

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, deberá proporcionar un elemento audioConfig.If you want to provide an audio file instead of using a microphone, you'll still need to provide an audioConfig. Sin embargo, cuando se crea un elemento AudioConfig, en lugar de llamar a FromDefaultMicrophoneInput, llamará a FromWavFileInput y pasará el parámetro filename.However, when you create an AudioConfig, instead of calling FromDefaultMicrophoneInput, you'll call FromWavFileInput and pass the filename parameter.

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

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

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

Traducir vozTranslate speech

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio.To translate speech, the Speech SDK relies on a microphone or an audio file input. El reconocimiento de voz tiene lugar antes de la traducción de voz.Speech recognition occurs before speech translation. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado.After all objects have been initialized, call the recognize-once function and get the result.

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

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

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

    auto result = recognizer->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 más información acerca de la conversión de voz a texto, consulte Aspectos básicos del reconocimiento de voz.For more information about speech-to-text, see the basics of speech recognition.

Síntesis de traduccionesSynthesize translations

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario.After a successful speech recognition and translation, the result contains all the translations in a dictionary. La clave del diccionario Translations es el idioma de traducción de destino y el valor es el texto traducido.The Translations dictionary key is the target translation language and the value is the translated text. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).Recognized speech can be translated, then synthesized in a different language (speech-to-speech).

Síntesis basada en eventosEvent-based synthesis

El objeto TranslationRecognizer expone un evento Synthesizing.The TranslationRecognizer object exposes a Synthesizing event. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción.The event fires several times, and provides a mechanism to retrieve the synthesized audio from the translation recognition result. Si va a traducir a varios idiomas, consulte Síntesis manual.If you're translating to multiple languages, see manual synthesis. Especifique la voz de síntesis asignando un SetVoiceName y proporcione un controlador de eventos para el evento de Synthesizing y obtenga el audio.Specify the synthesis voice by assigning a SetVoiceName and provide an event handler for the Synthesizing event, get the audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.The following example saves the translated audio as a .wav file.

Importante

La síntesis basada en eventos solo funciona con una sola traducción, no agrega varios idiomas de traducción de destino.The event-based synthesis only works with a single translation, do not add multiple target translation languages. Además, el objeto SetVoiceName debe ser el mismo idioma que el idioma de traducción de destino; por ejemplo, "de" podría asignarse a "de-DE-Hedda".Additionally, the SetVoiceName should be the same language as the target translation language, for example; "de" could map to "de-DE-Hedda".

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

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

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

    auto recognizer = TranslationRecognizer::FromConfig(translationConfig);
    recognizer->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 = recognizer->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íntesis manualManual synthesis

El diccionario Translations se puede usar para sintetizar el audio desde el texto de traducción.The Translations dictionary can be used to synthesize audio from the translation text. Recorra en iteración cada traducción y sintetice la traducción.Iterate through each translation, and synthesize the translation. Al crear una instancia de SpeechSynthesizer, el objeto SpeechConfig debe tener su propiedad SetSpeechSynthesisVoiceName establecida en la voz deseada.When creating a SpeechSynthesizer instance, the SpeechConfig object needs to have its SetSpeechSynthesisVoiceName property set to the desired voice. El siguiente ejemplo se traduce a cinco idiomas y, a continuación, cada conversión se sintetiza en un archivo de audio en el idioma neuronal correspondiente.The following example translates to five languages, and each translation is then synthesized to an audio file in the corresponding neural language.

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

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

    auto recognizer = TranslationRecognizer::FromConfig(translationConfig);

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

    auto result = recognizer->RecognizeOnceAsync().get();
    if (result->Reason == ResultReason::TranslatedSpeech)
    {
        // See: https://aka.ms/speech/sdkregion#standard-and-neural-voices
        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 speech_config =
                SpeechConfig::FromSubscription(SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
            speech_config->SetSpeechSynthesisVoiceName(languageToVoiceMap[language]);

            auto audio_config = AudioConfig::FromWavFileOutput(language + "-translation.wav");
            auto synthesizer = SpeechSynthesizer::FromConfig(speech_config, audio_config);

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

Para más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.For more information about speech synthesis, see the basics of speech synthesis.

Una de las características principales del servicio de voz es la capacidad para reconocer la voz humana y traducirla a otros idiomas.One of the core features of the Speech service is the ability to recognize human speech and translate it to other languages. En este inicio rápido, aprenderá a usar Speech SDK en sus aplicaciones y productos para realizar la traducción de voz de alta calidad.In this quickstart you learn how to use the Speech SDK in your apps and products to perform high-quality speech translation. En este inicio rápido se tratan temas que incluyen:This quickstart covers topics including:

  • Traducción de voz a textoTranslating speech-to-text
  • Traducción de voz a varios idiomas de destinoTranslating speech to multiple target languages
  • Realizar la traducción de voz a voz directaPerforming direct speech-to-speech translation

Pasar a los ejemplos en GitHubSkip to samples on GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de Java en GitHub.If you want to skip straight to sample code, see the Java quickstart samples on GitHub.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK.Before you can do anything, you'll need to install the Speech SDK. Dependiendo de la plataforma, siga las instrucciones de la sección Obtención del SDK de Voz del artículo Acerca del SDK de Voz.Depending on your platform, follow the instructions under the Get the Speech SDK section of the About the Speech SDK article.

Dependencias de importaciónImport dependencies

Para ejecutar los ejemplos de este artículo, incluya las siguientes instrucciones import al principio del archivo de código .Java.To run the examples in this article, include the following import statements at the top of the * .Java code file.

package speech;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.*;
import com.microsoft.cognitiveservices.speech.translation.*;

Datos confidenciales y variables de entornoSensitive data and environment variables

El código fuente de ejemplo de este artículo depende de las variables de entorno para almacenar datos confidenciales, como la región y la clave de suscripción del recurso de voz.The example source code in this article depends on environment variables for storing sensitive data, such as the Speech resource subscription key and region. El archivo de código Java contiene dos valores static final String que se asignan a las variables de entorno de las máquinas host, es decir, SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION.The Java code file contains two static final String values that are assigned from the host machines environment variables, namely SPEECH__SUBSCRIPTION__KEY and SPEECH__SERVICE__REGION. Ambos campos se encuentran en el ámbito de clase, lo que les permite tener acceso a ellos en los cuerpos de método de la clase.Both of these fields are at the class scope, making them accessible within method bodies of the class. Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.For more information on environment variables, see environment variables and application configuration.

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

Creación de una configuración de traducción de vozCreate a speech translation configuration

Para llamar al servicio de voz con Speech SDK, debe crear un elemento SpeechTranslationConfig.To call the Speech service using the Speech SDK, you need to create a SpeechTranslationConfig. Esta clase incluye información sobre la suscripción, como la clave, la región asociada, el punto de conexión, el host o el token de autorización.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Sugerencia

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Existen diversas maneras para inicializar un elemento SpeechTranslationConfig:There are a few ways that you can initialize a SpeechTranslationConfig:

  • Con una suscripción: pase una clave y la región asociada.With a subscription: pass in a key and the associated region.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz.With an endpoint: pass in a Speech service endpoint. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un host: pase una dirección de host.With a host: pass in a host address. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un token de autorización: pase el token de autorización y la región asociada.With an authorization token: pass in an authorization token and the associated region.

Vamos a echar un vistazo al procedimiento de creación de un elemento SpeechTranslationConfig con una clave y una región.Let's take a look at how a SpeechTranslationConfig is created using a key and region. Para obtener estas credenciales, siga los pasos descritos en Prueba gratuita del servicio Voz.Get these credentials by following steps in Try the Speech service for free.

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 config = SpeechTranslationConfig.fromSubscription(
            SPEECH__SUBSCRIPTION__KEY, SPEECH__SERVICE__REGION);
    }
}

Cambio del idioma de origenChange source language

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen).One common task of speech translation is specifying the input (or source) language. Echemos un vistazo a cómo se cambiaría el idioma de entrada a italiano.Let's take a look at how you would change the input language to Italian. En el código, interactúe con la instancia SpeechTranslationConfig, mediante la llamada al método setSpeechRecognitionLanguage.In your code, interact with the SpeechTranslationConfig instance, calling the setSpeechRecognitionLanguage method.

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

La función setSpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma.The setSpeechRecognitionLanguage function expects a language-locale format string. En la columna Locale , puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.You can provide any value in the Locale column in the list of supported locales/languages.

Incorporación del idioma de traducciónAdd translation language

Otra tarea común de la traducción de voz es especificar los idiomas de traducción de destino; se requiere al menos uno, pero se admiten varios.Another common task of speech translation is to specify target translation languages, at least one is required but multiples are supported. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción.The following code snippet sets both French and German as translation language targets.

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

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

Con cada llamada a addTargetLanguage, se especifica un nuevo idioma de traducción de destino.With every call to addTargetLanguage, a new target translation language is specified. En otras palabras, cuando se reconoce la voz del lenguaje de origen, cada traducción de destino está disponible como parte de la operación de traducción resultante.In other words, when speech is recognized from the source language, each target translation is available as part of the resulting translation operation.

Inicialización de un reconocedor de traducciónInitialize a translation recognizer

Una vez creado un elemento SpeechTranslationConfig, el paso siguiente consiste en inicializar un elemento TranslationRecognizer.After you've created a SpeechTranslationConfig, the next step is to initialize a TranslationRecognizer. Al inicializar un elemento TranslationRecognizer, deberá pasar el elemento translationConfig.When you initialize a TranslationRecognizer, you'll need to pass it your translationConfig. El objeto de configuración proporciona las credenciales que necesita el servicio de voz para validar la solicitud.The configuration object provides the credentials that the speech service requires to validate your request.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, el elemento TranslationRecognizer debería ser similar a:If you're recognizing speech using your device's default microphone, here's what the TranslationRecognizer should look like:

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

    try (TranslationRecognizer recognizer = new TranslationRecognizer(translationConfig)) {
    }
}

Si desea especificar el dispositivo de entrada de audio, deberá crear un elemento AudioConfig y proporcionar el parámetro audioConfig al inicializar el elemento TranslationRecognizer.If you want to specify the audio input device, then you'll need to create an AudioConfig and provide the audioConfig parameter when initializing your TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:First, you'll reference the AudioConfig object as follows:

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

    AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
    try (TranslationRecognizer recognizer = new TranslationRecognizer(translationConfig, audioConfig)) {
        
    }
}

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, deberá proporcionar un elemento audioConfig.If you want to provide an audio file instead of using a microphone, you'll still need to provide an audioConfig. Sin embargo, cuando se crea un elemento AudioConfig, en lugar de llamar a fromDefaultMicrophoneInput, llamará a fromWavFileInput y pasará el parámetro filename.However, when you create an AudioConfig, instead of calling fromDefaultMicrophoneInput, you'll call fromWavFileInput and pass the filename parameter.

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

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

Traducir vozTranslate speech

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio.To translate speech, the Speech SDK relies on a microphone or an audio file input. El reconocimiento de voz tiene lugar antes de la traducción de voz.Speech recognition occurs before speech translation. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado.After all objects have been initialized, call the recognize-once function and get the result.

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

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

        TranslationRecognitionResult result = recognizer.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 más información acerca de la conversión de voz a texto, consulte Aspectos básicos del reconocimiento de voz.For more information about speech-to-text, see the basics of speech recognition.

Síntesis de traduccionesSynthesize translations

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario.After a successful speech recognition and translation, the result contains all the translations in a dictionary. La función getTranslations devuelve un diccionario con la clave como idioma de traducción de destino y el valor es el texto traducido.The getTranslations function returns a dictionary with the key as the target translation language and the value is the translated text. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).Recognized speech can be translated, then synthesized in a different language (speech-to-speech).

Síntesis basada en eventosEvent-based synthesis

El objeto TranslationRecognizer expone un evento synthesizing.The TranslationRecognizer object exposes a synthesizing event. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción.The event fires several times, and provides a mechanism to retrieve the synthesized audio from the translation recognition result. Si va a traducir a varios idiomas, consulte Síntesis manual.If you're translating to multiple languages, see manual synthesis. Especifique la voz de síntesis asignando un setVoiceName y proporcione un controlador de eventos para el evento de synthesizing y obtenga el audio.Specify the synthesis voice by assigning a setVoiceName and provide an event handler for the synthesizing event, get the audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.The following example saves the translated audio as a .wav file.

Importante

La síntesis basada en eventos solo funciona con una sola traducción, no agrega varios idiomas de traducción de destino.The event-based synthesis only works with a single translation, do not add multiple target translation languages. Además, el objeto setVoiceName debe ser el mismo idioma que el idioma de traducción de destino; por ejemplo, "de" podría asignarse a "de-DE-Hedda".Additionally, the setVoiceName should be the same language as the target translation language, for example; "de" could map to "de-DE-Hedda".

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

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

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

    try (TranslationRecognizer recognizer = new TranslationRecognizer(translationConfig)) {
        recognizer.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 = recognizer.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íntesis manualManual synthesis

La función getTranslations devuelve un diccionario que se puede usar para sintetizar el audio del texto de traducción.The getTranslations function returns a dictionary that can be used to synthesize audio from the translation text. Recorra en iteración cada traducción y sintetice la traducción.Iterate through each translation, and synthesize the translation. Al crear una instancia de SpeechSynthesizer, el objeto SpeechConfig debe tener su propiedad setSpeechSynthesisVoiceName establecida en la voz deseada.When creating a SpeechSynthesizer instance, the SpeechConfig object needs to have its setSpeechSynthesisVoiceName property set to the desired voice. El siguiente ejemplo se traduce a cinco idiomas y, a continuación, cada conversión se sintetiza en un archivo de audio en el idioma neuronal correspondiente.The following example translates to five languages, and each translation is then synthesized to an audio file in the corresponding neural language.

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

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

        TranslationRecognitionResult result = recognizer.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 synthesizer = new SpeechSynthesizer(speechConfig, audioConfig)) {
                    synthesizer.SpeakTextAsync(translation).get();
                }
            }
        }
    }
}

Para más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.For more information about speech synthesis, see the basics of speech synthesis.

Una de las características principales del servicio de voz es la capacidad para reconocer la voz humana y traducirla a otros idiomas.One of the core features of the Speech service is the ability to recognize human speech and translate it to other languages. En este inicio rápido, aprenderá a usar Speech SDK en sus aplicaciones y productos para realizar la traducción de voz de alta calidad.In this quickstart you learn how to use the Speech SDK in your apps and products to perform high-quality speech translation. En este inicio rápido se tratan temas que incluyen:This quickstart covers topics including:

  • Traducción de voz a textoTranslating speech-to-text
  • Traducción de voz a varios idiomas de destinoTranslating speech to multiple target languages
  • Realizar la traducción de voz a voz directaPerforming direct speech-to-speech translation

Pasar a los ejemplos en GitHubSkip to samples on GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de JavaScript en GitHub.If you want to skip straight to sample code, see the JavaScript quickstart samples on GitHub.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK para JavaScript.Before you can do anything, you'll need to install the Speech SDK for JavaScript . Utilice las siguientes instrucciones en función de la plataforma:Depending on your platform, use the following instructions:

Además, en función del entorno de destino, use una de las siguientes:Additionally, depending on the target environment use one of the following:

Descargue y extraiga el archivo microsoft.cognitiveservices.speech.sdk.bundle.js de Speech SDK para JavaScript y colóquelo en una carpeta accesible para el archivo HTML.Download and extract the Speech SDK for JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js file, and place it in a folder accessible to your HTML file.

<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;

Sugerencia

Si el destino es un explorador web y usa la etiqueta <script>, el prefijo sdk no es necesario.If you're targeting a web browser, and using the <script> tag; the sdk prefix is not needed. El prefijo sdk es un alias que se usa para asignar un nombre al módulo require.The sdk prefix is an alias used to name the require module.

Creación de una configuración de traducciónCreate a translation configuration

Para llamar al servicio de traducción con Speech SDK, debe crear un elemento SpeechTranslationConfig.To call the translation service using the Speech SDK, you need to create a SpeechTranslationConfig. Esta clase incluye información sobre la suscripción, como la clave, la región asociada, el punto de conexión, el host o el token de autorización.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Nota

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration. Existen diversas maneras para inicializar un elemento SpeechTranslationConfig:There are a few ways that you can initialize a SpeechTranslationConfig:

  • Con una suscripción: pase una clave y la región asociada.With a subscription: pass in a key and the associated region.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz.With an endpoint: pass in a Speech service endpoint. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un host: pase una dirección de host.With a host: pass in a host address. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un token de autorización: pase el token de autorización y la región asociada.With an authorization token: pass in an authorization token and the associated region.

Vamos a echar un vistazo al procedimiento de creación de un elemento SpeechTranslationConfig con una clave y una región.Let's take a look at how a SpeechTranslationConfig is created using a key and region. Para obtener estas credenciales, siga los pasos descritos en Prueba gratuita del servicio Voz.Get these credentials by following steps in Try the Speech service for free.

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

Inicialización de un traductorInitialize a translator

Una vez creado un elemento SpeechTranslationConfig, el paso siguiente consiste en inicializar un elemento TranslationRecognizer.After you've created a SpeechTranslationConfig, the next step is to initialize a TranslationRecognizer. Al inicializar un elemento TranslationRecognizer, deberá pasar el elemento speechTranslationConfig.When you initialize a TranslationRecognizer, you'll need to pass it your speechTranslationConfig. Esto proporciona las credenciales que necesita el servicio de traducción para validar la solicitud.This provides the credentials that the translation service requires to validate your request.

Si va a traducir la voz proporcionada a través del micrófono predeterminado del dispositivo, este es el aspecto que el TranslationRecognizer debería tener:If you're translating speech provided through your device's default microphone, here's what the TranslationRecognizer should look like:

const translator = new TranslationRecognizer(speechTranslationConfig);

Si desea especificar el dispositivo de entrada de audio, deberá crear un elemento AudioConfig y proporcionar el parámetro audioConfig al inicializar el elemento TranslationRecognizer.If you want to specify the audio input device, then you'll need to create an AudioConfig and provide the audioConfig parameter when initializing your TranslationRecognizer.

Sugerencia

Obtenga información sobre cómo obtener el identificador de dispositivo del dispositivo de entrada de audio.Learn how to get the device ID for your audio input device. Haga referencia al objeto AudioConfig como se indica a continuación:Reference the AudioConfig object as follows:

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

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, deberá proporcionar un elemento audioConfig.If you want to provide an audio file instead of using a microphone, you'll still need to provide an audioConfig. Sin embargo, esto solo se puede hacer cuando el destino es Node.js y al crear AudioConfig se llama a fromWavFileOutput y se pasa el parámetro filename, en lugar de llamar a fromDefaultMicrophoneInput.However, this can only be done when targeting Node.js and when you create an AudioConfig, instead of calling fromDefaultMicrophoneInput, you'll call fromWavFileOutput and pass the filename parameter.

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

Traducir vozTranslate speech

La clase TranslationRecognizer de Speech SDK para JavaScript expone algunos métodos que puede usar para la traducción de voz.The TranslationRecognizer class for the Speech SDK for JavaScript exposes a few methods that you can use for speech translation.

  • Traducción de una sola captura (asincrónico): realiza la traducción en modo sin bloqueo (asincrónico).Single-shot translation (async) - Performs translation in a non-blocking (asynchronous) mode. Esto traducirá una expresión única.This will translate a single utterance. El final de una expresión única se determina mediante la escucha de un silencio al final o hasta que se procesa un máximo de 15 segundos de audio.The end of a single utterance is determined by listening for silence at the end or until a maximum of 15 seconds of audio is processed.
  • Traducción continua (asincrónica): inicia de forma asincrónica la operación de traducción continua.Continuous translation (async) - Asynchronously initiates continuous translation operation. El usuario se registra a eventos y controla los distintos estados de la aplicación.The user registers to events and handles various application states. Para detener la traducción continua asincrónica, llame a stopContinuousRecognitionAsync.To stop asynchronous continuous translation, call stopContinuousRecognitionAsync.

Nota

Obtenga información adicional sobre cómo elegir el modo de reconocimiento de voz.Learn more about how to choose a speech recognition mode.

Especificación de un idioma de destinoSpecify a target language

Para traducir, debe especificar un idioma de origen y al menos un idioma de destino.To translate, you must specify both a source language and at least one target language. Puede elegir un idioma de origen mediante una configuración regional incluida en la tabla de traducción de voz.You can choose a source language using a locale listed in the Speech translation table. Busque las opciones de idioma de traducción en el mismo vínculo.Find your options for translated language at the same link. Las opciones de idiomas de destino se diferencian cuando se quiere ver el texto o cuando quiere oír una voz traducida sintetizada.Your options for target languages differ when you want to view text, or want to hear synthesized translated speech. Para traducir del inglés al alemán, modifique el objeto de configuración de traducción:To translate from English to German, modify the translation config object:

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

Reconocimiento de una sola capturaSingle-shot recognition

Este es un ejemplo de traducción asincrónica de una sola captura mediante recognizeOnceAsync:Here's an example of asynchronous single-shot translation using recognizeOnceAsync:

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

Deberá escribir código para controlar el resultado.You'll need to write some code to handle the result. Este ejemplo evalúa el elemento result.reason de una traducción al alemán:This sample evaluates the result.reason for a translation to German:

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

El código también puede controlar las actualizaciones proporcionadas mientras se procesa la traducción.Your code can also handle updates provided while the translation is processing. Puede usar estas actualizaciones para proporcionar comentarios visuales sobre el progreso de la traducción.You can use these updates to provide visual feedback about the translation progress. Consulte este ejemplo de Node.js de JavaScript para ver el código de ejemplo que muestra las actualizaciones proporcionadas durante el proceso de traducción.See this JavaScript Node.js example for sample code that shows updates provided during the translation process. En el código siguiente también se muestran los detalles que se han producido durante el proceso de traducción.The following code also displays details produced during the translation process.

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

Traducción continuaContinuous translation

La traducción continua es un poco más complicada que el reconocimiento de una sola captura.Continuous translation is a bit more involved than single-shot recognition. Requiere que se suscriba a los eventos recognizing, recognized y canceled para obtener los resultados del reconocimiento.It requires you to subscribe to the recognizing, recognized, and canceled events to get the recognition results. Para detener la traducción, debe llamar a stopContinuousRecognitionAsync.To stop translation, you must call stopContinuousRecognitionAsync. Este es un ejemplo de cómo se realiza la traducción continua en un archivo de entrada de audio.Here's an example of how continuous translation is performed on an audio input file.

Comencemos por definir la entrada e inicializar un elemento TranslationRecognizer:Let's start by defining the input and initializing a TranslationRecognizer:

const translator = new TranslationRecognizer(speechTranslationConfig);

Nos suscribiremos a los eventos enviados desde el elemento TranslationRecognizer.We'll subscribe to the events sent from the TranslationRecognizer.

  • recognizing: se señalizan los eventos que contienen los resultados intermedios de la traducción.recognizing: Signal for events containing intermediate translation results.
  • recognized: se señalizan los eventos que contienen los resultados finales de la traducción (lo que indica un intento de traducción correcto).recognized: Signal for events containing final translation results (indicating a successful translation attempt).
  • sessionStopped: se señalizan los eventos que indican el final de una sesión de traducción (operación).sessionStopped: Signal for events indicating the end of a translation session (operation).
  • canceled: se señalizan los eventos que contienen los resultados de traducción cancelados (que indican un intento de traducción que se canceló como resultado de una solicitud de cancelación directa o, de forma alternativa, por un error de protocolo o transporte).canceled: Signal for events containing canceled translation results (indicating a translation attempt that was canceled as a result or a direct cancellation request or, alternatively, a transport or protocol failure).
recognizer.recognizing = (s, e) => {
    console.log(`TRANSLATING: Text=${e.result.text}`);
};
recognizer.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.");
    }
};
recognizer.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 update the subscription info?");
    }
    recognizer.stopContinuousRecognitionAsync();
};
recognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    recognizer.stopContinuousRecognitionAsync();
};

Con todo configurado, podemos llamar a startContinuousRecognitionAsync.With everything set up, we can call startContinuousRecognitionAsync.

// Starts continuous recognition. Uses stopContinuousRecognitionAsync() to stop recognition.
recognizer.startContinuousRecognitionAsync();
// Something later can call, stops recognition.
// recognizer.StopContinuousRecognitionAsync();

Elección de un idioma de origenChoose a source language

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen).A common task for speech translation is specifying the input (or source) language. Echemos un vistazo a cómo se cambiaría el idioma de entrada a italiano.Let's take a look at how you would change the input language to Italian. En el código, busque SpeechTranslationConfig y, a continuación, agregue esta línea directamente debajo.In your code, find your SpeechTranslationConfig, then add the following line directly below it.

speechTranslationConfig.speechRecognitionLanguage = "it-IT";

La propiedad speechRecognitionLanguage espera una cadena con formato de configuración regional de idioma.The speechRecognitionLanguage property expects a language-locale format string. En la columna Locale , puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.You can provide any value in the Locale column in the list of supported locales/languages.

Elección de uno o varios idiomas de destinoChoose one or more target languages

Speech SDK puede traducir a varios idiomas de destino en paralelo.The Speech SDK can translate to multiple target languages in parallel. Los idiomas de destino disponibles son ligeramente distintos de la lista de idiomas de origen y los idiomas de destino se especifican con un código de idioma, en lugar de una configuración regional.The target languages available are somewhat different from the source language list, and you specify target languages using a language code, rather than a locale. Consulte una lista de códigos de idioma para los destinos de texto en la tabla de traducción de voz en la página de compatibilidad con idiomas.See a list of language codes for text targets in the speech translation table on the language support page. Ahí también puede encontrar detalles sobre la traducción a idiomas sintetizados.You can also find details about translation into synthesized languages there.

En el código siguiente se agrega el alemán como idioma de destino:The following code adds German as a target language:

translationConfig.addTargetLanguage("de");

Dado que es posible realizar traducciones a varios idiomas de destino, el código debe especificar el idioma de destino al examinar el resultado.Since multiple target language translations are possible, your code must specify the target language when examining the result. El código siguiente obtiene los resultados de la traducción para el alemán.The following code gets translation results for German.

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

Una de las características principales del servicio de voz es la capacidad para reconocer la voz humana y traducirla a otros idiomas.One of the core features of the Speech service is the ability to recognize human speech and translate it to other languages. En este inicio rápido, aprenderá a usar Speech SDK en sus aplicaciones y productos para realizar la traducción de voz de alta calidad.In this quickstart you learn how to use the Speech SDK in your apps and products to perform high-quality speech translation. En este inicio rápido se tratan temas que incluyen:This quickstart covers topics including:

  • Traducción de voz a textoTranslating speech-to-text
  • Traducción de voz a varios idiomas de destinoTranslating speech to multiple target languages
  • Realizar la traducción de voz a voz directaPerforming direct speech-to-speech translation

Pasar a los ejemplos en GitHubSkip to samples on GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de Python en GitHub.If you want to skip straight to sample code, see the Python quickstart samples on GitHub.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK.Before you can do anything, you'll need to install the Speech SDK. Dependiendo de la plataforma, siga las instrucciones de la sección Obtención del SDK de Voz del artículo Acerca del SDK de Voz.Depending on your platform, follow the instructions under the Get the Speech SDK section of the About the Speech SDK article.

Dependencias de importaciónImport dependencies

Para ejecutar los ejemplos de este artículo, incluya las siguientes instrucciones import al principio del archivo de código Python.To run the examples in this article, include the following import statements at the top of the python code file.

import os
import azure.cognitiveservices.speech as speechsdk

Datos confidenciales y variables de entornoSensitive data and environment variables

El código fuente de ejemplo de este artículo depende de las variables de entorno para almacenar datos confidenciales, como la región y la clave de suscripción del recurso de Voz.The example source code in this article depends on environment variables for storing sensitive data, such as the Speech resource subscription key and region. El archivo de código Python contiene dos valores que se asignan a las variables de entorno de las máquinas host, es decir, SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION.The python code file contains two values that are assigned from the host machines environment variables, namely SPEECH__SUBSCRIPTION__KEY and SPEECH__SERVICE__REGION. Ambas variables se encuentran en el ámbito global, lo que las hace accesibles dentro de la definición de función del archivo de código.Both of these variables are at the global scope, making them accessible within function definition of the code file. Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.For more information on environment variables, see environment variables and application configuration.

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

Creación de una configuración de traducción de vozCreate a speech translation configuration

Para llamar al servicio de voz con Speech SDK, debe crear un elemento SpeechTranslationConfig.To call the Speech service using the Speech SDK, you need to create a SpeechTranslationConfig. Esta clase incluye información sobre la suscripción, como la clave, la región asociada, el punto de conexión, el host o el token de autorización.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Sugerencia

Debe crear siempre una configuración, independientemente de si va a realizar reconocimiento de voz, síntesis de voz, traducción o reconocimiento de intenciones.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Existen diversas maneras para inicializar un elemento SpeechTranslationConfig:There are a few ways that you can initialize a SpeechTranslationConfig:

  • Con una suscripción: pase una clave y la región asociada.With a subscription: pass in a key and the associated region.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz.With an endpoint: pass in a Speech service endpoint. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un host: pase una dirección de host.With a host: pass in a host address. La clave y el token de autorización son opcionales.A key or authorization token is optional.
  • Con un token de autorización: pase el token de autorización y la región asociada.With an authorization token: pass in an authorization token and the associated region.

Vamos a echar un vistazo al procedimiento de creación de un elemento SpeechTranslationConfig con una clave y una región.Let's take a look at how a SpeechTranslationConfig is created using a key and region. Para obtener estas credenciales, siga los pasos descritos en Prueba gratuita del servicio Voz.Get these credentials by following steps in Try the Speech service for free.

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

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

Cambio del idioma de origenChange source language

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen).One common task of speech translation is specifying the input (or source) language. Echemos un vistazo a cómo se cambiaría el idioma de entrada a italiano.Let's take a look at how you would change the input language to Italian. En el código, interactúe con la instancia SpeechTranslationConfig, asignándola a la propiedad speech_recognition_language.In your code, interact with the SpeechTranslationConfig instance, assigning to the speech_recognition_language property.

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

    # Source (input) language
    translation_config.speech_recognition_language = from_language

La propiedad speech_recognition_language espera una cadena con formato de configuración regional de idioma.The speech_recognition_language property expects a language-locale format string. En la columna Locale , puede proporcionar cualquier valor de la lista de idiomas o configuraciones regionales compatibles.You can provide any value in the Locale column in the list of supported locales/languages.

Incorporación del idioma de traducciónAdd translation language

Otra tarea común de la traducción de voz es especificar los idiomas de traducción de destino; se requiere al menos uno, pero se admiten varios.Another common task of speech translation is to specify target translation languages, at least one is required but multiples are supported. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción.The following code snippet sets both French and German as translation language targets.

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

Con cada llamada a add_target_language, se especifica un nuevo idioma de traducción de destino.With every call to add_target_language, a new target translation language is specified. En otras palabras, cuando se reconoce la voz del lenguaje de origen, cada traducción de destino está disponible como parte de la operación de traducción resultante.In other words, when speech is recognized from the source language, each target translation is available as part of the resulting translation operation.

Inicialización de un reconocedor de traducciónInitialize a translation recognizer

Una vez creado un elemento SpeechTranslationConfig, el paso siguiente consiste en inicializar un elemento TranslationRecognizer.After you've created a SpeechTranslationConfig, the next step is to initialize a TranslationRecognizer. Al inicializar un elemento TranslationRecognizer, deberá pasar el elemento translation_config.When you initialize a TranslationRecognizer, you'll need to pass it your translation_config. El objeto de configuración proporciona las credenciales que necesita el servicio de voz para validar la solicitud.The configuration object provides the credentials that the speech service requires to validate your request.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, el elemento TranslationRecognizer debería ser similar a:If you're recognizing speech using your device's default microphone, here's what the TranslationRecognizer should look like:

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)

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

Si desea especificar el dispositivo de entrada de audio, deberá crear un elemento AudioConfig y proporcionar el parámetro audio_config al inicializar el elemento TranslationRecognizer.If you want to specify the audio input device, then you'll need to create an AudioConfig and provide the audio_config parameter when initializing your TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:First, you'll reference the AudioConfig object as follows:

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)
    recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config, audio_config=audio_config)

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, deberá proporcionar un elemento audioConfig.If you want to provide an audio file instead of using a microphone, you'll still need to provide an audioConfig. Sin embargo, cuando crea una AudioConfig, en lugar de hacer una llamada con use_default_microphone=True, la hará con filename="path-to-file.wav" y proporcionará el parámetro filename.However, when you create an AudioConfig, instead of calling with use_default_microphone=True, you'll call with filename="path-to-file.wav" and provide the filename parameter.

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")
    recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config, audio_config=audio_config)

Traducir vozTranslate speech

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio.To translate speech, the Speech SDK relies on a microphone or an audio file input. El reconocimiento de voz tiene lugar antes de la traducción de voz.Speech recognition occurs before speech translation. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado.After all objects have been initialized, call the recognize-once function and get the result.

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)

    recognizer = speechsdk.translation.TranslationRecognizer(
            translation_config=translation_config)
    
    print('Say something...')
    result = 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 más información acerca de la conversión de voz a texto, consulte Aspectos básicos del reconocimiento de voz.For more information about speech-to-text, see the basics of speech recognition.

Síntesis de traduccionesSynthesize translations

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario.After a successful speech recognition and translation, the result contains all the translations in a dictionary. La clave del diccionario translations es el idioma de traducción de destino y el valor es el texto traducido.The translations dictionary key is the target translation language and the value is the translated text. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).Recognized speech can be translated, then synthesized in a different language (speech-to-speech).

Síntesis basada en eventosEvent-based synthesis

El objeto TranslationRecognizer expone un evento Synthesizing.The TranslationRecognizer object exposes a Synthesizing event. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción.The event fires several times, and provides a mechanism to retrieve the synthesized audio from the translation recognition result. Si va a traducir a varios idiomas, consulte Síntesis manual.If you're translating to multiple languages, see manual synthesis. Especifique la voz de síntesis asignando un voice_name y proporcione un controlador de eventos para el evento de Synthesizing y obtenga el audio.Specify the synthesis voice by assigning a voice_name and provide an event handler for the Synthesizing event, get the audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.The following example saves the translated audio as a .wav file.

Importante

La síntesis basada en eventos solo funciona con una sola traducción, no agrega varios idiomas de traducción de destino.The event-based synthesis only works with a single translation, do not add multiple target translation languages. Además, el objeto voice_name debe ser el mismo idioma que el idioma de traducción de destino; por ejemplo, "de" podría asignarse a "de-DE-Hedda".Additionally, the voice_name should be the same language as the target translation language, for example; "de" could map to "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"

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

    recognizer.synthesizing.connect(synthesis_callback)

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

    result = 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íntesis manualManual synthesis

El diccionario translations se puede usar para sintetizar el audio desde el texto de traducción.The translations dictionary can be used to synthesize audio from the translation text. Recorra en iteración cada traducción y sintetice la traducción.Iterate through each translation, and synthesize the translation. Al crear una instancia de SpeechSynthesizer, el objeto SpeechConfig debe tener su propiedad speech_synthesis_voice_name establecida en la voz deseada.When creating a SpeechSynthesizer instance, the SpeechConfig object needs to have its speech_synthesis_voice_name property set to the desired voice. El siguiente ejemplo se traduce a cinco idiomas y, a continuación, cada conversión se sintetiza en un archivo de audio en el idioma neuronal correspondiente.The following example translates to five languages, and each translation is then synthesized to an audio file in the corresponding neural language.

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 = 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 más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.For more information about speech synthesis, see the basics of speech synthesis.

Una de las características principales del servicio de voz es la capacidad para reconocer la voz humana y traducirla a otros idiomas.One of the core features of the Speech service is the ability to recognize human speech and translate it to other languages. En este inicio rápido, aprenderá a usar Speech SDK en sus aplicaciones y productos para realizar la traducción de voz de alta calidad.In this quickstart you learn how to use the Speech SDK in your apps and products to perform high-quality speech translation. Este inicio rápido traduce la voz que sale por el micrófono en texto en otro idioma.This quickstart translates speech from the microphone into text in another language.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Descargar e instalarDownload and install

Nota

En Windows, necesita Microsoft Visual C++ Redistributable para Visual Studio 2019 para su plataforma.On Windows, you need the Microsoft Visual C++ Redistributable for Visual Studio 2019 for your platform. La primera vez que instala este paquete, puede que deba reiniciar Windows.Installing this for the first time may require you to restart Windows.

Siga estos pasos para instalar la CLI de Voz en Windows:Follow these steps to install the Speech CLI on Windows:

  1. Descargue el archivo ZIP de la CLI de Voz y extráigalo.Download the Speech CLI zip archive, then extract it.
  2. Vaya al directorio raíz spx-zips que extrajo de la descarga y extraiga el subdirectorio que necesita (spx-net471 para .NET Framework 4.7 o spx-netcore-win-x64 para .NET Core 3.0 en una CPU x64).Go to the root directory spx-zips that you extracted from the download, and extract the subdirectory that you need (spx-net471 for .NET Framework 4.7, or spx-netcore-win-x64 for .NET Core 3.0 on an x64 CPU).

En el símbolo del sistema, cambie el directorio a esta ubicación y, luego, escriba spx para ver la ayuda de la CLI de Voz.In the command prompt, change directory to this location, and then type spx to see help for the Speech CLI.

Nota

En Windows, la CLI de Voz solo puede mostrar las fuentes disponibles para el símbolo del sistema en el equipo local.On Windows, the Speech CLI can only show fonts available to the command prompt on the local computer. El terminal de Windows admite todas las fuentes que genera de forma interactiva la CLI de Voz.Windows Terminal supports all fonts produced interactively by the Speech CLI. Si se genera la salida a un archivo, un editor de texto como el Bloc de notas o un explorador Web como Microsoft Edge también pueden mostrar todas las fuentes.If you output to a file, a text editor like Notepad or a web browser like Microsoft Edge can also show all fonts.

Nota

PowerShell no comprueba el directorio local al buscar un comando.Powershell does not check the local directory when looking for a command. En PowerShell, cambie el directorio a la ubicación de spx y llame a la herramienta escribiendo .\spx.In Powershell, change directory to the location of spx and call the tool by entering .\spx. Si agrega este directorio a su ruta de acceso, PowerShell y el símbolo del sistema de Windows buscarán spx en cualquier directorio sin incluir el prefijo .\.If you add this directory to your path, Powershell and the Windows command prompt will find spx from any directory without including the .\ prefix.

Creación de la configuración de la suscripciónCreate subscription config

Si desea empezar a usar la CLI de Voz, debe especificar la clave de la suscripción al servicio de voz y la información de la región.To start using the Speech CLI, you need to enter your Speech subscription key and region identifier. Para obtener estas credenciales, siga los pasos descritos en Prueba gratuita del servicio Voz.Get these credentials by following steps in Try the Speech service for free. Una vez que tenga la clave de suscripción y el identificador de región (p. ej.,Once you have your subscription key and region identifier (ex. eastus, westus), ejecute los comandos siguientes.eastus, westus), run the following commands.

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

La autenticación de la suscripción se almacena ahora para futuras solicitudes de SPX.Your subscription authentication is now stored for future SPX requests. Si tiene que quitar cualquiera de estos valores almacenados, ejecute spx config @region --clear o spx config @key --clear.If you need to remove either of these stored values, run spx config @region --clear or spx config @key --clear.

Establecimiento del idioma de origen y destinoSet source and target language

Este comando llama a la CLI de voz para traducir la voz del micrófono de italiano a francés.This command calls Speech CLI to translate speech from the microphone from Italian to French.

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

Pasos siguientesNext steps