Share via


Syntetisera tal från text

Referensdokumentation Paket (NuGet) | Ytterligare exempel på GitHub |

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Välj syntesspråk och röst

Text till tal-funktionen i Speech-tjänsten stöder mer än 400 röster och mer än 140 språk och varianter. Du kan hämta hela listan eller prova dem i röstgalleriet.

Ange språket eller rösten SpeechConfig för för att matcha indatatexten och använd den angivna rösten. Följande kodfragment visar hur den här tekniken fungerar:

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig.SpeechSynthesisLanguage = "en-US"; 
    speechConfig.SpeechSynthesisVoiceName = "en-US-AvaMultilingualNeural";
}

Alla neurala röster är flerspråkiga och flytande på sitt eget språk och engelska. Om till exempel indatatexten på engelska är "Jag är glad över att prova text till tal" och du väljer es-ES-ElviraNeural, talas texten på engelska med spansk accent.

Om rösten inte talar indatatextens språk skapar taltjänsten inte syntetiserat ljud. En fullständig lista över neurala röster som stöds finns i Språk och röststöd för Speech-tjänsten.

Kommentar

Standardrösten är den första röst som returneras per språkvariant från RÖSTLISTA-API:et.

Rösten som talar bestäms i prioritetsordning enligt följande:

  • Om du inte anger SpeechSynthesisVoiceName eller SpeechSynthesisLanguage, talar standardrösten för en-US .
  • Om du bara anger SpeechSynthesisLanguagetalar standardrösten för det angivna språket.
  • Om både SpeechSynthesisVoiceName och SpeechSynthesisLanguage anges ignoreras inställningen SpeechSynthesisLanguage . Den röst som du anger med hjälp SpeechSynthesisVoiceName av talar.
  • Om röstelementet anges med hjälp av Speech Synthesis Markup Language (SSML)SpeechSynthesisVoiceName ignoreras inställningarna ochSpeechSynthesisLanguage.

Syntetisera tal till en fil

Skapa ett SpeechSynthesizer-objekt . Det här objektet som visas i följande kodfragment kör text till talkonverteringar och utdata till talare, filer eller andra utdataströmmar. SpeechSynthesizer accepterar som parametrar:

  • SpeechConfig-objektet som du skapade i föregående steg.
  • Ett AudioConfig-objekt som anger hur utdataresultat ska hanteras.
  1. Skapa en AudioConfig instans för att automatiskt skriva utdata till en .wav fil med hjälp FromWavFileOutput() av funktionen . Instansiera den med en using instruktion.

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

    En using instruktion i den här kontexten bortskaffar automatiskt ohanterade resurser och gör att objektet hamnar utanför omfånget efter bortskaffandet.

  2. Instansiera en SpeechSynthesizer instans med en annan using instruktion. Skicka objektet speechConfig och objektet audioConfig som parametrar. Om du vill syntetisera tal och skriva till en fil kör du SpeakTextAsync() med en textsträng.

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
    using var speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");
}

När du kör programmet skapas en syntetiserad .wav fil som skrivs till den plats som du anger. Det här resultatet är ett bra exempel på den mest grundläggande användningen. Därefter kan du anpassa utdata och hantera utdatasvaret som en minnesintern ström för att arbeta med anpassade scenarier.

Syntetisera till högtalarens utdata

Om du vill mata ut syntetiserat tal till den aktuella aktiva utdataenheten, till exempel en talare, utelämnar du parametern AudioConfig när du skapar instansen SpeechSynthesizer . Här är ett exempel:

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    using var speechSynthesizer = new SpeechSynthesizer(speechConfig);
    await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");
}

Hämta ett resultat som en minnesintern ström

Du kan använda resulterande ljuddata som en minnesintern ström i stället för att skriva direkt till en fil. Med minnesintern ström kan du skapa ett anpassat beteende:

  • Abstrahera den resulterande bytematrisen som en sökbar ström för anpassade underordnade tjänster.
  • Integrera resultatet med andra API:er eller tjänster.
  • Ändra ljuddata, skriv anpassade .wav rubriker och utför relaterade uppgifter.

Du kan göra den här ändringen i föregående exempel. Ta först bort AudioConfig blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka null för AudioConfig i SpeechSynthesizer konstruktorn.

Kommentar

Att skicka null för , i stället för AudioConfigatt utelämna det som i föregående talarexempel, spelar inte upp ljudet som standard på den aktuella aktiva utdataenheten.

Spara resultatet i en SpeechSynthesisResult-variabel . Egenskapen AudioData innehåller en byte [] instans för utdata. Du kan arbeta med den här byte [] instansen manuellt, eller så kan du använda klassen AudioDataStream för att hantera den minnesinterna strömmen.

I det här exemplet använder du den AudioDataStream.FromResult() statiska funktionen för att hämta en ström från resultatet:

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null);

    var result = await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");
    using var stream = AudioDataStream.FromResult(result);
}

Nu kan du implementera alla anpassade beteenden med hjälp av det resulterande stream objektet.

Anpassa ljudformat

Du kan anpassa ljudutdataattribut, inklusive:

  • Typ av ljudfil
  • Exempelfrekvens
  • Bitdjup

Om du vill ändra ljudformatet SetSpeechSynthesisOutputFormat() använder du funktionen på SpeechConfig objektet. Den här funktionen förväntar sig en enum instans av typen SpeechSynthesisOutputFormat. enum Använd för att välja utdataformatet. Tillgängliga format finns i listan över ljudformat.

Det finns olika alternativ för olika filtyper, beroende på dina krav. Per definition innehåller råformat som Raw24Khz16BitMonoPcm inte ljudhuvuden. Använd endast raw-format i någon av dessa situationer:

  • Du vet att din nedströmsimplementering kan avkoda en rå bitström.
  • Du planerar att skapa rubriker manuellt baserat på faktorer som bitdjup, exempelfrekvens och antal kanaler.

Det här exemplet anger RIFF-formatet Riff24Khz16BitMonoPcm med hög återgivning genom att ange SpeechSynthesisOutputFormat objektet SpeechConfig . Precis som i exemplet i föregående avsnitt använder du AudioDataStream för att hämta en minnesintern ström av resultatet och sedan skriva det till en fil.

static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    speechConfig.SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

    using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    var result = await speechSynthesizer.SpeakTextAsync("I'm excited to try text to speech");

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

När du kör programmet skrivs en .wav fil till den angivna sökvägen.

Använda SSML för att anpassa talegenskaper

Du kan använda SSML för att finjustera tonhöjd, uttal, talfrekvens, volym och andra aspekter i text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten. Mer information finns i Översikt över talsyntesmarkeringsspråk.

Om du vill börja använda SSML för anpassning gör du en mindre ändring som växlar rösten.

  1. Skapa en ny XML-fil för SSML-konfigurationen i rotprojektkatalogen.

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

    I det här exemplet är filen ssml.xml. Rotelementet är alltid <speak>. Om du omsluter texten i ett <voice> element kan du ändra rösten med hjälp av parametern name . En fullständig lista över neurala röster som stöds finns i Språk som stöds.

  2. Ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är mestadels densamma, men i stället för att SpeakTextAsync() använda funktionen använder SpeakSsmlAsync()du . Den här funktionen förväntar sig en XML-sträng. Läs först in SSML-konfigurationen som en sträng med hjälp File.ReadAllText()av . Från och med nu är resultatobjektet exakt detsamma som tidigare exempel.

    Kommentar

    Om du använder Visual Studio hittar din byggkonfiguration förmodligen inte XML-filen som standard. Högerklicka på XML-filen och välj Egenskaper. Ändra byggåtgärden till Innehåll. Ändra Kopiera till utdatakatalog till Kopiera alltid.

    public static async Task SynthesizeAudioAsync()
    {
        var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
        using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    
        var ssml = File.ReadAllText("./ssml.xml");
        var result = await speechSynthesizer.SpeakSsmlAsync(ssml);
    
        using var stream = AudioDataStream.FromResult(result);
        await stream.SaveToWaveFileAsync("path/to/write/file.wav");
    }
    

Kommentar

Om du vill ändra rösten utan att använda SSML kan du ange egenskapen på SpeechConfig med hjälp SpeechConfig.SpeechSynthesisVoiceName = "en-US-AvaMultilingualNeural";av .

Prenumerera på synthesizer-händelser

Du kanske vill ha fler insikter om text till talbearbetning och resultat. Du kanske till exempel vill veta när synteten startar och stoppas, eller om du vill veta mer om andra händelser som påträffas under syntesen.

När du använder SpeechSynthesizer för text till tal kan du prenumerera på händelserna i den här tabellen:

Händelse beskrivning Användningsfall
BookmarkReached Signalerar att ett bokmärke har nåtts. För att utlösa en bokmärkeshändelse krävs ett bookmark element i SSML. Den här händelsen rapporterar utdataljudets förflutna tid mellan början av syntesen och elementet bookmark . Händelsens Text egenskap är det strängvärde som du anger i bokmärkets mark attribut. Elementen bookmark talas inte. Du kan använda elementet bookmark för att infoga anpassade markörer i SSML för att få förskjutningen av varje markör i ljudströmmen. Elementet bookmark kan användas för att referera till en specifik plats i text- eller taggsekvensen.
SynthesisCanceled Signaler om att talsyntesen avbröts. Du kan bekräfta när syntesen avbryts.
SynthesisCompleted Signaler om att talsyntesen är klar. Du kan bekräfta när syntesen är klar.
SynthesisStarted Signaler om att talsyntesen startade. Du kan bekräfta när syntesen startade.
Synthesizing Signaler om att talsyntes pågår. Den här händelsen utlöses varje gång SDK:et tar emot ett ljudsegment från Speech-tjänsten. Du kan bekräfta när syntesen pågår.
VisemeReceived Signaler om att en viseme-händelse togs emot. Visemes används ofta för att representera nyckelställningarna i observerat tal. Viktiga poser inkluderar läpparnas, käkens och tungans position när det gäller att producera en viss fonetik. Du kan använda visemes för att animera ansiktet på en karaktär när talljud spelas upp.
WordBoundary Signalerar att en ordgräns togs emot. Den här händelsen utlöses i början av varje nytt talat ord, skiljetecken och mening. Händelsen rapporterar det aktuella ordets tidsförskjutning, i fästingar, från början av utdataljudet. Den här händelsen rapporterar också teckenpositionen i indatatexten eller SSML omedelbart före ordet som ska talas. Den här händelsen används ofta för att hämta relativa positioner för texten och motsvarande ljud. Du kanske vill veta mer om ett nytt ord och sedan vidta åtgärder baserat på tidpunkten. Du kan till exempel få information som kan hjälpa dig att bestämma när och hur länge ord ska markeras när de talas.

Kommentar

Händelser utlöses när utdata blir tillgängliga, vilket är snabbare än uppspelning till en utdataenhet. Anroparen måste synkronisera direktuppspelning och realtid på rätt sätt.

Här är ett exempel som visar hur du prenumererar på händelser för talsyntes. Du kan följa anvisningarna i snabbstarten, men ersätta innehållet i den Program.cs filen med följande C#-kod:

using Microsoft.CognitiveServices.Speech;

class Program 
{
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    static string speechKey = Environment.GetEnvironmentVariable("SPEECH_KEY");
    static string speechRegion = Environment.GetEnvironmentVariable("SPEECH_REGION");

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion);
         
        var speechSynthesisVoiceName  = "en-US-AvaMultilingualNeural";  
        var ssml = @$"<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
            <voice name='{speechSynthesisVoiceName}'>
                <mstts:viseme type='redlips_front'/>
                The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.
            </voice>
        </speak>";

        // Required for sentence-level WordBoundary events
        speechConfig.SetProperty(PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");

        using (var speechSynthesizer = new SpeechSynthesizer(speechConfig))
        {
            // Subscribe to events

            speechSynthesizer.BookmarkReached += (s, e) =>
            {
                Console.WriteLine($"BookmarkReached event:" +
                    $"\r\n\tAudioOffset: {(e.AudioOffset + 5000) / 10000}ms" +
                    $"\r\n\tText: \"{e.Text}\".");
            };

            speechSynthesizer.SynthesisCanceled += (s, e) =>
            {
                Console.WriteLine("SynthesisCanceled event");
            };

            speechSynthesizer.SynthesisCompleted += (s, e) =>
            {                
                Console.WriteLine($"SynthesisCompleted event:" +
                    $"\r\n\tAudioData: {e.Result.AudioData.Length} bytes" +
                    $"\r\n\tAudioDuration: {e.Result.AudioDuration}");
            };

            speechSynthesizer.SynthesisStarted += (s, e) =>
            {
                Console.WriteLine("SynthesisStarted event");
            };

            speechSynthesizer.Synthesizing += (s, e) =>
            {
                Console.WriteLine($"Synthesizing event:" +
                    $"\r\n\tAudioData: {e.Result.AudioData.Length} bytes");
            };

            speechSynthesizer.VisemeReceived += (s, e) =>
            {
                Console.WriteLine($"VisemeReceived event:" +
                    $"\r\n\tAudioOffset: {(e.AudioOffset + 5000) / 10000}ms" +
                    $"\r\n\tVisemeId: {e.VisemeId}");
            };

            speechSynthesizer.WordBoundary += (s, e) =>
            {
                Console.WriteLine($"WordBoundary event:" +
                    // Word, Punctuation, or Sentence
                    $"\r\n\tBoundaryType: {e.BoundaryType}" +
                    $"\r\n\tAudioOffset: {(e.AudioOffset + 5000) / 10000}ms" +
                    $"\r\n\tDuration: {e.Duration}" +
                    $"\r\n\tText: \"{e.Text}\"" +
                    $"\r\n\tTextOffset: {e.TextOffset}" +
                    $"\r\n\tWordLength: {e.WordLength}");
            };

            // Synthesize the SSML
            Console.WriteLine($"SSML to synthesize: \r\n{ssml}");
            var speechSynthesisResult = await speechSynthesizer.SpeakSsmlAsync(ssml);

            // Output the results
            switch (speechSynthesisResult.Reason)
            {
                case ResultReason.SynthesizingAudioCompleted:
                    Console.WriteLine("SynthesizingAudioCompleted result");
                    break;
                case ResultReason.Canceled:
                    var cancellation = SpeechSynthesisCancellationDetails.FromResult(speechSynthesisResult);
                    Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");

                    if (cancellation.Reason == CancellationReason.Error)
                    {
                        Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
                        Console.WriteLine($"CANCELED: ErrorDetails=[{cancellation.ErrorDetails}]");
                        Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
                    }
                    break;
                default:
                    break;
            }
        }

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }
}

Du hittar mer text till talexempel på GitHub.

Använda en anpassad slutpunkt

Den anpassade slutpunkten är funktionellt identisk med standardslutpunkten som används för text-till-tal-begäranden.

En skillnad är att EndpointId måste anges för att använda din anpassade röst via Speech SDK. Du kan börja med snabbstarten text till tal och sedan uppdatera koden med EndpointId och SpeechSynthesisVoiceName.

var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion);     
speechConfig.SpeechSynthesisVoiceName = "YourCustomVoiceName";
speechConfig.EndpointId = "YourEndpointId";

Om du vill använda en anpassad röst via Speech Synthesis Markup Language (SSML) anger du modellnamnet som röstnamn. I det YourCustomVoiceName här exemplet används rösten.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Referensdokumentation Paket (NuGet) | Ytterligare exempel på GitHub |

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Välj syntesspråk och röst

Text till tal-funktionen i Speech-tjänsten stöder mer än 400 röster och mer än 140 språk och varianter. Se den fullständiga listan över text som stöds till talspråk eller prova dem i röstgalleriet.

Ange språket eller rösten för klassen SpeechConfig för att matcha indatatexten och använd den angivna rösten. Följande kodfragment visar hur den här tekniken fungerar:

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig->SetSpeechSynthesisLanguage("en-US"); 
    speechConfig->SetSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural");
}

Alla neurala röster är flerspråkiga och flytande på sitt eget språk och engelska. Om indatatexten på engelska till exempel är "Jag är glad över att prova text till tal" och du väljer es-ES-ElviraNeural, talas texten på engelska med spansk accent.

Om rösten inte talar indatatextens språk skapar taltjänsten inte syntetiserat ljud. En fullständig lista över neurala röster som stöds finns i Språk och röststöd för Speech-tjänsten.

Kommentar

Standardrösten är den första röst som returneras per språkvariant från RÖSTLISTA-API:et.

Rösten som talar bestäms i prioritetsordning enligt följande:

  • Om du inte anger SpeechSynthesisVoiceName eller SpeechSynthesisLanguage, talar standardrösten för en-US .
  • Om du bara anger SpeechSynthesisLanguagetalar standardrösten för det angivna språket.
  • Om både SpeechSynthesisVoiceName och SpeechSynthesisLanguage anges ignoreras inställningen SpeechSynthesisLanguage . Den röst som du anger med hjälp SpeechSynthesisVoiceName av talar.
  • Om röstelementet anges med hjälp av Speech Synthesis Markup Language (SSML)SpeechSynthesisVoiceName ignoreras inställningarna ochSpeechSynthesisLanguage.

Syntetisera tal till en fil

Skapa ett SpeechSynthesizer-objekt . Det här objektet som visas i följande kodfragment kör text till talkonverteringar och utdata till talare, filer eller andra utdataströmmar. SpeechSynthesizer accepterar som parametrar:

  • SpeechConfig-objektet som du skapade i föregående steg.
  • Ett AudioConfig-objekt som anger hur utdataresultat ska hanteras.
  1. Skapa en AudioConfig instans för att automatiskt skriva utdata till en .wav fil med hjälp FromWavFileOutput() av funktionen:

    void synthesizeSpeech()
    {
        auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
        auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
    }
    
  2. Instansiera en SpeechSynthesizer instans. Skicka objektet speechConfig och objektet audioConfig som parametrar. Om du vill syntetisera tal och skriva till en fil kör du SpeakTextAsync() med en textsträng.

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

När du kör programmet skapas en syntetiserad .wav fil som skrivs till den plats som du anger. Det här resultatet är ett bra exempel på den mest grundläggande användningen. Därefter kan du anpassa utdata och hantera utdatasvaret som en minnesintern ström för att arbeta med anpassade scenarier.

Syntetisera till högtalarens utdata

Om du vill mata ut syntetiserat tal till den aktuella aktiva utdataenheten, till exempel en talare, utelämnar du parametern AudioConfig när du skapar instansen SpeechSynthesizer . Här är ett exempel:

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
    auto result = speechSynthesizer->SpeakTextAsync("I'm excited to try text to speech").get();
}

Hämta ett resultat som en minnesintern ström

Du kan använda resulterande ljuddata som en minnesintern ström i stället för att skriva direkt till en fil. Med minnesintern ström kan du skapa ett anpassat beteende:

  • Abstrahera den resulterande bytematrisen som en sökbar ström för anpassade underordnade tjänster.
  • Integrera resultatet med andra API:er eller tjänster.
  • Ändra ljuddata, skriv anpassade .wav rubriker och utför relaterade uppgifter.

Du kan göra den här ändringen i föregående exempel. Ta först bort AudioConfig blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka NULL för AudioConfig i SpeechSynthesizer konstruktorn.

Kommentar

Att skicka NULL för , i stället för AudioConfigatt utelämna det som i föregående talarexempel, spelar inte upp ljudet som standard på den aktuella aktiva utdataenheten.

Spara resultatet i en SpeechSynthesisResult-variabel . Gettern GetAudioData returnerar en byte [] instans för utdata. Du kan arbeta med den här byte [] instansen manuellt, eller så kan du använda klassen AudioDataStream för att hantera den minnesinterna strömmen.

I det här exemplet använder du den AudioDataStream.FromResult() statiska funktionen för att hämta en ström från resultatet:

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);

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

Nu kan du implementera alla anpassade beteenden med hjälp av det resulterande stream objektet.

Anpassa ljudformat

Du kan anpassa ljudutdataattribut, inklusive:

  • Typ av ljudfil
  • Exempelfrekvens
  • Bitdjup

Om du vill ändra ljudformatet SetSpeechSynthesisOutputFormat() använder du funktionen på SpeechConfig objektet. Den här funktionen förväntar sig en enum instans av typen SpeechSynthesisOutputFormat. enum Använd för att välja utdataformatet. Tillgängliga format finns i listan över ljudformat.

Det finns olika alternativ för olika filtyper, beroende på dina krav. Per definition innehåller råformat som Raw24Khz16BitMonoPcm inte ljudhuvuden. Använd endast raw-format i någon av dessa situationer:

  • Du vet att din nedströmsimplementering kan avkoda en rå bitström.
  • Du planerar att skapa rubriker manuellt baserat på faktorer som bitdjup, exempelfrekvens och antal kanaler.

Det här exemplet anger RIFF-formatet Riff24Khz16BitMonoPcm med hög återgivning genom att ange SpeechSynthesisOutputFormat objektet SpeechConfig . På samma sätt som i exemplet i föregående avsnitt använder AudioDataStream du för att hämta en minnesintern ström av resultatet och sedan skriva det till en fil.

void synthesizeSpeech()
{
    auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
    speechConfig->SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat::Riff24Khz16BitMonoPcm);

    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
    auto result = speechSynthesizer->SpeakTextAsync("A simple test to write to a file.").get();

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

När du kör programmet skrivs en .wav fil till den angivna sökvägen.

Använda SSML för att anpassa talegenskaper

Du kan använda SSML för att finjustera tonhöjd, uttal, talfrekvens, volym och andra aspekter i text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten. Mer information finns i Översikt över talsyntesmarkeringsspråk.

Om du vill börja använda SSML för anpassning gör du en mindre ändring som växlar rösten.

  1. Skapa en ny XML-fil för SSML-konfigurationen i rotprojektkatalogen.

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

    I det här exemplet är filen ssml.xml. Rotelementet är alltid <speak>. Om du omsluter texten i ett <voice> element kan du ändra rösten med hjälp av parametern name . En fullständig lista över neurala röster som stöds finns i Språk som stöds.

  2. Ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är mestadels densamma. I stället för att SpeakTextAsync() använda funktionen använder SpeakSsmlAsync()du . Den här funktionen förväntar sig en XML-sträng. Läs först in SSML-konfigurationen som en sträng. Från och med nu är resultatobjektet exakt detsamma som tidigare exempel.

    void synthesizeSpeech()
    {
        auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
        auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);
    
        std::ifstream file("./ssml.xml");
        std::string ssml, line;
        while (std::getline(file, line))
        {
            ssml += line;
            ssml.push_back('\n');
        }
        auto result = speechSynthesizer->SpeakSsmlAsync(ssml).get();
    
        auto stream = AudioDataStream::FromResult(result);
        stream->SaveToWavFileAsync("path/to/write/file.wav").get();
    }
    

Kommentar

Om du vill ändra rösten utan att använda SSML kan du ange egenskapen på SpeechConfig med hjälp SpeechConfig.SetSpeechSynthesisVoiceName("en-US-AndrewMultilingualNeural")av .

Prenumerera på synthesizer-händelser

Du kanske vill ha fler insikter om text till talbearbetning och resultat. Du kanske till exempel vill veta när synteten startar och stoppas, eller om du vill veta mer om andra händelser som påträffas under syntesen.

När du använder SpeechSynthesizer för text till tal kan du prenumerera på händelserna i den här tabellen:

Händelse beskrivning Användningsfall
BookmarkReached Signalerar att ett bokmärke har nåtts. För att utlösa en bokmärkeshändelse krävs ett bookmark element i SSML. Den här händelsen rapporterar utdataljudets förflutna tid mellan början av syntesen och elementet bookmark . Händelsens Text egenskap är det strängvärde som du anger i bokmärkets mark attribut. Elementen bookmark talas inte. Du kan använda elementet bookmark för att infoga anpassade markörer i SSML för att få förskjutningen av varje markör i ljudströmmen. Elementet bookmark kan användas för att referera till en specifik plats i text- eller taggsekvensen.
SynthesisCanceled Signaler om att talsyntesen avbröts. Du kan bekräfta när syntesen avbryts.
SynthesisCompleted Signaler om att talsyntesen är klar. Du kan bekräfta när syntesen är klar.
SynthesisStarted Signaler om att talsyntesen startade. Du kan bekräfta när syntesen startade.
Synthesizing Signaler om att talsyntes pågår. Den här händelsen utlöses varje gång SDK:et tar emot ett ljudsegment från Speech-tjänsten. Du kan bekräfta när syntesen pågår.
VisemeReceived Signaler om att en viseme-händelse togs emot. Visemes används ofta för att representera nyckelställningarna i observerat tal. Viktiga poser inkluderar läpparnas, käkens och tungans position när det gäller att producera en viss fonetik. Du kan använda visemes för att animera ansiktet på en karaktär när talljud spelas upp.
WordBoundary Signalerar att en ordgräns togs emot. Den här händelsen utlöses i början av varje nytt talat ord, skiljetecken och mening. Händelsen rapporterar det aktuella ordets tidsförskjutning, i fästingar, från början av utdataljudet. Den här händelsen rapporterar också teckenpositionen i indatatexten eller SSML omedelbart före ordet som ska talas. Den här händelsen används ofta för att hämta relativa positioner för texten och motsvarande ljud. Du kanske vill veta mer om ett nytt ord och sedan vidta åtgärder baserat på tidpunkten. Du kan till exempel få information som kan hjälpa dig att bestämma när och hur länge ord ska markeras när de talas.

Kommentar

Händelser utlöses när utdata blir tillgängliga, vilket är snabbare än uppspelning till en utdataenhet. Anroparen måste synkronisera direktuppspelning och realtid på rätt sätt.

Här är ett exempel som visar hur du prenumererar på händelser för talsyntes. Du kan följa anvisningarna i snabbstarten, men ersätta innehållet i den main.cpp filen med följande kod:

#include <iostream> 
#include <stdlib.h>
#include <speechapi_cxx.h>

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

std::string getEnvironmentVariable(const char* name);

int main()
{
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    auto speechKey = getEnvironmentVariable("SPEECH_KEY");
    auto speechRegion = getEnvironmentVariable("SPEECH_REGION");

    if ((size(speechKey) == 0) || (size(speechRegion) == 0)) {
        std::cout << "Please set both SPEECH_KEY and SPEECH_REGION environment variables." << std::endl;
        return -1;
    }

    auto speechConfig = SpeechConfig::FromSubscription(speechKey, speechRegion);

    // Required for WordBoundary event sentences.
    speechConfig->SetProperty(PropertyId::SpeechServiceResponse_RequestSentenceBoundary, "true");

    const auto ssml = R"(<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
        <voice name = 'en-US-AvaMultilingualNeural'>
            <mstts:viseme type = 'redlips_front' />
            The rainbow has seven colors : <bookmark mark = 'colors_list_begin' />Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark = 'colors_list_end' />.
        </voice>
        </speak>)";

    auto speechSynthesizer = SpeechSynthesizer::FromConfig(speechConfig);

    // Subscribe to events

    speechSynthesizer->BookmarkReached += [](const SpeechSynthesisBookmarkEventArgs& e)
    {
        std::cout << "Bookmark reached. "
            << "\r\n\tAudioOffset: " << round(e.AudioOffset / 10000) << "ms"
            << "\r\n\tText: " << e.Text << std::endl;
    };

    speechSynthesizer->SynthesisCanceled += [](const SpeechSynthesisEventArgs& e)
    {
        std::cout << "SynthesisCanceled event" << std::endl;
    };

    speechSynthesizer->SynthesisCompleted += [](const SpeechSynthesisEventArgs& e)
    {
        auto audioDuration = std::chrono::duration_cast<std::chrono::milliseconds>(e.Result->AudioDuration).count();

        std::cout << "SynthesisCompleted event:"
            << "\r\n\tAudioData: " << e.Result->GetAudioData()->size() << "bytes"
            << "\r\n\tAudioDuration: " << audioDuration << std::endl;
    };

    speechSynthesizer->SynthesisStarted += [](const SpeechSynthesisEventArgs& e)
    {
        std::cout << "SynthesisStarted event" << std::endl;
    };

    speechSynthesizer->Synthesizing += [](const SpeechSynthesisEventArgs& e)
    {
        std::cout << "Synthesizing event:"
            << "\r\n\tAudioData: " << e.Result->GetAudioData()->size() << "bytes" << std::endl;
    };

    speechSynthesizer->VisemeReceived += [](const SpeechSynthesisVisemeEventArgs& e)
    {
        std::cout << "VisemeReceived event:"
            << "\r\n\tAudioOffset: " << round(e.AudioOffset / 10000) << "ms"
            << "\r\n\tVisemeId: " << e.VisemeId << std::endl;
    };

    speechSynthesizer->WordBoundary += [](const SpeechSynthesisWordBoundaryEventArgs& e)
    {
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(e.Duration).count();
        
        auto boundaryType = "";
        switch (e.BoundaryType) {
        case SpeechSynthesisBoundaryType::Punctuation:
            boundaryType = "Punctuation";
            break;
        case SpeechSynthesisBoundaryType::Sentence:
            boundaryType = "Sentence";
            break;
        case SpeechSynthesisBoundaryType::Word:
            boundaryType = "Word";
            break;
        }

        std::cout << "WordBoundary event:"
            // Word, Punctuation, or Sentence
            << "\r\n\tBoundaryType: " << boundaryType
            << "\r\n\tAudioOffset: " << round(e.AudioOffset / 10000) << "ms"
            << "\r\n\tDuration: " << duration
            << "\r\n\tText: \"" << e.Text << "\""
            << "\r\n\tTextOffset: " << e.TextOffset
            << "\r\n\tWordLength: " << e.WordLength << std::endl;
    };

    auto result = speechSynthesizer->SpeakSsmlAsync(ssml).get();

    // Checks result.
    if (result->Reason == ResultReason::SynthesizingAudioCompleted)
    {
        std::cout << "SynthesizingAudioCompleted result" << std::endl;
    }
    else if (result->Reason == ResultReason::Canceled)
    {
        auto cancellation = SpeechSynthesisCancellationDetails::FromResult(result);
        std::cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;

        if (cancellation->Reason == CancellationReason::Error)
        {
            std::cout << "CANCELED: ErrorCode=" << (int)cancellation->ErrorCode << std::endl;
            std::cout << "CANCELED: ErrorDetails=[" << cancellation->ErrorDetails << "]" << std::endl;
            std::cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
        }
    }

    std::cout << "Press enter to exit..." << std::endl;
    std::cin.get();
}

std::string getEnvironmentVariable(const char* name)
{
#if defined(_MSC_VER)
    size_t requiredSize = 0;
    (void)getenv_s(&requiredSize, nullptr, 0, name);
    if (requiredSize == 0)
    {
        return "";
    }
    auto buffer = std::make_unique<char[]>(requiredSize);
    (void)getenv_s(&requiredSize, buffer.get(), requiredSize, name);
    return buffer.get();
#else
    auto value = getenv(name);
    return value ? value : "";
#endif
}

Du hittar mer text till talexempel på GitHub.

Använda en anpassad slutpunkt

Den anpassade slutpunkten är funktionellt identisk med standardslutpunkten som används för text-till-tal-begäranden.

En skillnad är att EndpointId måste anges för att använda din anpassade röst via Speech SDK. Du kan börja med snabbstarten text till tal och sedan uppdatera koden med EndpointId och SpeechSynthesisVoiceName.

auto speechConfig = SpeechConfig::FromSubscription(speechKey, speechRegion);
speechConfig->SetSpeechSynthesisVoiceName("YourCustomVoiceName");
speechConfig->SetEndpointId("YourEndpointId");

Om du vill använda en anpassad röst via Speech Synthesis Markup Language (SSML) anger du modellnamnet som röstnamn. I det YourCustomVoiceName här exemplet används rösten.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Referensdokumentation Paket (Go) | Ytterligare exempel på GitHub |

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Förutsättningar

Installera Speech SDK

Innan du kan göra något måste du installera Speech SDK för Go.

Text till tal till talare

Använd följande kodexempel för att köra talsyntes till standardenheten för ljudutdata. Ersätt variablerna subscription och region med din talnyckel och plats/region. När du kör skriptet visas din indatatext till standardhögtalaren.

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 := "YourSpeechKey"
    region := "YourSpeechRegion"

    audioConfig, err := audio.NewAudioConfigFromDefaultSpeakerOutput()
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    speechConfig, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechConfig.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(speechConfig, 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 set the speech resource key and region values?\n",
                    cancellation.ErrorCode,
                    cancellation.ErrorDetails)
            }
        }
    }
}

Kör följande kommandon för att skapa en go.mod-fil som länkar till komponenter som finns på GitHub:

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

Skapa och kör nu koden:

go build
go run quickstart

Detaljerad information om klasserna finns i referensdokumenten SpeechConfig och SpeechSynthesizer .

Text till tal till minnesintern ström

Du kan använda resulterande ljuddata som en minnesintern ström i stället för att skriva direkt till en fil. Med minnesintern ström kan du skapa ett anpassat beteende:

  • Abstrahera den resulterande bytematrisen som en sökbar ström för anpassade underordnade tjänster.
  • Integrera resultatet med andra API:er eller tjänster.
  • Ändra ljuddata, skriv anpassade .wav rubriker och utför relaterade uppgifter.

Du kan göra den här ändringen i föregående exempel. AudioConfig Ta bort blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka nil sedan vidare AudioConfig i SpeechSynthesizer konstruktorn.

Kommentar

Om du skickar nil för , i stället för AudioConfigatt utelämna det som du gjorde i föregående talarexempel, spelas inte ljudet upp som standard på den aktuella aktiva utdataenheten.

Spara resultatet i en SpeechSynthesisResult variabel. Egenskapen AudioData returnerar en []byte instans för utdata. Du kan arbeta med den här []byte instansen AudioDataStream manuellt, eller så kan du använda klassen för att hantera den minnesinterna strömmen. I det här exemplet använder du den NewAudioDataStreamFromSpeechSynthesisResult() statiska funktionen för att hämta en ström från resultatet.

Ersätt variablerna subscription och region med din talnyckel och plats/region:

package main

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

    "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 := "YourSpeechKey"
    region := "YourSpeechRegion"

    speechConfig, err := speech.NewSpeechConfigFromSubscription(subscription, region)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechConfig.Close()
    speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(speechConfig, 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 cases, 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))
    }
}

Kör följande kommandon för att skapa en go.mod-fil som länkar till komponenter som finns på GitHub:

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

Skapa och kör nu koden:

go build
go run quickstart

Detaljerad information om klasserna finns i referensdokumenten SpeechConfig och SpeechSynthesizer .

Välj syntesspråk och röst

Text till tal-funktionen i Speech-tjänsten stöder mer än 400 röster och mer än 140 språk och varianter. Du kan hämta hela listan eller prova dem i röstgalleriet.

Ange språket eller rösten SpeechConfig för för att matcha indatatexten och använd den angivna rösten:

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

speechConfig.SetSpeechSynthesisLanguage("en-US")
speechConfig.SetSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural")

Alla neurala röster är flerspråkiga och flytande på sitt eget språk och engelska. Om indatatexten på engelska till exempel är "Jag är glad över att prova text till tal" och du väljer es-ES-ElviraNeural, talas texten på engelska med spansk accent.

Om rösten inte talar indatatextens språk skapar taltjänsten inte syntetiserat ljud. En fullständig lista över neurala röster som stöds finns i Språk och röststöd för Speech-tjänsten.

Kommentar

Standardrösten är den första röst som returneras per språkvariant från RÖSTLISTA-API:et.

Rösten som talar bestäms i prioritetsordning enligt följande:

  • Om du inte anger SpeechSynthesisVoiceName eller SpeechSynthesisLanguage, talar standardrösten för en-US .
  • Om du bara anger SpeechSynthesisLanguagetalar standardrösten för det angivna språket.
  • Om både SpeechSynthesisVoiceName och SpeechSynthesisLanguage anges ignoreras inställningen SpeechSynthesisLanguage . Den röst som du anger med hjälp SpeechSynthesisVoiceName av talar.
  • Om röstelementet anges med hjälp av Speech Synthesis Markup Language (SSML)SpeechSynthesisVoiceName ignoreras inställningarna ochSpeechSynthesisLanguage.

Använda SSML för att anpassa talegenskaper

Du kan använda Speech Synthesis Markup Language (SSML) för att finjustera tonhöjd, uttal, talfrekvens, volym med mera i text till talutdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten. Mer information finns i Översikt över talsyntesmarkeringsspråk.

Om du vill börja använda SSML för anpassning gör du en mindre ändring som växlar rösten.

Skapa först en ny XML-fil för SSML-konfigurationen i rotprojektkatalogen. I det här exemplet är ssml.xmldet . Rotelementet är alltid <speak>. Om du omsluter texten i ett <voice> element kan du ändra rösten med hjälp av parametern name . En fullständig lista över neurala röster som stöds finns i Språk som stöds.

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

Därefter måste du ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är mestadels densamma, men i stället för att SpeakTextAsync() använda funktionen använder SpeakSsmlAsync()du . Den här funktionen förväntar sig en XML-sträng, så du läser först in SSML-konfigurationen som en sträng. Från och med nu är resultatobjektet exakt detsamma som tidigare exempel.

Kommentar

Om du vill ange rösten utan att använda SSML kan du ange egenskapen på SpeechConfig med hjälp speechConfig.SetSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural")av .

Prenumerera på synthesizer-händelser

Du kanske vill ha fler insikter om text till talbearbetning och resultat. Du kanske till exempel vill veta när synteten startar och stoppas, eller om du vill veta mer om andra händelser som påträffas under syntesen.

När du använder SpeechSynthesizer för text till tal kan du prenumerera på händelserna i den här tabellen:

Händelse beskrivning Användningsfall
BookmarkReached Signalerar att ett bokmärke har nåtts. För att utlösa en bokmärkeshändelse krävs ett bookmark element i SSML. Den här händelsen rapporterar utdataljudets förflutna tid mellan början av syntesen och elementet bookmark . Händelsens Text egenskap är det strängvärde som du anger i bokmärkets mark attribut. Elementen bookmark talas inte. Du kan använda elementet bookmark för att infoga anpassade markörer i SSML för att få förskjutningen av varje markör i ljudströmmen. Elementet bookmark kan användas för att referera till en specifik plats i text- eller taggsekvensen.
SynthesisCanceled Signaler om att talsyntesen avbröts. Du kan bekräfta när syntesen avbryts.
SynthesisCompleted Signaler om att talsyntesen är klar. Du kan bekräfta när syntesen är klar.
SynthesisStarted Signaler om att talsyntesen startade. Du kan bekräfta när syntesen startade.
Synthesizing Signaler om att talsyntes pågår. Den här händelsen utlöses varje gång SDK:et tar emot ett ljudsegment från Speech-tjänsten. Du kan bekräfta när syntesen pågår.
VisemeReceived Signaler om att en viseme-händelse togs emot. Visemes används ofta för att representera nyckelställningarna i observerat tal. Viktiga poser inkluderar läpparnas, käkens och tungans position när det gäller att producera en viss fonetik. Du kan använda visemes för att animera ansiktet på en karaktär när talljud spelas upp.
WordBoundary Signalerar att en ordgräns togs emot. Den här händelsen utlöses i början av varje nytt talat ord, skiljetecken och mening. Händelsen rapporterar det aktuella ordets tidsförskjutning, i fästingar, från början av utdataljudet. Den här händelsen rapporterar också teckenpositionen i indatatexten eller SSML omedelbart före ordet som ska talas. Den här händelsen används ofta för att hämta relativa positioner för texten och motsvarande ljud. Du kanske vill veta mer om ett nytt ord och sedan vidta åtgärder baserat på tidpunkten. Du kan till exempel få information som kan hjälpa dig att bestämma när och hur länge ord ska markeras när de talas.

Kommentar

Händelser utlöses när utdata blir tillgängliga, vilket är snabbare än uppspelning till en utdataenhet. Anroparen måste synkronisera direktuppspelning och realtid på rätt sätt.

Här är ett exempel som visar hur du prenumererar på händelser för talsyntes. Du kan följa anvisningarna i snabbstarten, men ersätta innehållet i speech-synthesis.go filen med följande Go-kod:

package main

import (
    "fmt"
    "os"
    "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 bookmarkReachedHandler(event speech.SpeechSynthesisBookmarkEventArgs) {
    defer event.Close()
    fmt.Println("BookmarkReached event")
}

func synthesisCanceledHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("SynthesisCanceled event")
}

func synthesisCompletedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("SynthesisCompleted event")
    fmt.Printf("\tAudioData: %d bytes\n", len(event.Result.AudioData))
    fmt.Printf("\tAudioDuration: %d\n", event.Result.AudioDuration)
}

func synthesisStartedHandler(event speech.SpeechSynthesisEventArgs) {
    defer event.Close()
    fmt.Println("SynthesisStarted event")
}

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

func visemeReceivedHandler(event speech.SpeechSynthesisVisemeEventArgs) {
    defer event.Close()
    fmt.Println("VisemeReceived event")
    fmt.Printf("\tAudioOffset: %dms\n", (event.AudioOffset+5000)/10000)
    fmt.Printf("\tVisemeID %d\n", event.VisemeID)
}

func wordBoundaryHandler(event speech.SpeechSynthesisWordBoundaryEventArgs) {
    defer event.Close()
    boundaryType := ""
    switch event.BoundaryType {
    case 0:
        boundaryType = "Word"
    case 1:
        boundaryType = "Punctuation"
    case 2:
        boundaryType = "Sentence"
    }
    fmt.Println("WordBoundary event")
    fmt.Printf("\tBoundaryType %v\n", boundaryType)
    fmt.Printf("\tAudioOffset: %dms\n", (event.AudioOffset+5000)/10000)
    fmt.Printf("\tDuration %d\n", event.Duration)
    fmt.Printf("\tText %s\n", event.Text)
    fmt.Printf("\tTextOffset %d\n", event.TextOffset)
    fmt.Printf("\tWordLength %d\n", event.WordLength)
}

func main() {
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    speechKey := os.Getenv("SPEECH_KEY")
    speechRegion := os.Getenv("SPEECH_REGION")

    audioConfig, err := audio.NewAudioConfigFromDefaultSpeakerOutput()
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer audioConfig.Close()
    speechConfig, err := speech.NewSpeechConfigFromSubscription(speechKey, speechRegion)
    if err != nil {
        fmt.Println("Got an error: ", err)
        return
    }
    defer speechConfig.Close()

    // Required for WordBoundary event sentences.
    speechConfig.SetProperty(common.SpeechServiceResponseRequestSentenceBoundary, "true")

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

    speechSynthesizer.BookmarkReached(bookmarkReachedHandler)
    speechSynthesizer.SynthesisCanceled(synthesisCanceledHandler)
    speechSynthesizer.SynthesisCompleted(synthesisCompletedHandler)
    speechSynthesizer.SynthesisStarted(synthesisStartedHandler)
    speechSynthesizer.Synthesizing(synthesizingHandler)
    speechSynthesizer.VisemeReceived(visemeReceivedHandler)
    speechSynthesizer.WordBoundary(wordBoundaryHandler)

    speechSynthesisVoiceName := "en-US-AvaMultilingualNeural"

    ssml := fmt.Sprintf(`<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
            <voice name='%s'>
                <mstts:viseme type='redlips_front'/>
                The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.
            </voice>
        </speak>`, speechSynthesisVoiceName)

    // Synthesize the SSML
    fmt.Printf("SSML to synthesize: \n\t%s\n", ssml)
    task := speechSynthesizer.SpeakSsmlAsync(ssml)

    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.Println("SynthesizingAudioCompleted result")
    } 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 set the speech resource key and region values?\n",
                cancellation.ErrorCode,
                cancellation.ErrorDetails)
        }
    }
}

Du hittar mer text till talexempel på GitHub.

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Referensdokumentation | Ytterligare exempel på GitHub

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Välj syntesspråk och röst

Text till tal-funktionen i Speech-tjänsten stöder mer än 400 röster och mer än 140 språk och varianter. Du kan hämta hela listan eller prova dem i röstgalleriet.

Ange språket eller rösten för SpeechConfig för att matcha indatatexten och använd den angivna rösten. Följande kodfragment visar hur den här tekniken fungerar:

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig.setSpeechSynthesisLanguage("en-US"); 
    speechConfig.setSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural");
}

Alla neurala röster är flerspråkiga och flytande på sitt eget språk och engelska. Om indatatexten på engelska till exempel är "Jag är glad över att prova text till tal" och du väljer es-ES-ElviraNeural, talas texten på engelska med spansk accent.

Om rösten inte talar indatatextens språk skapar taltjänsten inte syntetiserat ljud. En fullständig lista över neurala röster som stöds finns i Språk och röststöd för Speech-tjänsten.

Kommentar

Standardrösten är den första röst som returneras per språkvariant från RÖSTLISTA-API:et.

Rösten som talar bestäms i prioritetsordning enligt följande:

  • Om du inte anger SpeechSynthesisVoiceName eller SpeechSynthesisLanguage, talar standardrösten för en-US .
  • Om du bara anger SpeechSynthesisLanguagetalar standardrösten för det angivna språket.
  • Om både SpeechSynthesisVoiceName och SpeechSynthesisLanguage anges ignoreras inställningen SpeechSynthesisLanguage . Rösten som du angav med hjälp SpeechSynthesisVoiceName av talar.
  • Om röstelementet anges med hjälp av Speech Synthesis Markup Language (SSML)SpeechSynthesisVoiceName ignoreras inställningarna ochSpeechSynthesisLanguage.

Syntetisera tal till en fil

Skapa ett SpeechSynthesizer objekt. Det här objektet kör text till talkonverteringar och utdata till talare, filer eller andra utdataströmmar. SpeechSynthesizer accepterar som parametrar:

  • Det SpeechConfig objekt som du skapade i föregående steg.
  • Ett AudioConfig objekt som anger hur utdataresultat ska hanteras.
  1. Skapa en AudioConfig instans för att automatiskt skriva utdata till en .wav fil med hjälp av den fromWavFileOutput() statiska funktionen:

    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
    }
    
  2. Instansiera en SpeechSynthesizer instans. Skicka objektet speechConfig och objektet audioConfig som parametrar. Om du vill syntetisera tal och skriva till en fil kör du SpeakText() med en textsträng.

    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
    
        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
        speechSynthesizer.SpeakText("I'm excited to try text to speech");
    }
    

När du kör programmet skapas en syntetiserad .wav fil som skrivs till den plats som du anger. Det här resultatet är ett bra exempel på den mest grundläggande användningen. Därefter kan du anpassa utdata och hantera utdatasvaret som en minnesintern ström för att arbeta med anpassade scenarier.

Syntetisera till högtalarens utdata

Du kanske vill ha fler insikter om text till talbearbetning och resultat. Du kanske till exempel vill veta när synteten startar och stoppas, eller om du vill veta mer om andra händelser som påträffas under syntesen.

Om du vill mata ut syntetiserat tal till den aktuella aktiva utdataenheten, till exempel en talare, instansiera AudioConfig med hjälp av den fromDefaultSpeakerOutput() statiska funktionen. Här är ett exempel:

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

    SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    speechSynthesizer.SpeakText("I'm excited to try text to speech");
}

Hämta ett resultat som en minnesintern ström

Du kan använda resulterande ljuddata som en minnesintern ström i stället för att skriva direkt till en fil. Med minnesintern ström kan du skapa ett anpassat beteende:

  • Abstrahera den resulterande bytematrisen som en sökbar ström för anpassade underordnade tjänster.
  • Integrera resultatet med andra API:er eller tjänster.
  • Ändra ljuddata, skriv anpassade .wav rubriker och utför relaterade uppgifter.

Du kan göra den här ändringen i föregående exempel. Ta först bort AudioConfig blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka null sedan vidare AudioConfig i SpeechSynthesizer konstruktorn.

Kommentar

Att skicka null för , i stället för AudioConfigatt utelämna det som du gjorde i föregående talarexempel, spelar inte upp ljudet som standard på den aktuella aktiva utdataenheten.

Spara resultatet i en SpeechSynthesisResult variabel. Funktionen SpeechSynthesisResult.getAudioData() returnerar en byte [] instans av utdata. Du kan arbeta med den här byte [] instansen AudioDataStream manuellt, eller så kan du använda klassen för att hantera den minnesinterna strömmen.

I det här exemplet använder du den AudioDataStream.fromResult() statiska funktionen för att hämta en ström från resultatet:

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, null);

    SpeechSynthesisResult result = speechSynthesizer.SpeakText("I'm excited to try text to speech");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    System.out.print(stream.getStatus());
}

Nu kan du implementera alla anpassade beteenden med hjälp av det resulterande stream objektet.

Anpassa ljudformat

Du kan anpassa ljudutdataattribut, inklusive:

  • Typ av ljudfil
  • Exempelfrekvens
  • Bitdjup

Om du vill ändra ljudformatet setSpeechSynthesisOutputFormat() använder du funktionen på SpeechConfig objektet. Den här funktionen förväntar sig en enum instans av typen SpeechSynthesisOutputFormat. enum Använd för att välja utdataformatet. Tillgängliga format finns i listan över ljudformat.

Det finns olika alternativ för olika filtyper, beroende på dina krav. Per definition innehåller råformat som Raw24Khz16BitMonoPcm inte ljudhuvuden. Använd endast raw-format i någon av dessa situationer:

  • Du vet att din nedströmsimplementering kan avkoda en rå bitström.
  • Du planerar att skapa rubriker manuellt baserat på faktorer som bitdjup, exempelfrekvens och antal kanaler.

Det här exemplet anger RIFF-formatet Riff24Khz16BitMonoPcm med hög återgivning genom att ange SpeechSynthesisOutputFormat objektet SpeechConfig . På samma sätt som i exemplet i föregående avsnitt använder AudioDataStream du för att hämta en minnesintern ström av resultatet och sedan skriva det till en fil.

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

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

    SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    SpeechSynthesisResult result = speechSynthesizer.SpeakText("I'm excited to try text to speech");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    stream.saveToWavFile("path/to/write/file.wav");
}

När du kör programmet skrivs en .wav fil till den angivna sökvägen.

Använda SSML för att anpassa talegenskaper

Du kan använda SSML för att finjustera tonhöjd, uttal, talfrekvens, volym och andra aspekter i text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten. Mer information finns i artikeln instruktioner för SSML.

Om du vill börja använda SSML för anpassning gör du en mindre ändring som växlar rösten.

  1. Skapa en ny XML-fil för SSML-konfigurationen i rotprojektkatalogen.

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

    I det här exemplet är filen ssml.xml. Rotelementet är alltid <speak>. Om du omsluter texten i ett <voice> element kan du ändra rösten med hjälp av parametern name . En fullständig lista över neurala röster som stöds finns i Språk som stöds.

  2. Ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är mestadels densamma. I stället för att SpeakText() använda funktionen använder SpeakSsml()du . Den här funktionen förväntar sig en XML-sträng, så skapa först en funktion för att läsa in en XML-fil och returnera den som en sträng:

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

    I det här läget är resultatobjektet exakt detsamma som tidigare exempel:

    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
    
        String ssml = xmlToString("ssml.xml");
        SpeechSynthesisResult result = speechSynthesizer.SpeakSsml(ssml);
        AudioDataStream stream = AudioDataStream.fromResult(result);
        stream.saveToWavFile("path/to/write/file.wav");
    }
    

Kommentar

Om du vill ändra rösten utan att använda SSML anger du egenskapen på SpeechConfig med hjälp SpeechConfig.setSpeechSynthesisVoiceName("en-US-AvaMultilingualNeural");av .

Prenumerera på synthesizer-händelser

Du kanske vill ha fler insikter om text till talbearbetning och resultat. Du kanske till exempel vill veta när synteten startar och stoppas, eller om du vill veta mer om andra händelser som påträffas under syntesen.

När du använder SpeechSynthesizer för text till tal kan du prenumerera på händelserna i den här tabellen:

Händelse beskrivning Användningsfall
BookmarkReached Signalerar att ett bokmärke har nåtts. För att utlösa en bokmärkeshändelse krävs ett bookmark element i SSML. Den här händelsen rapporterar utdataljudets förflutna tid mellan början av syntesen och elementet bookmark . Händelsens Text egenskap är det strängvärde som du anger i bokmärkets mark attribut. Elementen bookmark talas inte. Du kan använda elementet bookmark för att infoga anpassade markörer i SSML för att få förskjutningen av varje markör i ljudströmmen. Elementet bookmark kan användas för att referera till en specifik plats i text- eller taggsekvensen.
SynthesisCanceled Signaler om att talsyntesen avbröts. Du kan bekräfta när syntesen avbryts.
SynthesisCompleted Signaler om att talsyntesen är klar. Du kan bekräfta när syntesen är klar.
SynthesisStarted Signaler om att talsyntesen startade. Du kan bekräfta när syntesen startade.
Synthesizing Signaler om att talsyntes pågår. Den här händelsen utlöses varje gång SDK:et tar emot ett ljudsegment från Speech-tjänsten. Du kan bekräfta när syntesen pågår.
VisemeReceived Signaler om att en viseme-händelse togs emot. Visemes används ofta för att representera nyckelställningarna i observerat tal. Viktiga poser inkluderar läpparnas, käkens och tungans position när det gäller att producera en viss fonetik. Du kan använda visemes för att animera ansiktet på en karaktär när talljud spelas upp.
WordBoundary Signalerar att en ordgräns togs emot. Den här händelsen utlöses i början av varje nytt talat ord, skiljetecken och mening. Händelsen rapporterar det aktuella ordets tidsförskjutning, i fästingar, från början av utdataljudet. Den här händelsen rapporterar också teckenpositionen i indatatexten eller SSML omedelbart före ordet som ska talas. Den här händelsen används ofta för att hämta relativa positioner för texten och motsvarande ljud. Du kanske vill veta mer om ett nytt ord och sedan vidta åtgärder baserat på tidpunkten. Du kan till exempel få information som kan hjälpa dig att bestämma när och hur länge ord ska markeras när de talas.

Kommentar

Händelser utlöses när utdata blir tillgängliga, vilket är snabbare än uppspelning till en utdataenhet. Anroparen måste synkronisera direktuppspelning och realtid på rätt sätt.

Här är ett exempel som visar hur du prenumererar på händelser för talsyntes. Du kan följa anvisningarna i snabbstarten, men ersätta innehållet i den SpeechSynthesis.java filen med följande Java-kod:

import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.*;

import java.util.Scanner;
import java.util.concurrent.ExecutionException;

public class SpeechSynthesis {
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    private static String speechKey = System.getenv("SPEECH_KEY");
    private static String speechRegion = System.getenv("SPEECH_REGION");

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        SpeechConfig speechConfig = SpeechConfig.fromSubscription(speechKey, speechRegion);
        
        // Required for WordBoundary event sentences.
        speechConfig.setProperty(PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");

        String speechSynthesisVoiceName = "en-US-AvaMultilingualNeural"; 
        
        String ssml = String.format("<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>"
            .concat(String.format("<voice name='%s'>", speechSynthesisVoiceName))
            .concat("<mstts:viseme type='redlips_front'/>")
            .concat("The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.")
            .concat("</voice>")
            .concat("</speak>"));

        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig);
        {
            // Subscribe to events

            speechSynthesizer.BookmarkReached.addEventListener((o, e) -> {
                System.out.println("BookmarkReached event:");
                System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
                System.out.println("\tText: " + e.getText());
            });

            speechSynthesizer.SynthesisCanceled.addEventListener((o, e) -> {
                System.out.println("SynthesisCanceled event");
            });

            speechSynthesizer.SynthesisCompleted.addEventListener((o, e) -> {
                SpeechSynthesisResult result = e.getResult();                
                byte[] audioData = result.getAudioData();
                System.out.println("SynthesisCompleted event:");
                System.out.println("\tAudioData: " + audioData.length + " bytes");
                System.out.println("\tAudioDuration: " + result.getAudioDuration());
                result.close();
            });
            
            speechSynthesizer.SynthesisStarted.addEventListener((o, e) -> {
                System.out.println("SynthesisStarted event");
            });

            speechSynthesizer.Synthesizing.addEventListener((o, e) -> {
                SpeechSynthesisResult result = e.getResult();
                byte[] audioData = result.getAudioData();
                System.out.println("Synthesizing event:");
                System.out.println("\tAudioData: " + audioData.length + " bytes");
                result.close();
            });

            speechSynthesizer.VisemeReceived.addEventListener((o, e) -> {
                System.out.println("VisemeReceived event:");
                System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
                System.out.println("\tVisemeId: " + e.getVisemeId());
            });

            speechSynthesizer.WordBoundary.addEventListener((o, e) -> {
                System.out.println("WordBoundary event:");
                System.out.println("\tBoundaryType: " + e.getBoundaryType());
                System.out.println("\tAudioOffset: " + ((e.getAudioOffset() + 5000) / 10000) + "ms");
                System.out.println("\tDuration: " + e.getDuration());
                System.out.println("\tText: " + e.getText());
                System.out.println("\tTextOffset: " + e.getTextOffset());
                System.out.println("\tWordLength: " + e.getWordLength());
            });

            // Synthesize the SSML
            System.out.println("SSML to synthesize:");
            System.out.println(ssml);
            SpeechSynthesisResult speechSynthesisResult = speechSynthesizer.SpeakSsmlAsync(ssml).get();

            if (speechSynthesisResult.getReason() == ResultReason.SynthesizingAudioCompleted) {
                System.out.println("SynthesizingAudioCompleted result");
            }
            else if (speechSynthesisResult.getReason() == ResultReason.Canceled) {
                SpeechSynthesisCancellationDetails cancellation = SpeechSynthesisCancellationDetails.fromResult(speechSynthesisResult);
                System.out.println("CANCELED: Reason=" + cancellation.getReason());

                if (cancellation.getReason() == CancellationReason.Error) {
                    System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
                    System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
                    System.out.println("CANCELED: Did you set the speech resource key and region values?");
                }
            }
        }
        speechSynthesizer.close();

        System.exit(0);
    }
}

Du hittar mer text till talexempel på GitHub.

Använda en anpassad slutpunkt

Den anpassade slutpunkten är funktionellt identisk med standardslutpunkten som används för text-till-tal-begäranden.

En skillnad är att EndpointId måste anges för att använda din anpassade röst via Speech SDK. Du kan börja med snabbstarten text till tal och sedan uppdatera koden med EndpointId och SpeechSynthesisVoiceName.

SpeechConfig speechConfig = SpeechConfig.fromSubscription(speechKey, speechRegion);
speechConfig.setSpeechSynthesisVoiceName("YourCustomVoiceName");
speechConfig.setEndpointId("YourEndpointId");

Om du vill använda en anpassad röst via Speech Synthesis Markup Language (SSML) anger du modellnamnet som röstnamn. I det YourCustomVoiceName här exemplet används rösten.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Referensdokumentation Paket (npm) | Ytterligare exempel på GitHub-bibliotekets källkod | |

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Välj syntesspråk och röst

Text till tal-funktionen i Speech-tjänsten stöder mer än 400 röster och mer än 140 språk och varianter. Du kan hämta hela listan eller prova dem i röstgalleriet.

Ange språket eller rösten SpeechConfig för för att matcha indatatexten och använd den angivna rösten:

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    // Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
    speechConfig.speechSynthesisLanguage = "en-US"; 
    speechConfig.speechSynthesisVoiceName = "en-US-AvaMultilingualNeural";
}

synthesizeSpeech();

Alla neurala röster är flerspråkiga och flytande på sitt eget språk och engelska. Om indatatexten på engelska till exempel är "Jag är glad över att prova text till tal" och du väljer es-ES-ElviraNeural, talas texten på engelska med spansk accent.

Om rösten inte talar indatatextens språk skapar taltjänsten inte syntetiserat ljud. En fullständig lista över neurala röster som stöds finns i Språk och röststöd för Speech-tjänsten.

Kommentar

Standardrösten är den första röst som returneras per språkvariant från RÖSTLISTA-API:et.

Rösten som talar bestäms i prioritetsordning enligt följande:

  • Om du inte anger SpeechSynthesisVoiceName eller SpeechSynthesisLanguage, talar standardrösten för en-US .
  • Om du bara anger SpeechSynthesisLanguagetalar standardrösten för det angivna språket.
  • Om både SpeechSynthesisVoiceName och SpeechSynthesisLanguage anges ignoreras inställningen SpeechSynthesisLanguage . Den röst som du anger med hjälp SpeechSynthesisVoiceName av talar.
  • Om röstelementet anges med hjälp av Speech Synthesis Markup Language (SSML)SpeechSynthesisVoiceName ignoreras inställningarna ochSpeechSynthesisLanguage.

Syntetisera text till tal

Om du vill mata ut syntetiserat tal till den aktuella aktiva utdataenheten, till exempel en talare, instansiera AudioConfig med hjälp av den fromDefaultSpeakerOutput() statiska funktionen. Här är ett exempel:

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

    const speechSynthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            if (result) {
                speechSynthesizer.close();
                return result.audioData;
            }
        },
        error => {
            console.log(error);
            speechSynthesizer.close();
        });
}

När du kör programmet spelas syntetiserat ljud upp från högtalaren. Det här resultatet är ett bra exempel på den mest grundläggande användningen. Därefter kan du anpassa utdata och hantera utdatasvaret som en minnesintern ström för att arbeta med anpassade scenarier.

Hämta ett resultat som en minnesintern ström

Du kan använda resulterande ljuddata som en minnesintern ström i stället för att skriva direkt till en fil. Med minnesintern ström kan du skapa ett anpassat beteende:

  • Abstrahera den resulterande bytematrisen som en sökbar ström för anpassade underordnade tjänster.
  • Integrera resultatet med andra API:er eller tjänster.
  • Ändra ljuddata, skriv anpassade .wav rubriker och utför relaterade uppgifter.

Du kan göra den här ändringen i föregående exempel. AudioConfig Ta bort blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka null sedan vidare AudioConfig i SpeechSynthesizer konstruktorn.

Kommentar

Att skicka null för , i stället för AudioConfigatt utelämna det som du gjorde i föregående talarexempel, spelar inte upp ljudet som standard på den aktuella aktiva utdataenheten.

Spara resultatet i en SpeechSynthesisResult-variabel . Egenskapen SpeechSynthesisResult.audioData returnerar ett ArrayBuffer värde för utdata, standardtypen för webbläsarström. För kod på serversidan konverterar du ArrayBuffer till en buffertström.

Följande kod fungerar för klientsidan:

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig);

    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            speechSynthesizer.close();
            return result.audioData;
        },
        error => {
            console.log(error);
            speechSynthesizer.close();
        });
}

Du kan implementera alla anpassade beteenden med hjälp av det resulterande ArrayBuffer objektet. ArrayBuffer är en vanlig typ att ta emot i en webbläsare och spela upp från det här formatet.

Om du behöver arbeta med data som en dataström för serverbaserad kod måste du konvertera ArrayBuffer objektet till en dataström:

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
    const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig);

    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            const { audioData } = result;

            speechSynthesizer.close();

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

Anpassa ljudformat

Du kan anpassa ljudutdataattribut, inklusive:

  • Typ av ljudfil
  • Exempelfrekvens
  • Bitdjup

Om du vill ändra ljudformatet speechSynthesisOutputFormat använder du egenskapen för SpeechConfig objektet. Den här egenskapen förväntar sig en enum instans av typen SpeechSynthesisOutputFormat. enum Använd för att välja utdataformatet. Tillgängliga format finns i listan över ljudformat.

Det finns olika alternativ för olika filtyper, beroende på dina krav. Per definition innehåller råformat som Raw24Khz16BitMonoPcm inte ljudhuvuden. Använd endast raw-format i någon av dessa situationer:

  • Du vet att din nedströmsimplementering kan avkoda en rå bitström.
  • Du planerar att skapa rubriker manuellt baserat på faktorer som bitdjup, exempelfrekvens och antal kanaler.

Det här exemplet anger RIFF-formatet Riff24Khz16BitMonoPcm med hög återgivning genom att ange speechSynthesisOutputFormat objektet SpeechConfig . Precis som i exemplet i föregående avsnitt hämtar du ljuddata ArrayBuffer och interagerar med dem.

function synthesizeSpeech() {
    const speechConfig = SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");

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

    const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig, null);
    speechSynthesizer.speakTextAsync(
        "I'm excited to try text to speech",
        result => {
            // Interact with the audio ArrayBuffer data
            const audioData = result.audioData;
            console.log(`Audio data byte size: ${audioData.byteLength}.`)

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

Använda SSML för att anpassa talegenskaper

Du kan använda SSML för att finjustera tonhöjd, uttal, talfrekvens, volym och andra aspekter i text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten. Mer information finns i Översikt över talsyntesmarkeringsspråk.

Om du vill börja använda SSML för anpassning gör du en mindre ändring som växlar rösten.

  1. Skapa en ny XML-fil för SSML-konfigurationen i rotprojektkatalogen.

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

    I det här exemplet är det ssml.xml. Rotelementet är alltid <speak>. Om du omsluter texten i ett <voice> element kan du ändra rösten med hjälp av parametern name . En fullständig lista över neurala röster som stöds finns i Språk som stöds.

  2. Ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är mestadels densamma, men i stället för att speakTextAsync() använda funktionen använder speakSsmlAsync()du . Den här funktionen förväntar sig en XML-sträng. Skapa en funktion för att läsa in en XML-fil och returnera den som en sträng:

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

    Mer information om readFileSyncfinns i Node.js filsystem.

    Resultatobjektet är exakt samma som tidigare exempel:

    function synthesizeSpeech() {
        const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
        const speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig, null);
    
        const ssml = xmlToString("ssml.xml");
        speechSynthesizer.speakSsmlAsync(
            ssml,
            result => {
                if (result.errorDetails) {
                    console.error(result.errorDetails);
                } else {
                    console.log(JSON.stringify(result));
                }
    
                speechSynthesizer.close();
            },
            error => {
                console.log(error);
                speechSynthesizer.close();
            });
    }
    

Kommentar

Om du vill ändra rösten utan att använda SSML kan du ange egenskapen på SpeechConfig med hjälp SpeechConfig.speechSynthesisVoiceName = "en-US-AvaMultilingualNeural";av .

Prenumerera på synthesizer-händelser

Du kanske vill ha fler insikter om text till talbearbetning och resultat. Du kanske till exempel vill veta när synteten startar och stoppas, eller om du vill veta mer om andra händelser som påträffas under syntesen.

När du använder SpeechSynthesizer för text till tal kan du prenumerera på händelserna i den här tabellen:

Händelse beskrivning Användningsfall
BookmarkReached Signalerar att ett bokmärke har nåtts. För att utlösa en bokmärkeshändelse krävs ett bookmark element i SSML. Den här händelsen rapporterar utdataljudets förflutna tid mellan början av syntesen och elementet bookmark . Händelsens Text egenskap är det strängvärde som du anger i bokmärkets mark attribut. Elementen bookmark talas inte. Du kan använda elementet bookmark för att infoga anpassade markörer i SSML för att få förskjutningen av varje markör i ljudströmmen. Elementet bookmark kan användas för att referera till en specifik plats i text- eller taggsekvensen.
SynthesisCanceled Signaler om att talsyntesen avbröts. Du kan bekräfta när syntesen avbryts.
SynthesisCompleted Signaler om att talsyntesen är klar. Du kan bekräfta när syntesen är klar.
SynthesisStarted Signaler om att talsyntesen startade. Du kan bekräfta när syntesen startade.
Synthesizing Signaler om att talsyntes pågår. Den här händelsen utlöses varje gång SDK:et tar emot ett ljudsegment från Speech-tjänsten. Du kan bekräfta när syntesen pågår.
VisemeReceived Signaler om att en viseme-händelse togs emot. Visemes används ofta för att representera nyckelställningarna i observerat tal. Viktiga poser inkluderar läpparnas, käkens och tungans position när det gäller att producera en viss fonetik. Du kan använda visemes för att animera ansiktet på en karaktär när talljud spelas upp.
WordBoundary Signalerar att en ordgräns togs emot. Den här händelsen utlöses i början av varje nytt talat ord, skiljetecken och mening. Händelsen rapporterar det aktuella ordets tidsförskjutning, i fästingar, från början av utdataljudet. Den här händelsen rapporterar också teckenpositionen i indatatexten eller SSML omedelbart före ordet som ska talas. Den här händelsen används ofta för att hämta relativa positioner för texten och motsvarande ljud. Du kanske vill veta mer om ett nytt ord och sedan vidta åtgärder baserat på tidpunkten. Du kan till exempel få information som kan hjälpa dig att bestämma när och hur länge ord ska markeras när de talas.

Kommentar

Händelser utlöses när utdata blir tillgängliga, vilket är snabbare än uppspelning till en utdataenhet. Anroparen måste synkronisera direktuppspelning och realtid på rätt sätt.

Här är ett exempel som visar hur du prenumererar på händelser för talsyntes. Du kan följa anvisningarna i snabbstarten, men ersätta innehållet i den SpeechSynthesis.js filen med följande JavaScript-kod.

(function() {

    "use strict";

    var sdk = require("microsoft-cognitiveservices-speech-sdk");

    var audioFile = "YourAudioFile.wav";
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    const speechConfig = sdk.SpeechConfig.fromSubscription(process.env.SPEECH_KEY, process.env.SPEECH_REGION);
    const audioConfig = sdk.AudioConfig.fromAudioFileOutput(audioFile);

    var speechSynthesisVoiceName  = "en-US-AvaMultilingualNeural";  
    var ssml = `<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'> \r\n \
        <voice name='${speechSynthesisVoiceName}'> \r\n \
            <mstts:viseme type='redlips_front'/> \r\n \
            The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>. \r\n \
        </voice> \r\n \
    </speak>`;
    
    // Required for WordBoundary event sentences.
    speechConfig.setProperty(sdk.PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");

    // Create the speech speechSynthesizer.
    var speechSynthesizer = new sdk.SpeechSynthesizer(speechConfig, audioConfig);

    speechSynthesizer.bookmarkReached = function (s, e) {
        var str = `BookmarkReached event: \
            \r\n\tAudioOffset: ${(e.audioOffset + 5000) / 10000}ms \
            \r\n\tText: \"${e.text}\".`;
        console.log(str);
    };

    speechSynthesizer.synthesisCanceled = function (s, e) {
        console.log("SynthesisCanceled event");
    };
    
    speechSynthesizer.synthesisCompleted = function (s, e) {
        var str = `SynthesisCompleted event: \
                    \r\n\tAudioData: ${e.result.audioData.byteLength} bytes \
                    \r\n\tAudioDuration: ${e.result.audioDuration}`;
        console.log(str);
    };

    speechSynthesizer.synthesisStarted = function (s, e) {
        console.log("SynthesisStarted event");
    };

    speechSynthesizer.synthesizing = function (s, e) {
        var str = `Synthesizing event: \
            \r\n\tAudioData: ${e.result.audioData.byteLength} bytes`;
        console.log(str);
    };
    
    speechSynthesizer.visemeReceived = function(s, e) {
        var str = `VisemeReceived event: \
            \r\n\tAudioOffset: ${(e.audioOffset + 5000) / 10000}ms \
            \r\n\tVisemeId: ${e.visemeId}`;
        console.log(str);
    };

    speechSynthesizer.wordBoundary = function (s, e) {
        // Word, Punctuation, or Sentence
        var str = `WordBoundary event: \
            \r\n\tBoundaryType: ${e.boundaryType} \
            \r\n\tAudioOffset: ${(e.audioOffset + 5000) / 10000}ms \
            \r\n\tDuration: ${e.duration} \
            \r\n\tText: \"${e.text}\" \
            \r\n\tTextOffset: ${e.textOffset} \
            \r\n\tWordLength: ${e.wordLength}`;
        console.log(str);
    };

    // Synthesize the SSML
    console.log(`SSML to synthesize: \r\n ${ssml}`)
    console.log(`Synthesize to: ${audioFile}`);
    speechSynthesizer.speakSsmlAsync(ssml,
        function (result) {
      if (result.reason === sdk.ResultReason.SynthesizingAudioCompleted) {
        console.log("SynthesizingAudioCompleted result");
      } else {
        console.error("Speech synthesis canceled, " + result.errorDetails +
            "\nDid you set the speech resource key and region values?");
      }
      speechSynthesizer.close();
      speechSynthesizer = null;
    },
        function (err) {
      console.trace("err - " + err);
      speechSynthesizer.close();
      speechSynthesizer = null;
    });
}());

Du hittar mer text till talexempel på GitHub.

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Referensdokumentationspaket (ladda ned) | Ytterligare exempel på GitHub |

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Förutsättningar

Installera Speech SDK och exempel

Lagringsplatsen Azure-Samples/cognitive-services-speech-sdk innehåller exempel skrivna i Objective-C för iOS och Mac. Välj en länk för att se installationsinstruktioner för varje exempel:

Använda en anpassad slutpunkt

Den anpassade slutpunkten är funktionellt identisk med standardslutpunkten som används för text-till-tal-begäranden.

En skillnad är att EndpointId måste anges för att använda din anpassade röst via Speech SDK. Du kan börja med snabbstarten text till tal och sedan uppdatera koden med EndpointId och SpeechSynthesisVoiceName.

SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:speechKey region:speechRegion];
speechConfig.speechSynthesisVoiceName = @"YourCustomVoiceName";
speechConfig.EndpointId = @"YourEndpointId";

Om du vill använda en anpassad röst via Speech Synthesis Markup Language (SSML) anger du modellnamnet som röstnamn. I det YourCustomVoiceName här exemplet används rösten.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Referensdokumentationspaket (ladda ned) | Ytterligare exempel på GitHub |

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Förutsättningar

Installera Speech SDK och exempel

Lagringsplatsen Azure-Samples/cognitive-services-speech-sdk innehåller exempel skrivna i Swift för iOS och Mac. Välj en länk för att se installationsinstruktioner för varje exempel:

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Referensdokumentation Paket (PyPi) | Ytterligare exempel på GitHub |

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Välj syntesspråk och röst

Text till tal-funktionen i Speech-tjänsten stöder mer än 400 röster och mer än 140 språk och varianter. Du kan hämta hela listan eller prova dem i röstgalleriet.

Ange språket eller rösten SpeechConfig för för att matcha indatatexten och använd den angivna rösten:

# Set either the `SpeechSynthesisVoiceName` or `SpeechSynthesisLanguage`.
speech_config.speech_synthesis_language = "en-US" 
speech_config.speech_synthesis_voice_name ="en-US-AvaMultilingualNeural"

Alla neurala röster är flerspråkiga och flytande på sitt eget språk och engelska. Om indatatexten på engelska till exempel är "Jag är glad över att prova text till tal" och du väljer es-ES-ElviraNeural, talas texten på engelska med spansk accent.

Om rösten inte talar indatatextens språk skapar taltjänsten inte syntetiserat ljud. En fullständig lista över neurala röster som stöds finns i Språk och röststöd för Speech-tjänsten.

Kommentar

Standardrösten är den första röst som returneras per språkvariant från RÖSTLISTA-API:et.

Rösten som talar bestäms i prioritetsordning enligt följande:

  • Om du inte anger SpeechSynthesisVoiceName eller SpeechSynthesisLanguage, talar standardrösten för en-US .
  • Om du bara anger SpeechSynthesisLanguagetalar standardrösten för det angivna språket.
  • Om både SpeechSynthesisVoiceName och SpeechSynthesisLanguage anges ignoreras inställningen SpeechSynthesisLanguage . Den röst som du anger med hjälp SpeechSynthesisVoiceName av talar.
  • Om röstelementet anges med hjälp av Speech Synthesis Markup Language (SSML)SpeechSynthesisVoiceName ignoreras inställningarna ochSpeechSynthesisLanguage.

Syntetisera tal till en fil

Skapa ett SpeechSynthesizer-objekt . Det här objektet kör text till talkonverteringar och utdata till talare, filer eller andra utdataströmmar. SpeechSynthesizer accepterar som parametrar:

  1. Skapa en AudioOutputConfig instans för att automatiskt skriva utdata till en .wav fil med hjälp av konstruktorparametern filename :

    audio_config = speechsdk.audio.AudioOutputConfig(filename="path/to/write/file.wav")
    
  2. Instansiera SpeechSynthesizer genom att skicka objektet speech_config och objektet audio_config som parametrar. Om du vill syntetisera tal och skriva till en fil kör du speak_text_async() med en textsträng.

    speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
    speech_synthesizer.speak_text_async("I'm excited to try text to speech")
    

När du kör programmet skapas en syntetiserad .wav fil som skrivs till den plats som du anger. Det här resultatet är ett bra exempel på den mest grundläggande användningen. Därefter kan du anpassa utdata och hantera utdatasvaret som en minnesintern ström för att arbeta med anpassade scenarier.

Syntetisera till högtalarens utdata

Om du vill mata ut syntetiserat tal till den aktuella aktiva utdataenheten, till exempel en talare, anger du parametern use_default_speaker när du skapar instansen AudioOutputConfig . Här är ett exempel:

audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)

Hämta ett resultat som en minnesintern ström

Du kan använda resulterande ljuddata som en minnesintern ström i stället för att skriva direkt till en fil. Med minnesintern ström kan du skapa ett anpassat beteende:

  • Abstrahera den resulterande bytematrisen som en sökbar ström för anpassade underordnade tjänster.
  • Integrera resultatet med andra API:er eller tjänster.
  • Ändra ljuddata, skriv anpassade .wav rubriker och utför relaterade uppgifter.

Du kan göra den här ändringen i föregående exempel. Ta först bort AudioConfig, eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka None för AudioConfig i SpeechSynthesizer konstruktorn.

Kommentar

Att skicka None för , i stället för AudioConfigatt utelämna det som du gjorde i föregående talarexempel, spelar inte upp ljudet som standard på den aktuella aktiva utdataenheten.

Spara resultatet i en SpeechSynthesisResult variabel. Egenskapen audio_data innehåller ett bytes objekt för utdata. Du kan arbeta med det här objektet manuellt, eller så kan du använda AudioDataStream klassen för att hantera minnesintern ström.

I det här exemplet använder du AudioDataStream konstruktorn för att hämta en ström från resultatet:

speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)
result = speech_synthesizer.speak_text_async("I'm excited to try text to speech").get()
stream = AudioDataStream(result)

Nu kan du implementera alla anpassade beteenden med hjälp av det resulterande stream objektet.

Anpassa ljudformat

Du kan anpassa ljudutdataattribut, inklusive:

  • Typ av ljudfil
  • Exempelfrekvens
  • Bitdjup

Om du vill ändra ljudformatet set_speech_synthesis_output_format() använder du funktionen på SpeechConfig objektet. Den här funktionen förväntar sig en enum instans av typen SpeechSynthesisOutputFormat. enum Använd för att välja utdataformatet. Tillgängliga format finns i listan över ljudformat.

Det finns olika alternativ för olika filtyper, beroende på dina krav. Per definition innehåller råformat som Raw24Khz16BitMonoPcm inte ljudhuvuden. Använd endast raw-format i någon av dessa situationer:

  • Du vet att din nedströmsimplementering kan avkoda en rå bitström.
  • Du planerar att skapa rubriker manuellt baserat på faktorer som bitdjup, exempelfrekvens och antal kanaler.

Det här exemplet anger RIFF-formatet Riff24Khz16BitMonoPcm med hög återgivning genom att ange SpeechSynthesisOutputFormat objektet SpeechConfig . På samma sätt som i exemplet i föregående avsnitt använder AudioDataStream du för att hämta en minnesintern ström av resultatet och sedan skriva det till en fil.

speech_config.set_speech_synthesis_output_format(speechsdk.SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm)
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)

result = speech_synthesizer.speak_text_async("I'm excited to try text to speech").get()
stream = speechsdk.AudioDataStream(result)
stream.save_to_wav_file("path/to/write/file.wav")

När du kör programmet skrivs en .wav fil till den angivna sökvägen.

Använda SSML för att anpassa talegenskaper

Du kan använda SSML för att finjustera tonhöjd, uttal, talfrekvens, volym och andra aspekter i text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten. Mer information finns i Översikt över talsyntesmarkeringsspråk.

Om du vill börja använda SSML för anpassning gör du en mindre ändring som växlar rösten.

  1. Skapa en ny XML-fil för SSML-konfigurationen i rotprojektkatalogen.

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

    I det här exemplet är filen ssml.xml. Rotelementet är alltid <speak>. Om du omsluter texten i ett <voice> element kan du ändra rösten med hjälp av parametern name . En fullständig lista över neurala röster som stöds finns i Språk som stöds.

  2. Ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är mestadels densamma. I stället för att speak_text_async() använda funktionen använder du speak_ssml_async(). Den här funktionen förväntar sig en XML-sträng. Läs först SSML-konfigurationen som en sträng. Från och med nu är resultatobjektet exakt detsamma som tidigare exempel.

    Kommentar

    Om din ssml_string innehåller  i början av strängen måste du ta bort BOM-formatet eller så returnerar tjänsten ett fel. Du gör detta genom att ange parametern enligt encoding följande: open("ssml.xml", "r", encoding="utf-8-sig").

    speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=None)
    
    ssml_string = open("ssml.xml", "r").read()
    result = speech_synthesizer.speak_ssml_async(ssml_string).get()
    
    stream = speechsdk.AudioDataStream(result)
    stream.save_to_wav_file("path/to/write/file.wav")
    

Kommentar

Om du vill ändra rösten utan att använda SSML kan du ange egenskapen på SpeechConfig med hjälp speech_config.speech_synthesis_voice_name = "en-US-AvaMultilingualNeural"av .

Prenumerera på synthesizer-händelser

Du kanske vill ha fler insikter om text till talbearbetning och resultat. Du kanske till exempel vill veta när synteten startar och stoppas, eller om du vill veta mer om andra händelser som påträffas under syntesen.

När du använder SpeechSynthesizer för text till tal kan du prenumerera på händelserna i den här tabellen:

Händelse beskrivning Användningsfall
BookmarkReached Signalerar att ett bokmärke har nåtts. För att utlösa en bokmärkeshändelse krävs ett bookmark element i SSML. Den här händelsen rapporterar utdataljudets förflutna tid mellan början av syntesen och elementet bookmark . Händelsens Text egenskap är det strängvärde som du anger i bokmärkets mark attribut. Elementen bookmark talas inte. Du kan använda elementet bookmark för att infoga anpassade markörer i SSML för att få förskjutningen av varje markör i ljudströmmen. Elementet bookmark kan användas för att referera till en specifik plats i text- eller taggsekvensen.
SynthesisCanceled Signaler om att talsyntesen avbröts. Du kan bekräfta när syntesen avbryts.
SynthesisCompleted Signaler om att talsyntesen är klar. Du kan bekräfta när syntesen är klar.
SynthesisStarted Signaler om att talsyntesen startade. Du kan bekräfta när syntesen startade.
Synthesizing Signaler om att talsyntes pågår. Den här händelsen utlöses varje gång SDK:et tar emot ett ljudsegment från Speech-tjänsten. Du kan bekräfta när syntesen pågår.
VisemeReceived Signaler om att en viseme-händelse togs emot. Visemes används ofta för att representera nyckelställningarna i observerat tal. Viktiga poser inkluderar läpparnas, käkens och tungans position när det gäller att producera en viss fonetik. Du kan använda visemes för att animera ansiktet på en karaktär när talljud spelas upp.
WordBoundary Signalerar att en ordgräns togs emot. Den här händelsen utlöses i början av varje nytt talat ord, skiljetecken och mening. Händelsen rapporterar det aktuella ordets tidsförskjutning, i fästingar, från början av utdataljudet. Den här händelsen rapporterar också teckenpositionen i indatatexten eller SSML omedelbart före ordet som ska talas. Den här händelsen används ofta för att hämta relativa positioner för texten och motsvarande ljud. Du kanske vill veta mer om ett nytt ord och sedan vidta åtgärder baserat på tidpunkten. Du kan till exempel få information som kan hjälpa dig att bestämma när och hur länge ord ska markeras när de talas.

Kommentar

Händelser utlöses när utdata blir tillgängliga, vilket är snabbare än uppspelning till en utdataenhet. Anroparen måste synkronisera direktuppspelning och realtid på rätt sätt.

Här är ett exempel som visar hur du prenumererar på händelser för talsyntes. Du kan följa anvisningarna i snabbstarten, men ersätta innehållet i den speech-synthesis.py filen med följande Python-kod:

import os
import azure.cognitiveservices.speech as speechsdk

def speech_synthesizer_bookmark_reached_cb(evt: speechsdk.SessionEventArgs):
    print('BookmarkReached event:')
    print('\tAudioOffset: {}ms'.format((evt.audio_offset + 5000) / 10000))
    print('\tText: {}'.format(evt.text))

def speech_synthesizer_synthesis_canceled_cb(evt: speechsdk.SessionEventArgs):
    print('SynthesisCanceled event')

def speech_synthesizer_synthesis_completed_cb(evt: speechsdk.SessionEventArgs):
    print('SynthesisCompleted event:')
    print('\tAudioData: {} bytes'.format(len(evt.result.audio_data)))
    print('\tAudioDuration: {}'.format(evt.result.audio_duration))

def speech_synthesizer_synthesis_started_cb(evt: speechsdk.SessionEventArgs):
    print('SynthesisStarted event')

def speech_synthesizer_synthesizing_cb(evt: speechsdk.SessionEventArgs):
    print('Synthesizing event:')
    print('\tAudioData: {} bytes'.format(len(evt.result.audio_data)))

def speech_synthesizer_viseme_received_cb(evt: speechsdk.SessionEventArgs):
    print('VisemeReceived event:')
    print('\tAudioOffset: {}ms'.format((evt.audio_offset + 5000) / 10000))
    print('\tVisemeId: {}'.format(evt.viseme_id))

def speech_synthesizer_word_boundary_cb(evt: speechsdk.SessionEventArgs):
    print('WordBoundary event:')
    print('\tBoundaryType: {}'.format(evt.boundary_type))
    print('\tAudioOffset: {}ms'.format((evt.audio_offset + 5000) / 10000))
    print('\tDuration: {}'.format(evt.duration))
    print('\tText: {}'.format(evt.text))
    print('\tTextOffset: {}'.format(evt.text_offset))
    print('\tWordLength: {}'.format(evt.word_length))

# This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('SPEECH_KEY'), region=os.environ.get('SPEECH_REGION'))

# Required for WordBoundary event sentences.
speech_config.set_property(property_id=speechsdk.PropertyId.SpeechServiceResponse_RequestSentenceBoundary, value='true')

audio_config = speechsdk.audio.AudioOutputConfig(use_default_speaker=True)
speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)

# Subscribe to events
speech_synthesizer.bookmark_reached.connect(speech_synthesizer_bookmark_reached_cb)
speech_synthesizer.synthesis_canceled.connect(speech_synthesizer_synthesis_canceled_cb)
speech_synthesizer.synthesis_completed.connect(speech_synthesizer_synthesis_completed_cb)
speech_synthesizer.synthesis_started.connect(speech_synthesizer_synthesis_started_cb)
speech_synthesizer.synthesizing.connect(speech_synthesizer_synthesizing_cb)
speech_synthesizer.viseme_received.connect(speech_synthesizer_viseme_received_cb)
speech_synthesizer.synthesis_word_boundary.connect(speech_synthesizer_word_boundary_cb)

# The language of the voice that speaks.
speech_synthesis_voice_name='en-US-AvaMultilingualNeural'

ssml = """<speak version='1.0' xml:lang='en-US' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
    <voice name='{}'>
        <mstts:viseme type='redlips_front'/>
        The rainbow has seven colors: <bookmark mark='colors_list_begin'/>Red, orange, yellow, green, blue, indigo, and violet.<bookmark mark='colors_list_end'/>.
    </voice>
</speak>""".format(speech_synthesis_voice_name)

# Synthesize the SSML
print("SSML to synthesize: \r\n{}".format(ssml))
speech_synthesis_result = speech_synthesizer.speak_ssml_async(ssml).get()

if speech_synthesis_result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
    print("SynthesizingAudioCompleted result")
elif speech_synthesis_result.reason == speechsdk.ResultReason.Canceled:
    cancellation_details = speech_synthesis_result.cancellation_details
    print("Speech synthesis canceled: {}".format(cancellation_details.reason))
    if cancellation_details.reason == speechsdk.CancellationReason.Error:
        if cancellation_details.error_details:
            print("Error details: {}".format(cancellation_details.error_details))
            print("Did you set the speech resource key and region values?")

Du hittar mer text till talexempel på GitHub.

Använda en anpassad slutpunkt

Den anpassade slutpunkten är funktionellt identisk med standardslutpunkten som används för text-till-tal-begäranden.

En skillnad är att endpoint_id måste anges för att använda din anpassade röst via Speech SDK. Du kan börja med snabbstarten text till tal och sedan uppdatera koden med endpoint_id och speech_synthesis_voice_name.

speech_config = speechsdk.SpeechConfig(subscription=os.environ.get('SPEECH_KEY'), region=os.environ.get('SPEECH_REGION'))
speech_config.endpoint_id = "YourEndpointId"
speech_config.speech_synthesis_voice_name = "YourCustomVoiceName"

Om du vill använda en anpassad röst via Speech Synthesis Markup Language (SSML) anger du modellnamnet som röstnamn. I det YourCustomVoiceName här exemplet används rösten.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
    <voice name="YourCustomVoiceName">
        This is the text that is spoken. 
    </voice>
</speak>

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

REST API för tal till text refererar | till REST API för tal till text för kort ljudreferens | Ytterligare exempel på GitHub

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Förutsättningar

Konvertera text till tal

Kör följande kommando i en kommandotolk. Infoga dessa värden i kommandot:

  • Din Speech-resursnyckel
  • Din Speech-resursregion

Du kanske också vill ändra följande värden:

  • Rubrikvärdet X-Microsoft-OutputFormat , som styr ljudutdataformatet. Du hittar en lista över ljudutdataformat som stöds i rest-API-referensen för text till tal.
  • Utdatarösten. Information om hur du hämtar en lista över röster som är tillgängliga för speech-tjänstens slutpunkt finns i API:et för röstlista.
  • Utdatafilen. I det här exemplet dirigerar vi svaret från servern till en fil med namnet output.mp3.
curl --location --request POST 'https://YOUR_RESOURCE_REGION.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: YOUR_RESOURCE_KEY' \
--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 name='\''en-US-AvaMultilingualNeural'\''>
        I am excited to try text to speech
    </voice>
</speak>' > output.mp3

I den här guiden får du lära dig vanliga designmönster för att göra text till talsyntes.

Mer information om följande områden finns i Vad är text till tal?

  • Få svar som minnesinterna strömmar.
  • Anpassa utdataexempelfrekvens och bithastighet.
  • Skicka syntesbegäranden med hjälp av Speech Synthesis Markup Language (SSML).
  • Använda neurala röster.
  • Prenumerera på händelser och agera på resultat.

Förutsättningar

Ladda ned och installera

Följ de här stegen och se snabbstarten för Speech CLI för andra krav för din plattform.

  1. Kör följande .NET CLI-kommando för att installera Speech CLI:

    dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
    
  2. Kör följande kommandon för att konfigurera din Speech-resursnyckel och -region. Ersätt SUBSCRIPTION-KEY med din Speech-resursnyckel och ersätt REGION med din Speech-resursregion.

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

Syntetisera tal till en högtalare

Nu är du redo att köra Speech CLI för att syntetisera tal från text.

  • I ett konsolfönster ändrar du till katalogen som innehåller den binära Speech CLI-filen. Kör följande kommando:

    spx synthesize --text "I'm excited to try text to speech"
    

Speech CLI producerar naturligt språk på engelska via datorhögtalaren.

Syntetisera tal till en fil

  • Kör följande kommando för att ändra utdata från högtalaren till en .wav fil:

    spx synthesize --text "I'm excited to try text to speech" --audio output greetings.wav
    

Speech CLI producerar naturligt språk på engelska till den greetings.wav ljudfilen.

Köra och använda en container

Talcontainrar tillhandahåller websocketbaserade frågeslutpunkts-API:er som nås via Speech SDK och Speech CLI. Som standard använder Speech SDK och Speech CLI den offentliga Speech-tjänsten. Om du vill använda containern måste du ändra initieringsmetoden. Använd en containervärd-URL i stället för nyckel och region.

Mer information om containrar finns i Installera och köra Speech-containrar med Docker.

Nästa steg