Wprowadzenie do zamiany tekstu na mowęGet started with text-to-speech

W tym przewodniku szybki start przedstawiono typowe wzorce projektowania służące do wykonywania syntezy zamiany tekstu na mowę przy użyciu zestawu Speech SDK.In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. Najpierw należy wykonać podstawowe czynności konfiguracyjne i synteza, a następnie przejść do bardziej zaawansowanych przykładów tworzenia aplikacji niestandardowych, takich jak:You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • Uzyskiwanie odpowiedzi jako strumieni w pamięciGetting responses as in-memory streams
  • Dostosowywanie szybkości próbkowania danych wyjściowych i szybkości transmisji bitówCustomizing output sample rate and bit rate
  • Przesyłanie żądań syntezy przy użyciu SSML (język oznaczeń syntezy mowy)Submitting synthesis requests using SSML (speech synthesis markup language)
  • Korzystanie z głosów neuronowychUsing neural voices

Przejdź do przykładów w witrynie GitHubSkip to samples on GitHub

Jeśli chcesz pominąć prosty kod przykładowy, zobacz przykłady przewodnika Szybki Start w języku C# w witrynie GitHub.If you want to skip straight to sample code, see the C# quickstart samples on GitHub.

Wymagania wstępnePrerequisites

W tym artykule przyjęto założenie, że masz konto platformy Azure i subskrypcję usługi mowy.This article assumes that you have an Azure account and Speech service subscription. Jeśli nie masz konta i subskrypcji, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and subscription, try the Speech service for free.

Instalowanie zestawu SDK usługi MowaInstall the Speech SDK

Przed wykonaniem jakichkolwiek czynności należy zainstalować zestaw Speech SDK.Before you can do anything, you'll need to install the Speech SDK. W zależności od platformy należy wykonać następujące instrukcje:Depending on your platform, use the following instructions:

Importowanie zależnościImport dependencies

Aby uruchomić przykłady z tego artykułu, należy uwzględnić następujące using instrukcje w górnej części skryptu.To run the examples in this article, include the following using statements at the top of your script.

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

Tworzenie konfiguracji mowyCreate a speech configuration

Aby wywołać usługę mowy przy użyciu zestawu Speech SDK, należy utworzyć SpeechConfig .To call the Speech service using the Speech SDK, you need to create a SpeechConfig. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, Host lub Token autoryzacji.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Uwaga

Bez względu na to, czy wykonujesz rozpoznawanie mowy, synteza mowy, tłumaczenie czy rozpoznawanie intencji, zawsze utworzysz konfigurację.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Istnieje kilka sposobów na zainicjowanie SpeechConfig :There are a few ways that you can initialize a SpeechConfig:

  • Z subskrypcją: Przekaż klucz i skojarzony region.With a subscription: pass in a key and the associated region.
  • Z punktem końcowym: Pass w punkcie końcowym usługi mowy.With an endpoint: pass in a Speech service endpoint. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z hostem: Przekaż adres hosta.With a host: pass in a host address. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z tokenem autoryzacji: Przekaż Token autoryzacji i skojarzony region.With an authorization token: pass in an authorization token and the associated region.

W tym przykładzie utworzysz SpeechConfig przy użyciu klucza subskrypcji i regionu.In this example, you create a SpeechConfig using a subscription key and region. Pobierz te poświadczenia, wykonując czynności opisane w sekcji Wypróbuj bezpłatnie usługę Speech.Get these credentials by following steps in Try the Speech service for free. Utworzysz również podstawowy kod standardowy do użycia w pozostałej części tego artykułu, który można modyfikować w celu dostosowania.You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

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

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

Wyrównać mowę do plikuSynthesize speech to a file

Następnie utworzysz SpeechSynthesizer obiekt, który wykonuje konwersje zamiany tekstu na mowę i wyjście na głośniki, pliki lub inne strumienie wyjściowe.Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizerAkceptuje jako params SpeechConfig obiekt utworzony w poprzednim kroku oraz AudioConfig obiekt, który określa sposób obsługi wyników.The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

Aby rozpocząć, Utwórz element, AudioConfig Aby automatycznie zapisywać dane wyjściowe do .wav pliku przy użyciu FromWavFileOutput() funkcji i utworzyć jej wystąpienie z using instrukcją.To start, create an AudioConfig to automatically write the output to a .wav file, using the FromWavFileOutput() function, and instantiate it with a using statement. usingInstrukcja w tym kontekście automatycznie usuwa niezarządzane zasoby i powoduje, że obiekt wykracza poza zakres po usunięciu.A using statement in this context automatically disposes of unmanaged resources and causes the object to go out of scope after disposal.

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

Następnie Utwórz wystąpienie SpeechSynthesizer z inną using instrukcją.Next, instantiate a SpeechSynthesizer with another using statement. Przekaż config obiekt i audioConfig obiekt jako parametry.Pass your config object and the audioConfig object as params. Następnie wykonanie syntezy mowy i zapis w pliku jest tak proste jak uruchamianie SpeakTextAsync() z ciągiem tekstu.Then, executing speech synthesis and writing to a file is as simple as running SpeakTextAsync() with a string of text.

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

Uruchom program, a plik z syntezą .wav jest zapisywana w określonej lokalizacji.Run the program, and a synthesized .wav file is written to the location you specified. Jest to dobry przykład typowego użycia, ale następnym zapoznaj się z tematem dostosowywania danych wyjściowych i obsługi odpowiedzi wyjściowej jako strumienia znajdującego się w pamięci na potrzeby pracy z niestandardowymi scenariuszami.This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

Synteza danych wyjściowych prezenteraSynthesize to speaker output

W niektórych przypadkach można chcieć bezpośrednio wyprowadzać dane z głosu do osoby mówiącej.In some cases, you may want to directly output synthesized speech directly to a speaker. W tym celu wystarczy pominąć AudioConfig parametr podczas tworzenia SpeechSynthesizer w powyższym przykładzie.To do this, simply omit the AudioConfig param when creating the SpeechSynthesizer in the example above. To wyjście do bieżącego aktywnego urządzenia wyjściowego.This outputs to the current active output device.

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

Pobierz wynik jako strumień w pamięciGet result as an in-memory stream

W przypadku wielu scenariuszy tworzenia aplikacji mowy potrzebne są wyniki danych audio jako strumień w pamięci zamiast bezpośredniego zapisywania do pliku.For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. Pozwoli to na tworzenie zachowań niestandardowych, w tym:This will allow you to build custom behavior including:

  • Abstrakcyjna w efekcie tablica bajtów jako strumień umożliwiający wyszukiwanie niestandardowych usług podrzędnych.Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • Zintegruj wynik z innymi interfejsami API lub usługami.Integrate the result with other API's or services.
  • Modyfikowanie danych audio, zapisywanie niestandardowych .wav nagłówków itp.Modify the audio data, write custom .wav headers, etc.

Jest to proste, aby wprowadzić tę zmianę z poprzedniego przykładu.It's simple to make this change from the previous example. Najpierw usuń AudioConfig blok, ponieważ będzie można ręcznie zarządzać zachowaniem danych wyjściowych od tego momentu w celu zwiększenia kontroli.First, remove the AudioConfig block, as you will manage the output behavior manually from this point onward for increased control. Następnie Przekaż null AudioConfig w SpeechSynthesizer konstruktorze.Then pass null for the AudioConfig in the SpeechSynthesizer constructor.

Uwaga

W null przypadku AudioConfig , gdy nie zostanie pominięty w powyższym przykładzie danych wyjściowych prezentera, nie będzie odtwarzany dźwięk domyślnie na bieżącym aktywnym urządzeniu wyjściowym.Passing null for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

Tym razem można zapisać wynik w SpeechSynthesisResult zmiennej.This time, you save the result to a SpeechSynthesisResult variable. AudioDataWłaściwość zawiera byte [] dane wyjściowe.The AudioData property contains a byte [] of the output data. Możesz korzystać z tego byte [] ręcznie lub użyć AudioDataStream klasy do zarządzania strumieniem znajdującym się w pamięci.You can work with this byte [] manually, or you can use the AudioDataStream class to manage the in-memory stream. W tym przykładzie użyto AudioDataStream.FromResult() funkcji statycznej w celu uzyskania strumienia z wyniku.In this example you use the AudioDataStream.FromResult() static function to get a stream from the result.

static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config, null);
    
    var result = await synthesizer.SpeakTextAsync("Getting the response as an in-memory stream.");
    using var stream = AudioDataStream.FromResult(result);
}

W tym miejscu można zaimplementować dowolne zachowanie niestandardowe przy użyciu stream obiektu wyniku.From here you can implement any custom behavior using the resulting stream object.

Dostosuj format audioCustomize audio format

W poniższej sekcji pokazano, jak dostosować atrybuty wyjściowe audio, w tym:The following section shows how to customize audio output attributes including:

  • Typ pliku audioAudio file type
  • Szybkość próbkowaniaSample-rate
  • Bit — GłębokośćBit-depth

Aby zmienić format dźwięku, należy użyć SetSpeechSynthesisOutputFormat() funkcji dla SpeechConfig obiektu.To change the audio format, you use the SetSpeechSynthesisOutputFormat() function on the SpeechConfig object. Ta funkcja oczekuje enum typu SpeechSynthesisOutputFormat , którego można użyć do wybrania formatu danych wyjściowych.This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. Listę dostępnych formatów audio można znaleźć w dokumentacji referencyjnej.See the reference docs for a list of audio formats that are available.

Istnieją różne opcje dla różnych typów plików, w zależności od wymagań.There are various options for different file types depending on your requirements. Należy pamiętać, że zgodnie z definicją, formaty nieprzetworzone, takie jak Raw24Khz16BitMonoPcm nie obejmują nagłówków audio.Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. Używaj formatów nieprzetworzonych tylko wtedy, gdy wiesz, że wdrożenie podrzędne może zdekodować surową Bitstream lub jeśli planujesz ręczne tworzenie nagłówków na podstawie głębi bitowej, szybkości próbkowania, liczby kanałów itd.Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

Uwaga

Głosy en-us-AriaRUS i en-us-GuyRUS są tworzone na podstawie przykładów zakodowanych w Riff24Khz16BitMonoPcm współczynniku próbkowania.Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

W tym przykładzie należy określić format RIFF o wysokiej wierności, Riff24Khz16BitMonoPcm ustawiając SpeechSynthesisOutputFormat dla SpeechConfig obiektu.In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. Podobnie jak w przypadku przykładu w poprzedniej sekcji, należy użyć AudioDataStream , aby uzyskać strumień w pamięci wyniku, a następnie zapisać go do pliku.Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

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

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

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

Ponowne uruchomienie programu spowoduje zapisanie .wav pliku w określonej ścieżce.Running your program again will write a .wav file to the specified path.

Użyj SSML, aby dostosować charakterystykę mowyUse SSML to customize speech characteristics

Język znaczników syntezy mowy (SSML) umożliwia precyzyjne dostosowanie wielkości liter, wymowy, liczby głosu i większej liczby danych wyjściowych zamiany tekstu na mowę przez przesłanie żądań ze schematu XML.Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. W tej sekcji przedstawiono kilka praktycznych przykładów użycia, ale w celu uzyskania bardziej szczegółowego przewodnika zapoznaj się z artykułem How to SSML.This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

Aby rozpocząć korzystanie z SSML do dostosowywania, należy wprowadzić prostą zmianę, która przełącza głos.To start using SSML for customization, you make a simple change that switches the voice. Najpierw utwórz nowy plik XML dla konfiguracji SSML w katalogu głównym projektu, w tym przykładzie ssml.xml .First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. Element główny jest zawsze <speak> , a Zawijanie tekstu w <voice> elemencie pozwala na zmianę głosu przy użyciu name parametru.The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. Ten przykład zmienia głos na styk brytyjski (Zjednoczone Królestwo).This example changes the voice to a male English (UK) voice. Należy zauważyć, że ten głos jest standardowym głosem, który ma inne ceny i dostępność niż neuronowych głosów.Note that this voice is a standard voice, which has different pricing and availability than neural voices. Zapoznaj się z pełną listą obsługiwanych głosów standardowych .See the full list of supported standard voices.

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

Następnie musisz zmienić żądanie syntezy mowy, aby odwołać się do pliku XML.Next, you need to change the speech synthesis request to reference your XML file. Żądanie jest w większości takie samo, ale zamiast przy użyciu SpeakTextAsync() funkcji, używasz SpeakSsmlAsync() .The request is mostly the same, but instead of using the SpeakTextAsync() function, you use SpeakSsmlAsync(). Ta funkcja oczekuje ciągu XML, dlatego należy najpierw załadować konfigurację SSML jako ciąg za pomocą polecenia File.ReadAllText() .This function expects an XML string, so you first load your SSML config as a string using File.ReadAllText(). W tym miejscu obiekt wynik jest dokładnie taki sam jak w poprzednich przykładach.From here, the result object is exactly the same as previous examples.

Uwaga

Jeśli używasz programu Visual Studio, konfiguracja kompilacji prawdopodobnie nie odnajdzie pliku XML domyślnie.If you're using Visual Studio, your build config likely will not find your XML file by default. Aby rozwiązać ten problem, kliknij prawym przyciskiem myszy plik XML i wybierz polecenie Właściwości.To fix this, right click the XML file and select Properties. Zmień akcję kompilacji na zawartość i zmień opcję Kopiuj do katalogu wyjściowego na zawsze Kopiuj.Change Build Action to Content, and change Copy to Output Directory to Copy always.

public static async Task SynthesizeAudioAsync() 
{
    var config = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    using var synthesizer = new SpeechSynthesizer(config, null);
    
    var ssml = File.ReadAllText("./ssml.xml");
    var result = await synthesizer.SpeakSsmlAsync(ssml);

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

Dane wyjściowe działają, ale wprowadzono kilka prostych dodatkowych zmian, które ułatwiają bardziej naturalny dźwięk.The output works, but there a few simple additional changes you can make to help it sound more natural. Ogólna szybkość mówienia jest nieco zbyt szybka, dlatego dodamy <prosody> znacznik i obniży szybkość do 90% częstotliwości domyślnej.The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. Ponadto wstrzymanie po przecinku w zdaniu jest nieco zbyt krótkie i nienaturalne.Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. Aby rozwiązać ten problem, Dodaj <break> znacznik, aby opóźnić mowę i ustawić parametry czasu na 200ms.To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. Uruchom ponowną syntezę, aby zobaczyć, jak te dostosowania wpłynęły na dane wyjściowe.Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

Głosy neuronowychNeural voices

Głosy neuronowych są algorytmami syntezy mowy obsługiwanymi przez głębokie sieci neuronowych.Neural voices are speech synthesis algorithms powered by deep neural networks. W przypadku korzystania z głosu neuronowych, synteza mowy jest niemal nieczytelna w odróżnieniu od nagrań ludzkich.When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. Podobnie jak naturalna prosodya i wyraźny zbiór wyrazów, głosy neuronowych znacząco zmniejszają zmęczenie nasłuchiwania, gdy użytkownicy współpracują z systemami AI.With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

Aby przełączyć się na głos neuronowych, Zmień na name jedną z opcji głosu neuronowych.To switch to a neural voice, change the name to one of the neural voice options. Następnie Dodaj przestrzeń nazw XML dla mstts i zawiń tekst w <mstts:express-as> tagu.Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. Użyj style parametru, aby dostosować styl mówiący.Use the style param to customize the speaking style. Ten przykład używa cheerful , ale spróbuje ustawić customerservice lub, chat Aby zobaczyć różnicę w stylu mówiącym.This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

Ważne

Głosy neuronowych są obsługiwane tylko w przypadku zasobów mowy utworzonych w regionach Wschodnie stany usa, Południowe Azja Wschodnia i Europa Zachodnia .Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

W tym przewodniku szybki start przedstawiono typowe wzorce projektowania służące do wykonywania syntezy zamiany tekstu na mowę przy użyciu zestawu Speech SDK.In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. Najpierw należy wykonać podstawowe czynności konfiguracyjne i synteza, a następnie przejść do bardziej zaawansowanych przykładów tworzenia aplikacji niestandardowych, takich jak:You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • Uzyskiwanie odpowiedzi jako strumieni w pamięciGetting responses as in-memory streams
  • Dostosowywanie szybkości próbkowania danych wyjściowych i szybkości transmisji bitówCustomizing output sample rate and bit rate
  • Przesyłanie żądań syntezy przy użyciu SSML (język oznaczeń syntezy mowy)Submitting synthesis requests using SSML (speech synthesis markup language)
  • Korzystanie z głosów neuronowychUsing neural voices

Przejdź do przykładów w witrynie GitHubSkip to samples on GitHub

Jeśli chcesz pominąć prosty kod przykładowy, zobacz przykłady przewodnika Szybki Start dla języka C++ w witrynie GitHub.If you want to skip straight to sample code, see the C++ quickstart samples on GitHub.

Wymagania wstępnePrerequisites

W tym artykule przyjęto założenie, że masz konto platformy Azure i subskrypcję usługi mowy.This article assumes that you have an Azure account and Speech service subscription. Jeśli nie masz konta i subskrypcji, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and subscription, try the Speech service for free.

Instalowanie zestawu SDK usługi MowaInstall the Speech SDK

Przed wykonaniem jakichkolwiek czynności należy zainstalować zestaw Speech SDK.Before you can do anything, you'll need to install the Speech SDK. W zależności od platformy należy wykonać następujące instrukcje:Depending on your platform, use the following instructions:

Importowanie zależnościImport dependencies

Aby uruchomić przykłady z tego artykułu, należy uwzględnić następujące using instrukcje importu w górnej części skryptu.To run the examples in this article, include the following import and using statements at the top of your script.

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

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

Tworzenie konfiguracji mowyCreate a speech configuration

Aby wywołać usługę mowy przy użyciu zestawu Speech SDK, należy utworzyć SpeechConfig .To call the Speech service using the Speech SDK, you need to create a SpeechConfig. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, Host lub Token autoryzacji.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Uwaga

Bez względu na to, czy wykonujesz rozpoznawanie mowy, synteza mowy, tłumaczenie czy rozpoznawanie intencji, zawsze utworzysz konfigurację.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Istnieje kilka sposobów na zainicjowanie SpeechConfig :There are a few ways that you can initialize a SpeechConfig:

  • Z subskrypcją: Przekaż klucz i skojarzony region.With a subscription: pass in a key and the associated region.
  • Z punktem końcowym: Pass w punkcie końcowym usługi mowy.With an endpoint: pass in a Speech service endpoint. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z hostem: Przekaż adres hosta.With a host: pass in a host address. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z tokenem autoryzacji: Przekaż Token autoryzacji i skojarzony region.With an authorization token: pass in an authorization token and the associated region.

W tym przykładzie utworzysz SpeechConfig przy użyciu klucza subskrypcji i regionu.In this example, you create a SpeechConfig using a subscription key and region. Pobierz te poświadczenia, wykonując czynności opisane w sekcji Wypróbuj bezpłatnie usługę Speech.Get these credentials by following steps in Try the Speech service for free. Utworzysz również podstawowy kod standardowy do użycia w pozostałej części tego artykułu, który można modyfikować w celu dostosowania.You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

int wmain()
{
    try
    {
        synthesizeSpeech();
    }
    catch (exception e)
    {
        cout << e.what();
    }
    return 0;
}
    
void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
}

Wyrównać mowę do plikuSynthesize speech to a file

Następnie utworzysz SpeechSynthesizer obiekt, który wykonuje konwersje zamiany tekstu na mowę i wyjście na głośniki, pliki lub inne strumienie wyjściowe.Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizerAkceptuje jako params SpeechConfig obiekt utworzony w poprzednim kroku oraz AudioConfig obiekt, który określa sposób obsługi wyników.The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

Aby rozpocząć, Utwórz element, AudioConfig Aby automatycznie zapisywać dane wyjściowe do .wav pliku przy użyciu FromWavFileOutput() funkcji.To start, create an AudioConfig to automatically write the output to a .wav file, using the FromWavFileOutput() function.

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

Następnie Utwórz wystąpienie a SpeechSynthesizer , przekazanie config obiektu i audioConfig obiektu jako parametry.Next, instantiate a SpeechSynthesizer, passing your config object and the audioConfig object as params. Następnie wykonanie syntezy mowy i zapis w pliku jest tak proste jak uruchamianie SpeakTextAsync() z ciągiem tekstu.Then, executing speech synthesis and writing to a file is as simple as running SpeakTextAsync() with a string of text.

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

Uruchom program, a plik z syntezą .wav jest zapisywana w określonej lokalizacji.Run the program, and a synthesized .wav file is written to the location you specified. Jest to dobry przykład typowego użycia, ale następnym zapoznaj się z tematem dostosowywania danych wyjściowych i obsługi odpowiedzi wyjściowej jako strumienia znajdującego się w pamięci na potrzeby pracy z niestandardowymi scenariuszami.This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

Synteza danych wyjściowych prezenteraSynthesize to speaker output

W niektórych przypadkach można chcieć bezpośrednio wyprowadzać dane z głosu do osoby mówiącej.In some cases, you may want to directly output synthesized speech directly to a speaker. W tym celu wystarczy pominąć AudioConfig parametr podczas tworzenia SpeechSynthesizer w powyższym przykładzie.To do this, simply omit the AudioConfig param when creating the SpeechSynthesizer in the example above. To wyjście do bieżącego aktywnego urządzenia wyjściowego.This outputs to the current active output device.

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

Pobierz wynik jako strumień w pamięciGet result as an in-memory stream

W przypadku wielu scenariuszy tworzenia aplikacji mowy potrzebne są wyniki danych audio jako strumień w pamięci zamiast bezpośredniego zapisywania do pliku.For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. Pozwoli to na tworzenie zachowań niestandardowych, w tym:This will allow you to build custom behavior including:

  • Abstrakcyjna w efekcie tablica bajtów jako strumień umożliwiający wyszukiwanie niestandardowych usług podrzędnych.Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • Zintegruj wynik z innymi interfejsami API lub usługami.Integrate the result with other API's or services.
  • Modyfikowanie danych audio, zapisywanie niestandardowych .wav nagłówków itp.Modify the audio data, write custom .wav headers, etc.

Jest to proste, aby wprowadzić tę zmianę z poprzedniego przykładu.It's simple to make this change from the previous example. Najpierw usuń AudioConfig , ponieważ będziesz zarządzać zachowaniem danych wyjściowych ręcznie z tego punktu, aby zwiększyć kontrolę.First, remove the AudioConfig, as you will manage the output behavior manually from this point onward for increased control. Następnie Przekaż NULL AudioConfig w SpeechSynthesizer konstruktorze.Then pass NULL for the AudioConfig in the SpeechSynthesizer constructor.

Uwaga

W NULL przypadku AudioConfig , gdy nie zostanie pominięty w powyższym przykładzie danych wyjściowych prezentera, nie będzie odtwarzany dźwięk domyślnie na bieżącym aktywnym urządzeniu wyjściowym.Passing NULL for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

Tym razem można zapisać wynik w SpeechSynthesisResult zmiennej.This time, you save the result to a SpeechSynthesisResult variable. GetAudioDataMetoda pobierająca zwraca byte [] dane wyjściowe.The GetAudioData getter returns a byte [] of the output data. Możesz korzystać z tego byte [] ręcznie lub użyć AudioDataStream klasy do zarządzania strumieniem znajdującym się w pamięci.You can work with this byte [] manually, or you can use the AudioDataStream class to manage the in-memory stream. W tym przykładzie użyto AudioDataStream.FromResult() funkcji statycznej w celu uzyskania strumienia z wyniku.In this example you use the AudioDataStream.FromResult() static function to get a stream from the result.

void synthesizeSpeech() 
{
    auto config = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
    
    auto result = synthesizer->SpeakTextAsync("Getting the response as an in-memory stream.").get();
    auto stream = AudioDataStream::FromResult(result);
}

W tym miejscu można zaimplementować dowolne zachowanie niestandardowe przy użyciu stream obiektu wyniku.From here you can implement any custom behavior using the resulting stream object.

Dostosuj format audioCustomize audio format

W poniższej sekcji pokazano, jak dostosować atrybuty wyjściowe audio, w tym:The following section shows how to customize audio output attributes including:

  • Typ pliku audioAudio file type
  • Szybkość próbkowaniaSample-rate
  • Bit — GłębokośćBit-depth

Aby zmienić format dźwięku, należy użyć SetSpeechSynthesisOutputFormat() funkcji dla SpeechConfig obiektu.To change the audio format, you use the SetSpeechSynthesisOutputFormat() function on the SpeechConfig object. Ta funkcja oczekuje enum typu SpeechSynthesisOutputFormat , którego można użyć do wybrania formatu danych wyjściowych.This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. Listę dostępnych formatów audio można znaleźć w dokumentacji referencyjnej.See the reference docs for a list of audio formats that are available.

Istnieją różne opcje dla różnych typów plików, w zależności od wymagań.There are various options for different file types depending on your requirements. Należy pamiętać, że zgodnie z definicją, formaty nieprzetworzone, takie jak Raw24Khz16BitMonoPcm nie obejmują nagłówków audio.Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. Używaj formatów nieprzetworzonych tylko wtedy, gdy wiesz, że wdrożenie podrzędne może zdekodować surową Bitstream lub jeśli planujesz ręczne tworzenie nagłówków na podstawie głębi bitowej, szybkości próbkowania, liczby kanałów itd.Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

Uwaga

Głosy en-us-AriaRUS i en-us-GuyRUS są tworzone na podstawie przykładów zakodowanych w Riff24Khz16BitMonoPcm współczynniku próbkowania.Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

W tym przykładzie należy określić format RIFF o wysokiej wierności, Riff24Khz16BitMonoPcm ustawiając SpeechSynthesisOutputFormat dla SpeechConfig obiektu.In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. Podobnie jak w przypadku przykładu w poprzedniej sekcji, należy użyć AudioDataStream , aby uzyskać strumień w pamięci wyniku, a następnie zapisać go do pliku.Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

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

    auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
    auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
    
    auto stream = AudioDataStream::FromResult(result);
    stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}

Ponowne uruchomienie programu spowoduje zapisanie .wav pliku w określonej ścieżce.Running your program again will write a .wav file to the specified path.

Użyj SSML, aby dostosować charakterystykę mowyUse SSML to customize speech characteristics

Język znaczników syntezy mowy (SSML) umożliwia precyzyjne dostosowanie wielkości liter, wymowy, liczby głosu i większej liczby danych wyjściowych zamiany tekstu na mowę przez przesłanie żądań ze schematu XML.Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. W tej sekcji przedstawiono kilka praktycznych przykładów użycia, ale w celu uzyskania bardziej szczegółowego przewodnika zapoznaj się z artykułem How to SSML.This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

Aby rozpocząć korzystanie z SSML do dostosowywania, należy wprowadzić prostą zmianę, która przełącza głos.To start using SSML for customization, you make a simple change that switches the voice. Najpierw utwórz nowy plik XML dla konfiguracji SSML w katalogu głównym projektu, w tym przykładzie ssml.xml .First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. Element główny jest zawsze <speak> , a Zawijanie tekstu w <voice> elemencie pozwala na zmianę głosu przy użyciu name parametru.The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. Ten przykład zmienia głos na styk brytyjski (Zjednoczone Królestwo).This example changes the voice to a male English (UK) voice. Należy zauważyć, że ten głos jest standardowym głosem, który ma inne ceny i dostępność niż neuronowych głosów.Note that this voice is a standard voice, which has different pricing and availability than neural voices. Zapoznaj się z pełną listą obsługiwanych głosów standardowych .See the full list of supported standard voices.

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

Następnie musisz zmienić żądanie syntezy mowy, aby odwołać się do pliku XML.Next, you need to change the speech synthesis request to reference your XML file. Żądanie jest w większości takie samo, ale zamiast przy użyciu SpeakTextAsync() funkcji, używasz SpeakSsmlAsync() .The request is mostly the same, but instead of using the SpeakTextAsync() function, you use SpeakSsmlAsync(). Ta funkcja oczekuje ciągu XML, dlatego należy najpierw załadować konfigurację SSML jako ciąg.This function expects an XML string, so you first load your SSML config as a string. W tym miejscu obiekt wynik jest dokładnie taki sam jak w poprzednich przykładach.From here, the result object is exactly the same as previous examples.

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

Dane wyjściowe działają, ale wprowadzono kilka prostych dodatkowych zmian, które ułatwiają bardziej naturalny dźwięk.The output works, but there a few simple additional changes you can make to help it sound more natural. Ogólna szybkość mówienia jest nieco zbyt szybka, dlatego dodamy <prosody> znacznik i obniży szybkość do 90% częstotliwości domyślnej.The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. Ponadto wstrzymanie po przecinku w zdaniu jest nieco zbyt krótkie i nienaturalne.Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. Aby rozwiązać ten problem, Dodaj <break> znacznik, aby opóźnić mowę i ustawić parametry czasu na 200ms.To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. Uruchom ponowną syntezę, aby zobaczyć, jak te dostosowania wpłynęły na dane wyjściowe.Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

Głosy neuronowychNeural voices

Głosy neuronowych są algorytmami syntezy mowy obsługiwanymi przez głębokie sieci neuronowych.Neural voices are speech synthesis algorithms powered by deep neural networks. W przypadku korzystania z głosu neuronowych, synteza mowy jest niemal nieczytelna w odróżnieniu od nagrań ludzkich.When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. Podobnie jak naturalna prosodya i wyraźny zbiór wyrazów, głosy neuronowych znacząco zmniejszają zmęczenie nasłuchiwania, gdy użytkownicy współpracują z systemami AI.With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

Aby przełączyć się na głos neuronowych, Zmień na name jedną z opcji głosu neuronowych.To switch to a neural voice, change the name to one of the neural voice options. Następnie Dodaj przestrzeń nazw XML dla mstts i zawiń tekst w <mstts:express-as> tagu.Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. Użyj style parametru, aby dostosować styl mówiący.Use the style param to customize the speaking style. Ten przykład używa cheerful , ale spróbuje ustawić customerservice lub, chat Aby zobaczyć różnicę w stylu mówiącym.This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

Ważne

Głosy neuronowych są obsługiwane tylko w przypadku zasobów mowy utworzonych w regionach Wschodnie stany usa, Południowe Azja Wschodnia i Europa Zachodnia .Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

W tym przewodniku szybki start przedstawiono typowe wzorce projektowania służące do wykonywania syntezy zamiany tekstu na mowę przy użyciu zestawu Speech SDK.In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. Najpierw należy wykonać podstawowe czynności konfiguracyjne i synteza, a następnie przejść do bardziej zaawansowanych przykładów tworzenia aplikacji niestandardowych, takich jak:You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • Uzyskiwanie odpowiedzi jako strumieni w pamięciGetting responses as in-memory streams
  • Dostosowywanie szybkości próbkowania danych wyjściowych i szybkości transmisji bitówCustomizing output sample rate and bit rate
  • Przesyłanie żądań syntezy przy użyciu SSML (język oznaczeń syntezy mowy)Submitting synthesis requests using SSML (speech synthesis markup language)
  • Korzystanie z głosów neuronowychUsing neural voices

Przejdź do przykładów w witrynie GitHubSkip to samples on GitHub

Jeśli chcesz pominąć prosty kod przykładowy, zobacz przykłady przewodnika Szybki Start dla języka Java w witrynie GitHub.If you want to skip straight to sample code, see the Java quickstart samples on GitHub.

Wymagania wstępnePrerequisites

W tym artykule przyjęto założenie, że masz konto platformy Azure i subskrypcję usługi mowy.This article assumes that you have an Azure account and Speech service subscription. Jeśli nie masz konta i subskrypcji, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and subscription, try the Speech service for free.

Instalowanie zestawu SDK usługi MowaInstall the Speech SDK

Przed wykonaniem jakichkolwiek czynności należy zainstalować zestaw Speech SDK.Before you can do anything, you'll need to install the Speech SDK. W zależności od platformy należy wykonać następujące instrukcje:Depending on your platform, use the following instructions:

Importowanie zależnościImport dependencies

Aby uruchomić przykłady z tego artykułu, należy uwzględnić następujące instrukcje importu u góry skryptu.To run the examples in this article, include the following import statements at the top of your 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;

Tworzenie konfiguracji mowyCreate a speech configuration

Aby wywołać usługę mowy przy użyciu zestawu Speech SDK, należy utworzyć SpeechConfig .To call the Speech service using the Speech SDK, you need to create a SpeechConfig. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, Host lub Token autoryzacji.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Uwaga

Bez względu na to, czy wykonujesz rozpoznawanie mowy, synteza mowy, tłumaczenie czy rozpoznawanie intencji, zawsze utworzysz konfigurację.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Istnieje kilka sposobów na zainicjowanie SpeechConfig :There are a few ways that you can initialize a SpeechConfig:

  • Z subskrypcją: Przekaż klucz i skojarzony region.With a subscription: pass in a key and the associated region.
  • Z punktem końcowym: Pass w punkcie końcowym usługi mowy.With an endpoint: pass in a Speech service endpoint. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z hostem: Przekaż adres hosta.With a host: pass in a host address. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z tokenem autoryzacji: Przekaż Token autoryzacji i skojarzony region.With an authorization token: pass in an authorization token and the associated region.

W tym przykładzie utworzysz SpeechConfig przy użyciu klucza subskrypcji i regionu.In this example, you create a SpeechConfig using a subscription key and region. Pobierz te poświadczenia, wykonując czynności opisane w sekcji Wypróbuj bezpłatnie usługę Speech.Get these credentials by following steps in Try the Speech service for free. Utworzysz również podstawowy kod standardowy do użycia w pozostałej części tego artykułu, który można modyfikować w celu dostosowania.You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

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

Wyrównać mowę do plikuSynthesize speech to a file

Następnie utworzysz SpeechSynthesizer obiekt, który wykonuje konwersje zamiany tekstu na mowę i wyjście na głośniki, pliki lub inne strumienie wyjściowe.Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizerAkceptuje jako params SpeechConfig obiekt utworzony w poprzednim kroku oraz AudioConfig obiekt, który określa sposób obsługi wyników.The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

Aby rozpocząć, Utwórz element, AudioConfig Aby automatycznie zapisywać dane wyjściowe do .wav pliku przy użyciu fromWavFileOutput() funkcji statycznej.To start, create an AudioConfig to automatically write the output to a .wav file using the fromWavFileOutput() static function.

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

Następnie Utwórz wystąpienie SpeechSynthesizer przekazanie speechConfig obiektu i audioConfig obiektu jako parametry.Next, instantiate a SpeechSynthesizer passing your speechConfig object and the audioConfig object as params. Następnie wykonanie syntezy mowy i zapis w pliku jest tak proste jak uruchamianie SpeakText() z ciągiem tekstu.Then, executing speech synthesis and writing to a file is as simple as running SpeakText() with a string of text.

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

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

Uruchom program, a plik z syntezą .wav jest zapisywana w określonej lokalizacji.Run the program, and a synthesized .wav file is written to the location you specified. Jest to dobry przykład typowego użycia, ale następnym zapoznaj się z tematem dostosowywania danych wyjściowych i obsługi odpowiedzi wyjściowej jako strumienia znajdującego się w pamięci na potrzeby pracy z niestandardowymi scenariuszami.This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

Synteza danych wyjściowych prezenteraSynthesize to speaker output

W niektórych przypadkach można chcieć bezpośrednio wyprowadzać dane z głosu do osoby mówiącej.In some cases, you may want to directly output synthesized speech directly to a speaker. W tym celu Utwórz wystąpienie AudioConfig przy użyciu fromDefaultSpeakerOutput() funkcji statycznej.To do this, instantiate the AudioConfig using the fromDefaultSpeakerOutput() static function. To wyjście do bieżącego aktywnego urządzenia wyjściowego.This outputs to the current active output device.

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

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

Pobierz wynik jako strumień w pamięciGet result as an in-memory stream

W przypadku wielu scenariuszy tworzenia aplikacji mowy potrzebne są wyniki danych audio jako strumień w pamięci zamiast bezpośredniego zapisywania do pliku.For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. Pozwoli to na tworzenie zachowań niestandardowych, w tym:This will allow you to build custom behavior including:

  • Abstrakcyjna w efekcie tablica bajtów jako strumień umożliwiający wyszukiwanie niestandardowych usług podrzędnych.Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • Zintegruj wynik z innymi interfejsami API lub usługami.Integrate the result with other API's or services.
  • Modyfikowanie danych audio, zapisywanie niestandardowych .wav nagłówków itp.Modify the audio data, write custom .wav headers, etc.

Jest to proste, aby wprowadzić tę zmianę z poprzedniego przykładu.It's simple to make this change from the previous example. Najpierw usuń AudioConfig blok, ponieważ będzie można ręcznie zarządzać zachowaniem danych wyjściowych od tego momentu w celu zwiększenia kontroli.First, remove the AudioConfig block, as you will manage the output behavior manually from this point onward for increased control. Następnie Przekaż null AudioConfig w SpeechSynthesizer konstruktorze.Then pass null for the AudioConfig in the SpeechSynthesizer constructor.

Uwaga

W null przypadku AudioConfig , gdy nie zostanie pominięty w powyższym przykładzie danych wyjściowych prezentera, nie będzie odtwarzany dźwięk domyślnie na bieżącym aktywnym urządzeniu wyjściowym.Passing null for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

Tym razem można zapisać wynik w SpeechSynthesisResult zmiennej.This time, you save the result to a SpeechSynthesisResult variable. SpeechSynthesisResult.getAudioData()Funkcja zwraca byte [] dane wyjściowe.The SpeechSynthesisResult.getAudioData() function returns a byte [] of the output data. Możesz korzystać z tego byte [] ręcznie lub użyć AudioDataStream klasy do zarządzania strumieniem znajdującym się w pamięci.You can work with this byte [] manually, or you can use the AudioDataStream class to manage the in-memory stream. W tym przykładzie użyto AudioDataStream.fromResult() funkcji statycznej w celu uzyskania strumienia z wyniku.In this example you use the AudioDataStream.fromResult() static function to get a stream from the result.

public static void main(String[] args) {
    SpeechConfig speechConfig = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
    SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
    
    SpeechSynthesisResult result = synthesizer.SpeakText("Getting the response as an in-memory stream.");
    AudioDataStream stream = AudioDataStream.fromResult(result);
    System.out.print(stream.getStatus());
}

W tym miejscu można zaimplementować dowolne zachowanie niestandardowe przy użyciu stream obiektu wyniku.From here you can implement any custom behavior using the resulting stream object.

Dostosuj format audioCustomize audio format

W poniższej sekcji pokazano, jak dostosować atrybuty wyjściowe audio, w tym:The following section shows how to customize audio output attributes including:

  • Typ pliku audioAudio file type
  • Szybkość próbkowaniaSample-rate
  • Bit — GłębokośćBit-depth

Aby zmienić format dźwięku, należy użyć setSpeechSynthesisOutputFormat() funkcji dla SpeechConfig obiektu.To change the audio format, you use the setSpeechSynthesisOutputFormat() function on the SpeechConfig object. Ta funkcja oczekuje enum typu SpeechSynthesisOutputFormat , którego można użyć do wybrania formatu danych wyjściowych.This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. Listę dostępnych formatów audio można znaleźć w dokumentacji referencyjnej.See the reference docs for a list of audio formats that are available.

Istnieją różne opcje dla różnych typów plików, w zależności od wymagań.There are various options for different file types depending on your requirements. Należy pamiętać, że zgodnie z definicją, formaty nieprzetworzone, takie jak Raw24Khz16BitMonoPcm nie obejmują nagłówków audio.Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. Używaj formatów nieprzetworzonych tylko wtedy, gdy wiesz, że wdrożenie podrzędne może zdekodować surową Bitstream lub jeśli planujesz ręczne tworzenie nagłówków na podstawie głębi bitowej, szybkości próbkowania, liczby kanałów itd.Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

Uwaga

Głosy en-us-AriaRUS i en-us-GuyRUS są tworzone na podstawie przykładów zakodowanych w Riff24Khz16BitMonoPcm współczynniku próbkowania.Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

W tym przykładzie należy określić format RIFF o wysokiej wierności, Riff24Khz16BitMonoPcm ustawiając SpeechSynthesisOutputFormat dla SpeechConfig obiektu.In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. Podobnie jak w przypadku przykładu w poprzedniej sekcji, należy użyć AudioDataStream , aby uzyskać strumień w pamięci wyniku, a następnie zapisać go do pliku.Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

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

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

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

Ponowne uruchomienie programu spowoduje zapisanie .wav pliku w określonej ścieżce.Running your program again will write a .wav file to the specified path.

Użyj SSML, aby dostosować charakterystykę mowyUse SSML to customize speech characteristics

Język znaczników syntezy mowy (SSML) umożliwia precyzyjne dostosowanie wielkości liter, wymowy, liczby głosu i większej liczby danych wyjściowych zamiany tekstu na mowę przez przesłanie żądań ze schematu XML.Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. W tej sekcji przedstawiono kilka praktycznych przykładów użycia, ale w celu uzyskania bardziej szczegółowego przewodnika zapoznaj się z artykułem How to SSML.This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

Aby rozpocząć korzystanie z SSML do dostosowywania, należy wprowadzić prostą zmianę, która przełącza głos.To start using SSML for customization, you make a simple change that switches the voice. Najpierw utwórz nowy plik XML dla konfiguracji SSML w katalogu głównym projektu, w tym przykładzie ssml.xml .First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. Element główny jest zawsze <speak> , a Zawijanie tekstu w <voice> elemencie pozwala na zmianę głosu przy użyciu name parametru.The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. Ten przykład zmienia głos na styk brytyjski (Zjednoczone Królestwo).This example changes the voice to a male English (UK) voice. Należy zauważyć, że ten głos jest standardowym głosem, który ma inne ceny i dostępność niż neuronowych głosów.Note that this voice is a standard voice, which has different pricing and availability than neural voices. Zapoznaj się z pełną listą obsługiwanych głosów standardowych .See the full list of supported standard voices.

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

Następnie musisz zmienić żądanie syntezy mowy, aby odwołać się do pliku XML.Next, you need to change the speech synthesis request to reference your XML file. Żądanie jest w większości takie samo, ale zamiast przy użyciu SpeakText() funkcji, używasz SpeakSsml() .The request is mostly the same, but instead of using the SpeakText() function, you use SpeakSsml(). Ta funkcja oczekuje ciągu XML, więc najpierw należy utworzyć funkcję do załadowania pliku XML i zwrócić ją jako ciąg.This function expects an XML string, so first you create a function to load an XML file and return it as a string.

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

W tym miejscu obiekt wynik jest dokładnie taki sam jak w poprzednich przykładach.From here, the result object is exactly the same as previous examples.

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

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

Dane wyjściowe działają, ale wprowadzono kilka prostych dodatkowych zmian, które ułatwiają bardziej naturalny dźwięk.The output works, but there a few simple additional changes you can make to help it sound more natural. Ogólna szybkość mówienia jest nieco zbyt szybka, dlatego dodamy <prosody> znacznik i obniży szybkość do 90% częstotliwości domyślnej.The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. Ponadto wstrzymanie po przecinku w zdaniu jest nieco zbyt krótkie i nienaturalne.Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. Aby rozwiązać ten problem, Dodaj <break> znacznik, aby opóźnić mowę i ustawić parametry czasu na 200ms.To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. Uruchom ponowną syntezę, aby zobaczyć, jak te dostosowania wpłynęły na dane wyjściowe.Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

Głosy neuronowychNeural voices

Głosy neuronowych są algorytmami syntezy mowy obsługiwanymi przez głębokie sieci neuronowych.Neural voices are speech synthesis algorithms powered by deep neural networks. W przypadku korzystania z głosu neuronowych, synteza mowy jest niemal nieczytelna w odróżnieniu od nagrań ludzkich.When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. Podobnie jak naturalna prosodya i wyraźny zbiór wyrazów, głosy neuronowych znacząco zmniejszają zmęczenie nasłuchiwania, gdy użytkownicy współpracują z systemami AI.With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

Aby przełączyć się na głos neuronowych, Zmień na name jedną z opcji głosu neuronowych.To switch to a neural voice, change the name to one of the neural voice options. Następnie Dodaj przestrzeń nazw XML dla mstts i zawiń tekst w <mstts:express-as> tagu.Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. Użyj style parametru, aby dostosować styl mówiący.Use the style param to customize the speaking style. Ten przykład używa cheerful , ale spróbuje ustawić customerservice lub, chat Aby zobaczyć różnicę w stylu mówiącym.This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

Ważne

Głosy neuronowych są obsługiwane tylko w przypadku zasobów mowy utworzonych w regionach Wschodnie stany usa, Południowe Azja Wschodnia i Europa Zachodnia .Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

W tym przewodniku szybki start przedstawiono typowe wzorce projektowania służące do wykonywania syntezy zamiany tekstu na mowę przy użyciu zestawu Speech SDK.In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. Najpierw należy wykonać podstawowe czynności konfiguracyjne i synteza, a następnie przejść do bardziej zaawansowanych przykładów tworzenia aplikacji niestandardowych, takich jak:You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • Uzyskiwanie odpowiedzi jako strumieni w pamięciGetting responses as in-memory streams
  • Dostosowywanie szybkości próbkowania danych wyjściowych i szybkości transmisji bitówCustomizing output sample rate and bit rate
  • Przesyłanie żądań syntezy przy użyciu SSML (język oznaczeń syntezy mowy)Submitting synthesis requests using SSML (speech synthesis markup language)
  • Korzystanie z głosów neuronowychUsing neural voices

Przejdź do przykładów w witrynie GitHubSkip to samples on GitHub

Jeśli chcesz pominąć prosty kod przykładowy, zobacz przykłady przewodnika Szybki Start dla języka JavaScript w witrynie GitHub.If you want to skip straight to sample code, see the JavaScript quickstart samples on GitHub.

Wymagania wstępnePrerequisites

W tym artykule przyjęto założenie, że masz konto platformy Azure i zasób usługi mowy.This article assumes that you have an Azure account and Speech service resource. Jeśli nie masz konta i zasobu, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and resource, try the Speech service for free.

Instalowanie zestawu SDK usługi MowaInstall the Speech SDK

Przed wykonaniem jakichkolwiek czynności konieczne będzie zainstalowanie zestawu Speech SDK dla języka JavaScript .Before you can do anything, you'll need to install the Speech SDK for JavaScript . W zależności od platformy należy wykonać następujące instrukcje:Depending on your platform, use the following instructions:

Ponadto, w zależności od środowiska docelowego, użyj jednego z następujących elementów:Additionally, depending on the target environment use one of the following:

Pobierz i Wyodrębnij zestaw Speech SDK dla pliku microsoft.cognitiveservices.speech.sdk.bundle.js JavaScript i umieść go w folderze dostępnym dla pliku HTML.Download and extract the Speech SDK for JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js file, and place it in a folder accessible to your HTML file.

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

Porada

Jeśli masz dostęp do przeglądarki sieci Web i używasz <script> znacznika; sdk prefiks nie jest wymagany.If you're targeting a web browser, and using the <script> tag; the sdk prefix is not needed. sdkPrefiks jest aliasem używanym do nazwy require modułu.The sdk prefix is an alias used to name the require module.

Tworzenie konfiguracji mowyCreate a speech configuration

Aby wywołać usługę mowy przy użyciu zestawu Speech SDK, należy utworzyć SpeechConfig .To call the Speech service using the Speech SDK, you need to create a SpeechConfig. Ta klasa zawiera informacje o Twoim zasobie, takie jak klucz i skojarzony region, punkt końcowy, Host lub Token autoryzacji.This class includes information about your resource, like your key and associated region, endpoint, host, or authorization token.

Uwaga

Bez względu na to, czy wykonujesz rozpoznawanie mowy, synteza mowy, tłumaczenie czy rozpoznawanie intencji, zawsze utworzysz konfigurację.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Istnieje kilka sposobów na zainicjowanie SpeechConfig :There are a few ways that you can initialize a SpeechConfig:

  • Z zasobem: Przekaż klucz i skojarzony region.With a resource: pass in a key and the associated region.
  • Z punktem końcowym: Pass w punkcie końcowym usługi mowy.With an endpoint: pass in a Speech service endpoint. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z hostem: Przekaż adres hosta.With a host: pass in a host address. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z tokenem autoryzacji: Przekaż Token autoryzacji i skojarzony region.With an authorization token: pass in an authorization token and the associated region.

W tym przykładzie utworzysz SpeechConfig przy użyciu klucza zasobu i regionu.In this example, you create a SpeechConfig using a resource key and region. Pobierz te poświadczenia, wykonując czynności opisane w sekcji Wypróbuj bezpłatnie usługę Speech.Get these credentials by following steps in Try the Speech service for free. Utworzysz również podstawowy kod standardowy do użycia w pozostałej części tego artykułu, który można modyfikować w celu dostosowania.You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

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

synthesizeSpeech();

Wyrównać mowę do plikuSynthesize speech to a file

Następnie utworzysz SpeechSynthesizer obiekt, który wykonuje konwersje zamiany tekstu na mowę i wyjście na głośniki, pliki lub inne strumienie wyjściowe.Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizerAkceptuje jako params SpeechConfig obiekt utworzony w poprzednim kroku oraz AudioConfig obiekt, który określa sposób obsługi wyników.The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioConfig object that specifies how output results should be handled.

Aby rozpocząć, Utwórz element, AudioConfig Aby automatycznie zapisywać dane wyjściowe do .wav pliku przy użyciu fromAudioFileOutput() funkcji statycznej.To start, create an AudioConfig to automatically write the output to a .wav file using the fromAudioFileOutput() static function.

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

Następnie Utwórz wystąpienie SpeechSynthesizer przekazanie speechConfig obiektu i audioConfig obiektu jako parametry.Next, instantiate a SpeechSynthesizer passing your speechConfig object and the audioConfig object as params. Następnie wykonanie syntezy mowy i zapis w pliku jest tak proste jak uruchamianie speakTextAsync() z ciągiem tekstu.Then, executing speech synthesis and writing to a file is as simple as running speakTextAsync() with a string of text. Wywołanie zwrotne wynik jest doskonałym miejscem do wywołania synthesizer.close() , w rzeczywistości — to wywołanie jest konieczne, aby synteza działała prawidłowo.The result callback is a great place to call synthesizer.close(), in fact - this call is needed in order for synthesis to function correctly.

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

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

Uruchom program, a plik z syntezą .wav jest zapisywana w określonej lokalizacji.Run the program, and a synthesized .wav file is written to the location you specified. Jest to dobry przykład typowego użycia, ale następnym zapoznaj się z tematem dostosowywania danych wyjściowych i obsługi odpowiedzi wyjściowej jako strumienia znajdującego się w pamięci na potrzeby pracy z niestandardowymi scenariuszami.This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

Synteza danych wyjściowych prezenteraSynthesize to speaker output

W niektórych przypadkach można chcieć bezpośrednio wyprowadzać dane z głosu do osoby mówiącej.In some cases, you may want to directly output synthesized speech directly to a speaker. W tym celu Utwórz wystąpienie AudioConfig przy użyciu fromDefaultSpeakerOutput() funkcji statycznej.To do this, instantiate the AudioConfig using the fromDefaultSpeakerOutput() static function. To wyjście do bieżącego aktywnego urządzenia wyjściowego.This outputs to the current active output device.

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

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

Pobierz wynik jako strumień w pamięciGet result as an in-memory stream

W przypadku wielu scenariuszy tworzenia aplikacji mowy potrzebne są wyniki danych audio jako strumień w pamięci zamiast bezpośredniego zapisywania do pliku.For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. Pozwoli to na tworzenie zachowań niestandardowych, w tym:This will allow you to build custom behavior including:

  • Abstrakcyjna w efekcie tablica bajtów jako strumień umożliwiający wyszukiwanie niestandardowych usług podrzędnych.Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • Zintegruj wynik z innymi interfejsami API lub usługami.Integrate the result with other API's or services.
  • Modyfikowanie danych audio, zapisywanie niestandardowych .wav nagłówków itp.Modify the audio data, write custom .wav headers, etc.

Jest to proste, aby wprowadzić tę zmianę z poprzedniego przykładu.It's simple to make this change from the previous example. Najpierw usuń AudioConfig blok, ponieważ będzie można ręcznie zarządzać zachowaniem danych wyjściowych od tego momentu w celu zwiększenia kontroli.First, remove the AudioConfig block, as you will manage the output behavior manually from this point onward for increased control. Następnie Przekaż undefined AudioConfig w SpeechSynthesizer konstruktorze.Then pass undefined for the AudioConfig in the SpeechSynthesizer constructor.

Uwaga

W undefined przypadku AudioConfig , gdy nie zostanie pominięty w powyższym przykładzie danych wyjściowych prezentera, nie będzie odtwarzany dźwięk domyślnie na bieżącym aktywnym urządzeniu wyjściowym.Passing undefined for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

Tym razem można zapisać wynik w SpeechSynthesisResult zmiennej.This time, you save the result to a SpeechSynthesisResult variable. SpeechSynthesisResult.audioDataWłaściwość zwraca ArrayBuffer dane wyjściowe, domyślny typ strumienia przeglądarki.The SpeechSynthesisResult.audioData property returns an ArrayBuffer of the output data, the default browser stream type. W przypadku kodu serwerowego Konwertuj arrayBuffer na strumień bufora.For server-code, convert the arrayBuffer to a buffer stream.

Poniższy kod działa dla kodu po stronie klienta.The following code works for client-side code.

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

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

W tym miejscu można zaimplementować dowolne zachowanie niestandardowe przy użyciu ArrayBuffer obiektu wyniku.From here you can implement any custom behavior using the resulting ArrayBuffer object. ArrayBuffer jest wspólnym typem, który ma być odbierany w przeglądarce i odtwarzany w tym formacie.The ArrayBuffer is a common type to receive in a browser and play from this format.

W przypadku dowolnego kodu opartego na serwerze, jeśli potrzebujesz pracy z danymi jako strumień zamiast ArrayBuffer, musisz przekonwertować obiekt na strumień.For any server-based code, if you need to work with the data as a stream, instead of an ArrayBuffer, you need to convert the object into a stream.

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

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

            synthesizer.close();

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

Dostosuj format audioCustomize audio format

W poniższej sekcji pokazano, jak dostosować atrybuty wyjściowe audio, w tym:The following section shows how to customize audio output attributes including:

  • Typ pliku audioAudio file type
  • Szybkość próbkowaniaSample-rate
  • Bit — GłębokośćBit-depth

Aby zmienić format dźwięku, należy użyć speechSynthesisOutputFormat właściwości SpeechConfig obiektu.To change the audio format, you use the speechSynthesisOutputFormat property on the SpeechConfig object. Ta właściwość oczekuje enum typu SpeechSynthesisOutputFormat , którego można użyć do wybrania formatu danych wyjściowych.This property expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. Listę dostępnych formatów audio można znaleźć w dokumentacji referencyjnej.See the reference docs for a list of audio formats that are available.

Istnieją różne opcje dla różnych typów plików, w zależności od wymagań.There are various options for different file types depending on your requirements. Należy pamiętać, że zgodnie z definicją, formaty nieprzetworzone, takie jak Raw24Khz16BitMonoPcm nie obejmują nagłówków audio.Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. Używaj formatów nieprzetworzonych tylko wtedy, gdy wiesz, że wdrożenie podrzędne może zdekodować surową Bitstream lub jeśli planujesz ręczne tworzenie nagłówków na podstawie głębi bitowej, szybkości próbkowania, liczby kanałów itd.Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

Uwaga

Głosy en-us-AriaRUS i en-us-GuyRUS są tworzone na podstawie przykładów zakodowanych w Riff24Khz16BitMonoPcm współczynniku próbkowania.Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

W tym przykładzie należy określić format RIFF o wysokiej wierności, Riff24Khz16BitMonoPcm ustawiając speechSynthesisOutputFormat dla SpeechConfig obiektu.In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the speechSynthesisOutputFormat on the SpeechConfig object. Podobnie jak w przypadku przykładu w poprzedniej sekcji, Pobierz ArrayBuffer dane audio i pracuj z nimi.Similar to the example in the previous section, get the audio ArrayBuffer data and interact with it.

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

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

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

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

Ponowne uruchomienie programu spowoduje zapisanie .wav pliku w określonej ścieżce.Running your program again will write a .wav file to the specified path.

Użyj SSML, aby dostosować charakterystykę mowyUse SSML to customize speech characteristics

Język znaczników syntezy mowy (SSML) umożliwia precyzyjne dostosowanie wielkości liter, wymowy, liczby głosu i większej liczby danych wyjściowych zamiany tekstu na mowę przez przesłanie żądań ze schematu XML.Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. W tej sekcji przedstawiono kilka praktycznych przykładów użycia, ale w celu uzyskania bardziej szczegółowego przewodnika zapoznaj się z artykułem How to SSML.This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

Aby rozpocząć korzystanie z SSML do dostosowywania, należy wprowadzić prostą zmianę, która przełącza głos.To start using SSML for customization, you make a simple change that switches the voice. Najpierw utwórz nowy plik XML dla konfiguracji SSML w katalogu głównym projektu, w tym przykładzie ssml.xml .First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. Element główny jest zawsze <speak> , a Zawijanie tekstu w <voice> elemencie pozwala na zmianę głosu przy użyciu name parametru.The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. Ten przykład zmienia głos na styk brytyjski (Zjednoczone Królestwo).This example changes the voice to a male English (UK) voice. Należy zauważyć, że ten głos jest standardowym głosem, który ma inne ceny i dostępność niż neuronowych głosów.Note that this voice is a standard voice, which has different pricing and availability than neural voices. Zapoznaj się z pełną listą obsługiwanych głosów standardowych .See the full list of supported standard voices.

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

Następnie musisz zmienić żądanie syntezy mowy, aby odwołać się do pliku XML.Next, you need to change the speech synthesis request to reference your XML file. Żądanie jest w większości takie samo, ale zamiast przy użyciu speakTextAsync() funkcji, używasz speakSsmlAsync() .The request is mostly the same, but instead of using the speakTextAsync() function, you use speakSsmlAsync(). Ta funkcja oczekuje ciągu XML, więc najpierw należy utworzyć funkcję do załadowania pliku XML i zwrócić ją jako ciąg.This function expects an XML string, so first you create a function to load an XML file and return it as a string.

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

Aby uzyskać więcej informacji na temat readFileSync , zobacz Node.js File System.For more information on readFileSync, see Node.js file system. W tym miejscu obiekt wynik jest dokładnie taki sam jak w poprzednich przykładach.From here, the result object is exactly the same as previous examples.

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

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

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

Dane wyjściowe działają, ale wprowadzono kilka prostych dodatkowych zmian, które ułatwiają bardziej naturalny dźwięk.The output works, but there a few simple additional changes you can make to help it sound more natural. Ogólna szybkość mówienia jest nieco zbyt szybka, dlatego dodamy <prosody> znacznik i obniży szybkość do 90% częstotliwości domyślnej.The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. Ponadto wstrzymanie po przecinku w zdaniu jest nieco zbyt krótkie i nienaturalne.Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. Aby rozwiązać ten problem, Dodaj <break> znacznik, aby opóźnić mowę i ustawić parametry czasu na 200ms.To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. Uruchom ponowną syntezę, aby zobaczyć, jak te dostosowania wpłynęły na dane wyjściowe.Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

Głosy neuronowychNeural voices

Głosy neuronowych są algorytmami syntezy mowy obsługiwanymi przez głębokie sieci neuronowych.Neural voices are speech synthesis algorithms powered by deep neural networks. W przypadku korzystania z głosu neuronowych, synteza mowy jest niemal nieczytelna w odróżnieniu od nagrań ludzkich.When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. Podobnie jak naturalna prosodya i wyraźny zbiór wyrazów, głosy neuronowych znacząco zmniejszają zmęczenie nasłuchiwania, gdy użytkownicy współpracują z systemami AI.With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

Aby przełączyć się na głos neuronowych, Zmień na name jedną z opcji głosu neuronowych.To switch to a neural voice, change the name to one of the neural voice options. Następnie Dodaj przestrzeń nazw XML dla mstts i zawiń tekst w <mstts:express-as> tagu.Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. Użyj style parametru, aby dostosować styl mówiący.Use the style param to customize the speaking style. Ten przykład używa cheerful , ale spróbuje ustawić customerservice lub, chat Aby zobaczyć różnicę w stylu mówiącym.This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

Ważne

Głosy neuronowych są obsługiwane tylko w przypadku zasobów mowy utworzonych w regionach Wschodnie stany usa, Południowe Azja Wschodnia i Europa Zachodnia .Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
    xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

Można wykluczać mowę z tekstu przy użyciu zestawu Speech SDK dla SWIFT i celu języka C.You can synthesize speech from text using the Speech SDK for Swift and Objective-C.

Wymagania wstępnePrerequisites

W poniższych przykładach założono, że masz konto platformy Azure i subskrypcję usługi mowy.The following samples assume that you have an Azure account and Speech service subscription. Jeśli nie masz konta i subskrypcji, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and subscription, try the Speech service for free.

Instalowanie zestawu Speech SDK i przykładówInstall Speech SDK and samples

Zestaw SDK mowy Cognitive Services zawiera przykłady w postaci SWIFT i celu dla systemów iOS i Mac.The Cognitive Services Speech SDK contains samples written in in Swift and Objective-C for iOS and Mac. Kliknij link, aby zobaczyć instrukcje dotyczące instalacji poszczególnych próbek:Click a link to see installation instructions for each sample:

Udostępniamy również zestaw SDK mowy online dla odwołania do języka C.We also provide an online Speech SDK for Objective-C Reference.

W tym przewodniku szybki start przedstawiono typowe wzorce projektowania służące do wykonywania syntezy zamiany tekstu na mowę przy użyciu zestawu Speech SDK.In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. Najpierw należy wykonać podstawowe czynności konfiguracyjne i synteza, a następnie przejść do bardziej zaawansowanych przykładów tworzenia aplikacji niestandardowych, takich jak:You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • Uzyskiwanie odpowiedzi jako strumieni w pamięciGetting responses as in-memory streams
  • Dostosowywanie szybkości próbkowania danych wyjściowych i szybkości transmisji bitówCustomizing output sample rate and bit rate
  • Przesyłanie żądań syntezy przy użyciu SSML (język oznaczeń syntezy mowy)Submitting synthesis requests using SSML (speech synthesis markup language)
  • Korzystanie z głosów neuronowychUsing neural voices

Przejdź do przykładów w witrynie GitHubSkip to samples on GitHub

Jeśli chcesz pominąć prosty kod przykładowy, zobacz przykłady przewodnika Szybki Start w języku Python w witrynie GitHub.If you want to skip straight to sample code, see the Python quickstart samples on GitHub.

Wymagania wstępnePrerequisites

W tym artykule przyjęto założenie, że masz konto platformy Azure i subskrypcję usługi mowy.This article assumes that you have an Azure account and Speech service subscription. Jeśli nie masz konta i subskrypcji, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and subscription, try the Speech service for free.

Instalowanie zestawu SDK usługi MowaInstall the Speech SDK

Przed wykonaniem jakichkolwiek czynności należy zainstalować zestaw Speech SDK.Before you can do anything, you'll need to install the Speech SDK.

pip install azure-cognitiveservices-speech

Jeśli pracujesz w programie macOS i masz problemy z instalacją, może być konieczne uruchomienie tego polecenia jako pierwsze.If you're on macOS and run into install issues, you may need to run this command first.

python3 -m pip install --upgrade pip

Po zainstalowaniu zestawu Speech SDK należy uwzględnić następujące instrukcje importu u góry skryptu.After the Speech SDK is installed, include the following import statements at the top of your script.

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

Tworzenie konfiguracji mowyCreate a speech configuration

Aby wywołać usługę mowy przy użyciu zestawu Speech SDK, należy utworzyć SpeechConfig .To call the Speech service using the Speech SDK, you need to create a SpeechConfig. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, Host lub Token autoryzacji.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

Uwaga

Bez względu na to, czy wykonujesz rozpoznawanie mowy, synteza mowy, tłumaczenie czy rozpoznawanie intencji, zawsze utworzysz konfigurację.Regardless of whether you're performing speech recognition, speech synthesis, translation, or intent recognition, you'll always create a configuration.

Istnieje kilka sposobów na zainicjowanie SpeechConfig :There are a few ways that you can initialize a SpeechConfig:

  • Z subskrypcją: Przekaż klucz i skojarzony region.With a subscription: pass in a key and the associated region.
  • Z punktem końcowym: Pass w punkcie końcowym usługi mowy.With an endpoint: pass in a Speech service endpoint. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z hostem: Przekaż adres hosta.With a host: pass in a host address. Klucz lub Token autoryzacji jest opcjonalny.A key or authorization token is optional.
  • Z tokenem autoryzacji: Przekaż Token autoryzacji i skojarzony region.With an authorization token: pass in an authorization token and the associated region.

W tym przykładzie utworzysz SpeechConfig przy użyciu klucza subskrypcji i regionu.In this example, you create a SpeechConfig using a subscription key and region. Pobierz te poświadczenia, wykonując czynności opisane w sekcji Wypróbuj bezpłatnie usługę Speech.Get these credentials by following steps in Try the Speech service for free.

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

Wyrównać mowę do plikuSynthesize speech to a file

Następnie utworzysz SpeechSynthesizer obiekt, który wykonuje konwersje zamiany tekstu na mowę i wyjście na głośniki, pliki lub inne strumienie wyjściowe.Next, you create a SpeechSynthesizer object, which executes text-to-speech conversions and outputs to speakers, files, or other output streams. SpeechSynthesizerAkceptuje jako params SpeechConfig obiekt utworzony w poprzednim kroku oraz AudioOutputConfig obiekt, który określa sposób obsługi wyników.The SpeechSynthesizer accepts as params the SpeechConfig object created in the previous step, and an AudioOutputConfig object that specifies how output results should be handled.

Aby rozpocząć, Utwórz element, AudioOutputConfig Aby automatycznie zapisywać dane wyjściowe do .wav pliku przy użyciu filename parametru konstruktora.To start, create an AudioOutputConfig to automatically write the output to a .wav file, using the filename constructor param.

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

Następnie Utwórz wystąpienie a SpeechSynthesizer przez przekazanie speech_config obiektu i audio_config obiektu jako parametrów.Next, instantiate a SpeechSynthesizer by passing your speech_config object and the audio_config object as params. Następnie wykonanie syntezy mowy i zapis w pliku jest tak proste jak uruchamianie speak_text_async() z ciągiem tekstu.Then, executing speech synthesis and writing to a file is as simple as running speak_text_async() with a string of text.

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

Uruchom program, a plik z syntezą .wav jest zapisywana w określonej lokalizacji.Run the program, and a synthesized .wav file is written to the location you specified. Jest to dobry przykład typowego użycia, ale następnym zapoznaj się z tematem dostosowywania danych wyjściowych i obsługi odpowiedzi wyjściowej jako strumienia znajdującego się w pamięci na potrzeby pracy z niestandardowymi scenariuszami.This is a good example of the most basic usage, but next you look at customizing output and handling the output response as an in-memory stream for working with custom scenarios.

Synteza danych wyjściowych prezenteraSynthesize to speaker output

W niektórych przypadkach można chcieć bezpośrednio wyprowadzać dane z głosu do osoby mówiącej.In some cases, you may want to directly output synthesized speech directly to a speaker. Aby to zrobić, użyj przykładu w poprzedniej sekcji, ale zmień go, AudioOutputConfig usuwając filename Parametry i ustaw use_default_speaker=True .To do this, use the example in the previous section, but change the AudioOutputConfig by removing the filename param, and set use_default_speaker=True. To wyjście do bieżącego aktywnego urządzenia wyjściowego.This outputs to the current active output device.

audio_config = AudioOutputConfig(use_default_speaker=True)

Pobierz wynik jako strumień w pamięciGet result as an in-memory stream

W przypadku wielu scenariuszy tworzenia aplikacji mowy potrzebne są wyniki danych audio jako strumień w pamięci zamiast bezpośredniego zapisywania do pliku.For many scenarios in speech application development, you likely need the resulting audio data as an in-memory stream rather than directly writing to a file. Pozwoli to na tworzenie zachowań niestandardowych, w tym:This will allow you to build custom behavior including:

  • Abstrakcyjna w efekcie tablica bajtów jako strumień umożliwiający wyszukiwanie niestandardowych usług podrzędnych.Abstract the resulting byte array as a seek-able stream for custom downstream services.
  • Zintegruj wynik z innymi interfejsami API lub usługami.Integrate the result with other API's or services.
  • Modyfikowanie danych audio, zapisywanie niestandardowych .wav nagłówków itp.Modify the audio data, write custom .wav headers, etc.

Jest to proste, aby wprowadzić tę zmianę z poprzedniego przykładu.It's simple to make this change from the previous example. Najpierw usuń AudioConfig , ponieważ będziesz zarządzać zachowaniem danych wyjściowych ręcznie z tego punktu, aby zwiększyć kontrolę.First, remove the AudioConfig, as you will manage the output behavior manually from this point onward for increased control. Następnie Przekaż None AudioConfig w SpeechSynthesizer konstruktorze.Then pass None for the AudioConfig in the SpeechSynthesizer constructor.

Uwaga

W None przypadku AudioConfig , gdy nie zostanie pominięty w powyższym przykładzie danych wyjściowych prezentera, nie będzie odtwarzany dźwięk domyślnie na bieżącym aktywnym urządzeniu wyjściowym.Passing None for the AudioConfig, rather than omitting it like in the speaker output example above, will not play the audio by default on the current active output device.

Tym razem można zapisać wynik w SpeechSynthesisResult zmiennej.This time, you save the result to a SpeechSynthesisResult variable. audio_dataWłaściwość zawiera bytes obiekt danych wyjściowych.The audio_data property contains a bytes object of the output data. Możesz współpracować z tym obiektem ręcznie lub użyć AudioDataStream klasy do zarządzania strumieniem znajdującym się w pamięci.You can work with this object manually, or you can use the AudioDataStream class to manage the in-memory stream. W tym przykładzie użyjesz AudioDataStream konstruktora, aby uzyskać strumień z wyniku.In this example you use the AudioDataStream constructor to get a stream from the result.

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)

W tym miejscu można zaimplementować dowolne zachowanie niestandardowe przy użyciu stream obiektu wyniku.From here you can implement any custom behavior using the resulting stream object.

Dostosuj format audioCustomize audio format

W poniższej sekcji pokazano, jak dostosować atrybuty wyjściowe audio, w tym:The following section shows how to customize audio output attributes including:

  • Typ pliku audioAudio file type
  • Szybkość próbkowaniaSample-rate
  • Bit — GłębokośćBit-depth

Aby zmienić format dźwięku, należy użyć set_speech_synthesis_output_format() funkcji dla SpeechConfig obiektu.To change the audio format, you use the set_speech_synthesis_output_format() function on the SpeechConfig object. Ta funkcja oczekuje enum typu SpeechSynthesisOutputFormat , którego można użyć do wybrania formatu danych wyjściowych.This function expects an enum of type SpeechSynthesisOutputFormat, which you use to select the output format. Listę dostępnych formatów audio można znaleźć w dokumentacji referencyjnej.See the reference docs for a list of audio formats that are available.

Istnieją różne opcje dla różnych typów plików, w zależności od wymagań.There are various options for different file types depending on your requirements. Należy pamiętać, że zgodnie z definicją, formaty nieprzetworzone, takie jak Raw24Khz16BitMonoPcm nie obejmują nagłówków audio.Note that by definition, raw formats like Raw24Khz16BitMonoPcm do not include audio headers. Używaj formatów nieprzetworzonych tylko wtedy, gdy wiesz, że wdrożenie podrzędne może zdekodować surową Bitstream lub jeśli planujesz ręczne tworzenie nagłówków na podstawie głębi bitowej, szybkości próbkowania, liczby kanałów itd.Use raw formats only when you know your downstream implementation can decode a raw bitstream, or if you plan on manually building headers based on bit-depth, sample-rate, number of channels, etc.

Uwaga

Głosy en-us-AriaRUS i en-us-GuyRUS są tworzone na podstawie przykładów zakodowanych w Riff24Khz16BitMonoPcm współczynniku próbkowania.Voices en-US-AriaRUS and en-US-GuyRUS are created from samples encoded in the Riff24Khz16BitMonoPcm sample rate.

W tym przykładzie należy określić format RIFF o wysokiej wierności, Riff24Khz16BitMonoPcm ustawiając SpeechSynthesisOutputFormat dla SpeechConfig obiektu.In this example, you specify a high-fidelity RIFF format Riff24Khz16BitMonoPcm by setting the SpeechSynthesisOutputFormat on the SpeechConfig object. Podobnie jak w przypadku przykładu w poprzedniej sekcji, należy użyć AudioDataStream , aby uzyskać strumień w pamięci wyniku, a następnie zapisać go do pliku.Similar to the example in the previous section, you use AudioDataStream to get an in-memory stream of the result, and then write it to a file.

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

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

Ponowne uruchomienie programu zapisze dostosowany .wav plik do określonej ścieżki.Running your program again will write a customized .wav file to the specified path.

Użyj SSML, aby dostosować charakterystykę mowyUse SSML to customize speech characteristics

Język znaczników syntezy mowy (SSML) umożliwia precyzyjne dostosowanie wielkości liter, wymowy, liczby głosu i większej liczby danych wyjściowych zamiany tekstu na mowę przez przesłanie żądań ze schematu XML.Speech Synthesis Markup Language (SSML) allows you to fine-tune the pitch, pronunciation, speaking rate, volume, and more of the text-to-speech output by submitting your requests from an XML schema. W tej sekcji przedstawiono kilka praktycznych przykładów użycia, ale w celu uzyskania bardziej szczegółowego przewodnika zapoznaj się z artykułem How to SSML.This section shows a few practical usage examples, but for a more detailed guide, see the SSML how-to article.

Aby rozpocząć korzystanie z SSML do dostosowywania, należy wprowadzić prostą zmianę, która przełącza głos.To start using SSML for customization, you make a simple change that switches the voice. Najpierw utwórz nowy plik XML dla konfiguracji SSML w katalogu głównym projektu, w tym przykładzie ssml.xml .First, create a new XML file for the SSML config in your root project directory, in this example ssml.xml. Element główny jest zawsze <speak> , a Zawijanie tekstu w <voice> elemencie pozwala na zmianę głosu przy użyciu name parametru.The root element is always <speak>, and wrapping the text in a <voice> element allows you to change the voice using the name param. Ten przykład zmienia głos na styk brytyjski (Zjednoczone Królestwo).This example changes the voice to a male English (UK) voice. Należy zauważyć, że ten głos jest standardowym głosem, który ma inne ceny i dostępność niż neuronowych głosów.Note that this voice is a standard voice, which has different pricing and availability than neural voices. Zapoznaj się z pełną listą obsługiwanych głosów standardowych .See the full list of supported standard voices.

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

Następnie musisz zmienić żądanie syntezy mowy, aby odwołać się do pliku XML.Next, you need to change the speech synthesis request to reference your XML file. Żądanie jest w większości takie samo, ale zamiast przy użyciu speak_text_async() funkcji, używasz speak_ssml_async() .The request is mostly the same, but instead of using the speak_text_async() function, you use speak_ssml_async(). Ta funkcja oczekuje ciągu XML, więc najpierw należy odczytać konfigurację SSML jako ciąg.This function expects an XML string, so you first read your SSML config as a string. W tym miejscu obiekt wynik jest dokładnie taki sam jak w poprzednich przykładach.From here, the result object is exactly the same as previous examples.

Uwaga

Jeśli element ssml_string zawiera  na początku ciągu, należy wyłączyć format BOM lub usługa zwróci błąd.If your ssml_string contains  at the beginning of the string, you need to strip off the BOM format or the service will return an error. W tym celu należy ustawić encoding parametr w następujący sposób: open("ssml.xml", "r", encoding="utf-8-sig") .You do this by setting the encoding parameter as follows: 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")

Dane wyjściowe działają, ale wprowadzono kilka prostych dodatkowych zmian, które ułatwiają bardziej naturalny dźwięk.The output works, but there a few simple additional changes you can make to help it sound more natural. Ogólna szybkość mówienia jest nieco zbyt szybka, dlatego dodamy <prosody> znacznik i obniży szybkość do 90% częstotliwości domyślnej.The overall speaking speed is a little too fast, so we'll add a <prosody> tag and reduce the speed to 90% of the default rate. Ponadto wstrzymanie po przecinku w zdaniu jest nieco zbyt krótkie i nienaturalne.Additionally, the pause after the comma in the sentence is a little too short and unnatural sounding. Aby rozwiązać ten problem, Dodaj <break> znacznik, aby opóźnić mowę i ustawić parametry czasu na 200ms.To fix this issue, add a <break> tag to delay the speech, and set the time param to 200ms. Uruchom ponowną syntezę, aby zobaczyć, jak te dostosowania wpłynęły na dane wyjściowe.Re-run the synthesis to see how these customizations affected the output.

<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
  <voice name="en-GB-George-Apollo">
    <prosody rate="0.9">
      When you're on the motorway,<break time="200ms"/> it's a good idea to use a sat-nav.
    </prosody>
  </voice>
</speak>

Głosy neuronowychNeural voices

Głosy neuronowych są algorytmami syntezy mowy obsługiwanymi przez głębokie sieci neuronowych.Neural voices are speech synthesis algorithms powered by deep neural networks. W przypadku korzystania z głosu neuronowych, synteza mowy jest niemal nieczytelna w odróżnieniu od nagrań ludzkich.When using a neural voice, synthesized speech is nearly indistinguishable from the human recordings. Podobnie jak naturalna prosodya i wyraźny zbiór wyrazów, głosy neuronowych znacząco zmniejszają zmęczenie nasłuchiwania, gdy użytkownicy współpracują z systemami AI.With the human-like natural prosody and clear articulation of words, neural voices significantly reduce listening fatigue when users interact with AI systems.

Aby przełączyć się na głos neuronowych, Zmień na name jedną z opcji głosu neuronowych.To switch to a neural voice, change the name to one of the neural voice options. Następnie Dodaj przestrzeń nazw XML dla mstts i zawiń tekst w <mstts:express-as> tagu.Then, add an XML namespace for mstts, and wrap your text in the <mstts:express-as> tag. Użyj style parametru, aby dostosować styl mówiący.Use the style param to customize the speaking style. Ten przykład używa cheerful , ale spróbuje ustawić customerservice lub, chat Aby zobaczyć różnicę w stylu mówiącym.This example uses cheerful, but try setting it to customerservice or chat to see the difference in speaking style.

Ważne

Głosy neuronowych są obsługiwane tylko w przypadku zasobów mowy utworzonych w regionach Wschodnie stany usa, Południowe Azja Wschodnia i Europa Zachodnia .Neural voices are only supported for Speech resources created in East US, South East Asia, and West Europe regions.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
  <voice name="en-US-AriaNeural">
    <mstts:express-as style="cheerful">
      This is awesome!
    </mstts:express-as>
  </voice>
</speak>

W tym przewodniku szybki start dowiesz się, jak konwertować tekst na mowę przy użyciu usługi mowy i zapełniania.In this quickstart, you learn how to convert text to speech using the Speech service and cURL.

Aby zapoznać się z pojęciami dotyczącymi zamiany tekstu na mowę, zobacz artykuł z omówieniem .For a high-level look at Text-To-Speech concepts, see the overview article.

Wymagania wstępnePrerequisites

W tym artykule przyjęto założenie, że masz konto platformy Azure i subskrypcję usługi mowy.This article assumes that you have an Azure account and Speech service subscription. Jeśli nie masz konta i subskrypcji, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and subscription, try the Speech service for free.

Konwertuj tekst na mowęConvert text to speech

W wierszu polecenia Uruchom następujące polecenie.At a command prompt, run the following command. Należy umieścić następujące wartości w poleceniu.You will need to insert the following values into the command.

  • Klucz subskrypcji usługi rozpoznawania mowy.Your Speech service subscription key.
  • Region usługi mowy.Your Speech service region.

Możesz również zmienić następujące wartości.You might also wish to change the following values.

  • X-Microsoft-OutputFormatWartość nagłówka, która kontroluje format danych wyjściowych audio.The X-Microsoft-OutputFormat header value, which controls the audio output format. Listę obsługiwanych formatów danych wyjściowych audio można znaleźć w dokumentacji interfejsu API REST zamiany tekstu na mowę.You can find a list of supported audio output formats in the text-to-speech REST API reference.
  • Wyjściowy dźwięk.The output voice. Aby uzyskać listę głosów dostępnych dla punktu końcowego mowy, zobacz następną sekcję.To get a list of voices available for your Speech endpoint, see the next section.
  • Plik wyjściowy.The output file. W tym przykładzie kierujemy odpowiedź z serwera do pliku o nazwie output.wav .In this example, we direct the response from the server into a file named output.wav.
curl --location --request POST 'https://INSERT_REGION_HERE.tts.speech.microsoft.com/cognitiveservices/v1' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/ssml+xml' \
--header 'X-Microsoft-OutputFormat: audio-16khz-128kbitrate-mono-mp3' \
--header 'User-Agent: curl' \
--data-raw '<speak version='\''1.0'\'' xml:lang='\''en-US'\''>
    <voice xml:lang='\''en-US'\'' xml:gender='\''Female'\'' name='\''en-US-AriaRUS'\''>
        my voice is my passport verify me
    </voice>
</speak>' > output.wav

Wyświetl listę dostępnych głosów dla punktu końcowego mowyList available voices for your Speech endpoint

Aby wyświetlić listę dostępnych głosów dla punktu końcowego mowy, uruchom następujące polecenie.To list the available voices for your Speech endpoint, run the following command.

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

Powinna zostać wyświetlona odpowiedź taka jak następująca.You should receive a response like the following one.

[
    {
        "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"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ca-ES, HerenaRUS)",
        "DisplayName": "Herena",
        "LocalName": "Helena",
        "ShortName": "ca-ES-HerenaRUS",
        "Gender": "Female",
        "Locale": "ca-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (cs-CZ, Jakub)",
        "DisplayName": "Jakub",
        "LocalName": "Jakub",
        "ShortName": "cs-CZ-Jakub",
        "Gender": "Male",
        "Locale": "cs-CZ",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (da-DK, HelleRUS)",
        "DisplayName": "Helle",
        "LocalName": "Helle",
        "ShortName": "da-DK-HelleRUS",
        "Gender": "Female",
        "Locale": "da-DK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-AT, Michael)",
        "DisplayName": "Michael",
        "LocalName": "Michael",
        "ShortName": "de-AT-Michael",
        "Gender": "Male",
        "Locale": "de-AT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-CH, Karsten)",
        "DisplayName": "Karsten",
        "LocalName": "Karsten",
        "ShortName": "de-CH-Karsten",
        "Gender": "Male",
        "Locale": "de-CH",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-DE, HeddaRUS)",
        "DisplayName": "Hedda",
        "LocalName": "Hedda",
        "ShortName": "de-DE-HeddaRUS",
        "Gender": "Female",
        "Locale": "de-DE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (de-DE, Stefan)",
        "DisplayName": "Stefan",
        "LocalName": "Stefan",
        "ShortName": "de-DE-Stefan",
        "Gender": "Male",
        "Locale": "de-DE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (el-GR, Stefanos)",
        "DisplayName": "Stefanos",
        "LocalName": "Στέφανος",
        "ShortName": "el-GR-Stefanos",
        "Gender": "Male",
        "Locale": "el-GR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-AU, Catherine)",
        "DisplayName": "Catherine",
        "LocalName": "Catherine",
        "ShortName": "en-AU-Catherine",
        "Gender": "Female",
        "Locale": "en-AU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-AU, HayleyRUS)",
        "DisplayName": "Hayley",
        "LocalName": "Hayley",
        "ShortName": "en-AU-HayleyRUS",
        "Gender": "Female",
        "Locale": "en-AU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-CA, HeatherRUS)",
        "DisplayName": "Heather",
        "LocalName": "Heather",
        "ShortName": "en-CA-HeatherRUS",
        "Gender": "Female",
        "Locale": "en-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-CA, Linda)",
        "DisplayName": "Linda",
        "LocalName": "Linda",
        "ShortName": "en-CA-Linda",
        "Gender": "Female",
        "Locale": "en-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-GB, George)",
        "DisplayName": "George",
        "LocalName": "George",
        "ShortName": "en-GB-George",
        "Gender": "Male",
        "Locale": "en-GB",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-GB, HazelRUS)",
        "DisplayName": "Hazel",
        "LocalName": "Hazel",
        "ShortName": "en-GB-HazelRUS",
        "Gender": "Female",
        "Locale": "en-GB",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-GB, Susan)",
        "DisplayName": "Susan",
        "LocalName": "Susan",
        "ShortName": "en-GB-Susan",
        "Gender": "Female",
        "Locale": "en-GB",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IE, Sean)",
        "DisplayName": "Sean",
        "LocalName": "Sean",
        "ShortName": "en-IE-Sean",
        "Gender": "Male",
        "Locale": "en-IE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IN, Heera)",
        "DisplayName": "Heera",
        "LocalName": "Heera",
        "ShortName": "en-IN-Heera",
        "Gender": "Female",
        "Locale": "en-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IN, PriyaRUS)",
        "DisplayName": "Priya",
        "LocalName": "Priya",
        "ShortName": "en-IN-PriyaRUS",
        "Gender": "Female",
        "Locale": "en-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-IN, Ravi)",
        "DisplayName": "Ravi",
        "LocalName": "Ravi",
        "ShortName": "en-IN-Ravi",
        "Gender": "Male",
        "Locale": "en-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, AriaRUS)",
        "DisplayName": "Aria",
        "LocalName": "Aria",
        "ShortName": "en-US-AriaRUS",
        "Gender": "Female",
        "Locale": "en-US",
        "SampleRateHertz": "24000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, BenjaminRUS)",
        "DisplayName": "Benjamin",
        "LocalName": "Benjamin",
        "ShortName": "en-US-BenjaminRUS",
        "Gender": "Male",
        "Locale": "en-US",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, GuyRUS)",
        "DisplayName": "Guy",
        "LocalName": "Guy",
        "ShortName": "en-US-GuyRUS",
        "Gender": "Male",
        "Locale": "en-US",
        "SampleRateHertz": "24000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)",
        "DisplayName": "Zira",
        "LocalName": "Zira",
        "ShortName": "en-US-ZiraRUS",
        "Gender": "Female",
        "Locale": "en-US",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-ES, HelenaRUS)",
        "DisplayName": "Helena",
        "LocalName": "Helena",
        "ShortName": "es-ES-HelenaRUS",
        "Gender": "Female",
        "Locale": "es-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-ES, Laura)",
        "DisplayName": "Laura",
        "LocalName": "Laura",
        "ShortName": "es-ES-Laura",
        "Gender": "Female",
        "Locale": "es-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-ES, Pablo)",
        "DisplayName": "Pablo",
        "LocalName": "Pablo",
        "ShortName": "es-ES-Pablo",
        "Gender": "Male",
        "Locale": "es-ES",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-MX, HildaRUS)",
        "DisplayName": "Hilda",
        "LocalName": "Hilda",
        "ShortName": "es-MX-HildaRUS",
        "Gender": "Female",
        "Locale": "es-MX",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (es-MX, Raul)",
        "DisplayName": "Raul",
        "LocalName": "Raúl",
        "ShortName": "es-MX-Raul",
        "Gender": "Male",
        "Locale": "es-MX",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fi-FI, HeidiRUS)",
        "DisplayName": "Heidi",
        "LocalName": "Heidi",
        "ShortName": "fi-FI-HeidiRUS",
        "Gender": "Female",
        "Locale": "fi-FI",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-CA, Caroline)",
        "DisplayName": "Caroline",
        "LocalName": "Caroline",
        "ShortName": "fr-CA-Caroline",
        "Gender": "Female",
        "Locale": "fr-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-CA, HarmonieRUS)",
        "DisplayName": "Harmonie",
        "LocalName": "Harmonie",
        "ShortName": "fr-CA-HarmonieRUS",
        "Gender": "Female",
        "Locale": "fr-CA",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-CH, Guillaume)",
        "DisplayName": "Guillaume",
        "LocalName": "Guillaume",
        "ShortName": "fr-CH-Guillaume",
        "Gender": "Male",
        "Locale": "fr-CH",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-FR, HortenseRUS)",
        "DisplayName": "Hortense",
        "LocalName": "Hortense",
        "ShortName": "fr-FR-HortenseRUS",
        "Gender": "Female",
        "Locale": "fr-FR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-FR, Julie)",
        "DisplayName": "Julie",
        "LocalName": "Julie",
        "ShortName": "fr-FR-Julie",
        "Gender": "Female",
        "Locale": "fr-FR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (fr-FR, Paul)",
        "DisplayName": "Paul",
        "LocalName": "Paul",
        "ShortName": "fr-FR-Paul",
        "Gender": "Male",
        "Locale": "fr-FR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (he-IL, Asaf)",
        "DisplayName": "Asaf",
        "LocalName": "אסף",
        "ShortName": "he-IL-Asaf",
        "Gender": "Male",
        "Locale": "he-IL",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hi-IN, Hemant)",
        "DisplayName": "Hemant",
        "LocalName": "हेमन्त",
        "ShortName": "hi-IN-Hemant",
        "Gender": "Male",
        "Locale": "hi-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hi-IN, Kalpana)",
        "DisplayName": "Kalpana",
        "LocalName": "कल्पना",
        "ShortName": "hi-IN-Kalpana",
        "Gender": "Female",
        "Locale": "hi-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hr-HR, Matej)",
        "DisplayName": "Matej",
        "LocalName": "Matej",
        "ShortName": "hr-HR-Matej",
        "Gender": "Male",
        "Locale": "hr-HR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (hu-HU, Szabolcs)",
        "DisplayName": "Szabolcs",
        "LocalName": "Szabolcs",
        "ShortName": "hu-HU-Szabolcs",
        "Gender": "Male",
        "Locale": "hu-HU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (id-ID, Andika)",
        "DisplayName": "Andika",
        "LocalName": "Andika",
        "ShortName": "id-ID-Andika",
        "Gender": "Male",
        "Locale": "id-ID",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (it-IT, Cosimo)",
        "DisplayName": "Cosimo",
        "LocalName": "Cosimo",
        "ShortName": "it-IT-Cosimo",
        "Gender": "Male",
        "Locale": "it-IT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (it-IT, LuciaRUS)",
        "DisplayName": "Lucia",
        "LocalName": "Lucia",
        "ShortName": "it-IT-LuciaRUS",
        "Gender": "Female",
        "Locale": "it-IT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ja-JP, Ayumi)",
        "DisplayName": "Ayumi",
        "LocalName": "歩美",
        "ShortName": "ja-JP-Ayumi",
        "Gender": "Female",
        "Locale": "ja-JP",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ja-JP, HarukaRUS)",
        "DisplayName": "Haruka",
        "LocalName": "春香",
        "ShortName": "ja-JP-HarukaRUS",
        "Gender": "Female",
        "Locale": "ja-JP",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ja-JP, Ichiro)",
        "DisplayName": "Ichiro",
        "LocalName": "一郎",
        "ShortName": "ja-JP-Ichiro",
        "Gender": "Male",
        "Locale": "ja-JP",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ko-KR, HeamiRUS)",
        "DisplayName": "Heami",
        "LocalName": "해 미",
        "ShortName": "ko-KR-HeamiRUS",
        "Gender": "Female",
        "Locale": "ko-KR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ms-MY, Rizwan)",
        "DisplayName": "Rizwan",
        "LocalName": "Rizwan",
        "ShortName": "ms-MY-Rizwan",
        "Gender": "Male",
        "Locale": "ms-MY",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (nb-NO, HuldaRUS)",
        "DisplayName": "Hulda",
        "LocalName": "Hulda",
        "ShortName": "nb-NO-HuldaRUS",
        "Gender": "Female",
        "Locale": "nb-NO",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (nl-NL, HannaRUS)",
        "DisplayName": "Hanna",
        "LocalName": "Hanna",
        "ShortName": "nl-NL-HannaRUS",
        "Gender": "Female",
        "Locale": "nl-NL",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pl-PL, PaulinaRUS)",
        "DisplayName": "Paulina",
        "LocalName": "Paulina",
        "ShortName": "pl-PL-PaulinaRUS",
        "Gender": "Female",
        "Locale": "pl-PL",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pt-BR, Daniel)",
        "DisplayName": "Daniel",
        "LocalName": "Daniel",
        "ShortName": "pt-BR-Daniel",
        "Gender": "Male",
        "Locale": "pt-BR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pt-BR, HeloisaRUS)",
        "DisplayName": "Heloisa",
        "LocalName": "Heloisa",
        "ShortName": "pt-BR-HeloisaRUS",
        "Gender": "Female",
        "Locale": "pt-BR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (pt-PT, HeliaRUS)",
        "DisplayName": "Helia",
        "LocalName": "Hélia",
        "ShortName": "pt-PT-HeliaRUS",
        "Gender": "Female",
        "Locale": "pt-PT",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ro-RO, Andrei)",
        "DisplayName": "Andrei",
        "LocalName": "Andrei",
        "ShortName": "ro-RO-Andrei",
        "Gender": "Male",
        "Locale": "ro-RO",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ru-RU, EkaterinaRUS)",
        "DisplayName": "Ekaterina",
        "LocalName": "Екатерина",
        "ShortName": "ru-RU-EkaterinaRUS",
        "Gender": "Female",
        "Locale": "ru-RU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ru-RU, Irina)",
        "DisplayName": "Irina",
        "LocalName": "Ирина",
        "ShortName": "ru-RU-Irina",
        "Gender": "Female",
        "Locale": "ru-RU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ru-RU, Pavel)",
        "DisplayName": "Pavel",
        "LocalName": "Павел",
        "ShortName": "ru-RU-Pavel",
        "Gender": "Male",
        "Locale": "ru-RU",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (sk-SK, Filip)",
        "DisplayName": "Filip",
        "LocalName": "Filip",
        "ShortName": "sk-SK-Filip",
        "Gender": "Male",
        "Locale": "sk-SK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (sl-SI, Lado)",
        "DisplayName": "Lado",
        "LocalName": "Lado",
        "ShortName": "sl-SI-Lado",
        "Gender": "Male",
        "Locale": "sl-SI",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (sv-SE, HedvigRUS)",
        "DisplayName": "Hedvig",
        "LocalName": "Hedvig",
        "ShortName": "sv-SE-HedvigRUS",
        "Gender": "Female",
        "Locale": "sv-SE",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (ta-IN, Valluvar)",
        "DisplayName": "Valluvar",
        "LocalName": "வள்ளுவர்",
        "ShortName": "ta-IN-Valluvar",
        "Gender": "Male",
        "Locale": "ta-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (te-IN, Chitra)",
        "DisplayName": "Chitra",
        "LocalName": "చిత్ర",
        "ShortName": "te-IN-Chitra",
        "Gender": "Female",
        "Locale": "te-IN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (th-TH, Pattara)",
        "DisplayName": "Pattara",
        "LocalName": "ภัทรา",
        "ShortName": "th-TH-Pattara",
        "Gender": "Male",
        "Locale": "th-TH",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (tr-TR, SedaRUS)",
        "DisplayName": "Seda",
        "LocalName": "Seda",
        "ShortName": "tr-TR-SedaRUS",
        "Gender": "Female",
        "Locale": "tr-TR",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (vi-VN, An)",
        "DisplayName": "An",
        "LocalName": "An",
        "ShortName": "vi-VN-An",
        "Gender": "Male",
        "Locale": "vi-VN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-CN, HuihuiRUS)",
        "DisplayName": "Huihui",
        "LocalName": "慧慧",
        "ShortName": "zh-CN-HuihuiRUS",
        "Gender": "Female",
        "Locale": "zh-CN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-CN, Kangkang)",
        "DisplayName": "Kangkang",
        "LocalName": "康康",
        "ShortName": "zh-CN-Kangkang",
        "Gender": "Male",
        "Locale": "zh-CN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-CN, Yaoyao)",
        "DisplayName": "Yaoyao",
        "LocalName": "瑶瑶",
        "ShortName": "zh-CN-Yaoyao",
        "Gender": "Female",
        "Locale": "zh-CN",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-HK, Danny)",
        "DisplayName": "Danny",
        "LocalName": "Danny",
        "ShortName": "zh-HK-Danny",
        "Gender": "Male",
        "Locale": "zh-HK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-HK, TracyRUS)",
        "DisplayName": "Tracy",
        "LocalName": "Tracy",
        "ShortName": "zh-HK-TracyRUS",
        "Gender": "Female",
        "Locale": "zh-HK",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-TW, HanHanRUS)",
        "DisplayName": "HanHan",
        "LocalName": "涵涵",
        "ShortName": "zh-TW-HanHanRUS",
        "Gender": "Female",
        "Locale": "zh-TW",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-TW, Yating)",
        "DisplayName": "Yating",
        "LocalName": "雅婷",
        "ShortName": "zh-TW-Yating",
        "Gender": "Female",
        "Locale": "zh-TW",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    },
    {
        "Name": "Microsoft Server Speech Text to Speech Voice (zh-TW, Zhiwei)",
        "DisplayName": "Zhiwei",
        "LocalName": "志威",
        "ShortName": "zh-TW-Zhiwei",
        "Gender": "Male",
        "Locale": "zh-TW",
        "SampleRateHertz": "16000",
        "VoiceType": "Standard"
    }
]

W tym przewodniku szybki start przedstawiono typowe wzorce projektowania służące do wykonywania syntezy zamiany tekstu na mowę przy użyciu zestawu Speech SDK.In this quickstart, you learn common design patterns for doing text-to-speech synthesis using the Speech SDK. Najpierw należy wykonać podstawowe czynności konfiguracyjne i synteza, a następnie przejść do bardziej zaawansowanych przykładów tworzenia aplikacji niestandardowych, takich jak:You start by doing basic configuration and synthesis, and move on to more advanced examples for custom application development including:

  • Uzyskiwanie odpowiedzi jako strumieni w pamięciGetting responses as in-memory streams
  • Dostosowywanie szybkości próbkowania danych wyjściowych i szybkości transmisji bitówCustomizing output sample rate and bit rate
  • Przesyłanie żądań syntezy przy użyciu SSML (język oznaczeń syntezy mowy)Submitting synthesis requests using SSML (speech synthesis markup language)
  • Korzystanie z głosów neuronowychUsing neural voices

Wymagania wstępnePrerequisites

W tym artykule przyjęto założenie, że masz konto platformy Azure i subskrypcję usługi mowy.This article assumes that you have an Azure account and Speech service subscription. Jeśli nie masz konta i subskrypcji, Wypróbuj usługę mowy bezpłatnie.If you don't have an account and subscription, try the Speech service for free.

Pobieranie i instalowanieDownload and install

Wykonaj następujące kroki, aby zainstalować interfejs wiersza polecenia mowy w systemie Windows:Follow these steps to install the Speech CLI on Windows:

  1. W systemie Windows wymagany jest Microsoft Visual C++ redystrybucyjny dla programu Visual Studio 2019 dla danej platformy.On Windows, you need the Microsoft Visual C++ Redistributable for Visual Studio 2019 for your platform. Zainstalowanie tego po raz pierwszy może wymagać ponownego uruchomienia.Installing this for the first time may require a restart.

  2. Zainstaluj zestaw SDK platformy .NET Core 3,1.Install .NET Core 3.1 SDK.

  3. Zainstaluj interfejs wiersza polecenia mowy przy użyciu NuGet, wprowadzając następujące polecenie:Install the Speech CLI using NuGet by entering this command:

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

Wpisz spx , aby wyświetlić pomoc dla interfejsu wiersza polecenia mowy.Type spx to see help for the Speech CLI.

Uwaga

Alternatywą dla programu NuGet jest pobranie i wyodrębnienie archiwum zipinterfejsu wiersza polecenia mowy, znalezienie i wyodrębnienie platformy z spx-zips katalogu oraz dodanie spx ścieżki do zmiennej Path systemu.As an alternative to NuGet, you can download and extract the Speech CLI zip archive, find and extract your platform from the spx-zips directory, and add the spx path to your system PATH variable.

Ograniczenia dotyczące czcionekFont limitations

W systemie Windows interfejs wiersza polecenia mowy może wyświetlać tylko czcionki dostępne dla wiersza poleceń na komputerze lokalnym.On Windows, the Speech CLI can only show fonts available to the command prompt on the local computer. Terminal systemu Windows obsługuje wszystkie czcionki opracowane interaktywnie przez interfejs wiersza polecenia mowy.Windows Terminal supports all fonts produced interactively by the Speech CLI.

Jeśli dane wyjściowe są wyprowadzane do pliku, Edytor tekstu, taki jak Notatnik lub przeglądarka sieci Web, np. Microsoft Edge, może również wyświetlać wszystkie czcionki.If you output to a file, a text editor like Notepad or a web browser like Microsoft Edge can also show all fonts.

Utwórz konfigurację subskrypcjiCreate subscription config

Aby rozpocząć korzystanie z interfejsu wiersza polecenia mowy, należy wprowadzić klucz subskrypcji mowy i Identyfikator regionu.To start using the Speech CLI, you need to enter your Speech subscription key and region identifier. Pobierz te poświadczenia, wykonując czynności opisane w sekcji Wypróbuj bezpłatnie usługę Speech.Get these credentials by following steps in Try the Speech service for free. Gdy masz klucz subskrypcji i Identyfikator regionu (np.Once you have your subscription key and region identifier (ex. eastus, westus Uruchom następujące polecenia.eastus, westus), run the following commands.

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

Twoje uwierzytelnianie subskrypcji jest teraz przechowywane dla przyszłych żądań SPX.Your subscription authentication is now stored for future SPX requests. Jeśli musisz usunąć jedną z tych przechowywanych wartości, uruchom polecenie spx config @region --clear lub spx config @key --clear .If you need to remove either of these stored values, run spx config @region --clear or spx config @key --clear.

Syntetyzowanie mowy przy użyciu głośnikaSynthesize speech to a speaker

Teraz możesz przystąpić do uruchamiania interfejsu wiersza polecenia mowy, aby wyszukać mowę z tekstu.Now you're ready to run the Speech CLI to synthesize speech from text. W wierszu poleceń przejdź do katalogu, który zawiera plik binarny interfejsu wiersza polecenia mowy.From the command line, change to the directory that contains the Speech CLI binary file. Następnie uruchom następujące polecenie.Then run the following command.

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

Interfejs wiersza polecenia mowy umożliwia tworzenie języka naturalnego w języku angielskim przez prelegenta komputerów.The Speech CLI will produce natural language in English through the computer speaker.

Wyrównać mowę do plikuSynthesize speech to a file

Uruchom następujące polecenie, aby zmienić dane wyjściowe głośników na .wav plik.Run the following command to change the output from your speaker to a .wav file.

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

Interfejs wiersza polecenia mowy spowoduje utworzenie języka naturalnego w języku angielskim w greetings.wav pliku audio.The Speech CLI will produce natural language in English into the greetings.wav audio file. W systemie Windows można odtworzyć plik audio, wprowadzając polecenie start greetings.wav .In Windows, you can play the audio file by entering start greetings.wav.

Pobierz informacje o pozycjiGet position information

Twój projekt może potrzebować wiedzieć, kiedy słowo jest wymawiane przez zamianę mowy na tekst, tak aby mogło wykonać określone czynności na podstawie tego chronometrażu.Your project may need to know when a word is spoken by speech-to-text so that it can take specific action based on that timing. Jeśli na przykład chcesz wyróżnić słowa jako wymawiane, musisz wiedzieć, co należy zaznaczyć, kiedy ją podświetlić, i na jak długo ją podświetlić.As an example, if you wanted to highlight words as they were spoken, you would need to know what to highlight, when to highlight it, and for how long to highlight it.

Można to zrobić za pomocą WordBoundary dostępnego w programie zdarzenia SpeechSynthesizer .You can accomplish this using the WordBoundary event available within SpeechSynthesizer. To zdarzenie jest zgłaszane na początku każdego nowego wypowiadanego wyrazu i będzie przesunięte w czasie w strumieniu mówionym, a także przesunięcie tekstu w monicie wejściowym.This event is raised at the beginning of each new spoken word and will provide a time offset within the spoken stream as well as a text offset within the input prompt.

  • AudioOffset raportuje wyjściowy dźwięk, który upłynął czas między rozpoczęciem syntezy a rozpoczęciem następnego wyrazu.AudioOffset reports the output audio's elapsed time between the beginning of synthesis and the start of the next word. Ta wartość jest mierzona w jednostkach setki (SNS) z 10 000 SNS równych 1 milisekund.This is measured in hundred-nanosecond units (HNS) with 10,000 HNS equivalent to 1 millisecond.
  • WordOffset raportuje pozycję znaku w ciągu wejściowym (oryginalny tekst lub SSML) bezpośrednio przed wyrazem, który ma zostać wypowiadany.WordOffset reports the character position in the input string (original text or SSML) immediately before the word that's about to be spoken.

Uwaga

WordBoundary zdarzenia są wywoływane, gdy dane wyjściowe audio staną się dostępne, co będzie szybsze niż odtwarzanie na urządzeniu wyjściowym.WordBoundary events are raised as the output audio data becomes available, which will be faster than playback to an output device. Odpowiednio synchronizując chronometraż strumienia do "czasu rzeczywistego" musi zostać osiągnięty przez obiekt wywołujący.Appropriately synchronizing stream timing to "real time" must be accomplished by the caller.

Przykłady użycia można znaleźć w przykładach WordBoundary zamiany tekstu na mowę w witrynie GitHub.You can find examples of using WordBoundary in the text-to-speech samples on GitHub.

Następne krokiNext steps