Komma igång med talöversättning

En av huvudfunktionerna i Taltjänsten är möjligheten att känna igen mänskligt tal och översätta det till andra språk. I den här snabbstarten lär du dig hur du använder Speech SDK i dina appar och produkter för att utföra talöversättning av hög kvalitet. I den här snabbstarten går vi bland annat:

  • Översätta tal till text
  • Översätta tal till flera målspråk
  • Utföra direkt tal till tal-översättning

Gå vidare till exempel på GitHub

Om du vill hoppa direkt till exempelkoden kan du gå till C#-snabbstartsexempel på GitHub.

Förutsättningar

Den här artikeln förutsätter att du har ett Azure-konto och en prenumeration på Speech-tjänsten. Om du inte har ett konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.

Installera Speech SDK

Innan du kan göra något måste du installera Speech SDK. Beroende på din plattform följer du anvisningarna under avsnittet Hämta Speech SDK i artikeln Om Speech SDK.

Importera beroenden

Om du vill köra exemplen i den här artikeln inkluderar using du följande instruktioner överst i filen Program.cs.

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;

Känsliga data och miljövariabler

Exempelkällkoden i den här artikeln beror på miljövariabler för lagring av känsliga data, till exempel prenumerationsnyckeln för Speech-resursen och regionen. Klassen Program innehåller två värden som static readonly string tilldelas från värddatorerna miljövariabler, SPEECH__SUBSCRIPTION__KEY nämligen och SPEECH__SERVICE__REGION . Båda dessa fält finns i klassomfånget, vilket gör dem tillgängliga i metodens text i klassen. Mer information om miljövariabler finns i miljövariabler och programkonfiguration.

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

Skapa en talöversättningskonfiguration

Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechTranslationConfig . Den här klassen innehåller information om din prenumeration, till exempel din nyckel och tillhörande region, slutpunkt, värd eller auktoriseringstoken.

Tips

Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.

Det finns några olika sätt att initiera en SpeechTranslationConfig :

  • Med en prenumeration: skicka in en nyckel och den associerade regionen.
  • Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En nyckel eller auktoriseringstoken är valfri.
  • Med en värd: skicka in en värdadress. En nyckel eller auktoriseringstoken är valfri.
  • Med en auktoriseringstoken: skicka en auktoriseringstoken och den associerade regionen.

Låt oss ta en titt på hur en SpeechTranslationConfig skapas med hjälp av en nyckel och region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt.

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

Ändra källspråk

En vanlig uppgift för talöversättning är att ange indataspråket (eller källan). Låt oss ta en titt på hur du skulle ändra indataspråket till italienska. Interagera med -instansen SpeechTranslationConfig i koden och tilldela den till egenskapen SpeechRecognitionLanguage .

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

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

Egenskapen SpeechRecognitionLanguage förväntar sig en språkspråkssträng. Du kan ange ett värde i kolumnen Språk i listan över språk som stöds.

Lägga till översättningsspråk

En annan vanlig uppgift för talöversättning är att ange målöversättningsspråk, minst ett krävs men flera stöds. Följande kodfragment anger både franska och tyska som mål för översättningsspråket.

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

Vid varje anrop AddTargetLanguage till anges ett nytt målöversättningsspråk. När tal identifieras från källspråket är med andra ord varje målöversättning tillgänglig som en del av den resulterande översättningsåtgärden.

Initiera en översättnings igenknnare

När du har skapat en SpeechTranslationConfig är nästa steg att initiera en TranslationRecognizer . När du initierar TranslationRecognizer en måste du skicka den till translationConfig . Konfigurationsobjektet tillhandahåller de autentiseringsuppgifter som speech-tjänsten kräver för att verifiera din begäran.

Om du känner igen tal med enhetens standardmi mikrofon bör du se ut så TranslationRecognizer här:

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

Om du vill ange enheten för ljudinspelning måste du skapa en och ange AudioConfig audioConfig parametern när du initierar TranslationRecognizer din .

Först refererar du till AudioConfig -objektet på följande sätt:

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

Om du vill tillhandahålla en ljudfil i stället för att använda en mikrofon måste du fortfarande ange en audioConfig . Men när du skapar en AudioConfig , i stället för att anropa , FromDefaultMicrophoneInput anropar du och skickar FromWavFileInput filename parametern .

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

Översätt tal

För att översätta tal förlitar sig Speech SDK på en mikrofon eller en ljudfilsinmatning. Taligenkänning sker före talöversättning. När alla objekt har initierats anropar du funktionen recognize-once och hämtar resultatet.

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

Mer information om tal till text finns i grunderna för taligenkänning.

Syntetisera översättningar

Efter en lyckad taligenkänning och översättning innehåller resultatet alla översättningar i en ordlista. TranslationsOrdlistenyckeln är målöversättningsspråket och värdet är den översatta texten. Identifierat tal kan översättas och sedan syntetiseras på ett annat språk (tal till tal).

Händelsebaserad syntes

Objektet TranslationRecognizer exponerar en Synthesizing händelse. Händelsen utbrandas flera gånger och ger en mekanism för att hämta det syntetiserade ljudet från översättningsigenkänningsresultatet. Om du översätter till flera språk kan du läsa manuell syntes. Ange syntesrösten genom att tilldela VoiceName en och tillhandahålla en händelsehanterare för händelsen och hämta Synthesizing ljudet. I följande exempel sparas det översatta ljudet som en WAV-fil.

Viktigt

Den händelsebaserade syntesen fungerar bara med en enda översättning, lägg inte till flera målöversättningsspråk. Dessutom bör vara VoiceName samma språk som målöversättningsspråket, till exempel; "de" kan mappas till "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]}");
    }
}

Manuell syntes

Ordlistan Translations kan användas för att syntetisera ljud från översättningstexten. Iterera genom varje översättning och syntetisera översättningen. När du SpeechSynthesizer skapar en -instans måste objektet ha egenskapen SpeechConfig inställd på önskad SpeechSynthesisVoiceName röst. Följande exempel översätts till fem språk, och varje översättning syntetiseras sedan till en ljudfil på motsvarande neurala språk.

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

Mer information om talsyntes finns i grunderna i talsyntes.

Flerspråkig översättning med språkidentifiering

I många scenarier kanske du inte vet vilka indataspråk som ska anges. Med språkidentifiering kan du ange upp till tio möjliga indataspråk och automatiskt översätta till dina målspråk.

I följande exempel används kontinuerlig översättning från en ljudfil och identifierar automatiskt indataspråket, även om språket som talas ändras. När du kör exemplet en-US identifieras och automatiskt eftersom de zh-CN definieras i AutoDetectSourceLanguageConfig . Sedan översätts talet till och enligt de vad som anges i fr anropen till AddTargetLanguage() .

Viktigt

Den här funktionen är för närvarande i förhandsversion.

using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

public static async Task MultiLingualTranslation()
{
    var region = "<paste-your-region>";
    // currently the v2 endpoint is required for this design pattern
    var endpointString = $"wss://{region}.stt.speech.microsoft.com/speech/universal/v2";
    var endpointUrl = new Uri(endpointString);
    
    var config = SpeechConfig.FromEndpoint(endpointUrl, "<paste-your-subscription-key>");

    // Source lang is required, but is currently NoOp 
    string fromLanguage = "en-US";
    config.SpeechRecognitionLanguage = fromLanguage;

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

    config.SetProperty(PropertyId.SpeechServiceConnection_ContinuousLanguageIdPriority, "Latency");
    var autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig.FromLanguages(new string[] { "en-US", "zh-CN" });

    var stopTranslation = new TaskCompletionSource<int>();
    using (var audioInput = AudioConfig.FromWavFileInput(@"path-to-your-audio-file.wav"))
    {
        using (var recognizer = new TranslationRecognizer(config, autoDetectSourceLanguageConfig, audioInput))
        {
            recognizer.Recognizing += (s, e) =>
            {
                var lidResult = e.Result.Properties.GetProperty(PropertyId.SpeechServiceConnection_AutoDetectSourceLanguageResult);

                Console.WriteLine($"RECOGNIZING in '{lidResult}': Text={e.Result.Text}");
                foreach (var element in e.Result.Translations)
                {
                    Console.WriteLine($"    TRANSLATING into '{element.Key}': {element.Value}");
                }
            };

            recognizer.Recognized += (s, e) => {
                if (e.Result.Reason == ResultReason.TranslatedSpeech)
                {
                    var lidResult = e.Result.Properties.GetProperty(PropertyId.SpeechServiceConnection_AutoDetectSourceLanguageResult);

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

            recognizer.Canceled += (s, e) =>
            {
                Console.WriteLine($"CANCELED: Reason={e.Reason}");

                if (e.Reason == CancellationReason.Error)
                {
                    Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
                    Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
                    Console.WriteLine($"CANCELED: Did you update the subscription info?");
                }

                stopTranslation.TrySetResult(0);
            };

            recognizer.SpeechStartDetected += (s, e) => {
                Console.WriteLine("\nSpeech start detected event.");
            };

            recognizer.SpeechEndDetected += (s, e) => {
                Console.WriteLine("\nSpeech end detected event.");
            };

            recognizer.SessionStarted += (s, e) => {
                Console.WriteLine("\nSession started event.");
            };

            recognizer.SessionStopped += (s, e) => {
                Console.WriteLine("\nSession stopped event.");
                Console.WriteLine($"\nStop translation.");
                stopTranslation.TrySetResult(0);
            };

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

            Task.WaitAny(new[] { stopTranslation.Task });
            await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
        }
    }
}

En av huvudfunktionerna i taltjänsten är möjligheten att känna igen mänskligt tal och översätta det till andra språk. I den här snabbstarten lär du dig att använda Speech SDK i dina appar och produkter för att utföra talöversättning av hög kvalitet. Den här snabbstarten beskriver bland annat följande:

  • Översätta tal till text
  • Översätta tal till flera målspråk
  • Utföra direkt tal till tal-översättning

Hoppa till exempel på GitHub

Om du vill hoppa direkt till exempelkoden kan du gå till C++-snabbstartsexempel på GitHub.

Förutsättningar

Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.

Installera Speech SDK

Innan du kan göra något måste du installera Speech SDK. Beroende på din plattform följer du anvisningarna i avsnittet Hämta Speech SDK i artikeln Om Speech SDK.

Importera beroenden

Om du vill köra exemplen i den här artikeln inkluderar du #include följande - using och -instruktioner överst i C++-kodfilen.

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

Känsliga data och miljövariabler

Exempelkällkoden i den här artikeln är beroende av miljövariabler för lagring av känsliga data, till exempel prenumerationsnyckeln för Speech-resursen och regionen. C++-kodfilen innehåller två strängvärden som tilldelas från värddatorerna miljövariabler, SPEECH__SUBSCRIPTION__KEY nämligen och SPEECH__SERVICE__REGION . Båda dessa fält finns i klassomfånget, vilket gör dem tillgängliga i metodens text i klassen. Mer information om miljövariabler finns i miljövariabler och programkonfiguration.

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

Skapa en konfiguration för talöversättning

Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechTranslationConfig . Den här klassen innehåller information om din prenumeration, till exempel din nyckel och tillhörande region, slutpunkt, värd eller auktoriseringstoken.

Tips

Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.

Det finns några sätt att initiera en SpeechTranslationConfig :

  • Med en prenumeration: skicka en nyckel och den associerade regionen.
  • Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En nyckel eller auktoriseringstoken är valfri.
  • Med en värd: skicka in en värdadress. En nyckel eller auktoriseringstoken är valfri.
  • Med en auktoriseringstoken: skicka en auktoriseringstoken och den associerade regionen.

Låt oss ta en titt på hur en SpeechTranslationConfig skapas med hjälp av en nyckel och region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt.

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

Ändra källspråk

En vanlig uppgift för talöversättning är att ange indataspråket (eller källan). Låt oss ta en titt på hur du skulle ändra indataspråket till italienska. Interagera med instansen i koden SpeechTranslationConfig och anropa SetSpeechRecognitionLanguage metoden .

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

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

Egenskapen SpeechRecognitionLanguage förväntar sig en formatsträng med språkspråk. Du kan ange ett värde i kolumnen Språk i listan över språk som stöds.

Lägga till översättningsspråk

En annan vanlig uppgift för talöversättning är att ange målöversättningsspråk, minst ett krävs men multiplar stöds. Följande kodfragment anger både franska och tyska som mål för översättningsspråket.

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

Vid varje anrop AddTargetLanguage till anges ett nytt målöversättningsspråk. När tal identifieras från källspråket är med andra ord varje målöversättning tillgänglig som en del av den resulterande översättningsåtgärden.

Initiera en översättnings recognizer

När du har skapat en SpeechTranslationConfig är nästa steg att initiera en TranslationRecognizer . När du TranslationRecognizer initierar en måste du skicka den till translationConfig . Konfigurationsobjektet tillhandahåller de autentiseringsuppgifter som taltjänsten kräver för att verifiera din begäran.

Om du känner igen tal med enhetens standardmi mikrofon bör du se ut så TranslationRecognizer här:

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

Om du vill ange enheten för ljudinspelning måste du skapa en och ange AudioConfig audioConfig parametern när du initierar TranslationRecognizer din .

Först refererar du till AudioConfig -objektet på följande sätt:

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

Om du vill ange en ljudfil i stället för att använda en mikrofon måste du fortfarande ange en audioConfig . Men när du skapar en AudioConfig , i stället för att anropa , FromDefaultMicrophoneInput anropar du och skickar FromWavFileInput filename parametern .

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

Översätt tal

För att översätta tal förlitar sig Speech SDK på en mikrofon eller en ljudfilsinmatning. Taligenkänning sker före talöversättning. När alla objekt har initierats anropar du funktionen recognize-once och hämtar resultatet.

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

Mer information om tal till text finns i grunderna för taligenkänning.

Syntetisera översättningar

Efter en lyckad taligenkänning och översättning innehåller resultatet alla översättningar i en ordlista. TranslationsOrdlistenyckeln är målöversättningsspråket och värdet är den översatta texten. Identifierat tal kan översättas och sedan syntetiseras på ett annat språk (tal till tal).

Händelsebaserad syntes

Objektet TranslationRecognizer exponerar en Synthesizing händelse. Händelsen utbrandas flera gånger och ger en mekanism för att hämta det syntetiserade ljudet från översättningsigenkänningsresultatet. Om du översätter till flera språk kan du läsa manuell syntes. Ange syntesrösten genom att tilldela SetVoiceName en och ange en händelsehanterare för händelsen och hämta Synthesizing ljudet. I följande exempel sparas det översatta ljudet som en WAV-fil.

Viktigt

Den händelsebaserade syntesen fungerar bara med en enda översättning, lägg inte till flera målöversättningsspråk. Dessutom bör vara SetVoiceName samma språk som målöversättningsspråket, till exempel; kan "de" mappas till "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;
        }
    }
}

Manuell syntes

Ordlistan Translations kan användas för att syntetisera ljud från översättningstexten. Iterera genom varje översättning och syntetisera översättningen. När du skapar SpeechSynthesizer en instans måste objektet ha egenskapen inställd på önskad SpeechConfig SetSpeechSynthesisVoiceName röst. I följande exempel översätts till fem språk, och varje översättning syntetiseras sedan till en ljudfil i motsvarande neurala språk.

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

Mer information om talsyntes finns i grunderna för talsyntes.

Flerspråkig översättning med språkidentifiering

I många scenarier kanske du inte vet vilka indataspråk du ska ange. Med hjälp av språkidentifiering kan du ange upp till tio möjliga indataspråk och automatiskt översätta till dina målspråk.

I följande exempel används kontinuerlig översättning från en ljudfil och identifierar automatiskt indataspråket, även om språket som talas ändras. När du kör exemplet en-US identifieras och automatiskt eftersom de zh-CN definieras i AutoDetectSourceLanguageConfig . Sedan översätts talet till och enligt de vad som anges i fr anropen till AddTargetLanguage() .

Viktigt

Den här funktionen är för närvarande i förhandsversion.

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

void MultiLingualTranslation()
{
    auto region = "<paste-your-region>";
    // currently the v2 endpoint is required for this design pattern
    auto endpointString = std::format("wss://{}.stt.speech.microsoft.com/speech/universal/v2", region);
    auto config = SpeechConfig::FromEndpoint(endpointString, "<paste-your-subscription-key>");

    config->SetProperty(PropertyId::SpeechServiceConnection_ContinuousLanguageIdPriority, "Latency");
    auto autoDetectSourceLanguageConfig = AutoDetectSourceLanguageConfig::FromLanguages({ "en-US", "zh-CN" });

    promise<void> recognitionEnd;
    // Source lang is required, but is currently NoOp 
    auto fromLanguage = "en-US";
    config->SetSpeechRecognitionLanguage(fromLanguage);
    config->AddTargetLanguage("de");
    config->AddTargetLanguage("fr");

    auto audioInput = AudioConfig::FromWavFileInput("path-to-your-audio-file.wav");
    auto recognizer = TranslationRecognizer::FromConfig(config, autoDetectSourceLanguageConfig, audioInput);

    recognizer->Recognizing.Connect([](const TranslationRecognitionEventArgs& e)
        {
            std::string lidResult = e.Result->Properties.GetProperty(PropertyId::SpeechServiceConnection_AutoDetectSourceLanguageResult);

            cout << "Recognizing in Language = "<< lidResult << ":" << e.Result->Text << std::endl;
            for (const auto& it : e.Result->Translations)
            {
                cout << "  Translated into '" << it.first.c_str() << "': " << it.second.c_str() << std::endl;
            }
        });

    recognizer->Recognized.Connect([](const TranslationRecognitionEventArgs& e)
        {
            if (e.Result->Reason == ResultReason::TranslatedSpeech)
            {
                std::string lidResult = e.Result->Properties.GetProperty(PropertyId::SpeechServiceConnection_AutoDetectSourceLanguageResult);
                cout << "RECOGNIZED in Language = " << lidResult << ": Text=" << e.Result->Text << std::endl;
            }
            else if (e.Result->Reason == ResultReason::RecognizedSpeech)
            {
                cout << "RECOGNIZED: Text=" << e.Result->Text << " (text could not be translated)" << std::endl;
            }
            else if (e.Result->Reason == ResultReason::NoMatch)
            {
                cout << "NOMATCH: Speech could not be recognized." << std::endl;
            }

            for (const auto& it : e.Result->Translations)
            {
                cout << "  Translated into '" << it.first.c_str() << "': " << it.second.c_str() << std::endl;
            }
        });

    recognizer->Canceled.Connect([&recognitionEnd](const TranslationRecognitionCanceledEventArgs& e)
        {
            cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
            if (e.Reason == CancellationReason::Error)
            {
                cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << std::endl;
                cout << "CANCELED: ErrorDetails=" << e.ErrorDetails << std::endl;
                cout << "CANCELED: Did you update the subscription info?" << std::endl;

                recognitionEnd.set_value();
            }
        });

    recognizer->Synthesizing.Connect([](const TranslationSynthesisEventArgs& e)
        {
            auto size = e.Result->Audio.size();
            cout << "Translation synthesis result: size of audio data: " << size
                << (size == 0 ? "(END)" : "");
        });

    recognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
        {
            cout << "Session stopped.";
            recognitionEnd.set_value();
        });

    // Starts continuos recognition. Use StopContinuousRecognitionAsync() to stop recognition.
    recognizer->StartContinuousRecognitionAsync().get();
    recognitionEnd.get_future().get();
    recognizer->StopContinuousRecognitionAsync().get();
}

En av huvudfunktionerna i Taltjänsten är möjligheten att känna igen mänskligt tal och översätta det till andra språk. I den här snabbstarten lär du dig hur du använder Speech SDK i dina appar och produkter för att utföra talöversättning av hög kvalitet. I den här snabbstarten går vi bland annat:

  • Översätta tal till text
  • Översätta tal till flera målspråk
  • Utföra direkt tal till tal-översättning

Gå vidare till exempel på GitHub

Om du vill hoppa direkt till exempelkod kan du se Java-snabbstartsexempel på GitHub.

Förutsättningar

Den här artikeln förutsätter att du har ett Azure-konto och en prenumeration på Speech-tjänsten. Om du inte har ett konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.

Installera Speech SDK

Innan du kan göra något måste du installera Speech SDK. Beroende på din plattform följer du anvisningarna under avsnittet Hämta Speech SDK i artikeln Om Speech SDK.

Importera beroenden

Om du vill köra exemplen i den här artikeln inkluderar import du följande -instruktioner överst i *. Java-kodfil.

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

Känsliga data och miljövariabler

Exempelkällkoden i den här artikeln beror på miljövariabler för lagring av känsliga data, till exempel prenumerationsnyckeln för Speech-resursen och regionen. Java-kodfilen innehåller två static final String värden som tilldelas från värddatorerna miljövariabler, SPEECH__SUBSCRIPTION__KEY nämligen och SPEECH__SERVICE__REGION . Båda dessa fält finns i klassomfånget, vilket gör dem tillgängliga i metodens text i klassen. Mer information om miljövariabler finns i miljövariabler och programkonfiguration.

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

Skapa en talöversättningskonfiguration

Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechTranslationConfig . Den här klassen innehåller information om din prenumeration, till exempel din nyckel och tillhörande region, slutpunkt, värd eller auktoriseringstoken.

Tips

Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.

Det finns några olika sätt att initiera en SpeechTranslationConfig :

  • Med en prenumeration: skicka in en nyckel och den associerade regionen.
  • Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En nyckel eller auktoriseringstoken är valfri.
  • Med en värd: skicka in en värdadress. En nyckel eller auktoriseringstoken är valfri.
  • Med en auktoriseringstoken: skicka en auktoriseringstoken och den associerade regionen.

Låt oss ta en titt på hur en SpeechTranslationConfig skapas med hjälp av en nyckel och region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt.

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

Ändra källspråk

En vanlig uppgift för talöversättning är att ange indataspråket (eller källan). Låt oss ta en titt på hur du skulle ändra indataspråket till italienska. Interagera med -instansen i SpeechTranslationConfig koden och anropa metoden setSpeechRecognitionLanguage .

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

Funktionen setSpeechRecognitionLanguage förväntar sig en språkspråkssträng. Du kan ange ett värde i kolumnen Språk i listan över språk som stöds.

Lägga till översättningsspråk

En annan vanlig uppgift för talöversättning är att ange målöversättningsspråk, minst ett krävs men multiplar stöds. Följande kodfragment anger både franska och tyska som mål för översättningsspråket.

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

Vid varje anrop addTargetLanguage till anges ett nytt målöversättningsspråk. När tal identifieras från källspråket är med andra ord varje målöversättning tillgänglig som en del av den resulterande översättningsåtgärden.

Initiera en översättnings igenknnare

När du har skapat en SpeechTranslationConfig är nästa steg att initiera en TranslationRecognizer . När du initierar TranslationRecognizer en måste du skicka den till translationConfig . Konfigurationsobjektet tillhandahåller de autentiseringsuppgifter som speech-tjänsten kräver för att verifiera din begäran.

Om du känner igen tal med enhetens standardmi mikrofon bör du se ut så TranslationRecognizer här:

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

Om du vill ange enheten för ljudinspelning måste du skapa en och ange AudioConfig audioConfig parametern när du initierar TranslationRecognizer din .

Först refererar du till AudioConfig -objektet på följande sätt:

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

Om du vill tillhandahålla en ljudfil i stället för att använda en mikrofon måste du fortfarande ange en audioConfig . Men när du skapar en AudioConfig , i stället för att anropa , fromDefaultMicrophoneInput anropar du och skickar fromWavFileInput filename parametern .

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

Översätt tal

För att översätta tal förlitar sig Speech SDK på en mikrofon eller en ljudfilsinmatning. Taligenkänning sker före talöversättning. När alla objekt har initierats anropar du funktionen recognize-once och hämtar resultatet.

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

Mer information om tal till text finns i grunderna för taligenkänning.

Syntetisera översättningar

Efter en lyckad taligenkänning och översättning innehåller resultatet alla översättningar i en ordlista. Funktionen getTranslations returnerar en ordlista med nyckeln som målöversättningsspråk och värdet är den översatta texten. Identifierat tal kan översättas och sedan syntetiseras på ett annat språk (tal till tal).

Händelsebaserad syntes

Objektet TranslationRecognizer exponerar en synthesizing händelse. Händelsen utbrandas flera gånger och ger en mekanism för att hämta det syntetiserade ljudet från översättningsigenkänningsresultatet. Om du översätter till flera språk kan du läsa manuell syntes. Ange syntesrösten genom att tilldela setVoiceName en och tillhandahålla en händelsehanterare för händelsen och hämta synthesizing ljudet. I följande exempel sparas det översatta ljudet som en WAV-fil.

Viktigt

Den händelsebaserade syntesen fungerar bara med en enda översättning, lägg inte till flera målöversättningsspråk. Dessutom bör vara setVoiceName samma språk som målöversättningsspråket, till exempel; "de" kan mappas till "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);
            }
        }
    }
}

Manuell syntes

Funktionen getTranslations returnerar en ordlista som kan användas för att syntetisera ljud från översättningstexten. Iterera genom varje översättning och syntetisera översättningen. När du SpeechSynthesizer skapar en -instans måste objektet ha egenskapen SpeechConfig inställd på önskad setSpeechSynthesisVoiceName röst. Följande exempel översätts till fem språk, och varje översättning syntetiseras sedan till en ljudfil på motsvarande neurala språk.

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

Mer information om talsyntes finns i grunderna i talsyntes.

En av huvudfunktionerna i taltjänsten är möjligheten att känna igen mänskligt tal och översätta det till andra språk. I den här snabbstarten lär du dig att använda Speech SDK i dina appar och produkter för att utföra talöversättning av hög kvalitet. Den här snabbstarten beskriver bland annat följande:

  • Översätta tal till text
  • Översätta tal till flera målspråk
  • Utföra direkt tal till tal-översättning

Hoppa till exempel på GitHub

Om du vill hoppa direkt till exempelkoden kan du gå till Snabbstartsexempel för JavaScript på GitHub.

Förutsättningar

Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.

Installera Speech SDK

Innan du kan göra något måste du installera Speech SDK för JavaScript. Följ anvisningarna nedan beroende på din plattform:

Beroende på målmiljön kan du dessutom använda något av följande:

Ladda ned och extrahera Speech SDK för JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js och placera den i en mapp som är tillgänglig för HTML-filen.

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

Tips

Om du riktar in dig på en webbläsare och använder <script> taggen sdk behövs inte prefixet . Prefixet sdk är ett alias som används för att namnge require modulen.

Skapa en översättningskonfiguration

Om du vill anropa översättningstjänsten med hjälp av Speech SDK måste du skapa en SpeechTranslationConfig . Den här klassen innehåller information om din prenumeration, till exempel din nyckel och tillhörande region, slutpunkt, värd eller auktoriseringstoken.

Anteckning

Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration. Det finns några sätt att initiera en SpeechTranslationConfig :

  • Med en prenumeration: skicka en nyckel och den associerade regionen.
  • Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En nyckel eller auktoriseringstoken är valfri.
  • Med en värd: skicka in en värdadress. En nyckel eller auktoriseringstoken är valfri.
  • Med en auktoriseringstoken: skicka en auktoriseringstoken och den associerade regionen.

Låt oss ta en titt på hur en SpeechTranslationConfig skapas med hjälp av en nyckel och region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt.

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

Initiera en översättning

När du har skapat en SpeechTranslationConfig är nästa steg att initiera en TranslationRecognizer . När du TranslationRecognizer initierar en måste du skicka den till speechTranslationConfig . Detta ger de autentiseringsuppgifter som översättningstjänsten kräver för att verifiera din begäran.

Om du översätter tal som tillhandahålls via enhetens standardmi mikrofon bör du se ut så TranslationRecognizer här:

const translator = new TranslationRecognizer(speechTranslationConfig);

Om du vill ange enheten för ljudinspelning måste du skapa en och ange AudioConfig audioConfig parametern när du initierar TranslationRecognizer din .

Tips

Lär dig hur du hämtar enhets-ID:t för din enhet för ljudinspelning. Referera till AudioConfig objektet på följande sätt:

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

Om du vill ange en ljudfil i stället för att använda en mikrofon måste du fortfarande ange en audioConfig . Detta kan dock bara göras när du Node.js och när du skapar en , i stället för att anropa , anropar AudioConfig du och skickar fromDefaultMicrophoneInput fromWavFileOutput filename parametern .

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

Översätt tal

TranslationRecognizer-klassen för Speech SDK för JavaScript exponerar några metoder som du kan använda för talöversättning.

  • Översättning (asynkron) vid start – Utför översättning i ett icke-blockerande (asynkront) läge. Detta översätter ett enda uttryck. Slutet på ett enda uttryck bestäms genom att lyssna efter tystnad i slutet eller tills högst 15 sekunders ljud bearbetas.
  • Kontinuerlig översättning (asynkron) – Asynkront initierar kontinuerlig översättning. Användaren registrerar sig för händelser och hanterar olika program tillstånd. Om du vill stoppa asynkron kontinuerlig översättning anropar du stopContinuousRecognitionAsync .

Anteckning

Läs mer om hur du väljer ett taligenkänningsläge.

Ange ett målspråk

För att översätta måste du ange både ett källspråk och minst ett målspråk. Du kan välja ett källspråk med hjälp av ett språk som anges i talöversättningstabellen. Hitta dina alternativ för översatt språk på samma länk. Alternativen för målspråk skiljer sig åt när du vill visa text eller vill höra syntetiserat översatt tal. Om du vill översätta från engelska till tyska ändrar du översättningskonfigurationsobjektet:

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

Startigenkänning

Här är ett exempel på asynkron översättning i början med hjälp av recognizeOnceAsync :

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

Du måste skriva kod för att hantera resultatet. Det här exemplet utvärderar result.reason för en översättning till tyska:

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

Din kod kan också hantera uppdateringar som tillhandahålls medan översättningen bearbetas. Du kan använda dessa uppdateringar för att ge visuell feedback om översättningsförloppet. Se det här JavaScriptNode.js exempel för exempelkod som visar uppdateringar som tillhandahålls under översättningsprocessen. Följande kod visar även information som produceras under översättningsprocessen.

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

Kontinuerlig översättning

Kontinuerlig översättning är lite mer inblandat än vid början av igenkänningen. Det kräver att du prenumererar på recognizing händelserna , och för att få recognized canceled igenkänningsresultatet. Om du vill stoppa översättningen måste du anropa stopContinuousRecognitionAsync . Här är ett exempel på hur kontinuerlig översättning utförs på en ljudindatafil.

Vi börjar med att definiera indata och initiera ett TranslationRecognizer :

const translator = new TranslationRecognizer(speechTranslationConfig);

Vi prenumererar på de händelser som skickas från TranslationRecognizer .

  • recognizing: Signal för händelser som innehåller mellanliggande översättningsresultat.
  • recognized: Signal för händelser som innehåller slutliga översättningsresultat (som indikerar ett lyckat översättningsförsök).
  • sessionStopped: Signal för händelser som anger slutet av en översättningssession (åtgärd).
  • canceled: Signal för händelser som innehåller annullerade översättningsresultat (som anger ett översättningsförsök som avbröts som ett resultat eller en begäran om direkt annullering eller, alternativt, ett transport- eller protokollfel).
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();
};

När allt har ställts in kan vi anropa startContinuousRecognitionAsync .

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

Välj ett källspråk

En vanlig uppgift för talöversättning är att ange indataspråket (eller källan). Låt oss ta en titt på hur du skulle ändra indataspråket till italienska. Leta upp din i koden SpeechTranslationConfig och lägg sedan till följande rad direkt under den.

speechTranslationConfig.speechRecognitionLanguage = "it-IT";

Egenskapen speechRecognitionLanguage förväntar sig en formatsträng med språkspråk. Du kan ange ett värde i kolumnen Språk i listan över språk som stöds.

Välj ett eller flera målspråk

Speech SDK kan översättas till flera målspråk parallellt. De tillgängliga målspråken skiljer sig något från källspråklistan och du anger målspråk med hjälp av en språkkod i stället för ett språk. Se en lista över språkkoder för textmål i talöversättningstabellen på språksupportsidan. Du kan också hitta information om översättning till syntetiserade språk där.

Följande kod lägger till tyska som målspråk:

translationConfig.addTargetLanguage("de");

Eftersom flera översättningar av målspråk är möjliga måste koden ange målspråket när resultatet undersöks. Följande kod hämtar översättningsresultat för tyska.

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

En av huvudfunktionerna i taltjänsten är möjligheten att känna igen mänskligt tal och översätta det till andra språk. I den här snabbstarten lär du dig att använda Speech SDK i dina appar och produkter för att utföra talöversättning av hög kvalitet. Den här snabbstarten beskriver bland annat följande:

  • Översätta tal till text
  • Översätta tal till flera målspråk
  • Utföra direkt tal till tal-översättning

Hoppa till exempel på GitHub

Om du vill hoppa direkt till exempelkoden kan du gå till Python-snabbstartsexempel på GitHub.

Förutsättningar

Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.

Installera Speech SDK

Innan du kan göra något måste du installera Speech SDK. Beroende på din plattform följer du anvisningarna i avsnittet Hämta Speech SDK i artikeln Om Speech SDK.

Importera beroenden

Om du vill köra exemplen i den här artikeln inkluderar import du följande instruktioner överst i Python-kodfilen.

import os
import azure.cognitiveservices.speech as speechsdk

Känsliga data och miljövariabler

Exempelkällkoden i den här artikeln är beroende av miljövariabler för lagring av känsliga data, till exempel prenumerationsnyckeln för Speech-resursen och regionen. Python-kodfilen innehåller två värden som tilldelas från värddatorerna miljövariabler, SPEECH__SUBSCRIPTION__KEY nämligen och SPEECH__SERVICE__REGION . Båda dessa variabler finns i det globala omfånget, vilket gör dem tillgängliga inom funktionsdefinitionen för kodfilen. Mer information om miljövariabler finns i miljövariabler och programkonfiguration.

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

Skapa en konfiguration för talöversättning

Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechTranslationConfig . Den här klassen innehåller information om din prenumeration, till exempel din nyckel och tillhörande region, slutpunkt, värd eller auktoriseringstoken.

Tips

Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.

Det finns några sätt att initiera en SpeechTranslationConfig :

  • Med en prenumeration: skicka en nyckel och den associerade regionen.
  • Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En nyckel eller auktoriseringstoken är valfri.
  • Med en värd: skicka in en värdadress. En nyckel eller auktoriseringstoken är valfri.
  • Med en auktoriseringstoken: skicka en auktoriseringstoken och den associerade regionen.

Låt oss ta en titt på hur en SpeechTranslationConfig skapas med hjälp av en nyckel och region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt.

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

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

Ändra källspråk

En vanlig uppgift för talöversättning är att ange indataspråket (eller källan). Låt oss ta en titt på hur du skulle ändra indataspråket till italienska. Interagera med instansen i SpeechTranslationConfig koden och tilldela den till egenskapen 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

Egenskapen speech_recognition_language förväntar sig en formatsträng med språkspråk. Du kan ange ett värde i kolumnen Språk i listan över språk som stöds.

Lägga till översättningsspråk

En annan vanlig uppgift för talöversättning är att ange målöversättningsspråk, minst ett krävs men multiplar stöds. Följande kodfragment anger både franska och tyska som mål för översättningsspråket.

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

Vid varje anrop add_target_language till anges ett nytt målöversättningsspråk. När tal identifieras från källspråket är med andra ord varje målöversättning tillgänglig som en del av den resulterande översättningsåtgärden.

Initiera en översättnings recognizer

När du har skapat en SpeechTranslationConfig är nästa steg att initiera en TranslationRecognizer . När du TranslationRecognizer initierar en måste du skicka den till translation_config . Konfigurationsobjektet tillhandahåller de autentiseringsuppgifter som taltjänsten kräver för att verifiera din begäran.

Om du känner igen tal med enhetens standardmi mikrofon bör du se ut så TranslationRecognizer här:

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)

Om du vill ange enheten för ljudinspelning måste du skapa en och ange AudioConfig audio_config parametern när du initierar TranslationRecognizer din .

Först refererar du till AudioConfig objektet på följande sätt:

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)

Om du vill ange en ljudfil i stället för att använda en mikrofon måste du fortfarande ange en audioConfig . Men när du skapar en AudioConfig , i stället för att anropa med , use_default_microphone=True anropar du med och anger filename="path-to-file.wav" filename parametern .

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)

Översätt tal

Vid översättning av tal förlitar sig Speech SDK på en mikrofon- eller en ljudfilsinmatning. Taligenkänning sker före talöversättning. När alla objekt har initierats anropar du funktionen recognize-once och hämtar resultatet.

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

Mer information om tal till text finns i grunderna för taligenkänning.

Syntetisera översättningar

Efter en lyckad taligenkänning och översättning innehåller resultatet alla översättningar i en ordlista. translationsOrdlistenyckeln är målöversättningsspråket och värdet är den översatta texten. Identifierat tal kan översättas och sedan syntetiseras på ett annat språk (tal till tal).

Händelsebaserad syntes

Objektet TranslationRecognizer exponerar en Synthesizing händelse. Händelsen utbrandas flera gånger och ger en mekanism för att hämta det syntetiserade ljudet från översättningsigenkänningsresultatet. Om du översätter till flera språk kan du läsa manuell syntes. Ange syntesrösten genom att tilldela voice_name en och ange en händelsehanterare för händelsen och hämta Synthesizing ljudet. I följande exempel sparas det översatta ljudet som en WAV-fil.

Viktigt

Den händelsebaserade syntesen fungerar bara med en enda översättning, lägg inte till flera målöversättningsspråk. Dessutom bör vara voice_name samma språk som målöversättningsspråket, till exempel; kan "de" mappas till "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()

Manuell syntes

Ordlistan translations kan användas för att syntetisera ljud från översättningstexten. Iterera genom varje översättning och syntetisera översättningen. När du skapar SpeechSynthesizer en instans måste objektet ha egenskapen inställd på önskad SpeechConfig speech_synthesis_voice_name röst. Följande exempel översätts till fem språk, och varje översättning syntetiseras sedan till en ljudfil i motsvarande neurala språk.

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

Mer information om talsyntes finns i grunderna för talsyntes.

En av huvudfunktionerna i taltjänsten är möjligheten att känna igen mänskligt tal och översätta det till andra språk. I den här snabbstarten lär du dig att använda Speech SDK i dina appar och produkter för att utföra talöversättning av hög kvalitet. Den här snabbstarten översätter tal från mikrofonen till text på ett annat språk.

Förutsättningar

Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.

Hämta och installera

Följ dessa steg för att installera Speech CLI på Windows:

  1. På Windows behöver du Microsoft Visual C++ Redistributable för Visual Studio 2019 för din plattform. Om du installerar detta för första gången kan det krävas en omstart.

  2. Installera .NET Core 3.1 SDK.

  3. Installera Speech CLI med NuGet genom att ange följande kommando:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    

Skriv spx för att se hjälpen för Speech CLI.

Anteckning

Som ett alternativ till NuGet kan du ladda ned och extrahera Speech CLI för Windows som en zip-fil.

Teckenbegränsningar

På Windows kan Speech CLI endast visa teckensnitt som är tillgängliga för kommandotolken på den lokala datorn. Windows-terminal alla teckensnitt som produceras interaktivt av Speech CLI.

Om du matar ut till en fil kan en textredigerare som Anteckningar eller en webbläsare som Microsoft Edge också visa alla teckensnitt.

Ange käll- och målspråk

Det här kommandot anropar Speech CLI för att översätta tal från mikrofonen från italienska till franska.

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

Nästa steg