Aan de slag met tekst-naar-spraak

In deze quickstart maakt u kennis met algemene ontwerppatronen voor het uitvoeren van een spraak-naar-tekstsynthese met behulp van de Speech-SDK. Eerst voert u een basisconfiguratie en -synthese uit en gaat u verder met geavanceerdere voorbeelden voor aangepaste toepassingsontwikkeling zoals:

  • Antwoorden krijgen als stromen in het geheugen
  • De uitgevoerde frequentie- en bitsnelheid aanpassen
  • Synthese-aanvragen indienen met behulp van SSML (Speech Synthesis Markup Language)
  • Neurale stemmen gebruiken

Naar voorbeelden op GitHub

Zie de C#-quickstartvoorbeelden op GitHub als u direct naar voorbeeldcode wilt gaan.

Vereisten

In dit artikel wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

De Speech-SDK installeren

Voordat u iets kunt doen, moet u de Speech SDK installeren. Gebruik de volgende instructies, afhankelijk van uw platform:

Afhankelijkheden importeren

Als u de voorbeelden in dit artikel wilt uitvoeren, voegt u boven aan het script de volgende using-instructies toe.

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

Een spraakconfiguratie maken

Als u de Speech-service wilt aanroepen met behulp van de Speech SDK, moet u een SpeechConfig maken. Deze klasse bevat informatie over uw abonnement, zoals uw spraaksleutel en de bijbehorende locatie/regio, eindpunt, host of autorisatie-token.

Notitie

Ongeacht of u spraakherkenning, spraaksynthese, vertaling of intentieherkenning uitvoert, u maakt altijd een configuratie.

Er zijn een paar manieren waarop u een SpeechConfig kunt initialiseren:

  • Met een abonnement: geef een sleutel en de bijbehorende locatie/regio door.
  • Met een eindpunt: geef een Speech-service-eindpunt door. Een sleutel of autorisatietoken is optioneel.
  • Met een host: geef een hostadres door. Een sleutel of autorisatietoken is optioneel.
  • Met een autorisatie-token: geef een autorisatie-token en de bijbehorende locatie/regio door.

In dit voorbeeld maakt u een met SpeechConfig behulp van een spraaksleutel en locatie/regio. U kunt deze referenties ophalen door de stappen te volgen in De Speech-service gratis uitproberen. U schrijft ook wat eenvoudige standaardcode voor gebruik in de rest van dit artikel. U gaat de code voor verschillende aanpassingen wijzigen.

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

    static async Task SynthesizeAudioAsync()
    {
        var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    }
}

Synthesetaal en stem selecteren

De Azure Text to Speech-service ondersteunt meer dan 250 stemmen en meer dan 70 talen en varianten. U kunt de volledige lijst krijgen ofproberen in de demo over tekst-naar-spraak. Geef de taal of stem van op SpeechConfig die bij uw invoertekst past en gebruik de gezochte stem.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    config.SpeechSynthesisLanguage = "<your-synthesis-language>"; // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    config.SpeechSynthesisVoiceName = "<your-wanted-voice>";
}

Spraak synthetiseren naar een bestand

Vervolgens maakt u een SpeechSynthesizer-object, waarmee tekst-naar-spraakconversies en uitvoer naar luidsprekers, bestanden of andere uitvoerstromen worden uitgevoerd. De SpeechSynthesizer accepteert als parameters het SpeechConfig-object dat in de vorige stap is gemaakt en tevens een AudioConfig-object dat aangeeft hoe uitvoerresultaten moeten worden verwerkt.

Eerst maakt u een AudioConfig om de uitvoer automatisch naar een .wav bestand te schrijven, met behulp van de functie FromWavFileOutput() en voert u een exemplaar uit met een using-instructie. Met een using-instructie in deze context worden niet-beheerde resources automatisch verwijderd en wordt het object na verwijdering buiten gebruik gesteld.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
}

Vervolgens maakt u een SpeechSynthesizer met een andere using-instructie. Geef uw config-object en het audioConfig-object als parameters door. Daarna is het uitvoeren van spraaksynthese en het schrijven naar een bestand net zo eenvoudig als het uitvoeren van SpeakTextAsync() met een regel tekst.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
    using var synthesizer = new SpeechSynthesizer(config, audioConfig);
    await synthesizer.SpeakTextAsync("A simple test to write to a file.");
}

Voer het programma uit. Er wordt een gesynthetiseerd .wav-bestand geschreven naar de locatie die u hebt opgegeven. Dit is een goed voorbeeld van het eenvoudigste gebruik, maar hierna gaat u de uitvoer aanpassen en de uitvoerrespons verwerken als een in-memory stroom om met aangepaste scenario's te kunnen werken.

Synthetiseren naar de uitvoer van de luidspreker

In sommige gevallen kunt u gesynthetiseerde spraak rechtstreeks naar een luidspreker uitvoeren. U doet dit door de parameter weg te AudioConfig laten bij het maken van de in het SpeechSynthesizer bovenstaande voorbeeld. Dit wordt gesynthetiseerd naar het huidige actieve uitvoerapparaat.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var synthesizer = new SpeechSynthesizer(config);
    await synthesizer.SpeakTextAsync("Synthesizing directly to speaker output.");
}

Resultaat ophalen als een in-memory stroom

Voor veel scenario's in het ontwikkelen van spraaktoepassingen hebt u waarschijnlijk de resulterende audiogegevens als een in-memory stroom nodig, in plaats dat u rechtstreeks naar een bestand gaat schrijven. Zo kunt u aangepast gedrag maken, waaronder:

  • Vat de resulterende bytematrix samen als een doorzoekbare stroom voor aangepaste downstreamservices.
  • Integreer het resultaat met andere API's of services.
  • Wijzig de audiogegevens, schrijf aangepaste .wav-headers, enzovoort.

U kunt deze wijziging eenvoudig met behulp van het voorgaande voorbeeld uitvoeren. Verwijder eerst het AudioConfig-blok, omdat u het uitvoergedrag vanaf dit punt handmatig gaat beheren voor een betere controle. Geef vervolgens null door voor de AudioConfig in de SpeechSynthesizer-constructor.

Notitie

Als null voor de AudioConfig wordt doorgegeven in plaats van dat deze wordt weggelaten, zoals in het bovenstaande voorbeeld met de luidspreker, wordt de audio niet standaard afgespeeld op het huidige actieve uitvoerapparaat.

Deze keer slaat u het resultaat op in een SpeechSynthesisResult-variabele. De eigenschap AudioData bevat een byte [] van de uitvoergegevens. U kunt handmatig met deze byte [] werken, of u kunt de AudioDataStream-klasse gebruiken om de stroom in het geheugen te beheren. In dit voorbeeld gebruikt u de AudioDataStream.FromResult() statische functie om een stroom op te halen uit het resultaat.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var synthesizer = new SpeechSynthesizer(config, null);

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

Hierna kunt u aangepast gedrag implementeren met behulp van het resulterende stream-object.

Audio-indeling aanpassen

In de volgende sectie ziet u hoe u kenmerken van audio-uitvoer kunt aanpassen, zoals:

  • Audiobestandstype
  • Samplefrequentie
  • Bitdiepte

Als u de audio-indeling wilt wijzigen, gebruikt u de functie SetSpeechSynthesisOutputFormat() op het SpeechConfig-object. Deze functie verwacht een enum van het type SpeechSynthesisOutputFormat, die u gebruikt om de uitvoerindeling te selecteren. Zie de naslagdocumenten voor een lijst met audio-indelingen die beschikbaar zijn.

Voor verschillende bestandstypen zijn er diverse opties mogelijk, afhankelijk van uw vereisten. Houd er rekening mee dat raw-indelingen als Raw24Khz16BitMonoPcm geen audio-headers bevatten. Gebruik raw-indelingen alleen als u weet dat uw stroomafwaartse implementatie een onbewerkte bitstream kan decoderen of als u van plan bent om headers handmatig te bouwen op basis van bitdiepte, samplefrequentie, aantal kanalen, enzovoort.

In dit voorbeeld geeft u een RIFF-indeling met hoge kwaliteit Riff24Khz16BitMonoPcm op door SpeechSynthesisOutputFormat in te stellen voor het SpeechConfig-object. Net als in het voorbeeld in de vorige sectie, gebruikt u AudioDataStream om een stroom in het geheugen van het resultaat te verkrijgen en vervolgens naar een bestand te schrijven.

static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    config.SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);

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

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

Als u het programma opnieuw uitvoert, wordt een .wav-bestand naar het opgegeven pad geschreven.

SSML gebruiken om spraakkenmerken aan te passen

Met SSML (Speech Synthesis Markup Language) kunt u de toonhoogte, de uitspraak, de spreeksnelheid, het volume en meer van tekst-naar-spraakuitvoer nauwkeuriger instellen door uw aanvragen vanaf een XML-schema te verzenden. In deze sectie ziet u een voorbeeld van het wijzigen van de stem, maar zie het SSML-uitlegartikelvoor een gedetailleerdere handleiding.

Als u SSML voor aanpassing wilt gaan gebruiken, brengt u een eenvoudige wijziging aan die de stem wisselt. Maak eerst een nieuw XML-bestand voor de SSML-configuratie in de hoofdmap van het project, in dit voorbeeld ssml.xml. Het hoofdelement is altijd <speak>, en wanneer u de tekst in een <voice>-element verpakt, kunt u de stem wijzigen met behulp van de parameter name. Bekijk de volledige lijst met ondersteunde neurale stemmen.

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

Vervolgens moet u de aanvraag voor spraaksynthese wijzigen om te verwijzen naar uw XML-bestand. De aanvraag is doorgaans hetzelfde, maar in plaats van de functie SpeakTextAsync() gebruikt u SpeakSsmlAsync(). Deze functie verwacht een XML-tekenreeks, dus u moet uw SSML-configuratie eerst laden als een tekenreeks met behulp van File.ReadAllText(). Hier is het resultaatobject precies hetzelfde als in de vorige voorbeelden.

Notitie

Als u Visual Studio gebruikt, wordt uw XML-bestand waarschijnlijk niet standaard door uw build-configuratie gevonden. Als u dit wilt oplossen, klikt u met de rechter muisknop op het XML-bestand en selecteert u eigenschappen. Wijzig Build-actie naar Inhoud en wijzig Kopiëren naar uitvoermap naar Altijd kopiëren.

public static async Task SynthesizeAudioAsync()
{
    var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    using var synthesizer = new SpeechSynthesizer(config, null);

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

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

Notitie

Als u de stem wilt wijzigen zonder SSML te gebruiken, kunt u de eigenschap voor de instellen met behulp SpeechConfig van SpeechConfig.SpeechSynthesisVoiceName = "en-US-ChristopherNeural";

Gezichtshoudingsgebeurtenissen krijgen

Spraak kan een goede manier zijn om de animatie van gezichtsexpressie aan te geven. Visemes worden vaak gebruikt om de sleutelposities in waargenomen spraak weer te geven, zoals de positie van de ogen, de mond en de ogen bij het produceren van een bepaald phoneme. U kunt zich abonneren op de viseme-gebeurtenis in speech-SDK. Vervolgens kunt u viseme-gebeurtenissen toepassen om het gezicht van een teken te animaneren terwijl spraakaudio wordt afgespeeld. Meer informatie over het op halen van viseme-gebeurtenissen.

In deze quickstart maakt u kennis met algemene ontwerppatronen voor het uitvoeren van een spraak-naar-tekstsynthese met behulp van de Speech-SDK. Eerst voert u een basisconfiguratie en -synthese uit en gaat u verder met geavanceerdere voorbeelden voor aangepaste toepassingsontwikkeling zoals:

  • Antwoorden krijgen als stromen in het geheugen
  • De uitgevoerde frequentie- en bitsnelheid aanpassen
  • Synthese-aanvragen indienen met behulp van SSML (Speech Synthesis Markup Language)
  • Neurale stemmen gebruiken

Naar voorbeelden op GitHub

Raadpleeg de C++-quickstartvoorbeelden op GitHub als u direct naar voorbeeldcode wilt gaan.

Vereisten

In dit artikel wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

De Speech-SDK installeren

Voordat u iets kunt doen, moet u de Speech SDK installeren. Gebruik de volgende instructies, afhankelijk van uw platform:

Afhankelijkheden importeren

Als u de voorbeelden in dit artikel wilt uitvoeren, voegt u de volgende import- en using-instructies bovenaan het script toe.

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

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

Een spraakconfiguratie maken

Als u de Speech-service wilt aanroepen met behulp van de Speech SDK, moet u een SpeechConfig maken. Deze klasse bevat informatie over uw abonnement, zoals uw spraaksleutel en de bijbehorende locatie/regio, eindpunt, host of autorisatie-token.

Notitie

Ongeacht of u spraakherkenning, spraaksynthese, vertaling of intentieherkenning uitvoert, u maakt altijd een configuratie.

Er zijn een paar manieren waarop u een SpeechConfig kunt initialiseren:

  • Met een abonnement: geef een sleutel en de bijbehorende locatie/regio door.
  • Met een eindpunt: geef een Speech-service-eindpunt door. Een sleutel of autorisatietoken is optioneel.
  • Met een host: geef een hostadres door. Een sleutel of autorisatietoken is optioneel.
  • Met een autorisatie-token: geef een autorisatie-token en de bijbehorende locatie/regio door.

In dit voorbeeld maakt u een SpeechConfig met behulp van een abonnementssleutel en regio. U kunt deze referenties ophalen door de stappen te volgen in De Speech-service gratis uitproberen. U schrijft ook wat eenvoudige standaardcode voor gebruik in de rest van dit artikel. U gaat de code voor verschillende aanpassingen wijzigen.

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

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}

Synthesetaal en stem selecteren

De Azure Text to Speech-service ondersteunt meer dan 250 stemmen en meer dan 70 talen en varianten. U kunt de volledige lijst krijgen ofproberen in de demo over tekst-naar-spraak. Geef de taal of stem van op SpeechConfig die bij uw invoertekst past en gebruik de gezochte stem.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    config->SetSpeechSynthesisLanguage("<your-synthesis-language>"); // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    config->SetSpeechSynthesisVoiceName("<your-wanted-voice>");
}

Spraak synthetiseren naar een bestand

Vervolgens maakt u een SpeechSynthesizer-object, waarmee tekst-naar-spraakconversies en uitvoer naar luidsprekers, bestanden of andere uitvoerstromen worden uitgevoerd. De SpeechSynthesizer accepteert als parameters het SpeechConfig-object dat in de vorige stap is gemaakt en tevens een AudioConfig-object dat aangeeft hoe uitvoerresultaten moeten worden verwerkt.

Eerst maakt u een AudioConfig om de uitvoer automatisch naar een .wav-bestand te schrijven met behulp van de functie FromWavFileOutput().

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
}

Vervolgens instantieert u een SpeechSynthesizer, terwijl het config-object en het audioConfig-object als parameters worden doorgegeven. Daarna is het uitvoeren van spraaksynthese en het schrijven naar een bestand net zo eenvoudig als het uitvoeren van SpeakTextAsync() met een regel tekst.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, audioConfig);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
}

Voer het programma uit. Er wordt een gesynthetiseerd .wav-bestand geschreven naar de locatie die u hebt opgegeven. Dit is een goed voorbeeld van het eenvoudigste gebruik, maar hierna gaat u de uitvoer aanpassen en de uitvoerrespons verwerken als een in-memory stroom om met aangepaste scenario's te kunnen werken.

Synthetiseren naar de uitvoer van de luidspreker

In sommige gevallen kunt u gesynthetiseerde spraak rechtstreeks naar een luidspreker uitvoeren. U doet dit door de parameter weg te AudioConfig laten bij het maken van de in het SpeechSynthesizer bovenstaande voorbeeld. Dit wordt gesynthetiseerd naar het huidige actieve uitvoerapparaat.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto synthesizer = SpeechSynthesizer::FromConfig(config);
    auto result = synthesizer->SpeakTextAsync("Synthesizing directly to speaker output.").get();
}

Resultaat ophalen als een in-memory stroom

Voor veel scenario's in het ontwikkelen van spraaktoepassingen hebt u waarschijnlijk de resulterende audiogegevens als een in-memory stroom nodig, in plaats dat u rechtstreeks naar een bestand gaat schrijven. Zo kunt u aangepast gedrag maken, waaronder:

  • Vat de resulterende bytematrix samen als een doorzoekbare stroom voor aangepaste downstreamservices.
  • Integreer het resultaat met andere API's of services.
  • Wijzig de audiogegevens, schrijf aangepaste .wav-headers, enzovoort.

U kunt deze wijziging eenvoudig met behulp van het voorgaande voorbeeld uitvoeren. Verwijder eerst de AudioConfig, omdat u het uitvoergedrag vanaf dit punt handmatig gaat beheren voor een betere controle. Geef vervolgens NULL door voor de AudioConfig in de SpeechSynthesizer-constructor.

Notitie

Als NULL voor de AudioConfig wordt doorgegeven in plaats van dat deze wordt weggelaten, zoals in het bovenstaande voorbeeld met de luidspreker, wordt de audio niet standaard afgespeeld op het huidige actieve uitvoerapparaat.

Deze keer slaat u het resultaat op in een SpeechSynthesisResult-variabele. De GetAudioData retourneert een byte [] van de uitvoergegevens. U kunt handmatig met deze byte [] werken, of u kunt de AudioDataStream-klasse gebruiken om de stroom in het geheugen te beheren. In dit voorbeeld gebruikt u de statische functie AudioDataStream.FromResult() om een stroom van het resultaat op te halen.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);

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

Hierna kunt u aangepast gedrag implementeren met behulp van het resulterende stream-object.

Audio-indeling aanpassen

In de volgende sectie ziet u hoe u kenmerken van audio-uitvoer kunt aanpassen, zoals:

  • Audiobestandstype
  • Samplefrequentie
  • Bitdiepte

Als u de audio-indeling wilt wijzigen, gebruikt u de functie SetSpeechSynthesisOutputFormat() op het SpeechConfig-object. Deze functie verwacht een enum van het type SpeechSynthesisOutputFormat, die u gebruikt om de uitvoerindeling te selecteren. Zie de naslagdocumenten voor een lijst met audio-indelingen die beschikbaar zijn.

Voor verschillende bestandstypen zijn er diverse opties mogelijk, afhankelijk van uw vereisten. Houd er rekening mee dat raw-indelingen als Raw24Khz16BitMonoPcm geen audio-headers bevatten. Gebruik raw-indelingen alleen als u weet dat uw stroomafwaartse implementatie een onbewerkte bitstream kan decoderen of als u van plan bent om headers handmatig te bouwen op basis van bitdiepte, samplefrequentie, aantal kanalen, enzovoort.

In dit voorbeeld geeft u een RIFF-indeling met hoge kwaliteit Riff24Khz16BitMonoPcm op door SpeechSynthesisOutputFormat in te stellen voor het SpeechConfig-object. Net als in het voorbeeld in de vorige sectie, gebruikt u AudioDataStream om een stroom in het geheugen van het resultaat te verkrijgen en vervolgens naar een bestand te schrijven.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    config->SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat::Riff24Khz16BitMonoPcm);

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

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

Als u het programma opnieuw uitvoert, wordt een .wav-bestand naar het opgegeven pad geschreven.

SSML gebruiken om spraakkenmerken aan te passen

Met SSML (Speech Synthesis Markup Language) kunt u de toonhoogte, de uitspraak, de spreeksnelheid, het volume en meer van tekst-naar-spraakuitvoer nauwkeuriger instellen door uw aanvragen vanaf een XML-schema te verzenden. In deze sectie ziet u een voorbeeld van het wijzigen van de stem, maar zie het SSML-uitlegartikel voor een gedetailleerdere handleiding.

Als u SSML voor aanpassing wilt gaan gebruiken, brengt u een eenvoudige wijziging aan die de stem wisselt. Maak eerst een nieuw XML-bestand voor de SSML-configuratie in de hoofdmap van het project, in dit voorbeeld ssml.xml. Het hoofdelement is altijd <speak>, en wanneer u de tekst in een <voice>-element verpakt, kunt u de stem wijzigen met behulp van de parameter name. Bekijk de volledige lijst met ondersteunde neurale stemmen.

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

Vervolgens moet u de aanvraag voor spraaksynthese wijzigen om te verwijzen naar uw XML-bestand. De aanvraag is doorgaans hetzelfde, maar in plaats van de functie SpeakTextAsync() gebruikt u SpeakSsmlAsync(). Deze functie verwacht een XML-tekenreeks, dus u moet uw SSML-configuratie eerst laden als een tekenreeks. Hier is het resultaatobject precies hetzelfde als in de vorige voorbeelden.

void synthesizeSpeech()
{
    auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);

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

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

Notitie

Als u de stem wilt wijzigen zonder SSML te gebruiken, kunt u de eigenschap voor de instellen met behulp SpeechConfig van SpeechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")

Gezichtshoudingsgebeurtenissen krijgen

Spraak kan een goede manier zijn om de animatie van gezichtsexpressie aan te geven. Visemes worden vaak gebruikt om de sleutelposities in waargenomen spraak weer te geven, zoals de positie van de ogen, de mond en de ogen bij het produceren van een bepaald phoneme. U kunt zich abonneren op de viseme-gebeurtenis in speech-SDK. Vervolgens kunt u viseme-gebeurtenissen toepassen om het gezicht van een teken te animaneren terwijl spraakaudio wordt afgespeeld. Meer informatie over het op halen van viseme-gebeurtenissen.

In deze quickstart maakt u kennis met algemene ontwerppatronen voor het uitvoeren van een spraak-naar-tekstsynthese met behulp van de Speech-SDK.

Naar voorbeelden op GitHub

Raadpleeg de Go-quickstart-voorbeelden op GitHub als u direct naar voorbeeldcode wilt gaan.

Vereisten

In dit artikel wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

De Speech-SDK installeren

Voordat u iets kunt doen, moet u de Speech-SDK voor Go installeren.

Tekst-naar-spraak naar spreker

Gebruik het volgende codevoorbeeld om spraaksynthese uit te voeren op uw standaardapparaat voor audio-uitvoer. Vervang de variabelen subscription en door region uw spraaksleutel en locatie/regio. Door het script uit te voeren, wordt uw invoertekst op de standaardspreker gesproken.

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 := "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"

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

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

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

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

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

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

Voer de volgende opdrachten uit om een bestand go.mod te maken dat is koppelingen naar onderdelen die worden gehost op GitHub.

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

Bouw de code en voer deze uit.

go build
go run quickstart

Zie de referentiedocumenten voor gedetailleerde informatie over de klassen SpeechConfig en SpeechSynthesizer.

Tekst-naar-spraak naar in-memory stroom

Voor veel scenario's in het ontwikkelen van spraaktoepassingen hebt u waarschijnlijk de resulterende audiogegevens als een in-memory stroom nodig, in plaats dat u rechtstreeks naar een bestand gaat schrijven. Zo kunt u aangepast gedrag maken, waaronder:

  • Vat de resulterende bytematrix samen als een doorzoekbare stroom voor aangepaste downstreamservices.
  • Integreer het resultaat met andere API's of services.
  • Wijzig de audiogegevens, schrijf aangepaste .wav-headers, enzovoort.

U kunt deze wijziging eenvoudig met behulp van het voorgaande voorbeeld uitvoeren. Verwijder eerst de AudioConfig, omdat u het uitvoergedrag vanaf dit punt handmatig gaat beheren voor een betere controle. Geef vervolgens nil door voor de AudioConfig in de SpeechSynthesizer-constructor.

Notitie

Als nil voor de AudioConfig wordt doorgegeven in plaats van dat deze wordt weggelaten, zoals in het bovenstaande voorbeeld met de luidspreker, wordt de audio niet standaard afgespeeld op het huidige actieve uitvoerapparaat.

Deze keer slaat u het resultaat op in een SpeechSynthesisResult-variabele. De AudioData eigenschap retourneert een []byte van de uitvoergegevens. U kunt handmatig met deze []byte werken, of u kunt de AudioDataStream-klasse gebruiken om de stroom in het geheugen te beheren. In dit voorbeeld gebruikt u de NewAudioDataStreamFromSpeechSynthesisResult() statische functie om een stroom op te halen uit het resultaat.

Vervang de variabelen subscription en door region uw spraaksleutel en locatie/regio.

package main

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

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

func main(subscription string, region string) {
    subscription := "<paste-your-speech-key-here>"
    region := "<paste-your-speech-location/region-here>"

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

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

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

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

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

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

            if err == io.EOF {
                break
            }

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

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

Voer de volgende opdrachten uit om een bestand go.mod te maken dat is koppelingen naar onderdelen die worden gehost op GitHub.

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

Bouw de code en voer deze uit.

go build
go run quickstart

Zie de referentiedocumenten voor gedetailleerde informatie over de klassen SpeechConfig en SpeechSynthesizer.

SSML gebruiken om spraakkenmerken aan te passen

Met SSML (Speech Synthesis Markup Language) kunt u de toonhoogte, de uitspraak, de spreeksnelheid, het volume en meer van tekst-naar-spraakuitvoer nauwkeuriger instellen door uw aanvragen vanaf een XML-schema te verzenden. In deze sectie ziet u een voorbeeld van het wijzigen van de stem, maar zie het SSML-uitlegartikelvoor een gedetailleerdere handleiding.

Als u SSML voor aanpassing wilt gaan gebruiken, brengt u een eenvoudige wijziging aan die de stem wisselt. Maak eerst een nieuw XML-bestand voor de SSML-configuratie in de hoofdmap van het project, in dit voorbeeld ssml.xml. Het hoofdelement is altijd <speak>, en wanneer u de tekst in een <voice>-element verpakt, kunt u de stem wijzigen met behulp van de parameter name. Bekijk de volledige lijst met ondersteunde neurale stemmen.

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

Vervolgens moet u de aanvraag voor spraaksynthese wijzigen om te verwijzen naar uw XML-bestand. De aanvraag is doorgaans hetzelfde, maar in plaats van de functie SpeakTextAsync() gebruikt u SpeakSsmlAsync(). Deze functie verwacht een XML-tekenreeks, dus u moet uw SSML-configuratie eerst laden als een tekenreeks. Hier is het resultaatobject precies hetzelfde als in de vorige voorbeelden.

Notitie

Als u de stem wilt wijzigen zonder SSML te gebruiken, kunt u de eigenschap voor de instellen met behulp SpeechConfig van speechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")

Gezichtshoudingsgebeurtenissen krijgen

Spraak kan een goede manier zijn om de animatie van gezichtsexpressie aan te geven. Visemes worden vaak gebruikt om de sleutelposities in waargenomen spraak weer te geven, zoals de positie van de ogen, de mond en de ogen bij het produceren van een bepaald phoneme. U kunt zich abonneren op de viseme-gebeurtenis in speech-SDK. Vervolgens kunt u viseme-gebeurtenissen toepassen om het gezicht van een teken te animaneren terwijl spraakaudio wordt afgespeeld. Meer informatie over het op halen van viseme-gebeurtenissen.

In deze quickstart maakt u kennis met algemene ontwerppatronen voor het uitvoeren van een spraak-naar-tekstsynthese met behulp van de Speech-SDK. Eerst voert u een basisconfiguratie en -synthese uit en gaat u verder met geavanceerdere voorbeelden voor aangepaste toepassingsontwikkeling zoals:

  • Antwoorden krijgen als stromen in het geheugen
  • De uitgevoerde frequentie- en bitsnelheid aanpassen
  • Synthese-aanvragen indienen met behulp van SSML (Speech Synthesis Markup Language)
  • Neurale stemmen gebruiken

Naar voorbeelden op GitHub

Raadpleeg de Java-quickstartvoorbeelden op GitHub als u direct naar voorbeeldcode wilt gaan.

Vereisten

In dit artikel wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

De Speech-SDK installeren

Voordat u iets kunt doen, moet u de Speech SDK installeren. Gebruik de volgende instructies, afhankelijk van uw platform:

Afhankelijkheden importeren

Als u de voorbeelden in dit artikel wilt uitvoeren, voegt u de volgende importinstructies toe bovenaan het script.

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

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

Een spraakconfiguratie maken

Als u de Speech-service wilt aanroepen met behulp van de Speech SDK, moet u een SpeechConfig maken. Deze klasse bevat informatie over uw abonnement, zoals uw spraaksleutel en de bijbehorende locatie/regio, eindpunt, host of autorisatie-token.

Notitie

Ongeacht of u spraakherkenning, spraaksynthese, vertaling of intentieherkenning uitvoert, u maakt altijd een configuratie.

Er zijn een paar manieren waarop u een SpeechConfig kunt initialiseren:

  • Met een abonnement: geef een spraaksleutel en de bijbehorende locatie/regio door.
  • Met een eindpunt: geef een Speech-service-eindpunt door. Een spraaksleutel of autorisatie-token is optioneel.
  • Met een host: geef een hostadres door. Een spraaksleutel of autorisatie-token is optioneel.
  • Met een autorisatie-token: geef een autorisatie-token en de bijbehorende locatie/regio door.

In dit voorbeeld maakt u een met SpeechConfig behulp van een spraaksleutel en locatie/regio. U kunt deze referenties ophalen door de stappen te volgen in De Speech-service gratis uitproberen. U schrijft ook wat eenvoudige standaardcode voor gebruik in de rest van dit artikel. U gaat de code voor verschillende aanpassingen wijzigen.

public class Program
{
    public static void main(String[] args) {
        SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    }
}

Synthesetaal en stem selecteren

De Azure Text to Speech-service ondersteunt meer dan 250 stemmen en meer dan 70 talen en varianten. U kunt de volledige lijst krijgen ofproberen in de demo over tekst-naar-spraak. Geef de taal of stem van op SpeechConfig die bij uw invoertekst past en gebruik de gezochte stem.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    config.setSpeechSynthesisLanguage("<your-synthesis-language>"); // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    config.setSpeechSynthesisVoiceName("<your-wanted-voice>");
}

Spraak synthetiseren naar een bestand

Vervolgens maakt u een SpeechSynthesizer-object, waarmee tekst-naar-spraakconversies en uitvoer naar luidsprekers, bestanden of andere uitvoerstromen worden uitgevoerd. De SpeechSynthesizer accepteert als parameters het SpeechConfig-object dat in de vorige stap is gemaakt en tevens een AudioConfig-object dat aangeeft hoe uitvoerresultaten moeten worden verwerkt.

Eerst maakt u een AudioConfig om de uitvoer automatisch naar een .wav-bestand te schrijven met behulp van de statische functie fromWavFileOutput().

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
}

Vervolgens instantieert u een SpeechSynthesizer, terwijl het speechConfig-object en het audioConfig-object als parameters worden doorgegeven. Daarna is het uitvoeren van spraaksynthese en het schrijven naar een bestand net zo eenvoudig als het uitvoeren van SpeakText() met een regel tekst.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");

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

Voer het programma uit. Er wordt een gesynthetiseerd .wav-bestand geschreven naar de locatie die u hebt opgegeven. Dit is een goed voorbeeld van het eenvoudigste gebruik, maar hierna gaat u de uitvoer aanpassen en de uitvoerrespons verwerken als een in-memory stroom om met aangepaste scenario's te kunnen werken.

Synthetiseren naar de uitvoer van de luidspreker

In sommige gevallen kunt u gesynthetiseerde spraak rechtstreeks naar een luidspreker uitvoeren. Als u dit wilt doen, moet u AudioConfig instantiëren met behulp van de statische functie fromDefaultSpeakerOutput(). Hiermee wordt de uitvoer naar het huidige, actieve uitvoerapparaat gestuurd.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    AudioConfig audioConfig = AudioConfig.fromDefaultSpeakerOutput();

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

Resultaat ophalen als een in-memory stroom

Voor veel scenario's in het ontwikkelen van spraaktoepassingen hebt u waarschijnlijk de resulterende audiogegevens als een in-memory stroom nodig, in plaats dat u rechtstreeks naar een bestand gaat schrijven. Zo kunt u aangepast gedrag maken, waaronder:

  • Vat de resulterende bytematrix samen als een doorzoekbare stroom voor aangepaste downstreamservices.
  • Integreer het resultaat met andere API's of services.
  • Wijzig de audiogegevens, schrijf aangepaste .wav-headers, enzovoort.

U kunt deze wijziging eenvoudig met behulp van het voorgaande voorbeeld uitvoeren. Verwijder eerst het AudioConfig-blok, omdat u het uitvoergedrag vanaf dit punt handmatig gaat beheren voor een betere controle. Geef vervolgens null door voor de AudioConfig in de SpeechSynthesizer-constructor.

Notitie

Als null voor de AudioConfig wordt doorgegeven in plaats van dat deze wordt weggelaten, zoals in het bovenstaande voorbeeld met de luidspreker, wordt de audio niet standaard afgespeeld op het huidige actieve uitvoerapparaat.

Deze keer slaat u het resultaat op in een SpeechSynthesisResult-variabele. De functie SpeechSynthesisResult.getAudioData() retourneert een byte [] van de uitvoergegevens. U kunt handmatig met deze byte [] werken, of u kunt de AudioDataStream-klasse gebruiken om de stroom in het geheugen te beheren. In dit voorbeeld gebruikt u de statische functie AudioDataStream.fromResult() om een stroom van het resultaat op te halen.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);

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

Hierna kunt u aangepast gedrag implementeren met behulp van het resulterende stream-object.

Audio-indeling aanpassen

In de volgende sectie ziet u hoe u kenmerken van audio-uitvoer kunt aanpassen, zoals:

  • Audiobestandstype
  • Samplefrequentie
  • Bitdiepte

Als u de audio-indeling wilt wijzigen, gebruikt u de functie setSpeechSynthesisOutputFormat() op het SpeechConfig-object. Deze functie verwacht een enum van het type SpeechSynthesisOutputFormat, die u gebruikt om de uitvoerindeling te selecteren. Zie de naslagdocumenten voor een lijst met audio-indelingen die beschikbaar zijn.

Voor verschillende bestandstypen zijn er diverse opties mogelijk, afhankelijk van uw vereisten. Houd er rekening mee dat raw-indelingen als Raw24Khz16BitMonoPcm geen audio-headers bevatten. Gebruik raw-indelingen alleen als u weet dat uw stroomafwaartse implementatie een onbewerkte bitstream kan decoderen of als u van plan bent om headers handmatig te bouwen op basis van bitdiepte, samplefrequentie, aantal kanalen, enzovoort.

In dit voorbeeld geeft u een RIFF-indeling met hoge kwaliteit Riff24Khz16BitMonoPcm op door SpeechSynthesisOutputFormat in te stellen voor het SpeechConfig-object. Net als in het voorbeeld in de vorige sectie, gebruikt u AudioDataStream om een stroom in het geheugen van het resultaat te verkrijgen en vervolgens naar een bestand te schrijven.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

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

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

Als u het programma opnieuw uitvoert, wordt een .wav-bestand naar het opgegeven pad geschreven.

SSML gebruiken om spraakkenmerken aan te passen

Met SSML (Speech Synthesis Markup Language) kunt u de toonhoogte, de uitspraak, de spreeksnelheid, het volume en meer van tekst-naar-spraakuitvoer nauwkeuriger instellen door uw aanvragen vanaf een XML-schema te verzenden. In deze sectie ziet u een voorbeeld van het wijzigen van de stem, maar zie het SSML-uitlegartikelvoor een gedetailleerdere handleiding.

Als u SSML voor aanpassing wilt gaan gebruiken, brengt u een eenvoudige wijziging aan die de stem wisselt. Maak eerst een nieuw XML-bestand voor de SSML-configuratie in de hoofdmap van het project, in dit voorbeeld ssml.xml. Het hoofdelement is altijd <speak>, en wanneer u de tekst in een <voice>-element verpakt, kunt u de stem wijzigen met behulp van de parameter name. Bekijk de volledige lijst met ondersteunde neurale stemmen.

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

Vervolgens moet u de aanvraag voor spraaksynthese wijzigen om te verwijzen naar uw XML-bestand. De aanvraag is doorgaans hetzelfde, maar in plaats van de functie SpeakText() gebruikt u SpeakSsml(). Deze functie verwacht een XML-tekenreeks, dus eerst maakt u een functie om een XML-bestand te laden en als een tekenreeks te retourneren.

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

Hier is het resultaatobject precies hetzelfde als in de vorige voorbeelden.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);

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

Notitie

Als u de stem wilt wijzigen zonder SSML te gebruiken, kunt u de eigenschap voor de instellen met behulp SpeechConfig van SpeechConfig.setSpeechSynthesisVoiceName("en-US-ChristopherNeural");

Gezichtshoudingsgebeurtenissen krijgen

Spraak kan een goede manier zijn om de animatie van gezichtsexpressie aan te geven. Visemes worden vaak gebruikt om de sleutelposities in waargenomen spraak weer te geven, zoals de positie van de ogen, de mond en de ogen bij het produceren van een bepaald phoneme. U kunt zich abonneren op viseme-gebeurtenissen in speech-SDK om gezichts animatiegegevens op te halen en de gegevens vervolgens toepassen op een teken tijdens een gezichts animatie. Meer informatie over het op halen van viseme-gebeurtenissen.

In deze quickstart maakt u kennis met algemene ontwerppatronen voor het uitvoeren van een spraak-naar-tekstsynthese met behulp van de Speech-SDK. Eerst voert u een basisconfiguratie en -synthese uit en gaat u verder met geavanceerdere voorbeelden voor aangepaste toepassingsontwikkeling zoals:

  • Antwoorden krijgen als stromen in het geheugen
  • De uitgevoerde frequentie- en bitsnelheid aanpassen
  • Synthese-aanvragen indienen met behulp van SSML (Speech Synthesis Markup Language)
  • Neurale stemmen gebruiken

Naar voorbeelden op GitHub

Raadpleeg de JavaScript-quickstartvoorbeelden op GitHub als u direct naar voorbeeldcode wilt gaan.

Vereisten

In dit artikel wordt ervan uitgenomen dat u een Azure-account en spraakserviceresource hebt. Als u geen account en resource hebt, kunt u de Speech-service gratis proberen.

De Speech-SDK installeren

Voordat u iets kunt doen, moet u de Speech-SDK installeren voor JavaScript. Gebruik de volgende instructies, afhankelijk van uw platform:

Afhankelijk van de doelomgeving gebruikt u daarnaast een van de volgende opties:

Download en extraheerde de Speech SDK voor JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js en plaats het in een map die toegankelijk is voor uw HTML-bestand.

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

Tip

Als u een webbrowser als doel hebt en de tag <script> gebruikt, is het voorvoegsel sdk niet nodig. Het voorvoegsel sdk is een alias die wordt gebruikt om de require-module te benoemen.

Een spraakconfiguratie maken

Als u de Speech-service wilt aanroepen met behulp van de Speech SDK, moet u een SpeechConfig maken. Deze klasse bevat informatie over uw resource, zoals uw spraaksleutel en de bijbehorende locatie/regio, eindpunt, host of autorisatie-token.

Notitie

Ongeacht of u spraakherkenning, spraaksynthese, vertaling of intentieherkenning uitvoert, u maakt altijd een configuratie.

Er zijn een paar manieren waarop u een SpeechConfig kunt initialiseren:

  • Met een resource: geef een spraaksleutel en de bijbehorende locatie/regio door.
  • Met een eindpunt: geef een Speech-service-eindpunt door. Een spraaksleutel of autorisatie-token is optioneel.
  • Met een host: geef een hostadres door. Een spraaksleutel of autorisatie-token is optioneel.
  • Met een autorisatie-token: geef een autorisatie-token en de bijbehorende locatie/regio door.

In dit voorbeeld maakt u een met SpeechConfig behulp van een spraaksleutel en locatie/regio. U kunt deze referenties ophalen door de stappen te volgen in De Speech-service gratis uitproberen. U schrijft ook wat eenvoudige standaardcode voor gebruik in de rest van dit artikel. U gaat de code voor verschillende aanpassingen wijzigen.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}

synthesizeSpeech();

Synthesetaal en spraak selecteren

De Azure Text to Speech-service ondersteunt meer dan 250 stemmen en meer dan 70 talen en varianten. U kunt de volledige lijst krijgen ofproberen in tekst-naar-spraakdemo. Geef de taal of stem van op SpeechConfig die moet overeenkomen met uw invoertekst en gebruik de gezochte stem.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    // Note: if only language is set, the default voice of that language is chosen.
    speechConfig.speechSynthesisLanguage = "<your-synthesis-language>"; // e.g. "de-DE"
    // The voice setting will overwrite language setting.
    // The voice setting will not overwrite the voice element in input SSML.
    speechConfig.speechSynthesisVoiceName = "<your-wanted-voice>";
}

synthesizeSpeech();

Spraak synthetiseren naar een bestand

Vervolgens maakt u een SpeechSynthesizer-object, waarmee tekst-naar-spraakconversies en uitvoer naar luidsprekers, bestanden of andere uitvoerstromen worden uitgevoerd. De SpeechSynthesizer accepteert als parameters het SpeechConfig-object dat in de vorige stap is gemaakt en tevens een AudioConfig-object dat aangeeft hoe uitvoerresultaten moeten worden verwerkt.

Eerst maakt u een AudioConfig om de uitvoer automatisch naar een .wav-bestand te schrijven met behulp van de statische functie fromAudioFileOutput().

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const audioConfig = sdk.AudioConfig.fromAudioFileOutput("path/to/file.wav");
}

Vervolgens instantieert u een SpeechSynthesizer, terwijl het speechConfig-object en het audioConfig-object als parameters worden doorgegeven. Daarna is het uitvoeren van spraaksynthese en het schrijven naar een bestand net zo eenvoudig als het uitvoeren van speakTextAsync() met een regel tekst. De resulterende callback is een goede plaats om synthesizer.close() aan te roepen, omdat deze aanroep is vereist om de synthese goed te laten functioneren.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const audioConfig = sdk.AudioConfig.fromAudioFileOutput("path-to-file.wav");

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

Voer het programma uit. Er wordt een gesynthetiseerd .wav-bestand geschreven naar de locatie die u hebt opgegeven. Dit is een goed voorbeeld van het eenvoudigste gebruik, maar hierna gaat u de uitvoer aanpassen en de uitvoerrespons verwerken als een in-memory stroom om met aangepaste scenario's te kunnen werken.

Synthetiseren naar sprekeruitvoer (alleen browser)

In sommige gevallen kunt u gesynthetiseerde spraak rechtstreeks naar een luidspreker uitvoeren. Als u dit wilt doen, moet u AudioConfig instantiëren met behulp van de statische functie fromDefaultSpeakerOutput(). Hiermee wordt de uitvoer naar het huidige, actieve uitvoerapparaat gestuurd.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const audioConfig = sdk.AudioConfig.fromDefaultSpeakerOutput();

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

Resultaat ophalen als een in-memory stroom

Voor veel scenario's in het ontwikkelen van spraaktoepassingen hebt u waarschijnlijk de resulterende audiogegevens als een in-memory stroom nodig, in plaats dat u rechtstreeks naar een bestand gaat schrijven. Zo kunt u aangepast gedrag maken, waaronder:

  • Vat de resulterende bytematrix samen als een doorzoekbare stroom voor aangepaste downstreamservices.
  • Integreer het resultaat met andere API's of services.
  • Wijzig de audiogegevens, schrijf aangepaste .wav-headers, enzovoort.

U kunt deze wijziging eenvoudig met behulp van het voorgaande voorbeeld uitvoeren. Verwijder eerst het AudioConfig-blok, omdat u het uitvoergedrag vanaf dit punt handmatig gaat beheren voor een betere controle. Geef vervolgens undefined door voor de AudioConfig in de SpeechSynthesizer-constructor.

Notitie

Als undefined voor de AudioConfig wordt doorgegeven in plaats van dat deze wordt weggelaten, zoals in het bovenstaande voorbeeld met de luidspreker, wordt de audio niet standaard afgespeeld op het huidige actieve uitvoerapparaat.

Deze keer slaat u het resultaat op in een SpeechSynthesisResult-variabele. De SpeechSynthesisResult.audioData eigenschap retourneert een ArrayBuffer van de uitvoergegevens, het standaardstreamtype van de browser. Converteert voor servercode de arrayBuffer naar een bufferstroom.

De volgende code werkt voor code aan de clientzijde.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

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

Hierna kunt u aangepast gedrag implementeren met behulp van het resulterende ArrayBuffer-object. ArrayBuffer is een algemeen type dat in een browser wordt ontvangen en wordt afspelen vanuit deze indeling.

Als u voor elke servergebaseerde code met de gegevens wilt werken als een stroom, in plaats van een ArrayBuffer, moet u het object converteren naar een stream.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig);

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

            synthesizer.close();

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

Audio-indeling aanpassen

In de volgende sectie ziet u hoe u kenmerken van audio-uitvoer kunt aanpassen, zoals:

  • Audiobestandstype
  • Samplefrequentie
  • Bitdiepte

Als u de audio-indeling wilt wijzigen, gebruikt u de eigenschap speechSynthesisOutputFormat voor het SpeechConfig-object. Deze eigenschap verwacht een enum van het type SpeechSynthesisOutputFormat, dat u gebruikt om de uitvoerindeling te selecteren. Zie de naslagdocumenten voor een lijst met audio-indelingen die beschikbaar zijn.

Voor verschillende bestandstypen zijn er diverse opties mogelijk, afhankelijk van uw vereisten. Houd er rekening mee dat raw-indelingen als Raw24Khz16BitMonoPcm geen audio-headers bevatten. Gebruik raw-indelingen alleen als u weet dat uw stroomafwaartse implementatie een onbewerkte bitstream kan decoderen of als u van plan bent om headers handmatig te bouwen op basis van bitdiepte, samplefrequentie, aantal kanalen, enzovoort.

In dit voorbeeld geeft u een RIFF-indeling met hoge kwaliteit Riff24Khz16BitMonoPcm op door speechSynthesisOutputFormat in te stellen voor het SpeechConfig-object. Net als in het voorbeeld in de vorige sectie, kunt u de ArrayBuffer-audiogegevens ophalen en ermee werken.

function synthesizeSpeech() {
    const speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");

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

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

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

Als u het programma opnieuw uitvoert, wordt een .wav-bestand naar het opgegeven pad geschreven.

SSML gebruiken om spraakkenmerken aan te passen

Met SSML (Speech Synthesis Markup Language) kunt u de toonhoogte, de uitspraak, de spreeksnelheid, het volume en meer van tekst-naar-spraakuitvoer nauwkeuriger instellen door uw aanvragen vanaf een XML-schema te verzenden. In deze sectie ziet u een voorbeeld van het wijzigen van de stem, maar zie het SSML-uitlegartikel voor een gedetailleerdere handleiding.

Als u SSML voor aanpassing wilt gaan gebruiken, brengt u een eenvoudige wijziging aan die de stem wisselt. Maak eerst een nieuw XML-bestand voor de SSML-configuratie in de hoofdmap van het project, in dit voorbeeld ssml.xml. Het hoofdelement is altijd <speak>, en wanneer u de tekst in een <voice>-element verpakt, kunt u de stem wijzigen met behulp van de parameter name. Bekijk de volledige lijst met ondersteunde neurale stemmen.

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

Vervolgens moet u de aanvraag voor spraaksynthese wijzigen om te verwijzen naar uw XML-bestand. De aanvraag is doorgaans hetzelfde, maar in plaats van de functie speakTextAsync() gebruikt u speakSsmlAsync(). Deze functie verwacht een XML-tekenreeks, dus eerst maakt u een functie om een XML-bestand te laden en als een tekenreeks te retourneren.

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

Zie Node.js-bestandssysteem voor meer informatie over readFileSync. Hier is het resultaatobject precies hetzelfde als in de vorige voorbeelden.

function synthesizeSpeech() {
    const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
    const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);

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

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

Notitie

Als u de stem wilt wijzigen zonder SSML te gebruiken, kunt u de eigenschap voor de instellen SpeechConfig met behulp van SpeechConfig.speechSynthesisVoiceName = "en-US-ChristopherNeural";

Gezichtshoudingsgebeurtenissen krijgen

Spraak kan een goede manier zijn om de animatie van gezichtsexpressie te maken. Visemes worden vaak gebruikt om de belangrijkste houdingen in waargenomen spraak weer te geven, zoals de positie van de thee, de ogen en de ogen bij het produceren van een bepaald telefoonnummer. U kunt u abonneren op de viseme-gebeurtenis in speech-SDK. Vervolgens kunt u viseme-gebeurtenissen toepassen om het gezicht van een teken te animateren terwijl spraakaudio wordt afgespeeld. Meer informatie over het op halen van viseme-gebeurtenissen.

U kunt spraak uit tekst omzetten met behulp van de Speech-SDK voor Swift en Objective-C.

Vereisten

In de volgende artikelen wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

Speech-SDK en -voorbeelden installeren

De Cognitive Services Speech-SDK bevat voorbeelden die zijn geschreven in Swift en Objective-C voor iOS en Mac. Klik op een koppeling om de installatie-instructies voor elk voorbeeld weer te geven:

We bieden ook een online Speech-SDK voor naslaginformatie over Objective-C.

In deze quickstart maakt u kennis met algemene ontwerppatronen voor het uitvoeren van een spraak-naar-tekstsynthese met behulp van de Speech-SDK. Eerst voert u een basisconfiguratie en -synthese uit en gaat u verder met geavanceerdere voorbeelden voor aangepaste toepassingsontwikkeling zoals:

  • Antwoorden krijgen als stromen in het geheugen
  • De uitgevoerde frequentie- en bitsnelheid aanpassen
  • Synthese-aanvragen indienen met behulp van SSML (Speech Synthesis Markup Language)
  • Neurale stemmen gebruiken

Naar voorbeelden op GitHub

Raadpleeg de Python-quickstartvoorbeelden op GitHub als u direct naar voorbeeldcode wilt gaan.

Vereisten

In dit artikel wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

De Speech-SDK installeren

Voordat u iets kunt doen, moet u de Speech SDK installeren.

pip install azure-cognitiveservices-speech

Als u macOS heeft en er problemen met de installatie optreden, moet u deze opdracht mogelijk eerst uitvoeren.

python3 -m pip install --upgrade pip

Voeg nadat de Speech-SDK is geïnstalleerd de volgende importinstructies bovenaan het script toe.

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

Een spraakconfiguratie maken

Als u de Speech-service wilt aanroepen met behulp van de Speech SDK, moet u een SpeechConfig maken. Deze klasse bevat informatie over uw abonnement, zoals uw spraaksleutel en de bijbehorende locatie/regio, eindpunt, host of autorisatie-token.

Notitie

Ongeacht of u spraakherkenning, spraaksynthese, vertaling of intentieherkenning uitvoert, u maakt altijd een configuratie.

Er zijn een paar manieren waarop u een SpeechConfig kunt initialiseren:

  • Met een abonnement: geef een spraaksleutel en de bijbehorende locatie/regio door.
  • Met een eindpunt: geef een Speech-service-eindpunt door. Een spraaksleutel of autorisatie-token is optioneel.
  • Met een host: geef een hostadres door. Een spraaksleutel of autorisatie-token is optioneel.
  • Met een autorisatie-token: geef een autorisatie-token en de bijbehorende locatie/regio door.

In dit voorbeeld maakt u een met SpeechConfig behulp van een spraaksleutel en locatie/regio. U kunt deze referenties ophalen door de stappen te volgen in De Speech-service gratis uitproberen.

speech_config = SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")

Synthesetaal en stem selecteren

De Azure Text to Speech-service ondersteunt meer dan 250 stemmen en meer dan 70 talen en varianten. U kunt de volledige lijst krijgen ofproberen in de demo over tekst-naar-spraak. Geef de taal of stem van op SpeechConfig die bij uw invoertekst past en gebruik de gezochte stem.

# Note: if only language is set, the default voice of that language is chosen.
speech_config.speech_synthesis_language = "<your-synthesis-language>" # e.g. "de-DE"
# The voice setting will overwrite language setting.
# The voice setting will not overwrite the voice element in input SSML.
speech_config.speech_synthesis_voice_name ="<your-wanted-voice>"

Spraak synthetiseren naar een bestand

Vervolgens maakt u een SpeechSynthesizer-object, waarmee tekst-naar-spraakconversies en uitvoer naar luidsprekers, bestanden of andere uitvoerstromen worden uitgevoerd. De SpeechSynthesizer accepteert als parameters het SpeechConfig-object dat in de vorige stap is gemaakt en tevens een AudioOutputConfig-object dat aangeeft hoe uitvoerresultaten moeten worden verwerkt.

Eerst maakt u een AudioOutputConfig om de uitvoer automatisch naar een .wav-bestand te schrijven met behulp van de constructorparameter filename.

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

Vervolgens instantieert u een SpeechSynthesizer door het speech_config-object en het audio_config-object als parameters door te geven. Daarna is het uitvoeren van spraaksynthese en het schrijven naar een bestand net zo eenvoudig als het uitvoeren van speak_text_async() met een regel tekst.

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

Voer het programma uit. Er wordt een gesynthetiseerd .wav-bestand geschreven naar de locatie die u hebt opgegeven. Dit is een goed voorbeeld van het eenvoudigste gebruik, maar hierna gaat u de uitvoer aanpassen en de uitvoerrespons verwerken als een in-memory stroom om met aangepaste scenario's te kunnen werken.

Synthetiseren naar de uitvoer van de luidspreker

In sommige gevallen kunt u gesynthetiseerde spraak rechtstreeks naar een luidspreker uitvoeren. Gebruik hiervoor het voorbeeld in de vorige sectie, maar wijzig de AudioOutputConfig door de parameter filename te verwijderen en use_default_speaker=True in te stellen. Hiermee wordt de uitvoer naar het huidige, actieve uitvoerapparaat gestuurd.

audio_config = AudioOutputConfig(use_default_speaker=True)

Resultaat ophalen als een in-memory stroom

Voor veel scenario's in het ontwikkelen van spraaktoepassingen hebt u waarschijnlijk de resulterende audiogegevens als een in-memory stroom nodig, in plaats dat u rechtstreeks naar een bestand gaat schrijven. Zo kunt u aangepast gedrag maken, waaronder:

  • Vat de resulterende bytematrix samen als een doorzoekbare stroom voor aangepaste downstreamservices.
  • Integreer het resultaat met andere API's of services.
  • Wijzig de audiogegevens, schrijf aangepaste .wav-headers, enzovoort.

U kunt deze wijziging eenvoudig met behulp van het voorgaande voorbeeld uitvoeren. Verwijder eerst de AudioConfig, omdat u het uitvoergedrag vanaf dit punt handmatig gaat beheren voor een betere controle. Geef vervolgens None door voor de AudioConfig in de SpeechSynthesizer-constructor.

Notitie

Als None voor de AudioConfig wordt doorgegeven in plaats van dat deze wordt weggelaten, zoals in het bovenstaande voorbeeld met de luidspreker, wordt de audio niet standaard afgespeeld op het huidige actieve uitvoerapparaat.

Deze keer slaat u het resultaat op in een SpeechSynthesisResult-variabele. De eigenschap audio_data bevat een bytes-object van de uitvoergegevens. U kunt handmatig met dit object werken, of u kunt de AudioDataStream-klasse gebruiken om de stroom in het geheugen te beheren. In dit voorbeeld gebruikt u de constructor AudioDataStream om een stroom van het resultaat op te halen.

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

Hierna kunt u aangepast gedrag implementeren met behulp van het resulterende stream-object.

Audio-indeling aanpassen

In de volgende sectie ziet u hoe u kenmerken van audio-uitvoer kunt aanpassen, zoals:

  • Audiobestandstype
  • Samplefrequentie
  • Bitdiepte

Als u de audio-indeling wilt wijzigen, gebruikt u de functie set_speech_synthesis_output_format() op het SpeechConfig-object. Deze functie verwacht een enum van het type SpeechSynthesisOutputFormat, die u gebruikt om de uitvoerindeling te selecteren. Zie de naslagdocumenten voor een lijst met audio-indelingen die beschikbaar zijn.

Voor verschillende bestandstypen zijn er diverse opties mogelijk, afhankelijk van uw vereisten. Houd er rekening mee dat raw-indelingen als Raw24Khz16BitMonoPcm geen audio-headers bevatten. Gebruik raw-indelingen alleen als u weet dat uw stroomafwaartse implementatie een onbewerkte bitstream kan decoderen of als u van plan bent om headers handmatig te bouwen op basis van bitdiepte, samplefrequentie, aantal kanalen, enzovoort.

In dit voorbeeld geeft u een RIFF-indeling met hoge kwaliteit Riff24Khz16BitMonoPcm op door SpeechSynthesisOutputFormat in te stellen voor het SpeechConfig-object. Net als in het voorbeeld in de vorige sectie, gebruikt u AudioDataStream om een stroom in het geheugen van het resultaat te verkrijgen en vervolgens naar een bestand te schrijven.

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

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

Als u het programma opnieuw uitvoert, wordt een aangepast .wav-bestand naar het opgegeven pad geschreven.

SSML gebruiken om spraakkenmerken aan te passen

Met SSML (Speech Synthesis Markup Language) kunt u de toonhoogte, de uitspraak, de spreeksnelheid, het volume en meer van tekst-naar-spraakuitvoer nauwkeuriger instellen door uw aanvragen vanaf een XML-schema te verzenden. In deze sectie ziet u een voorbeeld van het wijzigen van de stem, maar zie het SSML-uitlegartikelvoor een gedetailleerdere handleiding.

Als u SSML voor aanpassing wilt gaan gebruiken, brengt u een eenvoudige wijziging aan die de stem wisselt. Maak eerst een nieuw XML-bestand voor de SSML-configuratie in de hoofdmap van het project, in dit voorbeeld ssml.xml. Het hoofdelement is altijd <speak>, en wanneer u de tekst in een <voice>-element verpakt, kunt u de stem wijzigen met behulp van de parameter name. Bekijk de volledige lijst met ondersteunde neurale stemmen.

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

Vervolgens moet u de aanvraag voor spraaksynthese wijzigen om te verwijzen naar uw XML-bestand. De aanvraag is doorgaans hetzelfde, maar in plaats van de functie speak_text_async() gebruikt u speak_ssml_async(). Deze functie verwacht een XML-tekenreeks, dus u moet uw SSML-configuratie eerst lezen als een tekenreeks. Hier is het resultaatobject precies hetzelfde als in de vorige voorbeelden.

Notitie

Als uw ssml_string aan het begin van de tekenreeks  bevat, moet u de BOM-indeling verwijderen, anders wordt er een foutbericht weergegeven. U doet dit door de parameter encoding als volgt in te stellen: open("ssml.xml", "r", encoding="utf-8-sig").

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

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

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

Notitie

Als u de stem wilt wijzigen zonder SSML te gebruiken, kunt u de eigenschap voor de instellen met behulp SpeechConfig van SpeechConfig.speech_synthesis_voice_name = "en-US-ChristopherNeural"

Gezichtshoudingsgebeurtenissen krijgen

Spraak kan een goede manier zijn om de animatie van gezichtsexpressie aan te geven. Visemes worden vaak gebruikt om de sleutelposities in waargenomen spraak weer te geven, zoals de positie van de ogen, de mond en de ogen bij het produceren van een bepaald phoneme. U kunt zich abonneren op de viseme-gebeurtenis in speech-SDK. Vervolgens kunt u viseme-gebeurtenissen toepassen om het gezicht van een teken te animaneren terwijl spraakaudio wordt afgespeeld. Meer informatie over het op halen van viseme-gebeurtenissen.

In deze quickstart leert u hoe u tekst naar spraak kunt converteren met behulp van de Speech-service en cURL.

Zie het artikel Overzicht voor een diepgaande bespreking van de concepten van tekst-naar-spraak.

Vereisten

In dit artikel wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

Tekst naar spraak converteren

Voer de volgende opdracht uit bij een opdrachtprompt: U moet de volgende waarden in de opdracht gebruiken.

  • De abonnementssleutel voor de Speech-service.
  • De regio voor de Speech-service.

Mogelijk wilt u ook de volgende waarden wijzigen.

  • De waarde van de X-Microsoft-OutputFormat-header, waarmee de indeling van de audio-uitvoer wordt bepaald. Een lijst met ondersteunde indelingen voor audio-uitvoer vindt u in de referentie voor tekst-naar-spraak REST API.
  • De stem voor de uitvoer. Zie de volgende sectie voor een lijst met stemmen die beschikbaar zijn voor uw Speech-eindpunt.
  • Het uitvoerbestand. In dit voorbeeld wordt het antwoord van de server naar het bestand output.wav gestuurd.
curl --location --request POST 'https://INSERT_REGION_HERE.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/ssml+xml' \
--header 'X-Microsoft-OutputFormat: audio-16khz-128kbitrate-mono-mp3' \
--header 'User-Agent: curl' \
--data-raw '<speak version='\''1.0'\'' xml:lang='\''en-US'\''>
    <voice xml:lang='\''en-US'\'' xml:gender='\''Female'\'' name='\''en-US-JennyNeural'\''>
        my voice is my passport verify me
    </voice>
</speak>' > output.mp3

Vermelden van beschikbare stemmen voor uw Speech-eindpunt

Voer de volgende opdracht uit om de beschikbare stemmen voor uw Speech-eindpunt te vermelden.

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

U krijgt een antwoord dat lijkt op het volgende.

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

In deze quickstart maakt u kennis met algemene ontwerppatronen voor het uitvoeren van een spraak-naar-tekstsynthese met behulp van de Speech-SDK. Eerst voert u een basisconfiguratie en -synthese uit en gaat u verder met geavanceerdere voorbeelden voor aangepaste toepassingsontwikkeling zoals:

  • Antwoorden krijgen als stromen in het geheugen
  • De uitgevoerde frequentie- en bitsnelheid aanpassen
  • Synthese-aanvragen indienen met behulp van SSML (Speech Synthesis Markup Language)
  • Neurale stemmen gebruiken

Vereisten

In dit artikel wordt ervan uitgegaan dat u een Azure-account en een abonnement op de Speech-service hebt. Als u geen account en abonnement hebt, kunt u de Speech-service gratis uitproberen.

Downloaden en installeren

Volg deze stappen om de Speech CLI te installeren voor Windows:

  1. In Windows hebt u het Microsoft Visual C++ Redistributable for Visual Studio 2019 voor uw platform nodig. Bij een eerste installatie is mogelijk een herstart vereist.

  2. Installeer .NET Core 3.1 SDK.

  3. Installeer de Speech CLI met NuGet door deze opdracht in te voeren:

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

Typ spx om Help weer te geven voor de Speech CLI.

Notitie

Als alternatief voor NuGet kunt u de Speech CLI voor een Windows downloaden en uitpakken als zip-bestand.

Lettertypebeperkingen

In Windows kan de Speech CLI alleen de lettertypen weergeven die beschikbaar zijn voor de opdrachtprompt op de lokale computer. Windows Terminal ondersteunt alle lettertypen die interactief worden gemaakt door de Speech CLI.

Als u naar een bestand uitvoert, kunnen in een teksteditor zoals Kladblok of een webbrowser zoals Microsoft Edge ook alle lettertypen worden weergegeven.

Spraaksynthese naar een luidspreker

Nu bent u klaar om de Speech CLI uit te voeren om tekst om te zetten in spraak. Gebruik de opdrachtregel om de map waarin het binair Speech CLI-bestand zich bevindt te veranderen. Voer vervolgens de volgende opdracht uit.

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

De Speech CLI produceert natuurlijke taal in het Engels via de luidspreker van de computer.

Spraak synthetiseren naar een bestand

Voer de volgende opdracht uit om de uitvoer van uw luidspreker te veranderen naar een .wav-bestand.

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

De Speech CLI produceert natuurlijke taal in het Engels en slaat die op in het greetings.wav-geluidsbestand. In Windows kunt u het geluidsbestand afspelen door start greetings.wavin te voeren.

Positiegegevens op halen

Uw project moet mogelijk weten wanneer een woord wordt uitgesproken door tekst-naar-spraak, zodat het specifieke actie kan ondernemen op basis van die timing. Als u bijvoorbeeld woorden wilt markeren zoals ze zijn uitgesproken, moet u weten wat u moet markeren, wanneer u deze wilt markeren en hoe lang u deze wilt markeren.

U kunt dit doen met behulp van WordBoundary de gebeurtenis die beschikbaar is in SpeechSynthesizer . Deze gebeurtenis teert aan het begin van elk nieuw gesproken woord en biedt een tijdsver offset binnen de gesproken stroom en een tekstver offset binnen de invoerprompt.

  • AudioOffset rapporteert de verstreken tijd van de uitvoeraudio tussen het begin van de synthese en het begin van het volgende woord. Dit wordt gemeten in eenheden van honderd nanoseconden (HNS) met 10.000 HNS gelijk aan 1 milliseconde.
  • WordOffset rapporteert de tekenpositie in de invoertekenreeks (oorspronkelijke tekst of SSML) direct vóór het woord dat op het punt staat te worden uitgesproken.

Notitie

WordBoundary -gebeurtenissen worden verhoogd wanneer de audiogegevens van de uitvoer beschikbaar komen, wat sneller is dan het afspelen naar een uitvoerapparaat. Het op de juiste wijze synchroniseren van de streamingtijd naar 'realtime' moet worden bereikt door de aanroeper.

Voorbeelden van het gebruik van WordBoundary vindt u in de voorbeelden van tekst-naar-spraak op GitHub.

Volgende stappen