Come riconoscere e tradurre la voce

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

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

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione del riconoscimento vocale
  • Traduzione della voce 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 classe Program contiene due valori static readonly string assegnati dalle variabili di ambiente del computer host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Entrambi i campi si trovano nell'ambito class, 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.

Importante

Se si usa una chiave API, archiviarla in modo sicuro in un'altra posizione, ad esempio in Azure Key Vault. Non includere la chiave API direttamente nel codice e non esporla mai pubblicamente.

Per altre informazioni sulla sicurezza dei servizi IA, vedere Autenticare richieste in Servizi di Azure AI.

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 SpeechTranslationConfig usando una chiave e un'area. Ottenere un'area e una chiave della risorsa per il servizio 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 è la specifica della 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 proprietà SpeechRecognitionLanguage:

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 per la traduzione

Un altro compito comune della traduzione vocale è quello di specificare le lingue di destinazione per la traduzione. È obbligatorio specificarne almeno una, ma sono supportate più lingue. Il frammento di codice seguente imposta sia il francese che il tedesco come lingue di destinazione per la 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 destinazione per la traduzione. In altre parole, quando il parlato viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile nell'ambito dell'operazione di traduzione risultante.

Inizializzare un riconoscimento 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 esegue il riconoscimento vocale usando il microfono predefinito del dispositivo, l'istanza TranslationRecognizer avrà questo aspetto:

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 di classe AudioConfig e specificare il parametro audioConfig quando si inizializza TranslationRecognizer.

Innanzitutto, fare riferimento all'oggetto AudioConfig come indicato di seguito:

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 si vuole specificare un file audio invece di usare un microfono, è comunque necessario fornire un parametro audioConfig. Tuttavia, quando si crea un'istanza classe AudioConfig, invece di chiamare FromDefaultMicrophoneInput, si chiamerà FromWavFileInput e si passerà il parametro filename:

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

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

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 evento Recognizing. 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 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 chiave del dizionario Translations è la lingua della traduzione di destinazione e il valore è il testo tradotto. Il parlato riconosciuto può essere tradotto e quindi sintetizzato in una lingua diversa (speech-to-speech).

Sintesi basata su eventi

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

Specificare la voce di sintesi assegnando un'istanza VoiceName e specificando un gestore dell'evento per l'evento Synthesizing al fine di ottenere l'audio. 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 valore VoiceName deve corrispondere alla lingua di destinazione per la traduzione. 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 dizionario Translations per sintetizzare l'audio dal testo di traduzione. Eseguire l'iterazione di ogni traduzione e sintetizzarla. Quando si crea un'istanza SpeechSynthesizer, l'oggetto SpeechConfig deve avere la relativa proprietà SpeechSynthesisVoiceName impostata sulla voce desiderata.

Nell'esempio seguente si traduce 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 sulla 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 debbano essere rilevate perché sono definite in AutoDetectSourceLanguageConfig. Quindi, il parlato viene 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 elemento di differenziazione fondamentale della traduzione vocale multilingue è che non è necessario specificare la lingua di partenza. Ciò è dovuto al fatto che il servizio rileverà automaticamente la lingua di origine. Creare l'oggetto AutoDetectSourceLanguageConfig con il metodo fromOpenRange per informare il servizio che si vuole usare la traduzione vocale multilingue senza una lingua di origine 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.

Uso della traduzione personalizzata nella traduzione vocale

La funzionalità di traduzione personalizzata nella traduzione vocale si integra perfettamente con il servizio traduzione personalizzata di Azure, consentendo di ottenere traduzioni più accurate e personalizzate. Poiché l'integrazione sfrutta direttamente le funzionalità del servizio di traduzione personalizzata di Azure, è necessario usare una risorsa multiservizio per garantire il corretto funzionamento del set completo di funzionalità. Per istruzioni dettagliate, vedere la guida su Creare una risorsa multiservizio per i servizi di intelligenza artificiale di Azure.

Per il training offline di un traduttore personalizzato e per ottenere un "ID categoria", vedere anche lo script dettagliato fornito nella Guida introduttiva: Compilare, distribuire e usare un modello personalizzato - Traduttore personalizzato.

// Creates an instance of a translation recognizer using speech translation configuration
// You should use the same subscription key, which you used to generate the custom model before.
// V2 endpoint is required for the “Custom Translation” feature. Example: "wss://westcentralus.stt.speech.microsoft.com/speech/universal/v2"

try (SpeechTranslationConfig config = SpeechTranslationConfig.fromEndpoint(URI.create(endpointUrl), speechSubscriptionKey)) {

            // Sets source and target language(s).
           ….

            // Set the category id
            config.setCustomModelCategoryId("yourCategoryId");

       ….
}

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

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

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione del riconoscimento vocale
  • Traduzione della voce 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 di stringa assegnati dalle variabili di ambiente del computer host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Entrambi i campi si trovano nell'ambito class, 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.

Importante

Se si usa una chiave API, archiviarla in modo sicuro in un'altra posizione, ad esempio in Azure Key Vault. Non includere la chiave API direttamente nel codice e non esporla mai pubblicamente.

Per altre informazioni sulla sicurezza dei servizi IA, vedere Autenticare richieste in Servizi di Azure AI.

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 SpeechTranslationConfig usando una chiave e un'area. Ottenere un'area e una chiave della risorsa per il servizio 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 è la specifica della 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 metodo SetSpeechRecognitionLanguage.

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 per la traduzione

Un altro compito comune della traduzione vocale è quello di specificare le lingue di destinazione per la traduzione. È obbligatorio specificarne almeno una, ma sono supportate più lingue. Il frammento di codice seguente imposta sia il francese che il tedesco come lingue di destinazione per la 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 destinazione per la traduzione. In altre parole, quando il parlato viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile nell'ambito dell'operazione di traduzione risultante.

Inizializzare un riconoscimento 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 esegue il riconoscimento vocale usando il microfono predefinito del dispositivo, TranslationRecognizer avrà questo aspetto:

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 di classe AudioConfig e specificare il parametro audioConfig quando si inizializza TranslationRecognizer.

Innanzitutto, fare riferimento all'oggetto AudioConfig come indicato di seguito:

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 si vuole specificare un file audio invece di usare un microfono, è comunque necessario fornire un parametro audioConfig. Tuttavia, quando si crea un'istanza classe AudioConfig, invece di chiamare FromDefaultMicrophoneInput, si chiamerà FromWavFileInput e si passerà il parametro filename:

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

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

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

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 chiave del dizionario Translations è la lingua della traduzione di destinazione e il valore è il testo tradotto. Il parlato riconosciuto può essere tradotto e quindi sintetizzato in una lingua diversa (speech-to-speech).

Sintesi basata su eventi

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

Specificare la voce di sintesi assegnando un'istanza SetVoiceName e specificando un gestore dell'evento per l'evento Synthesizing al fine di ottenere l'audio. 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 valore SetVoiceName deve corrispondere alla lingua di destinazione per la traduzione. 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 dizionario Translations per sintetizzare l'audio dal testo di traduzione. Eseguire l'iterazione di ogni traduzione e sintetizzarla. Quando si crea un'istanza SpeechSynthesizer, l'oggetto SpeechConfig deve avere la relativa proprietà SetSpeechSynthesisVoiceName impostata sulla voce desiderata.

Nell'esempio seguente si traduce 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 sulla 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 debbano essere rilevate perché sono definite in AutoDetectSourceLanguageConfig. Quindi, il parlato 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) | Ulteriori esempi in GitHub

Speech SDK per Go non supporta la traduzione vocale. Selezionare un altro linguaggio di programmazione oppure vedere le informazioni di riferimento e gli esempi collegati all'inizio dell'articolo.

documentazione di riferimento | Esempi aggiuntivi in GitHub

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

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione del riconoscimento vocale
  • Traduzione della voce 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 valori static final String assegnati dalle variabili di ambiente del computer host: SPEECH__SUBSCRIPTION__KEY e SPEECH__SERVICE__REGION. Entrambi i campi si trovano nell'ambito class, 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.

Importante

Se si usa una chiave API, archiviarla in modo sicuro in un'altra posizione, ad esempio in Azure Key Vault. Non includere la chiave API direttamente nel codice e non esporla mai pubblicamente.

Per altre informazioni sulla sicurezza dei servizi IA, vedere Autenticare richieste in Servizi di Azure AI.

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 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 SpeechTranslationConfig usando una chiave e un'area. Ottenere un'area e una chiave della risorsa per il servizio 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 è la specifica della 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 metodo setSpeechRecognitionLanguage:

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

La funzione setSpeechRecognitionLanguage si aspetta una stringa in formato lingua-impostazioni locali. Fare riferimento all'elenco delle impostazioni locali supportate per la traduzione vocale.

Aggiungere una lingua per la traduzione

Un altro compito comune della traduzione vocale è quello di specificare le lingue di destinazione per la traduzione. È obbligatorio specificarne almeno una, ma sono supportate più lingue. Il frammento di codice seguente imposta sia il francese che il tedesco come lingue di destinazione per la 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 destinazione per la traduzione. In altre parole, quando il parlato viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile nell'ambito dell'operazione di traduzione risultante.

Inizializzare un riconoscimento 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 esegue il riconoscimento vocale usando il microfono predefinito del dispositivo, TranslationRecognizer avrà questo aspetto:

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 di classe AudioConfig e specificare il parametro audioConfig quando si inizializza TranslationRecognizer.

Innanzitutto, fare riferimento all'oggetto AudioConfig come indicato di seguito:

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 si vuole specificare un file audio invece di usare un microfono, è comunque necessario fornire un parametro audioConfig. Tuttavia, quando si crea un'istanza classe AudioConfig, invece di chiamare fromDefaultMicrophoneInput, si chiamerà fromWavFileInput e si passerà il parametro filename:

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

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

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 translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
            for (Map.Entry<String, String> pair : translationRecognitionResult.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 funzione getTranslations restituisce un dizionario con la chiave come lingua di destinazione per la traduzione e il valore come testo tradotto. Il parlato riconosciuto può essere tradotto e quindi sintetizzato in una lingua diversa (speech-to-speech).

Sintesi basata su eventi

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

Specificare la voce di sintesi assegnando un'istanza setVoiceName e specificando un gestore dell'evento per l'evento synthesizing al fine di ottenere l'audio. 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 valore setVoiceName deve corrispondere alla lingua di destinazione per la traduzione. 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 translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.getReason() == ResultReason.TranslatedSpeech) {
            System.out.printf("Recognized: \"%s\"\n", translationRecognitionResult.getText());
            for (Map.Entry<String, String> pair : translationRecognitionResult.getTranslations().entrySet()) {
                String language = pair.getKey();
                String translation = pair.getValue();
                System.out.printf("Translated into '%s': %s\n", language, translation);
            }
        }
    }
}

Sintesi manuale

La funzione getTranslations restituisce un dizionario che può essere usato per sintetizzare l'audio dal testo della traduzione. Eseguire l'iterazione di ogni traduzione e sintetizzarla. Quando si crea un'istanza SpeechSynthesizer, l'oggetto SpeechConfig deve avere la relativa proprietà setSpeechSynthesisVoiceName impostata sulla voce desiderata.

Nell'esempio seguente si traduce 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 translationRecognitionResult = translationRecognizer.recognizeOnceAsync().get();
        if (translationRecognitionResult.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", translationRecognitionResult.getText());
            for (Map.Entry<String, String> pair : translationRecognitionResult.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 sulla sintesi vocale.

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

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

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione del riconoscimento vocale
  • Traduzione della voce in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Creare una configurazione di traduzione

Per chiamare il servizio di traduzione 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.

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 SpeechTranslationConfig usando una chiave e un'area. Ottenere un'area e una chiave della risorsa per il servizio 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 si esegue la traduzione del parlato fornito attraverso il microfono predefinito del dispositivo, TranslationRecognizer avrà questo aspetto:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

Se si vuole specificare il dispositivo di input audio, è necessario creare un'istanza di classe AudioConfig e specificare il parametro audioConfig quando si inizializza TranslationRecognizer.

Fare riferimento all'oggetto AudioConfig come indicato di seguito:

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

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

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 singola (asincrona): esegue la traduzione in modalità non bloccante (asincrona). Converte una singola espressione. Determina la fine di una singola espressione restando in ascolto del silenzio al termine o finché non vengono elaborati al massimo 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 dallo stesso link.

Le opzioni per le lingue di destinazione variano a seconda che si voglia visualizzare il testo o si voglia ascoltare il parlato sintetizzato tradotto. Per tradurre dall'inglese al tedesco, modificare l'oggetto di configurazione della traduzione:

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

Riconoscimento singolo

Ecco un esempio di traduzione singola asincrona tramite recognizeOnceAsync:

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

Per gestire il risultato è necessario scrivere del codice. In questo esempio viene valutato result.reason per 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ù impegnativa rispetto al riconoscimento singolo. 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 traduzione continua eseguita su un file di input audio. Per iniziare, definire l'input e inizializzare TranslationRecognizer:

const translationRecognizer = new TranslationRecognizer(speechTranslationConfig);

Nel codice seguente si sottoscrivono gli eventi inviati da TranslationRecognizer:

  • recognizing: segnale per gli eventi contenenti i risultati della traduzione intermedia.
  • recognized: segnale per gli eventi contenenti i risultati della traduzione finale. 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 in seguito a 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 tutti gli elementi configurati, è 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 è la specifica della 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 rispetto all'elenco delle lingue di origine. È possibile specificare le lingue di destinazione usando un codice lingua, anziché le impostazioni locali.

Per un elenco dei codici lingua per le destinazioni di testo, vedere la tabella di traduzione vocale nella pagina di supporto linguistico. Qui è anche possibile trovare informazioni dettagliate sulla traduzione nelle lingue sintetizzate.

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) | Ulteriori esempi in GitHub

Speech SDK per Objective-C supporta la traduzione vocale, ma in questa documentazione non è stata ancora inclusa la relativa guida. Selezionare un altro linguaggio di programmazione per iniziare ad apprendere i relativi concetti oppure vedere le informazioni di riferimento e gli esempi di Objective-C collegati all'inizio dell'articolo.

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

Speech SDK per Swift supporta la traduzione vocale, ma in questa documentazione non è stata ancora inclusa la relativa guida. Seleziona un altro linguaggio di programmazione per iniziare ad apprendere i relativi sui concetti oppure vedere le informazioni di riferimento e gli esempi di Swift collegati all'inizio dell'articolo.

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

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

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione del riconoscimento vocale
  • Traduzione della voce 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 le variabili si trovano nell'ambito globale, quindi sono accessibili all'interno della definizione di 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.

Importante

Se si usa una chiave API, archiviarla in modo sicuro in un'altra posizione, ad esempio in Azure Key Vault. Non includere la chiave API direttamente nel codice e non esporla mai pubblicamente.

Per altre informazioni sulla sicurezza dei servizi IA, vedere Autenticare richieste in Servizi di Azure AI.

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 SpeechTranslationConfig usando una chiave e un'area. Ottenere un'area e una chiave della risorsa per il servizio 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 è la specifica della 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 proprietà speech_recognition_language.

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

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

La 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 per la traduzione

Un altro compito comune della traduzione vocale è quello di specificare le lingue di destinazione per la traduzione. È obbligatorio specificarne almeno una, ma sono supportate più lingue. Il frammento di codice seguente imposta sia il francese che il tedesco come lingue di destinazione per la 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 destinazione per la traduzione. In altre parole, quando il parlato viene riconosciuto dalla lingua di origine, ogni traduzione di destinazione è disponibile nell'ambito dell'operazione di traduzione risultante.

Inizializzare un riconoscimento 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 esegue il riconoscimento vocale usando il microfono predefinito del dispositivo, TranslationRecognizer avrà questo aspetto:

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 di classe AudioConfig e specificare il parametro audio_config quando si inizializza TranslationRecognizer.

Innanzitutto, fare riferimento all'oggetto AudioConfig come indicato di seguito:

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 si vuole specificare un file audio invece di usare un microfono, è comunque necessario fornire un parametro audioConfig. Tuttavia, quando si crea un'istanza classe AudioConfig, invece di chiamare con use_default_microphone=True, si chiamerà con filename="path-to-file.wav" e si passerà il parametro filename:

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

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

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

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...')
    translation_recognition_result = translation_recognizer.recognize_once()
    print(get_result_text(reason=translation_recognition_result.reason, result=translation_recognition_result))

def get_result_text(reason, translation_recognition_result):
    reason_format = {
        speechsdk.ResultReason.TranslatedSpeech:
            f'RECOGNIZED "{from_language}": {translation_recognition_result.text}\n' +
            f'TRANSLATED into "{to_language}"": {translation_recognition_result.translations[to_language]}',
        speechsdk.ResultReason.RecognizedSpeech: f'Recognized: "{translation_recognition_result.text}"',
        speechsdk.ResultReason.NoMatch: f'No speech could be recognized: {translation_recognition_result.no_match_details}',
        speechsdk.ResultReason.Canceled: f'Speech Recognition canceled: {translation_recognition_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 chiave del dizionario translations è la lingua della traduzione di destinazione e il valore è il testo tradotto. Il parlato riconosciuto può essere tradotto e quindi sintetizzato in una lingua diversa (speech-to-speech).

Sintesi basata su eventi

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

Specificare la voce di sintesi assegnando un'istanza voice_name e specificando un gestore dell'evento per l'evento Synthesizing al fine di ottenere l'audio. 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 valore voice_name deve corrispondere alla lingua di destinazione per la traduzione. 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}".')

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

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

translate_speech_to_text()

Sintesi manuale

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

Nell'esempio seguente si traduce 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...')
    translation_recognition_result = translation_recognizer.recognize_once()
    synthesize_translations(result=translation_recognition_result)

def synthesize_translations(translation_recognition_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: "{translation_recognition_result.text}"')

    for language in translation_recognition_result.translations:
        translation = translation_recognition_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 sulla 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 brevi | Ulteriori esempi in GitHub

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

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

Per altre informazioni, vedere la panoramica della traduzione vocale:

  • Traduzione del riconoscimento vocale
  • Traduzione della voce in più lingue di destinazione
  • Esecuzione della traduzione vocale diretta

Prerequisiti

  • Una sottoscrizione di Azure. È possibile crearne uno gratuitamente.
  • Creare una risorsa Voce nel portale di Azure.
  • Ottenere la chiave e l'area della risorsa Voce. Dopo aver distribuito la risorsa Voce, selezionare Vai alla risorsa per visualizzare e gestire le chiavi.

Scaricare e installare

Seguire questi passaggi e vedere la guida di Avvio rapido sull'interfaccia della riga di comando di Voce per altri requisiti della 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