Introduzione alla sintesi vocale

Questo argomento di avvio rapido illustra i modelli di progettazione comuni per eseguire la sintesi vocale con Speech SDK. Si inizia con la configurazione di base e la sintesi e si passa ad esempi più avanzati per lo sviluppo di applicazioni personalizzate, tra cui:

  • Recupero di risposte come flussi in memoria
  • Personalizzazione della frequenza di campionamento e della velocità in bit dell'output
  • Invio di richieste di sintesi tramite SSML (Speech Synthesis Markup Language)
  • Uso di voci neurali

Passare agli esempi su GitHub

Per passare direttamente al codice di esempio, vedere gli esempi di avvio rapido C# in GitHub.

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK. A seconda della piattaforma, usare le istruzioni seguenti:

Importare le dipendenze

Per eseguire gli esempi di questo articolo, includere le istruzioni using seguenti all'inizio dello script.

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

Creare una configurazione di Voce

Per chiamare il servizio Voce con Speech SDK, è necessario creare una classe SpeechConfig. 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.

Esistono diversi modi per inizializzare SpeechConfig:

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

In questo esempio viene creato un oggetto SpeechConfig usando una chiave e un'area di sottoscrizione. Per ottenere queste credenziali, seguire la procedura descritta in Provare il servizio Voce gratuitamente. Si crea anche un codice boilerplate di base da usare per la parte restante di questo articolo, che viene modificato per diverse personalizzazioni.

public class Program
{
    static async Task Main()
    {
        await SynthesizeAudioAsync();
    }

    static async Task SynthesizeAudioAsync()
    {
        var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    }
}

Sintetizzare la voce in un file

Successivamente, creare un oggetto SpeechSynthesizer, che esegue le conversioni di sintesi vocale e invia l'output ad altoparlanti, file o altri flussi. SpeechSynthesizer accetta come parametri l'oggetto SpeechConfig creato nel passaggio precedente e un oggetto AudioConfig che specifica come devono essere gestiti i risultati dell'output.

Per iniziare, creare un oggetto AudioConfig per scrivere automaticamente l'output in un file .wav, usando la funzione FromWavFileOutput(), quindi crearne un'istanza con un'istruzione using. Un'istruzione using in questo contesto elimina automaticamente le risorse non gestite e fa in modo che l'oggetto esca dall'ambito dopo l'eliminazione.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
}

Successivamente, creare un'istanza di un SpeechSynthesizer con un'altra istruzione using. Passare l'oggetto config e l'oggetto audioConfig come parametri. Quindi, per eseguire la sintesi vocale e scrivere il risultato in un file, basta eseguire SpeakTextAsync() con una stringa di testo.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
    using var synthesizer = new SpeechSynthesizer(config, audioConfig);
    await synthesizer.SpeakTextAsync("A simple test to write to a file.");
}

Eseguire il programma. Un file .wav sintetizzato viene scritto nella posizione specificata. Si tratta di un esempio valido dell'utilizzo più semplice, ma in seguito viene illustrato come personalizzare l'output e gestire la relativa risposta in un flusso in memoria per scenari personalizzati.

Sintetizzare l'output dell'altoparlante

In alcuni casi, si può scegliere di indirizzare la voce sintetizzata di output direttamente a un altoparlante. A tale scopo, omettere il AudioConfig parametro durante SpeechSynthesizer la creazione di nell'esempio precedente. Questo sintetizza il dispositivo di output attivo corrente.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config);
    await synthesizer.SpeakTextAsync("Synthesizing directly to speaker output.");
}

Ottenere il risultato come flusso in memoria

Per molti scenari di sviluppo di applicazioni vocali, i dati audio risultanti potrebbero essere necessari come flusso in memoria invece di essere scritti direttamente in un file. In questo modo è possibile creare un comportamento personalizzato per:

  • Astrarre la matrice di byte risultante come flusso ricercabile per i servizi downstream personalizzati.
  • Integrare il risultato con altri servizi o API.
  • Modificare i dati audio, scrivere intestazioni di .wav personalizzate e così via.

È semplice apportare questa modifica dall'esempio precedente. Rimuovere prima di tutto il blocco AudioConfig, perché il comportamento di output verrà gestito manualmente da questo punto in poi per un maggior controllo. Passare quindi null per AudioConfig nel costruttore SpeechSynthesizer.

Nota

Se si passa null per AudioConfig, invece di ometterlo come nel precedente esempio di output nell'altoparlante, l'audio non verrà riprodotto per impostazione predefinita nel dispositivo di output attivo corrente.

Questa volta il risultato viene salvato in una variabile SpeechSynthesisResult. La proprietà AudioData contiene un oggetto byte [] dei dati di output. Questo oggetto byte [] può essere gestito manualmente oppure è possibile usare la classe AudioDataStream per gestire il flusso in memoria. In questo esempio si usa la funzione statica AudioDataStream.FromResult() per ottenere un flusso dal risultato.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config, null);

    var result = await synthesizer.SpeakTextAsync("Getting the response as an in-memory stream.");
    using var stream = AudioDataStream.FromResult(result);
}

Da qui è possibile implementare qualsiasi comportamento personalizzato usando l'oggetto stream risultante.

Personalizzare il formato audio

La sezione seguente illustra come personalizzare gli attributi dell'output audio, tra cui:

  • Tipo di file audio
  • Frequenza di campionamento
  • Profondità di bit

Per cambiare il formato audio, usare la funzione SetSpeechSynthesisOutputFormat() nell'oggetto SpeechConfig. Questa funzione prevede un oggetto enum di tipo SpeechSynthesisOutputFormat, che è possibile usare per selezionare il formato di output. Per un elenco di formati audio disponibili, vedere la documentazione di riferimento.

Sono disponibili varie opzioni per tipi di file diversi a seconda dei requisiti. Si noti che, per definizione, i formati non elaborati come Raw24Khz16BitMonoPcm non includono intestazioni audio. Usare formati non elaborati solo quando si è certi che l'implementazione downstream possa decodificare un flusso di bit non elaborato o se si prevede di creare manualmente le intestazioni in base alla profondità di bit, alla frequenza di campionamento, al numero di canali e così via.

In questo esempio si specifica un formato RIFF ad alta fedeltà Riff24Khz16BitMonoPcm impostando SpeechSynthesisOutputFormat nell'oggetto SpeechConfig. Analogamente all'esempio della sezione precedente, è possibile usare AudioDataStream per ottenere un flusso in memoria del risultato e quindi scriverlo in un file.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    config.SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    using var synthesizer = new SpeechSynthesizer(config, null);
    var result = await synthesizer.SpeakTextAsync("Customizing audio output format.");

    using var stream = AudioDataStream.FromResult(result);
    await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}

Eseguendo il programma, anche in questo caso verrà scritto un file .wav nel percorso specificato.

Usare SSML per personalizzare le caratteristiche vocali

Il linguaggio SSML (Speech Synthesis Markup Language) consente di ottimizzare il tono, la pronuncia, la velocità del parlato, il volume e altro ancora dell'output della sintesi vocale inviando le richieste da XML Schema. In questa sezione viene illustrato un esempio di modifica della voce, ma per una guida più dettagliata, vedere l' articolo sulle procedure relative a SSML.

Per iniziare a usare SSML per la personalizzazione, è necessario apportare una semplice modifica che cambia la voce. Creare prima di tutto un nuovo file XML per la configurazione di SSML nella directory radice del progetto, in questo esempio ssml.xml. L'elemento radice è sempre <speak> e il wrapping del testo in un elemento <voice> consente di cambiare la voce usando il parametro name. Vedere l' elenco completo delle voci neurali supportate.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    When you're on the freeway, it's a good idea to use a GPS.
  </voice>
</speak>

Successivamente, è necessario cambiare la richiesta di sintesi vocale in modo che faccia riferimento al file XML. La richiesta è essenzialmente la stessa, ma invece di usare la funzione SpeakTextAsync() si usa SpeakSsmlAsync(). Questa funzione prevede una stringa XML, quindi è prima di tutto necessario caricare la configurazione di SSML come stringa usando File.ReadAllText(). Da qui, l'oggetto risultato è esattamente lo stesso degli esempi precedenti.

Nota

Se si usa Visual Studio, la configurazione di compilazione probabilmente non troverà il file XML per impostazione predefinita. Per risolvere questo problema, fare clic con il pulsante destro del mouse sul file e scegliere Proprietà. Impostare Azione di compilazione su Contenuto e Copia nella directory di output su Copia sempre.

public static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config, null);

    var ssml = File.ReadAllText("./ssml.xml");
    var result = await synthesizer.SpeakSsmlAsync(ssml);

    using var stream = AudioDataStream.FromResult(result);
    await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}

Nota

Per modificare la voce senza usare SSML, è possibile impostare la proprietà SpeechConfig su usando SpeechConfig.SpeechSynthesisVoiceName = "en-US-AriaNeural";

Ottenere gli eventi di posa facciali

Il riconoscimento vocale può essere un modo efficace per guidare l'animazione di espressioni facciali. Spesso visemes vengono usati per rappresentare la chiave che si pone in un discorso osservato, ad esempio la posizione dei labbri, la mascella e la lingua durante la produzione di un fonema particolare. È possibile sottoscrivere l'evento viseme in Speech SDK. Quindi, è possibile applicare gli eventi viseme per animare la faccia di un carattere come riproduzione audio vocale. Informazioni su come ottenere gli eventi viseme.

Questo argomento di avvio rapido illustra i modelli di progettazione comuni per eseguire la sintesi vocale con Speech SDK. Si inizia con la configurazione di base e la sintesi e si passa ad esempi più avanzati per lo sviluppo di applicazioni personalizzate, tra cui:

  • Recupero di risposte come flussi in memoria
  • Personalizzazione della frequenza di campionamento e della velocità in bit dell'output
  • Invio di richieste di sintesi tramite SSML (Speech Synthesis Markup Language)
  • Uso di voci neurali

Passare agli esempi su GitHub

Per passare direttamente al codice di esempio, vedere gli esempi di avvio rapido C++ in GitHub.

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK. A seconda della piattaforma, usare le istruzioni seguenti:

Importare le dipendenze

Per eseguire gli esempi di questo articolo, includere le istruzioni import e using seguenti all'inizio dello script.

#include <iostream>
#include <fstream>
#include <string>
#include <speechapi_cxx.h>

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

Creare una configurazione di Voce

Per chiamare il servizio Voce con Speech SDK, è necessario creare una classe SpeechConfig. 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.

Esistono diversi modi per inizializzare SpeechConfig:

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

In questo esempio viene creato un oggetto SpeechConfig usando una chiave e un'area di sottoscrizione. Per ottenere queste credenziali, seguire la procedura descritta in Provare il servizio Voce gratuitamente. Si crea anche un codice boilerplate di base da usare per la parte restante di questo articolo, che viene modificato per diverse personalizzazioni.

int wmain()
{
    try
    {
        synthesizeSpeech();
    }
    catch (exception e)
    {
        cout << e.what();
    }
    return 0;
}

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
}

Sintetizzare la voce in un file

Successivamente, creare un oggetto SpeechSynthesizer, che esegue le conversioni di sintesi vocale e invia l'output ad altoparlanti, file o altri flussi. SpeechSynthesizer accetta come parametri l'oggetto SpeechConfig creato nel passaggio precedente e un oggetto AudioConfig che specifica come devono essere gestiti i risultati dell'output.

Per iniziare, creare un oggetto AudioConfig per scrivere automaticamente l'output in un file .wav, usando la funzione FromWavFileOutput().

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
}

Successivamente, creare un'istanza di SpeechSynthesizer passando l'oggetto config e l'oggetto audioConfig come parametri. Quindi, per eseguire la sintesi vocale e scrivere il risultato in un file, basta eseguire SpeakTextAsync() con una stringa di testo.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, audioConfig);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
}

Eseguire il programma. Un file .wav sintetizzato viene scritto nella posizione specificata. Si tratta di un esempio valido dell'utilizzo più semplice, ma in seguito viene illustrato come personalizzare l'output e gestire la relativa risposta in un flusso in memoria per scenari personalizzati.

Sintetizzare l'output dell'altoparlante

In alcuni casi, si può scegliere di indirizzare la voce sintetizzata di output direttamente a un altoparlante. A tale scopo, omettere il AudioConfig parametro durante SpeechSynthesizer la creazione di nell'esempio precedente. Questo sintetizza il dispositivo di output attivo corrente.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto synthesizer = SpeechSynthesizer::FromConfig(config);
    auto result = synthesizer->SpeakTextAsync("Synthesizing directly to speaker output.").get();
}

Ottenere il risultato come flusso in memoria

Per molti scenari di sviluppo di applicazioni vocali, i dati audio risultanti potrebbero essere necessari come flusso in memoria invece di essere scritti direttamente in un file. In questo modo è possibile creare un comportamento personalizzato per:

  • Astrarre la matrice di byte risultante come flusso ricercabile per i servizi downstream personalizzati.
  • Integrare il risultato con altri servizi o API.
  • Modificare i dati audio, scrivere intestazioni di .wav personalizzate e così via.

È semplice apportare questa modifica dall'esempio precedente. Rimuovere prima di tutto AudioConfig, perché il comportamento di output verrà gestito manualmente da questo punto in poi per un maggior controllo. Passare quindi NULL per AudioConfig nel costruttore SpeechSynthesizer.

Nota

Se si passa NULL per AudioConfig, invece di ometterlo come nel precedente esempio di output nell'altoparlante, l'audio non verrà riprodotto per impostazione predefinita nel dispositivo di output attivo corrente.

Questa volta il risultato viene salvato in una variabile SpeechSynthesisResult. Il getter GetAudioData restituisce un oggetto byte [] dei dati di output. Questo oggetto byte [] può essere gestito manualmente oppure è possibile usare la classe AudioDataStream per gestire il flusso in memoria. In questo esempio si usa la funzione statica AudioDataStream.FromResult() per ottenere un flusso dal risultato.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);

    auto result = synthesizer->SpeakTextAsync("Getting the response as an in-memory stream.").get();
    auto stream = AudioDataStream::FromResult(result);
}

Da qui è possibile implementare qualsiasi comportamento personalizzato usando l'oggetto stream risultante.

Personalizzare il formato audio

La sezione seguente illustra come personalizzare gli attributi dell'output audio, tra cui:

  • Tipo di file audio
  • Frequenza di campionamento
  • Profondità di bit

Per cambiare il formato audio, usare la funzione SetSpeechSynthesisOutputFormat() nell'oggetto SpeechConfig. Questa funzione prevede un oggetto enum di tipo SpeechSynthesisOutputFormat, che è possibile usare per selezionare il formato di output. Per un elenco di formati audio disponibili, vedere la documentazione di riferimento.

Sono disponibili varie opzioni per tipi di file diversi a seconda dei requisiti. Si noti che, per definizione, i formati non elaborati come Raw24Khz16BitMonoPcm non includono intestazioni audio. Usare formati non elaborati solo quando si è certi che l'implementazione downstream possa decodificare un flusso di bit non elaborato o se si prevede di creare manualmente le intestazioni in base alla profondità di bit, alla frequenza di campionamento, al numero di canali e così via.

In questo esempio si specifica un formato RIFF ad alta fedeltà Riff24Khz16BitMonoPcm impostando SpeechSynthesisOutputFormat nell'oggetto SpeechConfig. Analogamente all'esempio della sezione precedente, è possibile usare AudioDataStream per ottenere un flusso in memoria del risultato e quindi scriverlo in un file.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    config->SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat::Riff24Khz16BitMonoPcm);

    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();

    auto stream = AudioDataStream::FromResult(result);
    stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}

Eseguendo il programma, anche in questo caso verrà scritto un file .wav nel percorso specificato.

Usare SSML per personalizzare le caratteristiche vocali

Il linguaggio SSML (Speech Synthesis Markup Language) consente di ottimizzare il tono, la pronuncia, la velocità del parlato, il volume e altro ancora dell'output della sintesi vocale inviando le richieste da XML Schema. In questa sezione viene illustrato un esempio di modifica della voce, ma per una guida più dettagliata, vedere l' articolo sulle procedure relative a SSML.

Per iniziare a usare SSML per la personalizzazione, è necessario apportare una semplice modifica che cambia la voce. Creare prima di tutto un nuovo file XML per la configurazione di SSML nella directory radice del progetto, in questo esempio ssml.xml. L'elemento radice è sempre <speak> e il wrapping del testo in un elemento <voice> consente di cambiare la voce usando il parametro name. Vedere l' elenco completo delle voci neurali supportate.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    When you're on the freeway, it's a good idea to use a GPS.
  </voice>
</speak>

Successivamente, è necessario cambiare la richiesta di sintesi vocale in modo che faccia riferimento al file XML. La richiesta è essenzialmente la stessa, ma invece di usare la funzione SpeakTextAsync() si usa SpeakSsmlAsync(). Questa funzione prevede una stringa XML, quindi è prima di tutto necessario caricare la configurazione di SSML come stringa. Da qui, l'oggetto risultato è esattamente lo stesso degli esempi precedenti.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);

    std::ifstream file("./ssml.xml");
    std::string ssml, line;
    while (std::getline(file, line))
    {
        ssml += line;
        ssml.push_back('\n');
    }
    auto result = synthesizer->SpeakSsmlAsync(ssml).get();

    auto stream = AudioDataStream::FromResult(result);
    stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}

Nota

Per modificare la voce senza usare SSML, è possibile impostare la proprietà SpeechConfig su usando SpeechConfig.SetSpeechSynthesisVoiceName("en-US-AriaNeural")

Ottenere gli eventi di posa facciali

Il riconoscimento vocale può essere un modo efficace per guidare l'animazione di espressioni facciali. Spesso visemes vengono usati per rappresentare la chiave che si pone in un discorso osservato, ad esempio la posizione dei labbri, la mascella e la lingua durante la produzione di un fonema particolare. È possibile sottoscrivere l'evento viseme in Speech SDK. Quindi, è possibile applicare gli eventi viseme per animare la faccia di un carattere come riproduzione audio vocale. Informazioni su come ottenere gli eventi viseme.

Questo argomento di avvio rapido illustra i modelli di progettazione comuni per eseguire la sintesi vocale con Speech SDK.

Passare agli esempi su GitHub

Per passare direttamente al codice di esempio, vedere gli esempi di avvio rapido Go in GitHub.

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK per Go.

Sintesi vocale con voce

Usare l'esempio di codice seguente per eseguire la sintesi vocale nel dispositivo di output audio predefinito. Sostituire le variabili subscription e region con le chiavi della sottoscrizione e dell'area. L'esecuzione dello script farà pronunciare il testo di input all'altoparlante predefinito.

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
    "time"

    "github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/common"
    "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func synthesizeStartedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("Synthesis started.")
}

func synthesizingHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Printf("Synthesizing, audio chunk size %d.\n", len(event.Result.AudioData))
}

func synthesizedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Printf("Synthesized, audio length %d.\n", len(event.Result.AudioData))
}

func cancelledHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("Received a cancellation.")
}

func main() {
    subscription :=  "YOUR_SUBSCRIPTION_KEY"
    region := "YOUR_SUBSCRIPTIONKEY_REGION"

    audioConfig, err := audio.NewAudioConfigFromDefaultSpeakerOutput()
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer config.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(config, audioConfig)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechSynthesizer.Close()

    speechSynthesizer.SynthesisStarted(synthesizeStartedHandler)
    speechSynthesizer.Synthesizing(synthesizingHandler)
    speechSynthesizer.SynthesisCompleted(synthesizedHandler)
    speechSynthesizer.SynthesisCanceled(cancelledHandler)

    for {
        fmt.Printf("Enter some text that you want to speak, or enter empty text to exit.\n> ")
        text, _ := bufio.NewReader(os.Stdin).ReadString('\n')
        text = strings.TrimSuffix(text, "\n")
        if len(text) == 0 {
            break
        }

        task := speechSynthesizer.SpeakTextAsync(text)
        var outcome speech.SpeechSynthesisOutcome
        select {
        case outcome = <-task:
        case <-time.After(60 * time.Second):
            fmt.Println("Timed out")
            return
        }
        defer outcome.Close()
        if outcome.Error != nil {
            fmt.Println("Got an error: ", outcome.Error)
            return
        }

        if outcome.Result.Reason == common.SynthesizingAudioCompleted {
            fmt.Printf("Speech synthesized to speaker for text [%s].\n", text)
        } else {
            cancellation, _ := speech.NewCancellationDetailsFromSpeechSynthesisResult(outcome.Result)
            fmt.Printf("CANCELED: Reason=%d.\n", cancellation.Reason)

            if cancellation.Reason == common.Error {
                fmt.Printf("CANCELED: ErrorCode=%d\nCANCELED: ErrorDetails=[%s]\nCANCELED: Did you update the subscription info?\n",
                    cancellation.ErrorCode,
                    cancellation.ErrorDetails)
            }
        }
    }
}

Eseguire i comandi seguenti per creare un go.mod file che si collega ai componenti ospitati in GitHub.

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Ora compilare ed eseguire il codice.

go build
go run quickstart

Per informazioni dettagliate sulle classi SpeechConfig e SpeechSynthesizer, vedere la documentazione di riferimento.

Sintesi vocale nel flusso in memoria

Per molti scenari di sviluppo di applicazioni vocali, i dati audio risultanti potrebbero essere necessari come flusso in memoria invece di essere scritti direttamente in un file. In questo modo è possibile creare un comportamento personalizzato per:

  • Astrarre la matrice di byte risultante come flusso ricercabile per i servizi downstream personalizzati.
  • Integrare il risultato con altri servizi o API.
  • Modificare i dati audio, scrivere intestazioni di .wav personalizzate e così via.

È semplice apportare questa modifica dall'esempio precedente. Rimuovere prima di tutto AudioConfig, perché il comportamento di output verrà gestito manualmente da questo punto in poi per un maggior controllo. Passare quindi nil per AudioConfig nel costruttore SpeechSynthesizer.

Nota

Se si passa nil per AudioConfig, invece di ometterlo come nel precedente esempio di output nell'altoparlante, l'audio non verrà riprodotto per impostazione predefinita nel dispositivo di output attivo corrente.

Questa volta il risultato viene salvato in una variabile SpeechSynthesisResult. La AudioData proprietà restituisce un oggetto dei dati di []byte output. Questo oggetto []byte può essere gestito manualmente oppure è possibile usare la classe AudioDataStream per gestire il flusso in memoria. In questo esempio si usa la NewAudioDataStreamFromSpeechSynthesisResult() funzione statica per ottenere un flusso dal risultato.

Sostituire le variabili subscription e region con le chiavi della sottoscrizione e dell'area.

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
    "time"

    "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)

func main(subscription string, region string) {
    subscription :=  "YOUR_SUBSCRIPTION_KEY"
    region := "YOUR_SUBSCRIPTIONKEY_REGION"

    config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer config.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(config, nil)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechSynthesizer.Close()

    speechSynthesizer.SynthesisStarted(synthesizeStartedHandler)
    speechSynthesizer.Synthesizing(synthesizingHandler)
    speechSynthesizer.SynthesisCompleted(synthesizedHandler)
    speechSynthesizer.SynthesisCanceled(cancelledHandler)

    for {
        fmt.Printf("Enter some text that you want to speak, or enter empty text to exit.\n> ")
        text, _ := bufio.NewReader(os.Stdin).ReadString('\n')
        text = strings.TrimSuffix(text, "\n")
        if len(text) == 0 {
            break
        }

        // StartSpeakingTextAsync sends the result to channel when the synthesis starts.
        task := speechSynthesizer.StartSpeakingTextAsync(text)
        var outcome speech.SpeechSynthesisOutcome
        select {
        case outcome = <-task:
        case <-time.After(60 * time.Second):
            fmt.Println("Timed out")
            return
        }
        defer outcome.Close()
        if outcome.Error != nil {
            fmt.Println("Got an error: ", outcome.Error)
            return
        }

        // in most case we want to streaming receive the audio to lower the latency,
        // we can use AudioDataStream to do so.
        stream, err := speech.NewAudioDataStreamFromSpeechSynthesisResult(outcome.Result)
        defer stream.Close()
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }

        var all_audio []byte
        audio_chunk := make([]byte, 2048)
        for {
            n, err := stream.Read(audio_chunk)

            if err == io.EOF {
                break
            }

            all_audio = append(all_audio, audio_chunk[:n]...)
        }

        fmt.Printf("Read [%d] bytes from audio data stream.\n", len(all_audio))
    }
}

Eseguire i comandi seguenti per creare un go.mod file che si collega ai componenti ospitati in GitHub.

go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Ora compilare ed eseguire il codice.

go build
go run quickstart

Per informazioni dettagliate sulle classi SpeechConfig e SpeechSynthesizer, vedere la documentazione di riferimento.

Usare SSML per personalizzare le caratteristiche vocali

Il linguaggio SSML (Speech Synthesis Markup Language) consente di ottimizzare il tono, la pronuncia, la velocità del parlato, il volume e altro ancora dell'output della sintesi vocale inviando le richieste da XML Schema. Questa sezione illustra un esempio di modifica della voce, ma per una guida più dettagliata, vedere l'articolo sulle procedure di SSML.

Per iniziare a usare SSML per la personalizzazione, è necessario apportare una semplice modifica che cambia la voce. Creare prima di tutto un nuovo file XML per la configurazione di SSML nella directory radice del progetto, in questo esempio ssml.xml. L'elemento radice è sempre <speak> e il wrapping del testo in un elemento <voice> consente di cambiare la voce usando il parametro name. Vedere l'elenco completo delle voci neurali supportate.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    When you're on the freeway, it's a good idea to use a GPS.
  </voice>
</speak>

Successivamente, è necessario cambiare la richiesta di sintesi vocale in modo che faccia riferimento al file XML. La richiesta è essenzialmente la stessa, ma invece di usare la funzione SpeakTextAsync() si usa SpeakSsmlAsync(). Questa funzione prevede una stringa XML, quindi è prima di tutto necessario caricare la configurazione di SSML come stringa. Da qui, l'oggetto risultato è esattamente lo stesso degli esempi precedenti.

Nota

Per modificare la voce senza usare SSML, è possibile impostare la proprietà SpeechConfig su usando speechConfig.SetSpeechSynthesisVoiceName("en-US-AriaNeural")

Ottenere gli eventi di posizione facciale

Il riconoscimento vocale può essere un buon modo per guidare l'animazione delle espressioni facciali. Spesso i visemi vengono usati per rappresentare le posizioni chiave nel parlato osservato, ad esempio la posizione del fonema, del fonema specifico e del fonema. È possibile sottoscrivere l'evento viseme in Speech SDK. È quindi possibile applicare eventi viseme per animare il viso di un carattere durante la riproduzione dell'audio vocale. Informazioni su come ottenere eventi viseme.

Questo argomento di avvio rapido illustra i modelli di progettazione comuni per eseguire la sintesi vocale con Speech SDK. Si inizia con la configurazione di base e la sintesi e si passa ad esempi più avanzati per lo sviluppo di applicazioni personalizzate, tra cui:

  • Recupero di risposte come flussi in memoria
  • Personalizzazione della frequenza di campionamento e della velocità in bit dell'output
  • Invio di richieste di sintesi tramite SSML (Speech Synthesis Markup Language)
  • Uso di voci neurali

Passare agli esempi su GitHub

Per passare direttamente al codice di esempio, vedere gli esempi di avvio rapido Java in GitHub.

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK. A seconda della piattaforma, usare le istruzioni seguenti:

Importare le dipendenze

Per eseguire gli esempi di questo articolo, includere le istruzioni import seguenti all'inizio dello script.

import com.microsoft.cognitiveservices.speech.AudioDataStream;
import com.microsoft.cognitiveservices.speech.SpeechConfig;
import com.microsoft.cognitiveservices.speech.SpeechSynthesizer;
import com.microsoft.cognitiveservices.speech.SpeechSynthesisOutputFormat;
import com.microsoft.cognitiveservices.speech.SpeechSynthesisResult;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;

import java.io.*;
import java.util.Scanner;

Creare una configurazione di Voce

Per chiamare il servizio Voce con Speech SDK, è necessario creare una classe SpeechConfig. 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.

Esistono diversi modi per inizializzare SpeechConfig:

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

In questo esempio viene creato un oggetto SpeechConfig usando una chiave e un'area di sottoscrizione. Per ottenere queste credenziali, seguire la procedura descritta in Provare il servizio Voce gratuitamente. Si crea anche un codice boilerplate di base da usare per la parte restante di questo articolo, che viene modificato per diverse personalizzazioni.

public class Program
{
    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    }
}

Sintetizzare la voce in un file

Successivamente, creare un oggetto SpeechSynthesizer, che esegue le conversioni di sintesi vocale e invia l'output ad altoparlanti, file o altri flussi. SpeechSynthesizer accetta come parametri l'oggetto SpeechConfig creato nel passaggio precedente e un oggetto AudioConfig che specifica come devono essere gestiti i risultati dell'output.

Per iniziare, creare un oggetto AudioConfig per scrivere automaticamente l'output in un file .wav, usando la funzione statica fromWavFileOutput().

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
}

Successivamente, creare un'istanza di SpeechSynthesizer passando l'oggetto speechConfig e l'oggetto audioConfig come parametri. Quindi, per eseguire la sintesi vocale e scrivere il risultato in un file, basta eseguire SpeakText() con una stringa di testo.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.SpeakText("A simple test to write to a file.");
}

Eseguire il programma. Un file .wav sintetizzato viene scritto nella posizione specificata. Si tratta di un esempio valido dell'utilizzo più semplice, ma in seguito viene illustrato come personalizzare l'output e gestire la relativa risposta in un flusso in memoria per scenari personalizzati.

Sintetizzare l'output dell'altoparlante

In alcuni casi, si può scegliere di indirizzare la voce sintetizzata di output direttamente a un altoparlante. A questo scopo, creare un'istanza di AudioConfig usando la funzione statica fromDefaultSpeakerOutput(). L'output viene così indirizzato al dispositivo di output attivo corrente.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    AudioConfig audioConfig = AudioConfig.fromDefaultSpeakerOutput();

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.SpeakText("Synthesizing directly to speaker output.");
}

Ottenere il risultato come flusso in memoria

Per molti scenari di sviluppo di applicazioni vocali, i dati audio risultanti potrebbero essere necessari come flusso in memoria invece di essere scritti direttamente in un file. In questo modo è possibile creare un comportamento personalizzato per:

  • Astrarre la matrice di byte risultante come flusso ricercabile per i servizi downstream personalizzati.
  • Integrare il risultato con altri servizi o API.
  • Modificare i dati audio, scrivere intestazioni di .wav personalizzate e così via.

È semplice apportare questa modifica dall'esempio precedente. Rimuovere prima di tutto il blocco AudioConfig, perché il comportamento di output verrà gestito manualmente da questo punto in poi per un maggior controllo. Passare quindi null per AudioConfig nel costruttore SpeechSynthesizer.

Nota

Se si passa null per AudioConfig, invece di ometterlo come nel precedente esempio di output nell'altoparlante, l'audio non verrà riprodotto per impostazione predefinita nel dispositivo di output attivo corrente.

Questa volta il risultato viene salvato in una variabile SpeechSynthesisResult. La funzione SpeechSynthesisResult.getAudioData() restituisce un oggetto byte [] dei dati di output. Questo oggetto byte [] può essere gestito manualmente oppure è possibile usare la classe AudioDataStream per gestire il flusso in memoria. In questo esempio si usa la funzione statica AudioDataStream.fromResult() per ottenere un flusso dal risultato.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);

    SpeechSynthesisResult result = synthesizer.SpeakText("Getting the response as an in-memory stream.");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    System.out.print(stream.getStatus());
}

Da qui è possibile implementare qualsiasi comportamento personalizzato usando l'oggetto stream risultante.

Personalizzare il formato audio

La sezione seguente illustra come personalizzare gli attributi dell'output audio, tra cui:

  • Tipo di file audio
  • Frequenza di campionamento
  • Profondità di bit

Per cambiare il formato audio, usare la funzione setSpeechSynthesisOutputFormat() nell'oggetto SpeechConfig. Questa funzione prevede un oggetto enum di tipo SpeechSynthesisOutputFormat, che è possibile usare per selezionare il formato di output. Per un elenco di formati audio disponibili, vedere la documentazione di riferimento.

Sono disponibili varie opzioni per tipi di file diversi a seconda dei requisiti. Si noti che, per definizione, i formati non elaborati come Raw24Khz16BitMonoPcm non includono intestazioni audio. Usare formati non elaborati solo quando si è certi che l'implementazione downstream possa decodificare un flusso di bit non elaborato o se si prevede di creare manualmente le intestazioni in base alla profondità di bit, alla frequenza di campionamento, al numero di canali e così via.

In questo esempio si specifica un formato RIFF ad alta fedeltà Riff24Khz16BitMonoPcm impostando SpeechSynthesisOutputFormat nell'oggetto SpeechConfig. Analogamente all'esempio della sezione precedente, è possibile usare AudioDataStream per ottenere un flusso in memoria del risultato e quindi scriverlo in un file.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");

    // set the output format
    speechConfig.setSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
    SpeechSynthesisResult result = synthesizer.SpeakText("Customizing audio output format.");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

Eseguendo il programma, anche in questo caso verrà scritto un file .wav nel percorso specificato.

Usare SSML per personalizzare le caratteristiche vocali

Il linguaggio SSML (Speech Synthesis Markup Language) consente di ottimizzare il tono, la pronuncia, la velocità del parlato, il volume e altro ancora dell'output della sintesi vocale inviando le richieste da XML Schema. In questa sezione viene illustrato un esempio di modifica della voce, ma per una guida più dettagliata, vedere l' articolo sulle procedure relative a SSML.

Per iniziare a usare SSML per la personalizzazione, è necessario apportare una semplice modifica che cambia la voce. Creare prima di tutto un nuovo file XML per la configurazione di SSML nella directory radice del progetto, in questo esempio ssml.xml. L'elemento radice è sempre <speak> e il wrapping del testo in un elemento <voice> consente di cambiare la voce usando il parametro name. Vedere l' elenco completo delle voci neurali supportate.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    When you're on the freeway, it's a good idea to use a GPS.
  </voice>
</speak>

Successivamente, è necessario cambiare la richiesta di sintesi vocale in modo che faccia riferimento al file XML. La richiesta è essenzialmente la stessa, ma invece di usare la funzione SpeakText() si usa SpeakSsml(). Questa funzione prevede una stringa XML, quindi creare prima di tutto una funzione per caricare un file XML e restituirlo come stringa.

private static String xmlToString(String filePath) {
    File file = new File(filePath);
    StringBuilder fileContents = new StringBuilder((int)file.length());

    try (Scanner scanner = new Scanner(file)) {
        while(scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine() + System.lineSeparator());
        }
        return fileContents.toString().trim();
    } catch (FileNotFoundException ex) {
        return "File not found.";
    }
}

Da qui, l'oggetto risultato è esattamente lo stesso degli esempi precedenti.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);

    String ssml = xmlToString("ssml.xml");
    SpeechSynthesisResult result = synthesizer.SpeakSsml(ssml);
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

Nota

Per modificare la voce senza usare SSML, è possibile impostare la proprietà SpeechConfig su usando SpeechConfig.setSpeechSynthesisVoiceName("en-US-AriaNeural");

Ottenere gli eventi di posa facciali

Il riconoscimento vocale può essere un modo efficace per guidare l'animazione di espressioni facciali. Spesso visemes vengono usati per rappresentare la chiave che si pone in un discorso osservato, ad esempio la posizione dei labbri, la mascella e la lingua durante la produzione di un fonema particolare. È possibile sottoscrivere gli eventi viseme nell'SDK vocale per ottenere i dati di animazione facciali, quindi applicare i dati a un carattere durante un'animazione facciale. Informazioni su come ottenere gli eventi viseme.

Questo argomento di avvio rapido illustra i modelli di progettazione comuni per eseguire la sintesi vocale con Speech SDK. Si inizia con la configurazione di base e la sintesi e si passa ad esempi più avanzati per lo sviluppo di applicazioni personalizzate, tra cui:

  • Recupero di risposte come flussi in memoria
  • Personalizzazione della frequenza di campionamento e della velocità in bit dell'output
  • Invio di richieste di sintesi tramite SSML (Speech Synthesis Markup Language)
  • Uso di voci neurali

Passare agli esempi su GitHub

Per passare direttamente al codice di esempio, vedere gli esempi di avvio rapido JavaScript in GitHub.

Prerequisiti

Questo articolo presuppone che si disponga di un account Azure e di una risorsa del servizio di riconoscimento vocale. Se non si dispone di un account e di una risorsa, provare a usare il servizio riconoscimento vocale gratuitamente.

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK per JavaScript. A seconda della piattaforma, usare le istruzioni seguenti:

A seconda dell'ambiente di destinazione, inoltre, usare una delle alternative seguenti:

Scaricare ed estrarre il file SDK di riconoscimento vocale per JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js e inserirlo in una cartella accessibile al file HTML.

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

Suggerimento

Se la destinazione è un Web browser e si usa il tag <script>, il prefisso sdk non è necessario. Il prefisso sdk è un alias usato per la denominazione del modulo di require.

Creare una configurazione di Voce

Per chiamare il servizio Voce con Speech SDK, è necessario creare una classe SpeechConfig. Questa classe include informazioni sulla risorsa, 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.

Esistono diversi modi per inizializzare SpeechConfig:

  • Con una risorsa: 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.

In questo esempio si crea un oggetto SpeechConfig usando una chiave e un'area di risorsa. Per ottenere queste credenziali, seguire la procedura descritta in Provare il servizio Voce gratuitamente. Si crea anche un codice boilerplate di base da usare per la parte restante di questo articolo, che viene modificato per diverse personalizzazioni.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
}

synthesizeSpeech();

Sintetizzare la voce in un file

Successivamente, creare un oggetto SpeechSynthesizer, che esegue le conversioni di sintesi vocale e invia l'output ad altoparlanti, file o altri flussi. SpeechSynthesizer accetta come parametri l'oggetto SpeechConfig creato nel passaggio precedente e un oggetto AudioConfig che specifica come devono essere gestiti i risultati dell'output.

Per iniziare, creare un oggetto AudioConfig per scrivere automaticamente l'output in un file .wav, usando la funzione statica fromAudioFileOutput().

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const audioConfig = AudioConfig.fromAudioFileOutput("path/to/file.wav");
}

Successivamente, creare un'istanza di SpeechSynthesizer passando l'oggetto speechConfig e l'oggetto audioConfig come parametri. Quindi, per eseguire la sintesi vocale e scrivere il risultato in un file, basta eseguire speakTextAsync() con una stringa di testo. Il callback del risultato è una valida posizione in cui eseguire la chiamata di synthesizer.close(), necessaria per il funzionamento corretto della sintesi.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const audioConfig = AudioConfig.fromAudioFileOutput("path-to-file.wav");

    const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.speakTextAsync(
        "A simple test to write to a file.",
        result => {
            synthesizer.close();
            if (result) {
                // return result as stream
                return fs.createReadStream("path-to-file.wav");
            }
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Eseguire il programma. Un file .wav sintetizzato viene scritto nella posizione specificata. Si tratta di un esempio valido dell'utilizzo più semplice, ma in seguito viene illustrato come personalizzare l'output e gestire la relativa risposta in un flusso in memoria per scenari personalizzati.

Sintetizzare l'output dell'altoparlante

In alcuni casi, si può scegliere di indirizzare la voce sintetizzata di output direttamente a un altoparlante. A questo scopo, creare un'istanza di AudioConfig usando la funzione statica fromDefaultSpeakerOutput(). L'output viene così indirizzato al dispositivo di output attivo corrente.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const audioConfig = AudioConfig.fromDefaultSpeakerOutput();

    const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    synthesizer.speakTextAsync(
        "Synthesizing directly to speaker output.",
        result => {
            if (result) {
                synthesizer.close();
                return result.audioData;
            }
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Ottenere il risultato come flusso in memoria

Per molti scenari di sviluppo di applicazioni vocali, i dati audio risultanti potrebbero essere necessari come flusso in memoria invece di essere scritti direttamente in un file. In questo modo è possibile creare un comportamento personalizzato per:

  • Astrarre la matrice di byte risultante come flusso ricercabile per i servizi downstream personalizzati.
  • Integrare il risultato con altri servizi o API.
  • Modificare i dati audio, scrivere intestazioni di .wav personalizzate e così via.

È semplice apportare questa modifica dall'esempio precedente. Rimuovere prima di tutto il blocco AudioConfig, perché il comportamento di output verrà gestito manualmente da questo punto in poi per un maggior controllo. Passare quindi undefined per AudioConfig nel costruttore SpeechSynthesizer.

Nota

Se si passa undefined per AudioConfig, invece di ometterlo come nel precedente esempio di output nell'altoparlante, l'audio non verrà riprodotto per impostazione predefinita nel dispositivo di output attivo corrente.

Questa volta il risultato viene salvato in una variabile SpeechSynthesisResult. La SpeechSynthesisResult.audioData proprietà restituisce un oggetto ArrayBuffer dei dati di output, il tipo di flusso del browser predefinito. Per il codice server, convertire il arrayBuffer in un flusso del buffer.

Il codice seguente funziona per il codice lato client.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

    synthesizer.speakTextAsync(
        "Getting the response as an in-memory stream.",
        result => {
            synthesizer.close();
            return result.audioData;
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Da qui è possibile implementare qualsiasi comportamento personalizzato usando l'oggetto ArrayBuffer risultante. ArrayBuffer è un tipo comune da ricevere in un browser e riprodurre da questo formato.

Per qualsiasi codice basato su server, se è necessario usare i dati come flusso, invece di un ArrayBuffer, è necessario convertire l'oggetto in un flusso.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

    synthesizer.speakTextAsync(
        "Getting the response as an in-memory stream.",
        result => {
            const { audioData } = result;

            synthesizer.close();

            // convert arrayBuffer to stream
            // return stream
            const bufferStream = new PassThrough();
            bufferStream.end(Buffer.from(audioData));
            return bufferStream;
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Personalizzare il formato audio

La sezione seguente illustra come personalizzare gli attributi dell'output audio, tra cui:

  • Tipo di file audio
  • Frequenza di campionamento
  • Profondità di bit

Per cambiare il formato audio, usare la proprietà speechSynthesisOutputFormat nell'oggetto SpeechConfig. Questa proprietà prevede un oggetto enum di tipo SpeechSynthesisOutputFormat, che viene usato per selezionare il formato di output. Per un elenco di formati audio disponibili, vedere la documentazione di riferimento.

Sono disponibili varie opzioni per tipi di file diversi a seconda dei requisiti. Si noti che, per definizione, i formati non elaborati come Raw24Khz16BitMonoPcm non includono intestazioni audio. Usare formati non elaborati solo quando si è certi che l'implementazione downstream possa decodificare un flusso di bit non elaborato o se si prevede di creare manualmente le intestazioni in base alla profondità di bit, alla frequenza di campionamento, al numero di canali e così via.

In questo esempio si specifica un formato RIFF ad alta fedeltà Riff24Khz16BitMonoPcm impostando speechSynthesisOutputFormat nell'oggetto SpeechConfig. Analogamente all'esempio riportato nella sezione precedente, ottenere i dati audio di ArrayBuffer e interagirvi.

function synthesizeSpeech() {
    const speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");

    // Set the output format
    speechConfig.speechSynthesisOutputFormat = SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm;

    const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);
    synthesizer.speakTextAsync(
        "Customizing audio output format.",
        result => {
            // Interact with the audio ArrayBuffer data
            const audioData = result.audioData;
            console.log(`Audio data byte size: ${audioData.byteLength}.`)

            synthesizer.close();
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Eseguendo il programma, anche in questo caso verrà scritto un file .wav nel percorso specificato.

Usare SSML per personalizzare le caratteristiche vocali

Il linguaggio SSML (Speech Synthesis Markup Language) consente di ottimizzare il tono, la pronuncia, la velocità del parlato, il volume e altro ancora dell'output della sintesi vocale inviando le richieste da XML Schema. In questa sezione viene illustrato un esempio di modifica della voce, ma per una guida più dettagliata, vedere l' articolo sulle procedure relative a SSML.

Per iniziare a usare SSML per la personalizzazione, è necessario apportare una semplice modifica che cambia la voce. Creare prima di tutto un nuovo file XML per la configurazione di SSML nella directory radice del progetto, in questo esempio ssml.xml. L'elemento radice è sempre <speak> e il wrapping del testo in un elemento <voice> consente di cambiare la voce usando il parametro name. Vedere l' elenco completo delle voci neurali supportate.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    When you're on the freeway, it's a good idea to use a GPS.
  </voice>
</speak>

Successivamente, è necessario cambiare la richiesta di sintesi vocale in modo che faccia riferimento al file XML. La richiesta è essenzialmente la stessa, ma invece di usare la funzione speakTextAsync() si usa speakSsmlAsync(). Questa funzione prevede una stringa XML, quindi creare prima di tutto una funzione per caricare un file XML e restituirlo come stringa.

function xmlToString(filePath) {
    const xml = readFileSync(filePath, "utf8");
    return xml;
}

Per altre informazioni su readFileSync, vedere File system Node.js. Da qui, l'oggetto risultato è esattamente lo stesso degli esempi precedenti.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);

    const ssml = xmlToString("ssml.xml");
    synthesizer.speakSsmlAsync(
        ssml,
        result => {
            if (result.errorDetails) {
                console.error(result.errorDetails);
            } else {
                console.log(JSON.stringify(result));
            }

            synthesizer.close();
        },
        error => {
            console.log(error);
            synthesizer.close();
        });
}

Nota

Per modificare la voce senza usare SSML, è possibile impostare la proprietà SpeechConfig su usando SpeechConfig.speechSynthesisVoiceName = "en-US-AriaNeural";

Ottenere gli eventi di posa facciali

Il riconoscimento vocale può essere un modo efficace per guidare l'animazione di espressioni facciali. Spesso visemes vengono usati per rappresentare la chiave che si pone in un discorso osservato, ad esempio la posizione dei labbri, la mascella e la lingua durante la produzione di un fonema particolare. È possibile sottoscrivere l'evento viseme in Speech SDK. Quindi, è possibile applicare gli eventi viseme per animare la faccia di un carattere come riproduzione audio vocale. Informazioni su come ottenere gli eventi viseme.

È possibile eseguire la sintesi vocale del testo usando Speech SDK per Swift e Objective-C.

Prerequisiti

Gli esempi seguenti presuppongono che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Installare Speech SDK e gli esempi

Speech SDK di Servizi cognitivi contiene esempi scritti in Swift e Objective-C per iOS e Mac. Fare clic su un collegamento per visualizzare le istruzioni di installazione per ogni esempio:

Sono disponibili anche Informazioni di riferimento su Speech SDK per Objective-C.

Questo argomento di avvio rapido illustra i modelli di progettazione comuni per eseguire la sintesi vocale con Speech SDK. Si inizia con la configurazione di base e la sintesi e si passa ad esempi più avanzati per lo sviluppo di applicazioni personalizzate, tra cui:

  • Recupero di risposte come flussi in memoria
  • Personalizzazione della frequenza di campionamento e della velocità in bit dell'output
  • Invio di richieste di sintesi tramite SSML (Speech Synthesis Markup Language)
  • Uso di voci neurali

Passare agli esempi su GitHub

Per passare direttamente al codice di esempio, vedere gli esempi di avvio rapido Python in GitHub.

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK.

pip install azure-cognitiveservices-speech

Se si usa macOS e si verificano problemi di installazione, può essere necessario eseguire prima questo comando.

python3 -m pip install --upgrade pip

Dopo l'installazione di Speech SDK, includere le istruzioni import seguenti all'inizio dello script.

from azure.cognitiveservices.speech import AudioDataStream, SpeechConfig, SpeechSynthesizer, SpeechSynthesisOutputFormat
from azure.cognitiveservices.speech.audio import AudioOutputConfig

Creare una configurazione di Voce

Per chiamare il servizio Voce con Speech SDK, è necessario creare una classe SpeechConfig. 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.

Esistono diversi modi per inizializzare SpeechConfig:

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

In questo esempio viene creato un oggetto SpeechConfig usando una chiave e un'area di sottoscrizione. Per ottenere queste credenziali, seguire la procedura descritta in Provare il servizio Voce gratuitamente.

speech_config = SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")

Sintetizzare la voce in un file

Successivamente, creare un oggetto SpeechSynthesizer, che esegue le conversioni di sintesi vocale e invia l'output ad altoparlanti, file o altri flussi. SpeechSynthesizer accetta come parametri l'oggetto SpeechConfig creato nel passaggio precedente e un oggetto AudioOutputConfig che specifica come devono essere gestiti i risultati dell'output.

Per iniziare, creare un oggetto AudioOutputConfig per scrivere automaticamente l'output in un file .wav, usando il parametro del costruttore filename.

audio_config = AudioOutputConfig(filename="path/to/write/file.wav")

Successivamente, creare un'istanza di SpeechSynthesizer passando l'oggetto speech_config e l'oggetto audio_config come parametri. Quindi, per eseguire la sintesi vocale e scrivere il risultato in un file, basta eseguire speak_text_async() con una stringa di testo.

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
synthesizer.speak_text_async("A simple test to write to a file.")

Eseguire il programma. Un file .wav sintetizzato viene scritto nella posizione specificata. Si tratta di un esempio valido dell'utilizzo più semplice, ma in seguito viene illustrato come personalizzare l'output e gestire la relativa risposta in un flusso in memoria per scenari personalizzati.

Sintetizzare l'output dell'altoparlante

In alcuni casi, si può scegliere di indirizzare la voce sintetizzata di output direttamente a un altoparlante. A questo scopo, usare l'esempio della sezione precedente, ma cambiare AudioOutputConfig rimuovendo il parametro filename e impostare use_default_speaker=True. L'output viene così indirizzato al dispositivo di output attivo corrente.

audio_config = AudioOutputConfig(use_default_speaker=True)

Ottenere il risultato come flusso in memoria

Per molti scenari di sviluppo di applicazioni vocali, i dati audio risultanti potrebbero essere necessari come flusso in memoria invece di essere scritti direttamente in un file. In questo modo è possibile creare un comportamento personalizzato per:

  • Astrarre la matrice di byte risultante come flusso ricercabile per i servizi downstream personalizzati.
  • Integrare il risultato con altri servizi o API.
  • Modificare i dati audio, scrivere intestazioni di .wav personalizzate e così via.

È semplice apportare questa modifica dall'esempio precedente. Rimuovere prima di tutto AudioConfig, perché il comportamento di output verrà gestito manualmente da questo punto in poi per un maggior controllo. Passare quindi None per AudioConfig nel costruttore SpeechSynthesizer.

Nota

Se si passa None per AudioConfig, invece di ometterlo come nel precedente esempio di output nell'altoparlante, l'audio non verrà riprodotto per impostazione predefinita nel dispositivo di output attivo corrente.

Questa volta il risultato viene salvato in una variabile SpeechSynthesisResult. La proprietà audio_data contiene un oggetto bytes dei dati di output. Questo oggetto può essere gestito manualmente oppure è possibile usare la classe AudioDataStream per gestire il flusso in memoria. In questo esempio si usa il costruttore AudioDataStream per ottenere un flusso dal risultato.

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)
result = synthesizer.speak_text_async("Getting the response as an in-memory stream.").get()
stream = AudioDataStream(result)

Da qui è possibile implementare qualsiasi comportamento personalizzato usando l'oggetto stream risultante.

Personalizzare il formato audio

La sezione seguente illustra come personalizzare gli attributi dell'output audio, tra cui:

  • Tipo di file audio
  • Frequenza di campionamento
  • Profondità di bit

Per cambiare il formato audio, usare la funzione set_speech_synthesis_output_format() nell'oggetto SpeechConfig. Questa funzione prevede un oggetto enum di tipo SpeechSynthesisOutputFormat, che è possibile usare per selezionare il formato di output. Per un elenco di formati audio disponibili, vedere la documentazione di riferimento.

Sono disponibili varie opzioni per tipi di file diversi a seconda dei requisiti. Si noti che, per definizione, i formati non elaborati come Raw24Khz16BitMonoPcm non includono intestazioni audio. Usare formati non elaborati solo quando si è certi che l'implementazione downstream possa decodificare un flusso di bit non elaborato o se si prevede di creare manualmente le intestazioni in base alla profondità di bit, alla frequenza di campionamento, al numero di canali e così via.

In questo esempio si specifica un formato RIFF ad alta fedeltà Riff24Khz16BitMonoPcm impostando SpeechSynthesisOutputFormat nell'oggetto SpeechConfig. Analogamente all'esempio della sezione precedente, è possibile usare AudioDataStream per ottenere un flusso in memoria del risultato e quindi scriverlo in un file.

speech_config.set_speech_synthesis_output_format(SpeechSynthesisOutputFormat["Riff24Khz16BitMonoPcm"])
synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)

result = synthesizer.speak_text_async("Customizing audio output format.").get()
stream = AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

Eseguendo il programma, anche in questo caso verrà scritto un file .wav personalizzato nel percorso specificato.

Usare SSML per personalizzare le caratteristiche vocali

Il linguaggio SSML (Speech Synthesis Markup Language) consente di ottimizzare il tono, la pronuncia, la velocità del parlato, il volume e altro ancora dell'output della sintesi vocale inviando le richieste da XML Schema. In questa sezione viene illustrato un esempio di modifica della voce, ma per una guida più dettagliata, vedere l' articolo sulle procedure relative a SSML.

Per iniziare a usare SSML per la personalizzazione, è necessario apportare una semplice modifica che cambia la voce. Creare prima di tutto un nuovo file XML per la configurazione di SSML nella directory radice del progetto, in questo esempio ssml.xml. L'elemento radice è sempre <speak> e il wrapping del testo in un elemento <voice> consente di cambiare la voce usando il parametro name. Vedere l' elenco completo delle voci neurali supportate.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    When you're on the freeway, it's a good idea to use a GPS.
  </voice>
</speak>

Successivamente, è necessario cambiare la richiesta di sintesi vocale in modo che faccia riferimento al file XML. La richiesta è essenzialmente la stessa, ma invece di usare la funzione speak_text_async() si usa speak_ssml_async(). Questa funzione prevede una stringa XML, quindi è prima di tutto necessario leggere la configurazione di SSML come stringa. Da qui, l'oggetto risultato è esattamente lo stesso degli esempi precedenti.

Nota

Se ssml_string contiene  all'inizio della stringa, è necessario rimuovere il formato BOM, in caso contrario il servizio restituirà un errore. A questo scopo, impostare il parametro encoding come segue: open("ssml.xml", "r", encoding="utf-8-sig").

synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=None)

ssml_string = open("ssml.xml", "r").read()
result = synthesizer.speak_ssml_async(ssml_string).get()

stream = AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

Nota

Per modificare la voce senza usare SSML, è possibile impostare la proprietà SpeechConfig su usando SpeechConfig.speech_synthesis_voice_name = "en-US-AriaNeural"

Ottenere gli eventi di posa facciali

Il riconoscimento vocale può essere un modo efficace per guidare l'animazione di espressioni facciali. Spesso visemes vengono usati per rappresentare la chiave che si pone in un discorso osservato, ad esempio la posizione dei labbri, la mascella e la lingua durante la produzione di un fonema particolare. È possibile sottoscrivere l'evento viseme in Speech SDK. Quindi, è possibile applicare gli eventi viseme per animare la faccia di un carattere come riproduzione audio vocale. Informazioni su come ottenere gli eventi viseme.

Questa guida di avvio rapido descrive come eseguire la sintesi vocale con il servizio Voce e cURL.

Per informazioni generali sui concetti di sintesi vocale, vedere l'articolo Panoramica.

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Sintesi vocale

Al prompt dei comandi, eseguire questo comando. Sarà necessario inserire i valori seguenti nel comando.

  • La chiave di sottoscrizione al Servizio di riconoscimento vocale dell'utente.
  • L'area del servizio Voce.

È anche possibile modificare i valori seguenti.

  • Il valore dell'intestazione X-Microsoft-OutputFormat, che controlla il formato di output audio. Un elenco di formati di output audio supportati è disponibile nelle Informazioni di riferimento sull'API REST di sintesi vocale.
  • La voce di output. Per ottenere un elenco di voci disponibili per l'endpoint Voce, vedere la sezione successiva.
  • File di output. In questo esempio la risposta del server viene indirizzata a un file denominato output.wav.
curl --location --request POST 'https://INSERT_REGION_HERE.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/ssml+xml' \
--header 'X-Microsoft-OutputFormat: audio-16khz-128kbitrate-mono-mp3' \
--header 'User-Agent: curl' \
--data-raw '<speak version='\''1.0'\'' xml:lang='\''en-US'\''>
    <voice xml:lang='\''en-US'\'' xml:gender='\''Female'\'' name='\''en-US-AriaRUS'\''>
        my voice is my passport verify me
    </voice>
</speak>' > output.wav

Elencare le voci disponibili per l'endpoint Voce

Per elencare le voci disponibili per l'endpoint Voce, eseguire questo comando.

curl --location --request GET 'https://INSERT_ENDPOINT_HERE.tts.speech.microsoft.com/cognitiveservices/voices/list' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'

Verrà restituita una risposta simile alla seguente.

[
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ar-EG, Hoda)",
        "DisplayName": "Hoda",
        "LocalName": "هدى",
        "ShortName": "ar-EG-Hoda",
        "Gender": "Female",
        "Locale": "ar-EG",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ar-SA, Naayf)",
        "DisplayName": "Naayf",
        "LocalName": "نايف",
        "ShortName": "ar-SA-Naayf",
        "Gender": "Male",
        "Locale": "ar-SA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (bg-BG, Ivan)",
        "DisplayName": "Ivan",
        "LocalName": "Иван",
        "ShortName": "bg-BG-Ivan",
        "Gender": "Male",
        "Locale": "bg-BG",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        // This response is truncated. The response will include 
        // a complete list of supported languages and specific 
        // details like short name, gender, etc. 
    }
]

Questo argomento di avvio rapido illustra i modelli di progettazione comuni per eseguire la sintesi vocale con Speech SDK. Si inizia con la configurazione di base e la sintesi e si passa ad esempi più avanzati per lo sviluppo di applicazioni personalizzate, tra cui:

  • Recupero di risposte come flussi in memoria
  • Personalizzazione della frequenza di campionamento e della velocità in bit dell'output
  • Invio di richieste di sintesi tramite SSML (Speech Synthesis Markup Language)
  • Uso di voci neurali

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Download e installazione

Per installare l’interfaccia della riga di comando di Voce su Windows, seguire questa procedura:

  1. In Windows è necessaria la versione di Microsoft Visual C++ Redistributable per Visual Studio 2019 per la piattaforma in uso. La prima volta che si esegue questa installazione può essere necessario riavviare il sistema.

  2. Installare .NET Core 3.1 SDK.

  3. Installare l'interfaccia della riga di comando di Voce usando NuGet immettendo questo comando:

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

Digitare spx per visualizzare la guida per l'interfaccia della riga di comando di Voce.

Nota

In alternativa a NuGet, è possibile scaricare ed estrarre l'interfaccia della riga di comando di Voce per Windows come file ZIP.

Limitazioni dei tipi di carattere

In Windows, l'interfaccia della riga di comando di Voce può visualizzare solo i tipi di carattere disponibili per il prompt dei comandi nel computer locale. Il terminale Windows supporta tutti i tipi di carattere prodotti in modo interattivo dall'interfaccia della riga di comando di Voce.

Se l'output viene restituito in un file, è possibile che anche un editor di testo come Blocco note o un Web browser come Microsoft Edge visualizzi tutti i tipi di carattere.

Creare la configurazione della sottoscrizione

Per iniziare a usare l'interfaccia della riga di comando di Voce, è necessario immettere la chiave della sottoscrizione e l'identificatore di area del servizio Voce. Per ottenere queste credenziali, seguire la procedura descritta in Provare il servizio Voce gratuitamente. Dopo aver ottenuto l’identificatore dell’area e della chiave di sottoscrizione (ad esempio, eastus, westus), eseguire i comandi seguenti.

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

L'autenticazione della sottoscrizione è ora archiviata per richieste SPX future. Se è necessario rimuovere uno di questi valori archiviati, eseguire spx config @region --clear o spx config @key --clear.

Sintetizzare la voce in un altoparlante

A questo punto si è pronti per eseguire l'interfaccia della riga di comando per Voce per sintetizzare la sintesi vocale da testo. Dalla riga di comando passare alla directory che contiene il file binario dell'interfaccia della riga di comando per Voce. Quindi eseguire il comando seguente.

spx synthesize --text "The speech synthesizer greets you!"

L'interfaccia della riga di comando per Voce produrrà il linguaggio naturale in inglese attraverso l’altoparlante del computer.

Sintetizzare la voce in un file

Eseguire il comando seguente per sostituire l'output del relatore con un file .wav.

spx synthesize --text "The speech synthesizer greets you!" --audio output greetings.wav

L'interfaccia della riga di comando per Voce produrrà il linguaggio naturale in inglese nel file audio greetings.wav. In Windows è possibile riprodurre il file audio immettendo start greetings.wav.

Ottenere informazioni sulla posizione

Il progetto potrebbe dover sapere quando una parola viene pronunciata tramite sintesi vocale in modo che possa eseguire un'azione specifica in base a tale intervallo. Ad esempio, se si vogliono evidenziare le parole mentre sono state pronunciate, è necessario sapere cosa evidenziare, quando evidenziarla e per quanto tempo evidenziarla.

A tale scopo, è possibile usare WordBoundary l'evento disponibile all'interno di SpeechSynthesizer . Questo evento viene generato all'inizio di ogni nuova parola parlata e fornirà una offset temporale all'interno del flusso parlato e un offset di testo all'interno della richiesta di input.

  • AudioOffset segnala il tempo trascorso dell'audio di output tra l'inizio della sintesi e l'inizio della parola successiva. Questo valore viene misurato in unità di centinaia di nanosecondi (HNS) con 10.000 HNS equivalenti a 1 millisecondo.
  • WordOffset segnala la posizione del carattere nella stringa di input (testo originale o SSML)immediatamente prima della parola che sta per essere pronunciata.

Nota

WordBoundary Gli eventi vengono generati quando i dati audio di output diventano disponibili, che saranno più veloci rispetto alla riproduzione in un dispositivo di output. La sincronizzazione appropriata dell'intervallo del flusso in "tempo reale" deve essere eseguita dal chiamante.

È possibile trovare esempi di uso WordBoundary di negli esempi di sintesi vocale in GitHub.

Passaggi successivi