Reconocimiento y traducción de voz

Documentación de referencia | Paquete (NuGet) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer la voz humana y trasladarla a otro lenguaje.

Consulte Introducción a la traducción de voz para más información sobre los siguientes puntos:

  • Conversión de voz en texto
  • Traducción de voz a varios idiomas de destino
  • Realizar la traducción de voz a voz directa

Datos confidenciales y variables de entorno

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 del recurso de Voz. La clase Program contiene dos valores static readonly string que se asignan a las variables de entorno de las máquinas host: SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION. Ambos campos se encuentran en el ámbito de la clase, por lo que se pueden acceder dentro de los cuerpos de método de la clase:

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

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

Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.

Creación de una configuración de traducción de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de 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.

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.

Puede inicializar SpeechTranslationConfig de varias maneras:

  • Con una suscripción: pase una clave y la región asociada.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la región asociada.

Veamos cómo se crea una instancia de SpeechTranslationConfig mediante una clave y una región. Obtenga la clave de recurso de voz y la región en el Azure Portal.

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

    static Task Main() => TranslateSpeechAsync();

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

Cambio del idioma de origen

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a italiano. En el código, interactúe con la instancia de SpeechTranslationConfig, asignándola a la propiedad SpeechRecognitionLanguage:

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

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

La propiedad SpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Consulte la lista de configuraciones regionales de traducción de voz admitidas.

Adición de un idioma de traducción

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. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción:

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

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

Con cada llamada a AddTargetLanguage, se especifica un nuevo idioma de traducción de destino. 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.

Inicialización de un reconocedor de traducción

Una vez creada una instancia de SpeechTranslationConfig, el paso siguiente consiste en inicializar TranslationRecognizer. Al inicializar TranslationRecognizer, debe pasarle la instancia de speechTranslationConfig. El objeto de configuración proporciona las credenciales que necesita el servicio de Voz para validar la solicitud.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, la instancia de TranslationRecognizer debería ser similar a la siguiente:

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

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

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
}

Si quiere especificar el dispositivo de entrada de audio, debe crear una instancia de clase AudioConfig y proporcionar el parámetro audioConfig al inicializar TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:

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

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

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, debe proporcionar un parámetro audioConfig. Sin embargo, al crear una instancia de clase AudioConfig, en lugar de llamar a FromDefaultMicrophoneInput, se llama a FromWavFileInput y se pasa el parámetro filename:

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

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

Traducir voz

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio. El reconocimiento de voz tiene lugar antes de la traducción de voz. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado:

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

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

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

Para más información acerca de la conversión de voz en texto, consulte Aspectos básicos del reconocimiento de voz.

Síntesis de traducciones

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario. La clave del diccionario Translations es el idioma de traducción de destino y el valor es el texto traducido. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).

Síntesis basada en eventos

El objeto TranslationRecognizer expone un evento Synthesizing. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción. Si va a traducir a varios idiomas, consulte Síntesis manual.

Especifique la voz de síntesis asignando una instancia de VoiceName, proporcione un controlador de eventos para el evento de Synthesizing y obtenga el audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.

Importante

La síntesis basada en eventos solo funciona con una única traducción. No agregue varios idiomas de traducción de destino. Además, el valor de VoiceName debe ser el mismo idioma que el idioma de traducción de destino. Por ejemplo, "de" podría asignarse a "de-DE-Hedda".

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

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

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

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

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

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

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

Síntesis manual

El diccionario Translations se puede usar para sintetizar el audio del texto de traducción. Recorra en iteración cada traducción y sintetícela. Al crear una instancia de SpeechSynthesizer, en el objeto SpeechConfig debe establecerse la propiedad SpeechSynthesisVoiceName en la voz deseada.

En el ejemplo siguiente se traduce a cinco idiomas. A continuación, cada traducción se sintetiza en un archivo de audio en el idioma neuronal correspondiente.

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

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

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

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

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

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

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

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

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

Para más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.

Traducción multilingüe con identificación de idioma

En muchos escenarios, es posible que no sepa qué idiomas de entrada especificar. Usar la identificación de idioma le permite especificar hasta 10 idiomas de entrada posibles y traducir automáticamente a los idiomas de destino.

En el ejemplo siguiente se prevé que en-US o zh-CN se acaben especificando porque están presentes en AutoDetectSourceLanguageConfig. A continuación, la voz se traduce a de y fr como se especifica en las llamadas a AddTargetLanguage().

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

Para obtener un ejemplo de código completo, consulte: identificación de idioma.

Documentación de referencia | Paquete (NuGet) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer la voz humana y trasladarla a otro lenguaje.

Consulte Introducción a la traducción de voz para más información sobre los siguientes puntos:

  • Conversión de voz en texto
  • Traducción de voz a varios idiomas de destino
  • Realizar la traducción de voz a voz directa

Datos confidenciales y variables de entorno

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 del recurso de Voz. El archivo de código C++ contiene dos valores de cadena que se asignan desde las variables de entorno de la máquina host: SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION. Ambos campos se encuentran en el ámbito de la clase, por lo que se pueden acceder dentro de los cuerpos de método de la clase:

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

Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.

Creación de una configuración de traducción de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de 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.

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.

Puede inicializar SpeechTranslationConfig de varias maneras:

  • Con una suscripción: pase una clave y la región asociada.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la región asociada.

Veamos cómo se crea una instancia de SpeechTranslationConfig mediante una clave y una región. Obtenga la clave de recurso de voz y la región en el Azure Portal.

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

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

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

Cambio del idioma de origen

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a italiano. En el código, interactúe con la instancia de SpeechTranslationConfig mediante la llamada al método SetSpeechRecognitionLanguage.

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

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

La propiedad SpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Consulte la lista de configuraciones regionales de traducción de voz admitidas.

Adición de un idioma de traducción

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. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción:

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

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

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

Con cada llamada a AddTargetLanguage, se especifica un nuevo idioma de traducción de destino. 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.

Inicialización de un reconocedor de traducción

Una vez creada una instancia de SpeechTranslationConfig, el paso siguiente consiste en inicializar TranslationRecognizer. Al inicializar TranslationRecognizer, debe pasarle la instancia de translationConfig. El objeto de configuración proporciona las credenciales que necesita el servicio de Voz para validar la solicitud.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, TranslationRecognizer debería ser similar a:

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

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

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

Si quiere especificar el dispositivo de entrada de audio, debe crear una instancia de clase AudioConfig y proporcionar el parámetro audioConfig al inicializar TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:

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

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

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

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, debe proporcionar un parámetro audioConfig. Sin embargo, al crear una instancia de clase AudioConfig, en lugar de llamar a FromDefaultMicrophoneInput, se llama a FromWavFileInput y se pasa el parámetro filename:

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

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

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

Traducir voz

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio. El reconocimiento de voz tiene lugar antes de la traducción de voz. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado:

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

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

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

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

Para más información acerca de la conversión de voz en texto, consulte Aspectos básicos del reconocimiento de voz.

Síntesis de traducciones

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario. La clave del diccionario Translations es el idioma de traducción de destino y el valor es el texto traducido. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).

Síntesis basada en eventos

El objeto TranslationRecognizer expone un evento Synthesizing. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción. Si va a traducir a varios idiomas, consulte Síntesis manual.

Especifique la voz de síntesis asignando una instancia de SetVoiceName, proporcione un controlador de eventos para el evento de Synthesizing y obtenga el audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.

Importante

La síntesis basada en eventos solo funciona con una única traducción. No agregue varios idiomas de traducción de destino. Además, el valor de SetVoiceName debe ser el mismo idioma que el idioma de traducción de destino. Por ejemplo, "de" podría asignarse a "de-DE-Hedda".

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

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

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

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

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

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

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

Síntesis manual

El diccionario Translations se puede usar para sintetizar el audio del texto de traducción. Recorra en iteración cada traducción y sintetícela. Al crear una instancia de SpeechSynthesizer, en el objeto SpeechConfig debe establecerse la propiedad SetSpeechSynthesisVoiceName en la voz deseada.

En el ejemplo siguiente se traduce a cinco idiomas. A continuación, cada traducción se sintetiza en un archivo de audio en el idioma neuronal correspondiente.

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

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

    auto translationRecognizer = TranslationRecognizer::FromConfig(translationConfig);

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

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

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

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

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

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

Para más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.

Traducción multilingüe con identificación de idioma

En muchos escenarios, es posible que no sepa qué idiomas de entrada especificar. Usar la identificación de idioma le permite especificar hasta 10 idiomas de entrada posibles y traducir automáticamente a los idiomas de destino.

En el ejemplo siguiente se prevé que en-US o zh-CN se acaben especificando porque están presentes en AutoDetectSourceLanguageConfig. A continuación, la voz se traducirá a de y fr como se especifica en las llamadas a AddTargetLanguage().

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

Para obtener un ejemplo de código completo, consulte: identificación de idioma.

Documentación de referencia | Paquete (Go) | Ejemplos adicionales en GitHub

El SDK de Voz para Go no admite traducción de voz. Seleccione otro lenguaje de programación o la referencia de Go y los ejemplos vinculados desde el principio de este artículo.

Documentación de referencia | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer la voz humana y trasladarla a otro lenguaje.

Consulte Introducción a la traducción de voz para más información sobre los siguientes puntos:

  • Conversión de voz en texto
  • Traducción de voz a varios idiomas de destino
  • Realizar la traducción de voz a voz directa

Datos confidenciales y variables de entorno

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 del recurso de Voz. El archivo de código Java contiene dos valores static final String que se asignan desde las variables de entorno de la máquina: SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION. Ambos campos se encuentran en el ámbito de la clase, por lo que se pueden acceder dentro de los cuerpos de método de la clase:

public class App {

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

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

Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.

Creación de una configuración de traducción de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de 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.

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.

Puede inicializar una instancia de SpeechTranslationConfig de varias maneras:

  • Con una suscripción: pase una clave y la región asociada.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la región asociada.

Veamos cómo se crea una instancia de SpeechTranslationConfig mediante una clave y una región. Obtenga la clave de recurso de voz y la región en el Azure Portal.

public class App {

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

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

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

Cambio del idioma de origen

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a italiano. En el código, interactúe con la instancia de SpeechTranslationConfig mediante la llamada al método setSpeechRecognitionLanguage:

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

La función setSpeechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Consulte la lista de configuraciones regionales de traducción de voz admitidas.

Adición de un idioma de traducción

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. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción:

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

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

Con cada llamada a addTargetLanguage, se especifica un nuevo idioma de traducción de destino. 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.

Inicialización de un reconocedor de traducción

Una vez creada una instancia de SpeechTranslationConfig, el paso siguiente consiste en inicializar TranslationRecognizer. Al inicializar TranslationRecognizer, debe pasarle la instancia de speechTranslationConfig. El objeto de configuración proporciona las credenciales que necesita el servicio de Voz para validar la solicitud.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, TranslationRecognizer debería ser similar a:

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

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

Si quiere especificar el dispositivo de entrada de audio, debe crear una instancia de clase AudioConfig y proporcionar el parámetro audioConfig al inicializar TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:

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

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

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, debe proporcionar un parámetro audioConfig. Sin embargo, al crear una instancia de clase AudioConfig, en lugar de llamar a fromDefaultMicrophoneInput, se llama a fromWavFileInput y se pasa el parámetro filename:

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

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

Traducir voz

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio. El reconocimiento de voz tiene lugar antes de la traducción de voz. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado:

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

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

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

Para más información acerca de la conversión de voz en texto, consulte Aspectos básicos del reconocimiento de voz.

Síntesis de traducciones

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario. La función getTranslations devuelve un diccionario con la clave como idioma de traducción de destino y el valor como el texto traducido. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).

Síntesis basada en eventos

El objeto TranslationRecognizer expone un evento synthesizing. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción. Si va a traducir a varios idiomas, consulte Síntesis manual.

Especifique la voz de síntesis asignando una instancia de setVoiceName, proporcione un controlador de eventos para el evento de synthesizing y obtenga el audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.

Importante

La síntesis basada en eventos solo funciona con una única traducción. No agregue varios idiomas de traducción de destino. Además, el valor de setVoiceName debe ser el mismo idioma que el idioma de traducción de destino. Por ejemplo, "de" podría asignarse a "de-DE-Hedda".

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

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

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

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

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

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

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

Síntesis manual

La función getTranslations devuelve un diccionario que se puede usar para sintetizar el audio del texto de traducción. Recorra en iteración cada traducción y sintetícela. Al crear una instancia de SpeechSynthesizer, en el objeto SpeechConfig debe establecerse la propiedad setSpeechSynthesisVoiceName en la voz deseada.

En el ejemplo siguiente se traduce a cinco idiomas. A continuación, cada traducción se sintetiza en un archivo de audio en el idioma neuronal correspondiente.

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

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

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

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

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

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

Para más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.

Documentación de referencia | Paquete (npm) | Ejemplos adicionales en GitHub | Código fuente de la biblioteca

En esta guía paso a paso, aprenderá a reconocer la voz humana y trasladarla a otro lenguaje.

Consulte Introducción a la traducción de voz para más información sobre los siguientes puntos:

  • Conversión de voz en texto
  • Traducción de voz a varios idiomas de destino
  • Realizar la traducción de voz a voz directa

Creación de una configuración de traducción

Para llamar al servicio de traducción con el SDK de Voz, debe crear una instancia de 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.

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.

Puede inicializar SpeechTranslationConfig de varias maneras:

  • Con una suscripción: pase una clave y la región asociada.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la región asociada.

Veamos cómo se crea una instancia de SpeechTranslationConfig mediante una clave y una región. Obtenga la clave de recurso de voz y la región en el Azure Portal.

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

Inicialización de un traductor

Una vez creada una instancia de SpeechTranslationConfig, el paso siguiente consiste en inicializar TranslationRecognizer. Al inicializar TranslationRecognizer, debe pasarle la instancia de speechTranslationConfig. El objeto de configuración proporciona las credenciales que necesita el servicio de traducción para validar la solicitud.

Si va a traducir la voz proporcionada a través del micrófono predeterminado del dispositivo, este es el aspecto que TranslationRecognizer debe tener:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

Si quiere especificar el dispositivo de entrada de audio, debe crear una instancia de clase AudioConfig y proporcionar el parámetro audioConfig al inicializar TranslationRecognizer.

Haga referencia al objeto AudioConfig como se indica a continuación:

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

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, debe proporcionar un parámetro audioConfig. Sin embargo, esto solo se puede hacer cuando el destino es Node.js. Al crear una instancia de clase AudioConfig, en lugar de llamar a fromDefaultMicrophoneInput, se llama a fromWavFileOutput y se pasa el parámetro filename:

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

Traducir voz

La clase TranslationRecognizer del SDK de Voz para JavaScript expone métodos que puede usar para la traducción de voz:

  • Traducción de una sola captura (asincrónico): realiza la traducción en modo sin bloqueo (asincrónico). Traduce una sola expresión. Determina el final de una expresión única mediante la escucha de un silencio al final o hasta que se procesa un máximo de 15 segundos de audio.
  • Traducción continua (asincrónica): inicia de forma asincrónica una operación de traducción continua. El usuario se registra a eventos y controla los distintos estados de la aplicación. Para detener la traducción continua asincrónica, llame a stopContinuousRecognitionAsync.

Para más información sobre cómo elegir un modo de reconocimiento de voz, consulte Introducción a la conversión de voz a texto.

Especificación de un idioma de destino

Para traducir, debe especificar un idioma de origen y al menos un idioma de destino.

Puede elegir un idioma de origen mediante el uso de una configuración regional incluida en la tabla de traducción de voz. Busque las opciones de idioma de traducción en el mismo vínculo.

Las opciones de idiomas de destino se diferencian cuando se quiere ver el texto o cuando se quiere oír una voz traducida sintetizada. Para traducir del inglés al alemán, modifique el objeto de configuración de traducción:

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

Reconocimiento de una sola captura

Este es un ejemplo de traducción asincrónica de una sola captura mediante recognizeOnceAsync:

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

Debe escribir código para controlar el resultado. En este ejemplo se evalúa result.reason de una traducción al alemán:

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

El código también puede controlar las actualizaciones proporcionadas mientras se procesa la traducción. Puede usar estas actualizaciones para proporcionar comentarios visuales sobre el progreso de la traducción. En este ejemplo de Node.js de JavaScript se muestran estos tipos de actualizaciones. En el código siguiente también se muestran los detalles que se han producido durante el proceso de traducción:

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

Traducción continua

La traducción continua es un poco más complicada que el reconocimiento de una sola captura. Requiere que se suscriba a los eventos recognizing, recognized y canceled para obtener los resultados del reconocimiento. Para detener la traducción, debe llamar a stopContinuousRecognitionAsync.

Este es un ejemplo de cómo se realiza la traducción continua en un archivo de entrada de audio. Comencemos por definir la entrada e inicializar un elemento TranslationRecognizer:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

En el código siguiente, se suscribe a los eventos enviados desde TranslationRecognizer:

  • recognizing: se señalizan los eventos que contienen los resultados intermedios de la traducción.
  • recognized: se señalizan los eventos que contienen los resultados finales de la traducción. Estos resultados indican un intento de traducción correcto.
  • sessionStopped: se señalizan los eventos que indican el final de una sesión de traducción (operación).
  • canceled: se señalizan los eventos que contienen los resultados cancelados de la traducción. Estos eventos indican un intento de traducción que se canceló como resultado de una cancelación directa. Como alternativa, indican un error de transporte o protocolo.
translationRecognizer.recognizing = (s, e) => {
    console.log(`TRANSLATING: Text=${e.result.text}`);
};
translationRecognizer.recognized = (s, e) => {
    if (e.result.reason == ResultReason.RecognizedSpeech) {
        console.log(`TRANSLATED: Text=${e.result.text}`);
    }
    else if (e.result.reason == ResultReason.NoMatch) {
        console.log("NOMATCH: Speech could not be translated.");
    }
};
translationRecognizer.canceled = (s, e) => {
    console.log(`CANCELED: Reason=${e.reason}`);
    if (e.reason == CancellationReason.Error) {
        console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
        console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
        console.log("CANCELED: Did you set the speech resource key and region values?");
    }
    translationRecognizer.stopContinuousRecognitionAsync();
};
translationRecognizer.sessionStopped = (s, e) => {
    console.log("\n    Session stopped event.");
    translationRecognizer.stopContinuousRecognitionAsync();
};

Con todo configurado, puede llamar a startContinuousRecognitionAsync:

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

Elección de un idioma de origen

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a italiano. En el código, busque la instancia de SpeechTranslationConfig y, a continuación, agregue esta línea directamente debajo:

speechTranslationConfig.speechRecognitionLanguage = "it-IT";

La propiedad speechRecognitionLanguage espera una cadena con formato de configuración regional de idioma. Consulte la lista de configuraciones regionales de traducción de voz admitidas.

Elección de uno o varios idiomas de destino

Speech SDK puede traducir a varios idiomas de destino en paralelo. Los idiomas de destino disponibles son ligeramente diferentes de la lista de idiomas de origen. Los idiomas de destino se especifican mediante un código de idioma, en lugar de una configuración regional.

Para una lista de códigos de idioma de los destinos de texto, consulte la tabla de traducción de voz en la página de compatibilidad con idiomas. Ahí también puede encontrar detalles sobre la traducción a idiomas sintetizados.

En el código siguiente se agrega el alemán como idioma de destino:

speechTranslationConfig.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. El código siguiente obtiene los resultados de la traducción para el alemán:

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

Documentación de referencia | Paquete (Download) | Ejemplos adicionales en GitHub

El SDK de Voz para Objective-C admite la traducción de voz, aunque no tenemos ninguna guía disponible aún. Seleccione otro lenguaje de programación para empezar a trabajar y conocer los conceptos, o consulte la referencia de Objective-C y los ejemplos vinculados desde el principio de este artículo.

Documentación de referencia | Paquete (Download) | Ejemplos adicionales en GitHub

El SDK de Voz para Swift admite la traducción de voz, aunque no tenemos ninguna guía disponible aún. Seleccione otro lenguaje de programación para empezar a trabajar y conocer los conceptos, o consulte la referencia de Swift y los ejemplos vinculados desde el principio de este artículo.

Documentación de referencia | Paquete (PyPi) | Ejemplos adicionales en GitHub

En esta guía paso a paso, aprenderá a reconocer la voz humana y trasladarla a otro lenguaje.

Consulte Introducción a la traducción de voz para más información sobre los siguientes puntos:

  • Conversión de voz en texto
  • Traducción de voz a varios idiomas de destino
  • Realizar la traducción de voz a voz directa

Datos confidenciales y variables de entorno

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. El archivo de código Python contiene dos valores que se asignan desde las variables de entorno de la máquina: SPEECH__SUBSCRIPTION__KEY y SPEECH__SERVICE__REGION. Ambas variables se encuentran en el ámbito global, por lo que están accesibles dentro de la definición de función del archivo de código:

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

Para más información sobre las variables de entorno, consulte Configuración de las variables de entorno y de la aplicación.

Creación de una configuración de traducción de voz

Para llamar al servicio de Voz con el SDK de Voz, debe crear una instancia de 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.

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.

Puede inicializar SpeechTranslationConfig de varias maneras:

  • Con una suscripción: pase una clave y la región asociada.
  • Con un punto de conexión: pase un punto de conexión del servicio de voz. La clave y el token de autorización son opcionales.
  • Con un host: pase una dirección de host. La clave y el token de autorización son opcionales.
  • Con un token de autorización: pase el token de autorización y la región asociada.

Veamos cómo puede crear una instancia de SpeechTranslationConfig mediante una clave y una región. Obtenga la clave de recurso de voz y la región en el Azure Portal.

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 origen

Una tarea común en la traducción de voz es especificar el idioma de entrada (u origen). En el ejemplo siguiente se muestra cómo cambiar el idioma de entrada a italiano. En el código, interactúe con la instancia de SpeechTranslationConfig, asignándola a la propiedad speech_recognition_language.

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

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

La propiedad speech_recognition_language espera una cadena con formato de configuración regional de idioma. Consulte la lista de configuraciones regionales de traducción de voz admitidas.

Adición de un idioma de traducción

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. En el fragmento de código siguiente, se han especificado el francés y el alemán como destinos del idioma de traducción:

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. 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.

Inicialización de un reconocedor de traducción

Una vez creada una instancia de SpeechTranslationConfig, el paso siguiente consiste en inicializar TranslationRecognizer. Al inicializar TranslationRecognizer, debe pasarle la instancia de translation_config. El objeto de configuración proporciona las credenciales que necesita el servicio de Voz para validar la solicitud.

Si va a realizar un reconocimiento de voz con el micrófono predeterminado del dispositivo, TranslationRecognizer debería ser similar a:

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

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

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

Si quiere especificar el dispositivo de entrada de audio, debe crear una instancia de clase AudioConfig y proporcionar el parámetro audio_config al inicializar TranslationRecognizer.

En primer lugar, haga referencia al objeto AudioConfig como se indica a continuación:

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

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

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

Si desea proporcionar un archivo de audio en lugar de usar un micrófono, debe proporcionar un parámetro audioConfig. Sin embargo, cuando crea una instancia de clase AudioConfig, en lugar de hacer una llamada con use_default_microphone=True, la hace con filename="path-to-file.wav" y proporciona el parámetro filename:

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

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

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

Traducir voz

Para traducir la voz, el SDK de Voz depende de un micrófono o en una entrada de archivo de audio. El reconocimiento de voz tiene lugar antes de la traducción de voz. Cuando todos los objetos se hayan inicializado, llame a la función recognize-once y obtenga el resultado:

import os
import azure.cognitiveservices.speech as speechsdk

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

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

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

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

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

translate_speech_to_text()

Para más información acerca de la conversión de voz en texto, consulte Aspectos básicos del reconocimiento de voz.

Síntesis de traducciones

Después de un reconocimiento de voz y una traducción correctos, el resultado contiene todas las traducciones de un diccionario. La clave del diccionario translations es el idioma de traducción de destino y el valor es el texto traducido. La voz reconocida se puede traducir y sintetizar en otro idioma (de voz a voz).

Síntesis basada en eventos

El objeto TranslationRecognizer expone un evento Synthesizing. El evento se activa varias veces y proporciona un mecanismo para recuperar el audio sintetizado del resultado del reconocimiento de la traducción. Si va a traducir a varios idiomas, consulte Síntesis manual.

Especifique la voz de síntesis asignando una instancia de voice_name, proporcione un controlador de eventos para el evento de Synthesizing y obtenga el audio. En el ejemplo siguiente se guarda el audio traducido como un archivo .wav.

Importante

La síntesis basada en eventos solo funciona con una única traducción. No agregue varios idiomas de traducción de destino. Además, el valor de 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".

import os
import azure.cognitiveservices.speech as speechsdk

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

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

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

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

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

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

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

    translation_recognizer.synthesizing.connect(synthesis_callback)

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

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

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

translate_speech_to_text()

Síntesis manual

El diccionario translations se puede usar para sintetizar el audio del texto de traducción. Recorra en iteración cada traducción y sintetícela. Al crear una instancia de SpeechSynthesizer, en el objeto SpeechConfig debe establecerse la propiedad speech_synthesis_voice_name en la voz deseada.

En el ejemplo siguiente se traduce a cinco idiomas. A continuación, cada traducción se sintetiza en un archivo de audio en el idioma neuronal correspondiente.

import os
import azure.cognitiveservices.speech as speechsdk

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

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

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

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

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

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

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

translate_speech_to_text()

Para más información acerca de la síntesis de voz, consulte Aspectos básicos de la síntesis de voz.

Traducción multilingüe con identificación de idioma

En muchos escenarios, es posible que no sepa qué idiomas de entrada especificar. Usar la identificación de idioma le permite especificar hasta 10 idiomas de entrada posibles y traducir automáticamente a los idiomas de destino.

Para obtener un ejemplo de código completo, consulte: identificación de idioma.

Referencia de la API de REST en la conversión de voz en texto | Referencia de la API de REST en la conversión de voz en texto para audios breves | Ejemplos adicionales sobre GitHub

Puede usar la API de REST para la traducción de voz, aunque no tenemos ninguna guía disponible aún. Seleccione otro lenguaje de programación para empezar a trabajar y conocer los conceptos.

En esta guía paso a paso, aprenderá a reconocer la voz humana y trasladarla a otro lenguaje.

Consulte Introducción a la traducción de voz para más información sobre los siguientes puntos:

  • Conversión de voz en texto
  • Traducción de voz a varios idiomas de destino
  • Realizar la traducción de voz a voz directa

Requisitos previos

Descargar e instalar

Siga estos pasos y consulte el inicio rápido de la CLI de Voz para conocer los otros requisitos de la plataforma.

  1. Ejecute el siguiente comando de la CLI de .NET para instalar la CLI de Voz:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. Configure la clave de recurso de Voz y la región mediante la ejecución de los siguientes comandos. Reemplace SUBSCRIPTION-KEY por la clave del recurso de Voz y REGION por la región del recurso de Voz.

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

Establecimiento de los idiomas de origen y destino

Este comando llama a la CLI de Voz para traducir la voz del micrófono del italiano al francés:

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

Pasos siguientes