Share via


Come riconoscere e tradurre il parlato

Documentazione di riferimento | Pacchetto (NuGet) | Altri esempi in GitHub

In questa guida pratica si apprenderà come riconoscere il parlato umano e tradurlo in un'altra lingua.

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione vocale in testo
  • Traduzione vocale in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Dati sensibili e variabili di ambiente

Il codice sorgente di esempio in questo articolo dipende dalle variabili di ambiente per l'archiviazione di dati sensibili, ad esempio la chiave e l'area della risorsa Voce. La Program classe contiene due static readonly string valori assegnati dalle variabili di ambiente del computer host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Entrambi questi campi si trovano nell'ambito della classe, quindi sono accessibili all'interno dei corpi del metodo della classe :

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

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

Per altre informazioni sulle variabili di ambiente, vedere Variabili di ambiente e configurazione dell'applicazione.

Creare una configurazione di traduzione vocale

Per chiamare il servizio Voce con Speech SDK, è necessario creare un’istanza di SpeechTranslationConfig. Questa classe include informazioni sulla sottoscrizione, ad esempio la chiave e l'area associata, l'endpoint, l'host o il token di autorizzazione.

Suggerimento

Sia che si esegua il riconoscimento vocale, la sintesi vocale, la traduzione o il riconoscimento finalità, sarà sempre necessario creare una configurazione.

È possibile inizializzare SpeechTranslationConfig in diversi modi:

  • Con una sottoscrizione: passare una chiave e l'area associata.
  • Con un endpoint: passare un endpoint del servizio Voce. La chiave e il token di autorizzazione sono facoltativi.
  • Con un host: passare l'indirizzo di un host. La chiave e il token di autorizzazione sono facoltativi.
  • Con un token di autorizzazione: passare un token di autorizzazione e l'area associata.

Si esaminerà ora come creare un'istanza usando una chiave e un'area SpeechTranslationConfig . Ottenere la chiave e l'area della risorsa Voce nel portale di Azure.

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

    static Task Main() => TranslateSpeechAsync();

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

Modificare la lingua di origine

Un'attività comune della traduzione vocale consiste nell'specificare la lingua di input (o di origine). Nell'esempio seguente viene illustrato come modificare la lingua di input in italiano. Nel codice interagire con l'istanza SpeechTranslationConfig assegnandola alla SpeechRecognitionLanguage proprietà :

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

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

La proprietà SpeechRecognitionLanguage si aspetta una stringa in formato è prevista una stringa di formato lingua-impostazioni locali. Fare riferimento all'elenco delle impostazioni locali supportate per la traduzione vocale.

Aggiungere una lingua di traduzione

Un altro compito comune della traduzione vocale consiste nel specificare le lingue di traduzione di destinazione. Almeno uno è obbligatorio, ma sono supportati più. Il frammento di codice seguente imposta sia il francese che il tedesco come destinazione della lingua di traduzione:

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 ogni chiamata a AddTargetLanguage, viene specificata una nuova lingua di traduzione di destinazione. In altre parole, quando il riconoscimento vocale viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile come parte dell'operazione di traduzione risultante.

Inizializzare un riconoscitore di traduzione

Dopo aver creato un'istanza SpeechTranslationConfig , il passaggio successivo consiste nell'inizializzare TranslationRecognizer. Quando si inizializza TranslationRecognizer, è necessario passarlo all'istanza speechTranslationConfig . L'oggetto di configurazione fornisce le credenziali richieste dal servizio Voce per convalidare la richiesta.

Se si riconosce il riconoscimento vocale usando il microfono predefinito del dispositivo, ecco l'aspetto dell'istanza TranslationRecognizer :

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

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

    using var translationRecognizer = new TranslationRecognizer(speechTranslationConfig);
}

Se si vuole specificare il dispositivo di input audio, è necessario creare un'istanza AudioConfig della classe e specificare il parametro durante l'inizializzazione audioConfig di TranslationRecognizer.

Per prima cosa, fare riferimento all'oggetto AudioConfig come segue:

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

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

Se vuoi fornire un file audio invece di usare un microfono, devi comunque specificare un audioConfig parametro. Tuttavia, quando si crea un'istanza AudioConfig di classe, anziché chiamare FromDefaultMicrophoneInput, si chiama FromWavFileInput e si passa il filename parametro :

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

Traduzione vocale

Per tradurre il parlato, Speech SDK si basa su un microfono o su un input di file audio. Il riconoscimento vocale viene eseguito prima della traduzione vocale. Dopo l'inizializzazione di tutti gli oggetti, chiamare la funzione recognize-once e ottenere il risultato:

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

Per altre informazioni sul riconoscimento vocale, vedere le nozioni di base sul riconoscimento vocale.

Traduzione basata su eventi

L'oggetto TranslationRecognizer espone un Recognizing evento. L'evento viene generato più volte e fornisce un meccanismo per recuperare i risultati intermedi della traduzione.

Nota

I risultati intermedi della traduzione non sono disponibili quando si usa la traduzione vocale multilingue.

Nell'esempio seguente i risultati intermedi della traduzione sono stampati nella console:

using (var audioInput = AudioConfig.FromWavFileInput(@"whatstheweatherlike.wav"))
{
    using (var translationRecognizer = new TranslationRecognizer(config, audioInput))
    {
        // Subscribes to events.
        translationRecognizer.Recognizing += (s, e) =>
        {
            Console.WriteLine($"RECOGNIZING in '{fromLanguage}': Text={e.Result.Text}");
            foreach (var element in e.Result.Translations)
            {
                Console.WriteLine($"    TRANSLATING into '{element.Key}': {element.Value}");
            }
        };

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

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

        // Waits for completion.
        // Use Task.WaitAny to keep the task rooted.
        Task.WaitAny(new[] { stopTranslation.Task });

        // Stops translation.
        await translationRecognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
    }
}

Sintetizzare le traduzioni

Dopo aver completato correttamente il riconoscimento vocale e la traduzione, il risultato include tutte le traduzioni in un dizionario. La Translations chiave del dizionario è la lingua di traduzione di destinazione e il valore è il testo tradotto. Il riconoscimento vocale può essere tradotto e quindi sintetizzato in una lingua diversa (riconoscimento vocale).

Sintesi basata su eventi

L'oggetto TranslationRecognizer espone un Synthesizing evento. L'evento viene generato più volte e fornisce un meccanismo per recuperare l'audio sintetizzato dal risultato del riconoscimento della traduzione. Se stai traducendo in più lingue, vedi Sintesi manuale.

Specificare la voce di sintesi assegnando un'istanza VoiceName e specificando un gestore eventi per l'evento per ottenere l'audio Synthesizing . L'esempio seguente salva l'audio tradotto come file .wav.

Importante

La sintesi basata su eventi funziona solo con una singola traduzione. Non aggiungere più lingue di traduzione di destinazione. Inoltre, il VoiceName valore deve essere la stessa lingua della lingua di traduzione di destinazione. Ad esempio, "de" potrebbe eseguire il mapping 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]}");
    }
}

Sintesi manuale

È possibile usare il Translations dizionario per sintetizzare l'audio dal testo di traduzione. Scorrere ogni traduzione e sintetizzarla. Quando si crea un'istanza SpeechSynthesizer , l'oggetto SpeechConfig deve avere la relativa SpeechSynthesisVoiceName proprietà impostata sulla voce desiderata.

Nell'esempio seguente vengono convertite in cinque lingue. Ogni traduzione viene quindi sintetizzata in un file audio nel linguaggio neurale corrispondente.

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

Per altre informazioni sulla sintesi vocale, vedere le nozioni di base della sintesi vocale.

Traduzione multilingue con identificazione della lingua

In molti scenari, è possibile che non si conoscano le lingue di input da specificare. Usando l'identificazione della lingua è possibile rilevare fino a 10 lingue di input possibili e tradurre automaticamente nelle lingue di destinazione.

L'esempio seguente prevede che en-US o zh-CN deve essere rilevato perché sono definiti in AutoDetectSourceLanguageConfig. Il riconoscimento vocale viene quindi tradotto in de e fr come specificato nelle chiamate 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);

Per un esempio di codice completo, vedere Identificazione della lingua.

Traduzione vocale multilingue senza candidati per la lingua di origine

La traduzione vocale multilingue implementa un nuovo livello di tecnologia di traduzione vocale che sblocca varie funzionalità, tra cui la mancata lingua di input specificata e la gestione delle opzioni della lingua all'interno della stessa sessione. Queste funzionalità consentono un nuovo livello di poteri di traduzione vocale che possono essere implementati nei prodotti.

Attualmente quando si usa l'ID lingua con la traduzione vocale, è necessario creare l'oggetto SpeechTranslationConfig dall'endpoint v2. Sostituire la stringa "YourServiceRegion" con l'area della risorsa Voce, ad esempio "westus". Sostituire "YourSubscriptionKey" con la chiave della risorsa Voce.

var v2EndpointInString = String.Format("wss://{0}.stt.speech.microsoft.com/speech/universal/v2", "YourServiceRegion");
var v2EndpointUrl = new Uri(v2EndpointInString);
var speechTranslationConfig = SpeechTranslationConfig.FromEndpoint(v2EndpointUrl, "YourSubscriptionKey");

Specificare le lingue di destinazione della traduzione. Sostituire con le lingue desiderate. È possibile aggiungere altre righe.

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

Un differenziatore chiave con la traduzione vocale multilingue è che non è necessario specificare la lingua di origine. Ciò è dovuto al fatto che il servizio rileverà automaticamente la lingua di origine. Creare l'oggetto AutoDetectSourceLanguageConfig con il fromOpenRange metodo per informare il servizio che si vuole usare la traduzione vocale multilingue senza una lingua specificata.

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

Per un esempio di codice completo con Speech SDK, vedere esempi di traduzione vocale in GitHub.

Documentazione di riferimento | Pacchetto (NuGet) | Altri esempi in GitHub

In questa guida pratica si apprenderà come riconoscere il parlato umano e tradurlo in un'altra lingua.

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione vocale in testo
  • Traduzione vocale in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Dati sensibili e variabili di ambiente

Il codice sorgente di esempio in questo articolo dipende dalle variabili di ambiente per l'archiviazione di dati sensibili, ad esempio la chiave e l'area della risorsa Voce. Il file di codice C++ contiene due valori stringa assegnati dalle variabili di ambiente del computer host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Entrambi questi campi si trovano nell'ambito della classe, quindi sono accessibili all'interno dei corpi del metodo della classe :

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

Per altre informazioni sulle variabili di ambiente, vedere Variabili di ambiente e configurazione dell'applicazione.

Creare una configurazione di traduzione vocale

Per chiamare il servizio Voce con Speech SDK, è necessario creare un’istanza di SpeechTranslationConfig. Questa classe include informazioni sulla sottoscrizione, ad esempio la chiave e l'area associata, l'endpoint, l'host o il token di autorizzazione.

Suggerimento

Sia che si esegua il riconoscimento vocale, la sintesi vocale, la traduzione o il riconoscimento finalità, sarà sempre necessario creare una configurazione.

È possibile inizializzare SpeechTranslationConfig in diversi modi:

  • Con una sottoscrizione: passare una chiave e l'area associata.
  • Con un endpoint: passare un endpoint del servizio Voce. La chiave e il token di autorizzazione sono facoltativi.
  • Con un host: passare l'indirizzo di un host. La chiave e il token di autorizzazione sono facoltativi.
  • Con un token di autorizzazione: passare un token di autorizzazione e l'area associata.

Si esaminerà ora come creare un'istanza usando una chiave e un'area SpeechTranslationConfig . Ottenere la chiave e l'area della risorsa Voce nel portale di Azure.

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

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

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

Modificare la lingua di origine

Un'attività comune della traduzione vocale consiste nell'specificare la lingua di input (o di origine). Nell'esempio seguente viene illustrato come modificare la lingua di input in italiano. Nel codice interagire con l'istanza SpeechTranslationConfig chiamando il SetSpeechRecognitionLanguage metodo .

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

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

La proprietà SpeechRecognitionLanguage si aspetta una stringa in formato è prevista una stringa di formato lingua-impostazioni locali. Fare riferimento all'elenco delle impostazioni locali supportate per la traduzione vocale.

Aggiungere una lingua di traduzione

Un altro compito comune della traduzione vocale consiste nel specificare le lingue di traduzione di destinazione. Almeno uno è obbligatorio, ma sono supportati più. Il frammento di codice seguente imposta sia il francese che il tedesco come destinazione della lingua di traduzione:

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

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

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

Con ogni chiamata a AddTargetLanguage, viene specificata una nuova lingua di traduzione di destinazione. In altre parole, quando il riconoscimento vocale viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile come parte dell'operazione di traduzione risultante.

Inizializzare un riconoscitore di traduzione

Dopo aver creato un'istanza SpeechTranslationConfig , il passaggio successivo consiste nell'inizializzare TranslationRecognizer. Quando si inizializza TranslationRecognizer, è necessario passarlo all'istanza translationConfig . L'oggetto di configurazione fornisce le credenziali richieste dal servizio Voce per convalidare la richiesta.

Se si riconosce il riconoscimento vocale usando il microfono predefinito del dispositivo, ecco l'aspetto TranslationRecognizer seguente:

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

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

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

Se si vuole specificare il dispositivo di input audio, è necessario creare un'istanza AudioConfig della classe e specificare il parametro durante l'inizializzazione audioConfig di TranslationRecognizer.

Per prima cosa, fare riferimento all'oggetto AudioConfig come segue:

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

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

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

Se vuoi fornire un file audio invece di usare un microfono, devi comunque specificare un audioConfig parametro. Tuttavia, quando si crea un'istanza AudioConfig di classe, anziché chiamare FromDefaultMicrophoneInput, si chiama FromWavFileInput e si passa il filename parametro :

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

Traduzione vocale

Per tradurre il parlato, Speech SDK si basa su un microfono o su un input di file audio. Il riconoscimento vocale viene eseguito prima della traduzione vocale. Dopo l'inizializzazione di tutti gli oggetti, chiamare la funzione recognize-once e ottenere il risultato:

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

Per altre informazioni sul riconoscimento vocale, vedere le nozioni di base sul riconoscimento vocale.

Sintetizzare le traduzioni

Dopo aver completato correttamente il riconoscimento vocale e la traduzione, il risultato include tutte le traduzioni in un dizionario. La Translations chiave del dizionario è la lingua di traduzione di destinazione e il valore è il testo tradotto. Il riconoscimento vocale può essere tradotto e quindi sintetizzato in una lingua diversa (riconoscimento vocale).

Sintesi basata su eventi

L'oggetto TranslationRecognizer espone un Synthesizing evento. L'evento viene generato più volte e fornisce un meccanismo per recuperare l'audio sintetizzato dal risultato del riconoscimento della traduzione. Se stai traducendo in più lingue, vedi Sintesi manuale.

Specificare la voce di sintesi assegnando un'istanza SetVoiceName e specificando un gestore eventi per l'evento per ottenere l'audio Synthesizing . L'esempio seguente salva l'audio tradotto come file .wav.

Importante

La sintesi basata su eventi funziona solo con una singola traduzione. Non aggiungere più lingue di traduzione di destinazione. Inoltre, il SetVoiceName valore deve essere la stessa lingua della lingua di traduzione di destinazione. Ad esempio, "de" potrebbe eseguire il mapping 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;
        }
    }
}

Sintesi manuale

È possibile usare il Translations dizionario per sintetizzare l'audio dal testo di traduzione. Scorrere ogni traduzione e sintetizzarla. Quando si crea un'istanza SpeechSynthesizer , l'oggetto SpeechConfig deve avere la relativa SetSpeechSynthesisVoiceName proprietà impostata sulla voce desiderata.

Nell'esempio seguente vengono convertite in cinque lingue. Ogni traduzione viene quindi sintetizzata in un file audio nel linguaggio neurale corrispondente.

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

Per altre informazioni sulla sintesi vocale, vedere le nozioni di base della sintesi vocale.

Traduzione multilingue con identificazione della lingua

In molti scenari, è possibile che non si conoscano le lingue di input da specificare. Usando l'identificazione della lingua è possibile rilevare fino a 10 lingue di input possibili e tradurre automaticamente nelle lingue di destinazione.

L'esempio seguente prevede che en-US o zh-CN deve essere rilevato perché sono definiti in AutoDetectSourceLanguageConfig. Quindi, il riconoscimento vocale verrà tradotto in de e fr come specificato nelle chiamate a AddTargetLanguage().

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

Per un esempio di codice completo, vedere Identificazione della lingua.

Documentazione di riferimento | Pacchetto (Go) | Altri esempi in GitHub

Speech SDK per Go non supporta la traduzione vocale. Selezionare un altro linguaggio di programmazione o i riferimenti a Go e gli esempi collegati dall'inizio di questo articolo.

Documentazione di riferimento | Altri esempi in GitHub

In questa guida pratica si apprenderà come riconoscere il parlato umano e tradurlo in un'altra lingua.

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione vocale in testo
  • Traduzione vocale in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Dati sensibili e variabili di ambiente

Il codice sorgente di esempio in questo articolo dipende dalle variabili di ambiente per l'archiviazione di dati sensibili, ad esempio la chiave e l'area della risorsa Voce. Il file di codice Java contiene due static final String valori assegnati dalle variabili di ambiente del computer host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Entrambi questi campi si trovano nell'ambito della classe, quindi sono accessibili all'interno dei corpi del metodo della classe :

public class App {

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

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

Per altre informazioni sulle variabili di ambiente, vedere Variabili di ambiente e configurazione dell'applicazione.

Creare una configurazione di traduzione vocale

Per chiamare il servizio Voce con Speech SDK, è necessario creare un’istanza di SpeechTranslationConfig. Questa classe include informazioni sulla sottoscrizione, ad esempio la chiave e l'area associata, l'endpoint, l'host o il token di autorizzazione.

Suggerimento

Sia che si esegua il riconoscimento vocale, la sintesi vocale, la traduzione o il riconoscimento finalità, sarà sempre necessario creare una configurazione.

È possibile inizializzare un'istanza SpeechTranslationConfig in alcuni modi:

  • Con una sottoscrizione: passare una chiave e l'area associata.
  • Con un endpoint: passare un endpoint del servizio Voce. La chiave e il token di autorizzazione sono facoltativi.
  • Con un host: passare l'indirizzo di un host. La chiave e il token di autorizzazione sono facoltativi.
  • Con un token di autorizzazione: passare un token di autorizzazione e l'area associata.

Si esaminerà ora come creare un'istanza usando una chiave e un'area SpeechTranslationConfig . Ottenere la chiave e l'area della risorsa Voce nel portale di Azure.

public class App {

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

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

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

Modificare la lingua di origine

Un'attività comune della traduzione vocale consiste nell'specificare la lingua di input (o di origine). Nell'esempio seguente viene illustrato come modificare la lingua di input in italiano. Nel codice interagire con l'istanza SpeechTranslationConfig chiamando il setSpeechRecognitionLanguage metodo :

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

La setSpeechRecognitionLanguage funzione prevede una stringa di formato delle impostazioni locali della lingua. Fare riferimento all'elenco delle impostazioni locali supportate per la traduzione vocale.

Aggiungere una lingua di traduzione

Un altro compito comune della traduzione vocale consiste nel specificare le lingue di traduzione di destinazione. Almeno uno è obbligatorio, ma sono supportati più. Il frammento di codice seguente imposta sia il francese che il tedesco come destinazione della lingua di traduzione:

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 ogni chiamata a addTargetLanguage, viene specificata una nuova lingua di traduzione di destinazione. In altre parole, quando il riconoscimento vocale viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile come parte dell'operazione di traduzione risultante.

Inizializzare un riconoscitore di traduzione

Dopo aver creato un'istanza SpeechTranslationConfig , il passaggio successivo consiste nell'inizializzare TranslationRecognizer. Quando si inizializza TranslationRecognizer, è necessario passarlo all'istanza speechTranslationConfig . L'oggetto di configurazione fornisce le credenziali richieste dal servizio Voce per convalidare la richiesta.

Se si riconosce il riconoscimento vocale usando il microfono predefinito del dispositivo, ecco l'aspetto TranslationRecognizer seguente:

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

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

Se si vuole specificare il dispositivo di input audio, è necessario creare un'istanza AudioConfig della classe e specificare il parametro durante l'inizializzazione audioConfig di TranslationRecognizer.

Per prima cosa, fare riferimento all'oggetto AudioConfig come segue:

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

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

Se vuoi fornire un file audio invece di usare un microfono, devi comunque specificare un audioConfig parametro. Tuttavia, quando si crea un'istanza AudioConfig di classe, anziché chiamare fromDefaultMicrophoneInput, si chiama fromWavFileInput e si passa il filename parametro :

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

Traduzione vocale

Per tradurre il parlato, Speech SDK si basa su un microfono o su un input di file audio. Il riconoscimento vocale viene eseguito prima della traduzione vocale. Dopo l'inizializzazione di tutti gli oggetti, chiamare la funzione recognize-once e ottenere il risultato:

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

Per altre informazioni sul riconoscimento vocale, vedere le nozioni di base sul riconoscimento vocale.

Sintetizzare le traduzioni

Dopo aver completato correttamente il riconoscimento vocale e la traduzione, il risultato include tutte le traduzioni in un dizionario. La getTranslations funzione restituisce un dizionario con la chiave come lingua di traduzione di destinazione e il valore come testo tradotto. Il riconoscimento vocale può essere tradotto e quindi sintetizzato in una lingua diversa (riconoscimento vocale).

Sintesi basata su eventi

L'oggetto TranslationRecognizer espone un synthesizing evento. L'evento viene generato più volte e fornisce un meccanismo per recuperare l'audio sintetizzato dal risultato del riconoscimento della traduzione. Se stai traducendo in più lingue, vedi Sintesi manuale.

Specificare la voce di sintesi assegnando un'istanza setVoiceName e specificando un gestore eventi per l'evento per ottenere l'audio synthesizing . L'esempio seguente salva l'audio tradotto come file .wav.

Importante

La sintesi basata su eventi funziona solo con una singola traduzione. Non aggiungere più lingue di traduzione di destinazione. Inoltre, il setVoiceName valore deve essere la stessa lingua della lingua di traduzione di destinazione. Ad esempio, "de" potrebbe eseguire il mapping 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);
            }
        }
    }
}

Sintesi manuale

La getTranslations funzione restituisce un dizionario che è possibile usare per sintetizzare l'audio dal testo di traduzione. Scorrere ogni traduzione e sintetizzarla. Quando si crea un'istanza SpeechSynthesizer , l'oggetto SpeechConfig deve avere la relativa setSpeechSynthesisVoiceName proprietà impostata sulla voce desiderata.

Nell'esempio seguente vengono convertite in cinque lingue. Ogni traduzione viene quindi sintetizzata in un file audio nel linguaggio neurale corrispondente.

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

Per altre informazioni sulla sintesi vocale, vedere le nozioni di base della sintesi vocale.

Documentazione di riferimento | Pacchetto (npm) | Altri esempi in GitHub | Codice sorgente della libreria

In questa guida pratica si apprenderà come riconoscere il parlato umano e tradurlo in un'altra lingua.

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione vocale in testo
  • Traduzione vocale in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Creare una configurazione di traduzione

Per chiamare il servizio di traduzione usando Speech SDK, è necessario creare un'istanza SpeechTranslationConfig di . Questa classe include informazioni sulla sottoscrizione, ad esempio la chiave e l'area associata, l'endpoint, l'host o il token di autorizzazione.

Nota

Sia che si esegua il riconoscimento vocale, la sintesi vocale, la traduzione o il riconoscimento finalità, sarà sempre necessario creare una configurazione.

È possibile inizializzare SpeechTranslationConfig in diversi modi:

  • Con una sottoscrizione: passare una chiave e l'area associata.
  • Con un endpoint: passare un endpoint del servizio Voce. La chiave e il token di autorizzazione sono facoltativi.
  • Con un host: passare l'indirizzo di un host. La chiave e il token di autorizzazione sono facoltativi.
  • Con un token di autorizzazione: passare un token di autorizzazione e l'area associata.

Si esaminerà ora come creare un'istanza usando una chiave e un'area SpeechTranslationConfig . Ottenere la chiave e l'area della risorsa Voce nel portale di Azure.

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

Inizializzare un traduttore

Dopo aver creato un'istanza SpeechTranslationConfig , il passaggio successivo consiste nell'inizializzare TranslationRecognizer. Quando si inizializza TranslationRecognizer, è necessario passarlo all'istanza speechTranslationConfig . L'oggetto di configurazione fornisce le credenziali richieste dal servizio di traduzione per convalidare la richiesta.

Se stai traducendo la voce fornita tramite il microfono predefinito del dispositivo, ecco l'aspetto TranslationRecognizer seguente:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

Se si vuole specificare il dispositivo di input audio, è necessario creare un'istanza AudioConfig della classe e specificare il parametro durante l'inizializzazione audioConfig di TranslationRecognizer.

Fare riferimento all'oggetto AudioConfig come indicato di seguito:

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

Se vuoi fornire un file audio invece di usare un microfono, devi comunque specificare un audioConfig parametro. Tuttavia, è possibile eseguire questa operazione solo quando si ha come destinazione Node.js. Quando si crea un'istanza AudioConfig di classe, invece di chiamare fromDefaultMicrophoneInput, chiamare fromWavFileOutput e passare il filename parametro :

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

Traduzione vocale

La classe TranslationRecognizer per Speech SDK per JavaScript espone i metodi che è possibile usare per la traduzione vocale:

  • Traduzione single-shot (asincrona): esegue la traduzione in modalità non bloccante (asincrona). Converte una singola espressione. Determina la fine di una singola espressione ascoltando il silenzio alla fine o fino a quando non viene elaborato un massimo di 15 secondi di audio.
  • Traduzione continua (asincrona): avvia in modo asincrono un'operazione di traduzione continua. L'utente esegue la registrazione agli eventi e gestisce vari stati dell'applicazione. Per arrestare la traduzione continua asincrona, chiamare stopContinuousRecognitionAsync.

Per altre informazioni su come scegliere una modalità di riconoscimento vocale, vedere Introduzione alla sintesi vocale.

Specificare una lingua di destinazione

Per tradurre, è necessario specificare sia una lingua di origine che almeno una lingua di destinazione.

È possibile scegliere una lingua di origine usando le impostazioni locali elencate nella tabella Traduzione vocale. Trovare le opzioni per la lingua tradotta nello stesso collegamento.

Le opzioni per le lingue di destinazione variano quando si vuole visualizzare il testo o si vuole ascoltare la sintesi vocale tradotta. Per tradurre dall'inglese al tedesco, modificare l'oggetto di configurazione della traduzione:

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

Riconoscimento singolo

Di seguito è riportato un esempio di traduzione asincrona a singola esecuzione tramite recognizeOnceAsync:

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

Per gestire il risultato è necessario scrivere del codice. In questo esempio viene result.reason valutata una traduzione in tedesco:

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

Il codice può anche gestire gli aggiornamenti forniti durante l'elaborazione della traduzione. È possibile usare questi aggiornamenti per fornire feedback visivo sullo stato di avanzamento della traduzione. Questo esempio di javaScript Node.js mostra questi tipi di aggiornamenti. Il codice seguente visualizza anche i dettagli generati durante il processo di traduzione:

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

Traduzione continua

La traduzione continua è un po' più coinvolta rispetto al riconoscimento single-shot. Per ottenere i risultati del riconoscimento, è necessario sottoscrivere gli eventi recognizing, recognized e canceled. Per arrestare la traduzione, è necessario chiamare stopContinuousRecognitionAsync.

Ecco un esempio di come viene eseguita la traduzione continua in un file di input audio. Per iniziare, definire l'input e inizializzare TranslationRecognizer:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

Nel codice seguente si sottoscrive gli eventi inviati da TranslationRecognizer:

  • recognizing: segnale per gli eventi che contengono risultati intermedi della traduzione.
  • recognized: segnale per gli eventi che contengono risultati finali della traduzione. Questi risultati indicano un tentativo di traduzione riuscito.
  • sessionStopped: segnale per gli eventi che indicano la fine di una sessione di traduzione (operazione).
  • canceled: segnale per gli eventi che contengono risultati di traduzione annullati. Questi eventi indicano un tentativo di traduzione annullato a seguito di un annullamento diretto. In alternativa, indicano un errore di trasporto o protocollo.
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 tutto ciò che è configurato, è possibile chiamare startContinuousRecognitionAsync:

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

Scegliere una lingua di origine

Un'attività comune per la traduzione vocale specifica la lingua di input (o di origine). Nell'esempio seguente viene illustrato come modificare la lingua di input in italiano. Nel codice trovare l'istanza SpeechTranslationConfig e aggiungere la riga seguente direttamente sotto di essa:

speechTranslationConfig.speechRecognitionLanguage = "it-IT";

La proprietà speechRecognitionLanguage si aspetta una stringa in formato è prevista una stringa di formato lingua-impostazioni locali. Fare riferimento all'elenco delle impostazioni locali supportate per la traduzione vocale.

Scegliere una o più lingue di destinazione

Speech SDK può tradurre in più lingue di destinazione in parallelo. Le lingue di destinazione disponibili sono leggermente diverse dall'elenco delle lingue di origine. È possibile specificare le lingue di destinazione usando un codice linguistico, anziché le impostazioni locali.

Per un elenco dei codici linguistici per le destinazioni di testo, vedere la tabella di traduzione vocale nella pagina di supporto della lingua. È anche possibile trovare informazioni dettagliate sulla traduzione per sintetizzare le lingue in questa posizione.

Il codice seguente aggiunge il tedesco come lingua di destinazione:

speechTranslationConfig.addTargetLanguage("de");

Poiché sono possibili più traduzioni della lingua di destinazione, il codice deve specificare la lingua di destinazione durante l'analisi del risultato. Il codice seguente ottiene i risultati della traduzione per il tedesco:

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

Documentazione di riferimento | Pacchetto (download) | Altri esempi in GitHub

Speech SDK per Objective-C supporta la traduzione vocale, ma non è ancora stata inclusa una guida qui. Seleziona un altro linguaggio di programmazione per iniziare e ottenere informazioni sui concetti oppure vedi i riferimenti e gli esempi Objective-C collegati dall'inizio dell'articolo.

Documentazione di riferimento | Pacchetto (download) | Esempi aggiuntivi in GitHub

Speech SDK per Swift supporta la traduzione vocale, ma non è ancora stata inclusa una guida qui. Seleziona un altro linguaggio di programmazione per iniziare e ottenere informazioni sui concetti oppure vedi i riferimenti e gli esempi Swift collegati dall'inizio dell'articolo.

Documentazione di riferimento | Pacchetto (PyPi) | Altri esempi in GitHub

In questa guida pratica si apprenderà come riconoscere il parlato umano e tradurlo in un'altra lingua.

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione vocale in testo
  • Traduzione vocale in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Dati sensibili e variabili di ambiente

Il codice sorgente di esempio in questo articolo dipende dalle variabili di ambiente per l'archiviazione di dati sensibili, ad esempio la chiave di sottoscrizione e l'area della risorsa Voce. Il file di codice Python contiene due valori assegnati dalle variabili di ambiente del computer host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Entrambe queste variabili si trovano nell'ambito globale, quindi sono accessibili all'interno della definizione della funzione del file di codice:

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

Per altre informazioni sulle variabili di ambiente, vedere Variabili di ambiente e configurazione dell'applicazione.

Creare una configurazione di traduzione vocale

Per chiamare il servizio Voce con Speech SDK, è necessario creare un’istanza di SpeechTranslationConfig. Questa classe include informazioni sulla sottoscrizione, ad esempio la chiave e l'area associata, l'endpoint, l'host o il token di autorizzazione.

Suggerimento

Sia che si esegua il riconoscimento vocale, la sintesi vocale, la traduzione o il riconoscimento finalità, sarà sempre necessario creare una configurazione.

È possibile inizializzare SpeechTranslationConfig in diversi modi:

  • Con una sottoscrizione: passare una chiave e l'area associata.
  • Con un endpoint: passare un endpoint del servizio Voce. La chiave e il token di autorizzazione sono facoltativi.
  • Con un host: passare l'indirizzo di un host. La chiave e il token di autorizzazione sono facoltativi.
  • Con un token di autorizzazione: passare un token di autorizzazione e l'area associata.

Di seguito viene illustrato come creare un'istanza usando una chiave e un'area SpeechTranslationConfig . Ottenere la chiave e l'area della risorsa Voce nel portale di Azure.

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

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

Modificare la lingua di origine

Un'attività comune della traduzione vocale consiste nell'specificare la lingua di input (o di origine). Nell'esempio seguente viene illustrato come modificare la lingua di input in italiano. Nel codice interagire con l'istanza SpeechTranslationConfig assegnandola alla speech_recognition_language proprietà .

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 proprietà speech_recognition_language si aspetta una stringa in formato è prevista una stringa di formato lingua-impostazioni locali. Fare riferimento all'elenco delle impostazioni locali supportate per la traduzione vocale.

Aggiungere una lingua di traduzione

Un altro compito comune della traduzione vocale consiste nel specificare le lingue di traduzione di destinazione. Almeno uno è obbligatorio, ma sono supportati più. Il frammento di codice seguente imposta sia il francese che il tedesco come destinazione della lingua di traduzione:

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 ogni chiamata a add_target_language, viene specificata una nuova lingua di traduzione di destinazione. In altre parole, quando il riconoscimento vocale viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile come parte dell'operazione di traduzione risultante.

Inizializzare un riconoscitore di traduzione

Dopo aver creato un'istanza SpeechTranslationConfig , il passaggio successivo consiste nell'inizializzare TranslationRecognizer. Quando si inizializza TranslationRecognizer, è necessario passarlo all'istanza translation_config . L'oggetto di configurazione fornisce le credenziali richieste dal servizio Voce per convalidare la richiesta.

Se si riconosce il riconoscimento vocale usando il microfono predefinito del dispositivo, ecco l'aspetto TranslationRecognizer seguente:

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

    translation_config.speech_recognition_language = from_language
    translation_config.add_target_language(to_language)

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

Se si vuole specificare il dispositivo di input audio, è necessario creare un'istanza AudioConfig della classe e specificare il parametro durante l'inizializzazione audio_config di TranslationRecognizer.

Per prima cosa, fare riferimento all'oggetto AudioConfig come segue:

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

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

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

Se vuoi fornire un file audio invece di usare un microfono, devi comunque specificare un audioConfig parametro. Tuttavia, quando si crea un'istanza AudioConfig di classe, anziché chiamare con use_default_microphone=True, chiamare con filename="path-to-file.wav" e specificare il filename parametro :

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)

Traduzione vocale

Per tradurre il parlato, Speech SDK si basa su un microfono o su un input di file audio. Il riconoscimento vocale viene eseguito prima della traduzione vocale. Dopo l'inizializzazione di tutti gli oggetti, chiamare la funzione recognize-once e ottenere il risultato:

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

Per altre informazioni sul riconoscimento vocale, vedere le nozioni di base sul riconoscimento vocale.

Sintetizzare le traduzioni

Dopo aver completato correttamente il riconoscimento vocale e la traduzione, il risultato include tutte le traduzioni in un dizionario. La translations chiave del dizionario è la lingua di traduzione di destinazione e il valore è il testo tradotto. Il riconoscimento vocale può essere tradotto e quindi sintetizzato in una lingua diversa (riconoscimento vocale).

Sintesi basata su eventi

L'oggetto TranslationRecognizer espone un Synthesizing evento. L'evento viene generato più volte e fornisce un meccanismo per recuperare l'audio sintetizzato dal risultato del riconoscimento della traduzione. Se stai traducendo in più lingue, vedi Sintesi manuale.

Specificare la voce di sintesi assegnando un'istanza voice_name e specificando un gestore eventi per l'evento per ottenere l'audio Synthesizing . L'esempio seguente salva l'audio tradotto come file .wav.

Importante

La sintesi basata su eventi funziona solo con una singola traduzione. Non aggiungere più lingue di traduzione di destinazione. Inoltre, il voice_name valore deve essere la stessa lingua della lingua di traduzione di destinazione. Ad esempio, "de" potrebbe eseguire il mapping 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()

Sintesi manuale

È possibile usare il translations dizionario per sintetizzare l'audio dal testo di traduzione. Scorrere ogni traduzione e sintetizzarla. Quando si crea un'istanza SpeechSynthesizer , l'oggetto SpeechConfig deve avere la relativa speech_synthesis_voice_name proprietà impostata sulla voce desiderata.

Nell'esempio seguente vengono convertite in cinque lingue. Ogni traduzione viene quindi sintetizzata in un file audio nel linguaggio neurale corrispondente.

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

Per altre informazioni sulla sintesi vocale, vedere le nozioni di base della sintesi vocale.

Traduzione multilingue con identificazione della lingua

In molti scenari, è possibile che non si conoscano le lingue di input da specificare. Usando l'identificazione della lingua è possibile rilevare fino a 10 lingue di input possibili e tradurre automaticamente nelle lingue di destinazione.

Per un esempio di codice completo, vedere Identificazione della lingua.

Informazioni di riferimento sull'API REST di riconoscimento vocale | Informazioni di riferimento sull'API REST di riconoscimento vocale per audio breve | Altri esempi in GitHub

È possibile usare l'API REST per la traduzione vocale, ma non è ancora stata inclusa una guida qui. Selezionare un altro linguaggio di programmazione per iniziare e ottenere informazioni sui concetti.

In questa guida pratica si apprenderà come riconoscere il parlato umano e tradurlo in un'altra lingua.

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione vocale in testo
  • Traduzione vocale in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Prerequisiti

Scaricare e installare

Seguire questa procedura e vedere la guida introduttiva all'interfaccia della riga di comando di Voce per altri requisiti per la piattaforma.

  1. Eseguire il comando seguente dell'interfaccia della riga di comando di .NET per installare l'interfaccia della riga di comando di Voce:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. Eseguire i comandi seguenti per configurare la chiave e l'area della risorsa Voce. Sostituire SUBSCRIPTION-KEY con la chiave della risorsa Voce e REGION con l'area della risorsa Voce.

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

Impostare le lingue di origine e di destinazione

Questo comando chiama l'interfaccia della riga di comando di Voce per tradurre la voce dal microfono dall'italiano al francese:

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

Passaggi successivi