Komma igång med text till tal
I den här snabbstarten lär du dig vanliga designmönster för att göra text-till-tal-syntes med hjälp av Speech SDK. Du börjar med grundläggande konfiguration och syntes och går vidare till mer avancerade exempel för utveckling av anpassade program, inklusive:
- Få svar som minnesbaserade strömmar
- Anpassa exempelfrekvens för utdata och bithastighet
- Skicka syntesbegäranden med hjälp av SSML (talsyntespåläggsspråk)
- Använda neurala röster
Gå vidare till exempel på GitHub
Om du vill hoppa direkt till exempelkoden kan du gå till C#-snabbstartsexempel på GitHub.
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en prenumeration på Speech-tjänsten. Om du inte har ett konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Installera Speech SDK
Innan du kan göra något måste du installera Speech SDK. Följ anvisningarna nedan beroende på din plattform:
Importera beroenden
Om du vill köra exemplen i den här artikeln inkluderar using du följande instruktioner överst i skriptet.
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
Skapa en talkonfiguration
Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechConfig . Den här klassen innehåller information om din prenumeration, till exempel din talnyckel och tillhörande plats/region, slutpunkt, värd eller auktoriseringstoken.
Anteckning
Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.
Det finns några olika sätt att initiera en SpeechConfig :
- Med en prenumeration: skicka in en nyckel och den associerade platsen/regionen.
- Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En nyckel eller auktoriseringstoken är valfri.
- Med en värd: skicka in en värdadress. En nyckel eller auktoriseringstoken är valfri.
- Med en auktoriseringstoken: skicka in en auktoriseringstoken och den associerade platsen/regionen.
I det här exemplet skapar du en med SpeechConfig hjälp av en talnyckel och plats/region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt. Du kan också skapa grundläggande exempelkod som ska användas för resten av den här artikeln, som du ändrar för olika anpassningar.
public class Program
{
static async Task Main()
{
await SynthesizeAudioAsync();
}
static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}
}
Välj syntesspråk och röst
Azure Text till tal service stöder fler än 250 röster och över 70 språk och varianter.
Du kan hämta den fullständiga listaneller prova dem i text-till-tal-demo.
Ange språk eller röst för för SpeechConfig att matcha din indatatext och använd den önskade rösten.
static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
// Note: if only language is set, the default voice of that language is chosen.
config.SpeechSynthesisLanguage = "<your-synthesis-language>"; // e.g. "de-DE"
// The voice setting will overwrite language setting.
// The voice setting will not overwrite the voice element in input SSML.
config.SpeechSynthesisVoiceName = "<your-wanted-voice>";
}
Syntetisera tal till en fil
Därefter skapar du ett -objekt som kör SpeechSynthesizer text-till-tal-konverteringar och -utdata till talare, filer eller andra utdataströmmar. accepterar som params objektet som skapades i föregående steg och ett SpeechSynthesizer SpeechConfig -objekt AudioConfig som anger hur utdataresultat ska hanteras.
Börja genom att skapa en för att automatiskt skriva utdata till en fil med hjälp AudioConfig .wav av funktionen och FromWavFileOutput() instansiera den med en using -instruktion. En -instruktion i den här kontexten tar automatiskt bort ohanterade resurser och gör att objektet tas bort från using omfånget efter att det har tagits bort.
static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
}
Skapa sedan en instans av en SpeechSynthesizer med en annan using -instruktion. Skicka objektet config och audioConfig objektet som params. Sedan är det lika enkelt att köra talsyntes och skriva till en fil som SpeakTextAsync() att köra med en textsträng.
static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
using var audioConfig = AudioConfig.FromWavFileOutput("path/to/write/file.wav");
using var synthesizer = new SpeechSynthesizer(config, audioConfig);
await synthesizer.SpeakTextAsync("A simple test to write to a file.");
}
Kör programmet och en syntetiserat fil .wav skrivs till den plats som du har angett. Det här är ett bra exempel på den mest grundläggande användningen, men härnäst ska du titta på anpassning av utdata och hantering av utdatasvaret som en minnes in memory-dataström för att arbeta med anpassade scenarier.
Syntetisera till talarutdata
I vissa fall kanske du vill mata ut syntetiserat tal direkt till en talare. Det gör du genom att utelämna AudioConfig parametern när du skapar SpeechSynthesizer i exemplet ovan. Detta syntetiserar till den aktuella aktiva utdataenheten.
static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
using var synthesizer = new SpeechSynthesizer(config);
await synthesizer.SpeakTextAsync("Synthesizing directly to speaker output.");
}
Hämta resultat som en minnes in memory-ström
För många scenarier inom talprogramutveckling behöver du förmodligen resulterande ljuddata som en minnes in memory-dataström i stället för att skriva direkt till en fil. På så sätt kan du skapa anpassade beteenden, inklusive:
- Abstrahera den resulterande bytematrisen som en sök- och sökström för anpassade underordnade tjänster.
- Integrera resultatet med andra API:er eller tjänster.
- Ändra ljuddata, skriva anpassade
.wavrubriker osv.
Det är enkelt att göra den här ändringen från föregående exempel. Ta först bort AudioConfig blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka sedan null för AudioConfig i SpeechSynthesizer konstruktorn.
Anteckning
Om du går vidare till , i stället för att utelämna den som i exemplet med talarutdata ovan, spelas inte ljudet upp som standard på den null AudioConfig aktuella aktiva utdataenheten.
Den här gången sparar du resultatet i en SpeechSynthesisResult variabel. Egenskapen AudioData innehåller en av byte [] utdata. Du kan arbeta med byte [] detta manuellt, eller så kan du använda AudioDataStream klassen för att hantera den minnesbaserade dataströmmen. I det här exemplet använder du den AudioDataStream.FromResult() statiska funktionen för att hämta en dataström från resultatet.
static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
using var synthesizer = new SpeechSynthesizer(config, null);
var result = await synthesizer.SpeakTextAsync("Getting the response as an in-memory stream.");
using var stream = AudioDataStream.FromResult(result);
}
Härifrån kan du implementera ett anpassat beteende med hjälp av det resulterande stream objektet.
Anpassa ljudformat
Följande avsnitt visar hur du anpassar attribut för ljudutdata, inklusive:
- Ljudfiltyp
- Samplingshastighet
- Bitdjup
Om du vill ändra ljudformatet använder SetSpeechSynthesisOutputFormat() du funktionen för SpeechConfig -objektet. Den här funktionen förväntar sig enum en av typen , som du använder för att välja SpeechSynthesisOutputFormat utdataformat. Se referensdokumenten för en lista över ljudformat som är tillgängliga.
Det finns olika alternativ för olika filtyper beroende på dina krav. Observera att råformat som t.ex. Raw24Khz16BitMonoPcm inte innehåller ljudrubriker per definition. Använd endast rådataformat när du vet att din nedströmsimplementering kan avkoda en rå bitström, eller om du planerar att manuellt skapa rubriker baserat på bitdjup, samplingshastighet, antal kanaler osv.
I det här exemplet anger du ett RIFF-format med hög återgivning Riff24Khz16BitMonoPcm genom att ange på SpeechSynthesisOutputFormat SpeechConfig -objektet. På liknande sätt som i exemplet i föregående avsnitt använder du för att hämta en minnes in memory-ström av resultatet och AudioDataStream sedan skriva den till en fil.
static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
config.SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);
using var synthesizer = new SpeechSynthesizer(config, null);
var result = await synthesizer.SpeakTextAsync("Customizing audio output format.");
using var stream = AudioDataStream.FromResult(result);
await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}
Om du kör programmet igen skriver du en .wav fil till den angivna sökvägen.
Använda SSML för att anpassa talegenskaper
Med Speech Synthesis Markup Language (SSML) kan du finjustera tonhöjd, uttal, talfrekvens, volym och mer av text till tal-utdata genom att skicka dina begäranden från ett XML-schema. I det här avsnittet visas ett exempel på hur du ändrar rösten, men en mer detaljerad guide finns i SSML-artikelnom instruktioner.
Om du vill börja använda SSML för anpassning gör du en enkel ändring som byter röst.
Skapa först en ny XML-fil för SSML-konfigurationsfilen i rotprojektkatalogen, i det här exemplet ssml.xml . Rotelementet är alltid <speak> , och genom att omsluta texten i ett element kan du ändra <voice> rösten med hjälp av name parametern . Se den fullständiga listan över neurala röster som stöds.
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-ChristopherNeural">
When you're on the freeway, it's a good idea to use a GPS.
</voice>
</speak>
Därefter måste du ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är i stort sett densamma, men i stället för SpeakTextAsync() att använda funktionen använder du SpeakSsmlAsync() . Den här funktionen förväntar sig en XML-sträng, så du läser först in din SSML-konfiguration som en sträng med hjälp av File.ReadAllText() . Här är resultatobjektet exakt detsamma som i föregående exempel.
Anteckning
Om du använder Visual Studio kommer byggkonfigurationen troligen inte att hitta XML-filen som standard. Åtgärda detta genom att högerklicka på XML-filen och välja Egenskaper. Ändra Skapa-åtgärd till Innehåll och ändra Kopiera till utdatakatalog till Kopiera alltid.
public static async Task SynthesizeAudioAsync()
{
var config = SpeechConfig.FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
using var synthesizer = new SpeechSynthesizer(config, null);
var ssml = File.ReadAllText("./ssml.xml");
var result = await synthesizer.SpeakSsmlAsync(ssml);
using var stream = AudioDataStream.FromResult(result);
await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}
Anteckning
Om du vill ändra rösten utan att använda SSML kan du ange egenskapen för SpeechConfig med hjälp av SpeechConfig.SpeechSynthesisVoiceName = "en-US-ChristopherNeural";
Hämta ansiktsställningshändelser
Tal kan vara ett bra sätt att driva animeringen av ansiktsuttryck. Visemes används ofta för att representera viktiga attityder i observerat tal, till exempel positionen för ansiktena, skaften och jaget när du producerar en viss fonem. Du kan prenumerera på viseme-händelsen i Speech SDK. Sedan kan du använda viseme-händelser för att animera ansiktet på ett tecken när talljud spelas upp. Lär dig hur du hämtar viseme-händelser.
I den här snabbstarten lär du dig vanliga designmönster för att göra text-till-tal-syntes med hjälp av Speech SDK. Du börjar med grundläggande konfiguration och syntes och går vidare till mer avancerade exempel för anpassad programutveckling, inklusive:
- Få svar som minnesbaserade strömmar
- Anpassa exempelfrekvens för utdata och bithastighet
- Skicka syntesbegäranden med hjälp av SSML (märkspråk för talsyntes)
- Använda neurala röster
Hoppa till exempel på GitHub
Om du vill hoppa direkt till exempelkoden kan du gå till C++-snabbstartsexempel på GitHub.
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Installera Speech SDK
Innan du kan göra något måste du installera Speech SDK. Följ anvisningarna nedan beroende på din plattform:
Importera beroenden
Om du vill köra exemplen i den här artikeln inkluderar du följande import- using och -instruktioner överst i skriptet.
#include <iostream>
#include <fstream>
#include <string>
#include <speechapi_cxx.h>
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Audio;
Skapa en talkonfiguration
Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechConfig . Den här klassen innehåller information om din prenumeration, till exempel din talnyckel och tillhörande plats/region, slutpunkt, värd eller auktoriseringstoken.
Anteckning
Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.
Det finns några sätt att initiera en SpeechConfig :
- Med en prenumeration: skicka in en nyckel och den associerade platsen/regionen.
- Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En nyckel eller auktoriseringstoken är valfri.
- Med en värd: skicka in en värdadress. En nyckel eller auktoriseringstoken är valfri.
- Med en auktoriseringstoken: skicka in en auktoriseringstoken och den associerade platsen/regionen.
I det här exemplet skapar du en med SpeechConfig hjälp av en prenumerationsnyckel och region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt. Du kan också skapa grundläggande exempelkod som ska användas för resten av den här artikeln, som du ändrar för olika anpassningar.
int wmain()
{
try
{
synthesizeSpeech();
}
catch (exception e)
{
cout << e.what();
}
return 0;
}
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}
Välja syntesspråk och röst
Azure Text till tal service stöder fler än 250 röster och över 70 språk och varianter.
Du kan hämta den fullständiga listaneller prova dem i text till tal-demo.
Ange språk eller röst för för SpeechConfig att matcha din indatatext och använd den önskade rösten.
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
// Note: if only language is set, the default voice of that language is chosen.
config->SetSpeechSynthesisLanguage("<your-synthesis-language>"); // e.g. "de-DE"
// The voice setting will overwrite language setting.
// The voice setting will not overwrite the voice element in input SSML.
config->SetSpeechSynthesisVoiceName("<your-wanted-voice>");
}
Syntetisera tal till en fil
Därefter skapar du ett -objekt som kör SpeechSynthesizer text-till-tal-konverteringar och -utdata till talare, filer eller andra utdataströmmar. accepterar som parameter objektet som skapades i föregående steg och ett SpeechSynthesizer SpeechConfig -objekt AudioConfig som anger hur utdataresultat ska hanteras.
Börja genom att skapa en AudioConfig för att automatiskt skriva utdata till en fil med hjälp av funktionen .wav FromWavFileOutput() .
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
}
Skapa sedan en instans av SpeechSynthesizer en och skicka objektet och objektet som config audioConfig params. Sedan är det lika enkelt att köra talsyntes och skriva till en fil som att SpeakTextAsync() köra med en textsträng.
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
auto audioConfig = AudioConfig::FromWavFileOutput("path/to/write/file.wav");
auto synthesizer = SpeechSynthesizer::FromConfig(config, audioConfig);
auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
}
Kör programmet så skrivs en .wav synteterad fil till den plats som du har angett. Det här är ett bra exempel på den mest grundläggande användningen, men härnäst ska du titta på att anpassa utdata och hantera utdatasvaret som en minnesanpassad dataström för att arbeta med anpassade scenarier.
Syntetisera till talarutdata
I vissa fall kanske du vill mata ut syntetiserat tal direkt till en talare. Det gör du genom att utelämna AudioConfig parametern när du skapar SpeechSynthesizer i exemplet ovan. Detta syntetiserar till den aktuella aktiva utdataenheten.
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
auto synthesizer = SpeechSynthesizer::FromConfig(config);
auto result = synthesizer->SpeakTextAsync("Synthesizing directly to speaker output.").get();
}
Hämta resultat som en minnes minnesström
För många scenarier i talprogramutveckling behöver du förmodligen resulterande ljuddata som en minnes minnesström i stället för att skriva direkt till en fil. På så sätt kan du skapa anpassade beteenden, inklusive:
- Abstrahera den resulterande bytematrisen som en sök-kan-ström för anpassade underordnade tjänster.
- Integrera resultatet med andra API:er eller tjänster.
- Ändra ljuddata, skriva
.wavanpassade rubriker osv.
Det är enkelt att göra den här ändringen från föregående exempel. Ta först bort AudioConfig , eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka sedan NULL för AudioConfig i SpeechSynthesizer konstruktorn.
Anteckning
Om du passerar för , i stället för att utelämna det som i exemplet med talarutdata ovan, spelas inte ljudet upp som standard på den NULL AudioConfig aktuella aktiva utdataenheten.
Den här gången sparar du resultatet i en SpeechSynthesisResult variabel. Get GetAudioData returnerar en byte [] av utdata. Du kan arbeta med byte [] detta manuellt eller använda klassen för att hantera den AudioDataStream minnesbaserade dataströmmen. I det här exemplet använder du AudioDataStream.FromResult() den statiska funktionen för att hämta en dataström från resultatet.
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
auto result = synthesizer->SpeakTextAsync("Getting the response as an in-memory stream.").get();
auto stream = AudioDataStream::FromResult(result);
}
Härifrån kan du implementera ett anpassat beteende med hjälp av det resulterande stream objektet.
Anpassa ljudformat
I följande avsnitt visas hur du anpassar attribut för ljudutdata, inklusive:
- Ljudfiltyp
- Samplingshastighet
- Bitdjup
Om du vill ändra ljudformatet använder SetSpeechSynthesisOutputFormat() du funktionen för SpeechConfig -objektet. Den här funktionen förväntar sig enum en av typen , som du använder för att välja SpeechSynthesisOutputFormat utdataformat. En lista över tillgängliga ljudformat finns i referensdokumenten.
Det finns olika alternativ för olika filtyper beroende på dina krav. Observera att råformat som t.ex. Raw24Khz16BitMonoPcm inte innehåller ljudrubriker per definition. Använd endast rådataformat när du vet att din nedströmsimplementering kan avkoda en rå bitström, eller om du planerar att manuellt skapa huvuden baserat på bitdjup, samplingshastighet, antal kanaler osv.
I det här exemplet anger du ett RIFF-format med hög återgivning Riff24Khz16BitMonoPcm genom att ange för SpeechSynthesisOutputFormat SpeechConfig -objektet. På samma sätt som i exemplet i föregående avsnitt använder du för att hämta en minneslik ström av resultatet och AudioDataStream sedan skriva den till en fil.
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
config->SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat::Riff24Khz16BitMonoPcm);
auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
auto result = synthesizer->SpeakTextAsync("A simple test to write to a file.").get();
auto stream = AudioDataStream::FromResult(result);
stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}
Om du kör programmet igen skriver du en .wav fil till den angivna sökvägen.
Anpassa talegenskaper med hjälp av SSML
Med Speech Synthesis Markup Language (SSML) kan du finjustera tonhöjd, uttal, talhastighet, volym och mer av text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten, men en mer detaljerad guide finns i SSML-artikelnom instruktioner.
Om du vill börja använda SSML för anpassning gör du en enkel ändring som växlar rösten.
Skapa först en ny XML-fil för SSML-konfigurationsfilen i rotprojektkatalogen, i det här exemplet ssml.xml . Rotelementet är alltid <speak> , och genom att omsluta texten i ett element kan du ändra <voice> rösten med hjälp av name parametern . Se den fullständiga listan över neurala röster som stöds.
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-ChristopherNeural">
When you're on the freeway, it's a good idea to use a GPS.
</voice>
</speak>
Därefter måste du ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är i stort sett densamma, men i stället för att SpeakTextAsync() använda funktionen använder du SpeakSsmlAsync() . Den här funktionen förväntar sig en XML-sträng, så du läser först in din SSML-konfiguration som en sträng. Härifrån är resultatobjektet exakt samma som i föregående exempel.
void synthesizeSpeech()
{
auto config = SpeechConfig::FromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
auto synthesizer = SpeechSynthesizer::FromConfig(config, NULL);
std::ifstream file("./ssml.xml");
std::string ssml, line;
while (std::getline(file, line))
{
ssml += line;
ssml.push_back('\n');
}
auto result = synthesizer->SpeakSsmlAsync(ssml).get();
auto stream = AudioDataStream::FromResult(result);
stream->SaveToWavFileAsync("path/to/write/file.wav").get();
}
Anteckning
Om du vill ändra rösten utan att använda SSML kan du ange egenskapen för SpeechConfig med hjälp av SpeechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")
Hämta ansiktsställningshändelser
Tal kan vara ett bra sätt att driva animeringen av ansiktsuttryck. Visemes används ofta för att representera nyckelpositioner i observerat tal, till exempel positionen för ansiktena, skaften och ansiktena när du producerar ett visst fonem. Du kan prenumerera på viseme-händelsen i Speech SDK. Sedan kan du använda viseme-händelser för att animera ansiktet på ett tecken när talljud spelas upp. Lär dig hur du hämtar viseme-händelser.
I den här snabbstarten lär du dig vanliga designmönster för att göra text-till-tal-syntes med hjälp av Speech SDK.
Gå vidare till exempel på GitHub
Om du vill hoppa direkt till exempelkoden kan du gå till Go-snabbstartsexempel på GitHub.
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Installera Speech SDK
Innan du kan göra något måste du installera Speech SDK för Go.
Text till tal till talare
Använd följande kodexempel för att köra talsyntes till din standardenhet för ljudutdata.
Ersätt variablerna subscription och med din region talnyckel och plats/region.
Om du kör skriptet visas din indatatext som standardtalare.
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/common"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func synthesizeStartedHandler(event speech.SpeechSynthesisEventArgs) {
defer event.Close()
fmt.Println("Synthesis started.")
}
func synthesizingHandler(event speech.SpeechSynthesisEventArgs) {
defer event.Close()
fmt.Printf("Synthesizing, audio chunk size %d.\n", len(event.Result.AudioData))
}
func synthesizedHandler(event speech.SpeechSynthesisEventArgs) {
defer event.Close()
fmt.Printf("Synthesized, audio length %d.\n", len(event.Result.AudioData))
}
func cancelledHandler(event speech.SpeechSynthesisEventArgs) {
defer event.Close()
fmt.Println("Received a cancellation.")
}
func main() {
subscription := "<paste-your-speech-key-here>"
region := "<paste-your-speech-location/region-here>"
audioConfig, err := audio.NewAudioConfigFromDefaultSpeakerOutput()
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer audioConfig.Close()
config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer config.Close()
speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(config, audioConfig)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer speechSynthesizer.Close()
speechSynthesizer.SynthesisStarted(synthesizeStartedHandler)
speechSynthesizer.Synthesizing(synthesizingHandler)
speechSynthesizer.SynthesisCompleted(synthesizedHandler)
speechSynthesizer.SynthesisCanceled(cancelledHandler)
for {
fmt.Printf("Enter some text that you want to speak, or enter empty text to exit.\n> ")
text, _ := bufio.NewReader(os.Stdin).ReadString('\n')
text = strings.TrimSuffix(text, "\n")
if len(text) == 0 {
break
}
task := speechSynthesizer.SpeakTextAsync(text)
var outcome speech.SpeechSynthesisOutcome
select {
case outcome = <-task:
case <-time.After(60 * time.Second):
fmt.Println("Timed out")
return
}
defer outcome.Close()
if outcome.Error != nil {
fmt.Println("Got an error: ", outcome.Error)
return
}
if outcome.Result.Reason == common.SynthesizingAudioCompleted {
fmt.Printf("Speech synthesized to speaker for text [%s].\n", text)
} else {
cancellation, _ := speech.NewCancellationDetailsFromSpeechSynthesisResult(outcome.Result)
fmt.Printf("CANCELED: Reason=%d.\n", cancellation.Reason)
if cancellation.Reason == common.Error {
fmt.Printf("CANCELED: ErrorCode=%d\nCANCELED: ErrorDetails=[%s]\nCANCELED: Did you update the subscription info?\n",
cancellation.ErrorCode,
cancellation.ErrorDetails)
}
}
}
}
Kör följande kommandon för att skapa en go.mod fil som länkar till komponenter som finns på GitHub.
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Skapa och kör nu koden.
go build
go run quickstart
Se referensdokumenten för detaljerad information om SpeechConfig SpeechSynthesizer klasserna och .
Text till tal till minnes minnesström
För många scenarier i talprogramutveckling behöver du förmodligen resulterande ljuddata som en minnes minnesström i stället för att skriva direkt till en fil. På så sätt kan du skapa anpassade beteenden, inklusive:
- Abstrahera den resulterande bytematrisen som en sök-kan-ström för anpassade underordnade tjänster.
- Integrera resultatet med andra API:er eller tjänster.
- Ändra ljuddata, skriva
.wavanpassade rubriker osv.
Det är enkelt att göra den här ändringen från föregående exempel. Ta först bort AudioConfig , eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka sedan nil för AudioConfig i SpeechSynthesizer konstruktorn.
Anteckning
Om du passerar för , i stället för att utelämna det som i exemplet med talarutdata ovan, spelas inte ljudet upp som standard på den nil AudioConfig aktuella aktiva utdataenheten.
Den här gången sparar du resultatet i en SpeechSynthesisResult variabel.
Egenskapen AudioData returnerar en []byte av utdata. Du kan arbeta med []byte detta manuellt eller använda klassen för att hantera den AudioDataStream minnesbaserade dataströmmen.
I det här exemplet använder du den NewAudioDataStreamFromSpeechSynthesisResult() statiska funktionen för att hämta en dataström från resultatet.
Ersätt variablerna subscription och med din region talnyckel och plats/region.
package main
import (
"bufio"
"fmt"
"io"
"os"
"strings"
"time"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func main(subscription string, region string) {
subscription := "<paste-your-speech-key-here>"
region := "<paste-your-speech-location/region-here>"
config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer config.Close()
speechSynthesizer, err := speech.NewSpeechSynthesizerFromConfig(config, nil)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer speechSynthesizer.Close()
speechSynthesizer.SynthesisStarted(synthesizeStartedHandler)
speechSynthesizer.Synthesizing(synthesizingHandler)
speechSynthesizer.SynthesisCompleted(synthesizedHandler)
speechSynthesizer.SynthesisCanceled(cancelledHandler)
for {
fmt.Printf("Enter some text that you want to speak, or enter empty text to exit.\n> ")
text, _ := bufio.NewReader(os.Stdin).ReadString('\n')
text = strings.TrimSuffix(text, "\n")
if len(text) == 0 {
break
}
// StartSpeakingTextAsync sends the result to channel when the synthesis starts.
task := speechSynthesizer.StartSpeakingTextAsync(text)
var outcome speech.SpeechSynthesisOutcome
select {
case outcome = <-task:
case <-time.After(60 * time.Second):
fmt.Println("Timed out")
return
}
defer outcome.Close()
if outcome.Error != nil {
fmt.Println("Got an error: ", outcome.Error)
return
}
// in most case we want to streaming receive the audio to lower the latency,
// we can use AudioDataStream to do so.
stream, err := speech.NewAudioDataStreamFromSpeechSynthesisResult(outcome.Result)
defer stream.Close()
if err != nil {
fmt.Println("Got an error: ", err)
return
}
var all_audio []byte
audio_chunk := make([]byte, 2048)
for {
n, err := stream.Read(audio_chunk)
if err == io.EOF {
break
}
all_audio = append(all_audio, audio_chunk[:n]...)
}
fmt.Printf("Read [%d] bytes from audio data stream.\n", len(all_audio))
}
}
Kör följande kommandon för att skapa en go.mod fil som länkar till komponenter som finns på GitHub.
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Skapa och kör nu koden.
go build
go run quickstart
Se referensdokumenten för detaljerad information om SpeechConfig SpeechSynthesizer klasserna och .
Använda SSML för att anpassa talegenskaper
Med Speech Synthesis Markup Language (SSML) kan du finjustera tonhöjd, uttal, talhastighet, volym och mer av text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten, men en mer detaljerad guide finns i SSML-artikelnom instruktioner.
Om du vill börja använda SSML för anpassning gör du en enkel ändring som växlar rösten.
Skapa först en ny XML-fil för SSML-konfigurationsfilen i rotprojektkatalogen, i det här exemplet ssml.xml . Rotelementet är alltid <speak> , och genom att omsluta texten i ett element kan du ändra <voice> rösten med hjälp av name parametern . Se den fullständiga listan över neurala röster som stöds.
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-ChristopherNeural">
When you're on the freeway, it's a good idea to use a GPS.
</voice>
</speak>
Därefter måste du ändra begäran om talsyntes så att den refererar till XML-filen.
Begäran är i stort sett densamma, men i stället för att SpeakTextAsync() använda funktionen använder du SpeakSsmlAsync() . Den här funktionen förväntar sig en XML-sträng, så du läser först in din SSML-konfiguration som en sträng. Härifrån är resultatobjektet exakt samma som i föregående exempel.
Anteckning
Om du vill ändra rösten utan att använda SSML kan du ange egenskapen för SpeechConfig med hjälp av speechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")
Hämta ansiktsställningshändelser
Tal kan vara ett bra sätt att driva animeringen av ansiktsuttryck. Visemes används ofta för att representera nyckelpositioner i observerat tal, till exempel positionen för ansiktena, skaften och ansiktena när du producerar ett visst fonem. Du kan prenumerera på viseme-händelsen i Speech SDK. Sedan kan du använda viseme-händelser för att animera ansiktet på ett tecken när talljud spelas upp. Lär dig hur du hämtar viseme-händelser.
I den här snabbstarten lär du dig vanliga designmönster för att göra text-till-tal-syntes med hjälp av Speech SDK. Du börjar med grundläggande konfiguration och syntes och går vidare till mer avancerade exempel för anpassad programutveckling, inklusive:
- Få svar som minnesbaserade strömmar
- Anpassa exempelfrekvens för utdata och bithastighet
- Skicka syntesbegäranden med hjälp av SSML (märkspråk för talsyntes)
- Använda neurala röster
Hoppa till exempel på GitHub
Om du vill hoppa direkt till exempelkoden kan du gå till Snabbstartsexempel för Java på GitHub.
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Installera Speech SDK
Innan du kan göra något måste du installera Speech SDK. Följ anvisningarna nedan beroende på din plattform:
Importera beroenden
Om du vill köra exemplen i den här artikeln inkluderar du följande importutdrag överst i skriptet.
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;
Skapa en talkonfiguration
Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechConfig . Den här klassen innehåller information om din prenumeration, till exempel din talnyckel och tillhörande plats/region, slutpunkt, värd eller auktoriseringstoken.
Anteckning
Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.
Det finns några sätt att initiera en SpeechConfig :
- Med en prenumeration: skicka in en talnyckel och den associerade platsen/regionen.
- Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En talnyckel eller auktoriseringstoken är valfri.
- Med en värd: skicka in en värdadress. En talnyckel eller auktoriseringstoken är valfri.
- Med en auktoriseringstoken: skicka in en auktoriseringstoken och den associerade platsen/regionen.
I det här exemplet skapar du en med SpeechConfig hjälp av en talnyckel och plats/region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt. Du kan också skapa grundläggande exempelkod som ska användas för resten av den här artikeln, som du ändrar för olika anpassningar.
public class Program
{
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}
}
Välja syntesspråk och röst
Azure Text till tal service stöder fler än 250 röster och över 70 språk och varianter.
Du kan hämta den fullständiga listaneller prova dem i text till tal-demo.
Ange språk eller röst för för SpeechConfig att matcha din indatatext och använd den önskade rösten.
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
// Note: if only language is set, the default voice of that language is chosen.
config.setSpeechSynthesisLanguage("<your-synthesis-language>"); // e.g. "de-DE"
// The voice setting will overwrite language setting.
// The voice setting will not overwrite the voice element in input SSML.
config.setSpeechSynthesisVoiceName("<your-wanted-voice>");
}
Syntetisera tal till en fil
Därefter skapar du ett -objekt som kör SpeechSynthesizer text-till-tal-konverteringar och -utdata till talare, filer eller andra utdataströmmar. accepterar som parameter objektet som skapades i föregående steg och ett SpeechSynthesizer SpeechConfig -objekt AudioConfig som anger hur utdataresultat ska hanteras.
Börja genom att skapa en AudioConfig för att automatiskt skriva utdata till en fil med hjälp av den .wav fromWavFileOutput() statiska funktionen.
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
}
Sedan instansierar du SpeechSynthesizer ett objekt och objektet som speechConfig audioConfig params. Sedan är det lika enkelt att köra talsyntes och skriva till en fil som att SpeakText() köra med en textsträng.
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
AudioConfig audioConfig = AudioConfig.fromWavFileOutput("path/to/write/file.wav");
SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
synthesizer.SpeakText("A simple test to write to a file.");
}
Kör programmet så skrivs en synteterad .wav fil till den plats som du har angett. Det här är ett bra exempel på den mest grundläggande användningen, men härnäst ska du titta på att anpassa utdata och hantera utdatasvaret som en minnesanpassad dataström för att arbeta med anpassade scenarier.
Syntetisera till talarutdata
I vissa fall kanske du vill mata ut syntetiserat tal direkt till en talare. Det gör du genom att instansiera AudioConfig med hjälp av den fromDefaultSpeakerOutput() statiska funktionen. Detta matar ut till den aktuella aktiva utdataenheten.
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
AudioConfig audioConfig = AudioConfig.fromDefaultSpeakerOutput();
SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
synthesizer.SpeakText("Synthesizing directly to speaker output.");
}
Hämta resultat som en minnes minnesström
För många scenarier i talprogramutveckling behöver du förmodligen resulterande ljuddata som en minnes minnesström i stället för att skriva direkt till en fil. På så sätt kan du skapa anpassade beteenden, inklusive:
- Abstrahera den resulterande bytematrisen som en sök-kan-ström för anpassade underordnade tjänster.
- Integrera resultatet med andra API:er eller tjänster.
- Ändra ljuddata, skriva
.wavanpassade rubriker osv.
Det är enkelt att göra den här ändringen från föregående exempel. Ta först bort AudioConfig blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka sedan null för AudioConfig i SpeechSynthesizer konstruktorn.
Anteckning
Om du passerar för , i stället för att utelämna det som i exemplet med talarutdata ovan, spelas inte ljudet upp som standard på den null AudioConfig aktuella aktiva utdataenheten.
Den här gången sparar du resultatet i en SpeechSynthesisResult variabel. Funktionen SpeechSynthesisResult.getAudioData() returnerar en byte [] av utdata. Du kan arbeta med byte [] detta manuellt eller använda klassen för att hantera den AudioDataStream minnesbaserade dataströmmen. I det här exemplet använder du AudioDataStream.fromResult() den statiska funktionen för att hämta en dataström från resultatet.
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
SpeechSynthesisResult result = synthesizer.SpeakText("Getting the response as an in-memory stream.");
AudioDataStream stream = AudioDataStream.fromResult(result);
System.out.print(stream.getStatus());
}
Härifrån kan du implementera anpassade beteenden med hjälp av det resulterande stream objektet.
Anpassa ljudformat
I följande avsnitt visas hur du anpassar attribut för ljudutdata, inklusive:
- Ljudfiltyp
- Samplingshastighet
- Bitdjup
Om du vill ändra ljudformatet använder setSpeechSynthesisOutputFormat() du funktionen för SpeechConfig -objektet. Den här funktionen förväntar sig enum en av typen , som du använder för att välja SpeechSynthesisOutputFormat utdataformat. En lista över tillgängliga ljudformat finns i referensdokumenten.
Det finns olika alternativ för olika filtyper beroende på dina krav. Observera att råformat som t.ex. Raw24Khz16BitMonoPcm inte innehåller ljudrubriker per definition. Använd endast rådataformat när du vet att din nedströmsimplementering kan avkoda en rå bitström, eller om du planerar att manuellt skapa huvuden baserat på bitdjup, samplingshastighet, antal kanaler osv.
I det här exemplet anger du ett RIFF-format med hög återgivning Riff24Khz16BitMonoPcm genom att ange för SpeechSynthesisOutputFormat SpeechConfig -objektet. På samma sätt som i exemplet i föregående avsnitt använder du för att hämta en minneslik ström av resultatet och AudioDataStream sedan skriva den till en fil.
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
// set the output format
speechConfig.setSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);
SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
SpeechSynthesisResult result = synthesizer.SpeakText("Customizing audio output format.");
AudioDataStream stream = AudioDataStream.fromResult(result);
stream.saveToWavFile("path/to/write/file.wav");
}
Om du kör programmet igen skriver du en .wav fil till den angivna sökvägen.
Anpassa talegenskaper med hjälp av SSML
Med Speech Synthesis Markup Language (SSML) kan du finjustera tonhöjd, uttal, talhastighet, volym och mer av text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten, men en mer detaljerad guide finns i SSML-artikelnom instruktioner.
Om du vill börja använda SSML för anpassning gör du en enkel ändring som växlar rösten.
Skapa först en ny XML-fil för SSML-konfigurationsfilen i rotprojektkatalogen, i det här exemplet ssml.xml . Rotelementet är alltid <speak> , och genom att omsluta texten i ett element kan du ändra <voice> rösten med hjälp av name parametern . Se den fullständiga listan över neurala röster som stöds.
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-ChristopherNeural">
When you're on the freeway, it's a good idea to use a GPS.
</voice>
</speak>
Därefter måste du ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är i stort sett densamma, men i stället för att SpeakText() använda funktionen använder du SpeakSsml() . Den här funktionen förväntar sig en XML-sträng, så först skapar du en funktion för att läsa in en XML-fil och returnera den som en sträng.
private static String xmlToString(String filePath) {
File file = new File(filePath);
StringBuilder fileContents = new StringBuilder((int)file.length());
try (Scanner scanner = new Scanner(file)) {
while(scanner.hasNextLine()) {
fileContents.append(scanner.nextLine() + System.lineSeparator());
}
return fileContents.toString().trim();
} catch (FileNotFoundException ex) {
return "File not found.";
}
}
Härifrån är resultatobjektet exakt samma som i föregående exempel.
public static void main(String[] args) {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
String ssml = xmlToString("ssml.xml");
SpeechSynthesisResult result = synthesizer.SpeakSsml(ssml);
AudioDataStream stream = AudioDataStream.fromResult(result);
stream.saveToWavFile("path/to/write/file.wav");
}
Anteckning
Om du vill ändra rösten utan att använda SSML kan du ange egenskapen för SpeechConfig med hjälp av SpeechConfig.setSpeechSynthesisVoiceName("en-US-ChristopherNeural");
Hämta ansiktsställningshändelser
Tal kan vara ett bra sätt att driva animeringen av ansiktsuttryck. Visemes används ofta för att representera nyckelpositioner i observerat tal, till exempel positionen för ansiktena, skaften och ansiktena när du producerar ett visst fonem. Du kan prenumerera på viseme-händelser i Speech SDK för att hämta ansiktsanimeringsdata och sedan tillämpa data på ett tecken under ansiktsanimeringen. Lär dig hur du hämtar viseme-händelser.
I den här snabbstarten lär du dig vanliga designmönster för att göra text-till-tal-syntes med hjälp av Speech SDK. Du börjar med grundläggande konfiguration och syntes och går vidare till mer avancerade exempel för anpassad programutveckling, inklusive:
- Få svar som minnesbaserade strömmar
- Anpassa exempelfrekvens för utdata och bithastighet
- Skicka syntesbegäranden med hjälp av SSML (märkspråk för talsyntes)
- Använda neurala röster
Gå vidare till exempel på GitHub
Om du vill hoppa direkt till exempelkoden kan du gå till Snabbstartsexempel för JavaScript på GitHub.
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en Speech Service-resurs. Om du inte har något konto och en resurs kan du prova Speech-tjänsten utan kostnad.
Installera Speech SDK
Innan du kan göra något måste du installera Speech SDK för JavaScript. Följ anvisningarna nedan beroende på din plattform:
Beroende på målmiljön kan du dessutom använda något av följande:
Ladda ned och extrahera Speech SDK för JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js och placera den i en mapp som är tillgänglig för HTML-filen.
<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;
Tips
Om du riktar in dig på en webbläsare och använder <script> taggen sdk behövs inte prefixet . Prefixet sdk är ett alias som används för att namnge require modulen.
Skapa en talkonfiguration
Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechConfig . Den här klassen innehåller information om din resurs, till exempel din talnyckel och tillhörande plats/region, slutpunkt, värd eller auktoriseringstoken.
Anteckning
Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.
Det finns några sätt att initiera en SpeechConfig :
- Med en resurs: skicka in en talnyckel och den associerade platsen/regionen.
- Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En talnyckel eller auktoriseringstoken är valfri.
- Med en värd: skicka in en värdadress. En talnyckel eller auktoriseringstoken är valfri.
- Med en auktoriseringstoken: skicka in en auktoriseringstoken och den associerade platsen/regionen.
I det här exemplet skapar du en med SpeechConfig hjälp av en talnyckel och plats/region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt. Du kan också skapa grundläggande exempelkod som ska användas för resten av den här artikeln, som du ändrar för olika anpassningar.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}
synthesizeSpeech();
Välja syntesspråk och röst
Azure Text till tal service stöder fler än 250 röster och över 70 språk och varianter.
Du kan hämta den fullständiga listaneller prova dem i text till tal-demo.
Ange språk eller röst för för SpeechConfig att matcha din indatatext och använd den önskade rösten.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
// Note: if only language is set, the default voice of that language is chosen.
speechConfig.speechSynthesisLanguage = "<your-synthesis-language>"; // e.g. "de-DE"
// The voice setting will overwrite language setting.
// The voice setting will not overwrite the voice element in input SSML.
speechConfig.speechSynthesisVoiceName = "<your-wanted-voice>";
}
synthesizeSpeech();
Syntetisera tal till en fil
Därefter skapar du ett -objekt som kör SpeechSynthesizer text-till-tal-konverteringar och -utdata till talare, filer eller andra utdataströmmar. accepterar som parameter objektet som skapades i föregående steg och ett SpeechSynthesizer SpeechConfig -objekt AudioConfig som anger hur utdataresultat ska hanteras.
Börja genom att skapa en AudioConfig för att automatiskt skriva utdata till en fil med hjälp av den .wav fromAudioFileOutput() statiska funktionen.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
const audioConfig = sdk.AudioConfig.fromAudioFileOutput("path/to/file.wav");
}
Sedan instansierar du SpeechSynthesizer ett objekt och objektet som speechConfig audioConfig params. Sedan är det lika enkelt att köra talsyntes och skriva till en fil som speakTextAsync() att köra med en textsträng. Återanropet av resultatet är i själva verket ett bra ställe att anropa – det här anropet behövs synthesizer.close() för att syntesen ska fungera korrekt.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
const audioConfig = sdk.AudioConfig.fromAudioFileOutput("path-to-file.wav");
const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
synthesizer.speakTextAsync(
"A simple test to write to a file.",
result => {
synthesizer.close();
if (result) {
// return result as stream
return fs.createReadStream("path-to-file.wav");
}
},
error => {
console.log(error);
synthesizer.close();
});
}
Kör programmet så skrivs en .wav synteterad fil till den plats som du har angett. Det här är ett bra exempel på den mest grundläggande användningen, men härnäst ska du titta på att anpassa utdata och hantera utdatasvaret som en minnesanpassad dataström för att arbeta med anpassade scenarier.
Syntetisera till talarutdata (endast webbläsare)
I vissa fall kanske du vill mata ut syntetiserat tal direkt till en talare. Det gör du genom att instansiera AudioConfig med hjälp av den fromDefaultSpeakerOutput() statiska funktionen. Detta matar ut till den aktuella aktiva utdataenheten.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
const audioConfig = sdk.AudioConfig.fromDefaultSpeakerOutput();
const synthesizer = new SpeechSynthesizer(speechConfig, audioConfig);
synthesizer.speakTextAsync(
"Synthesizing directly to speaker output.",
result => {
if (result) {
synthesizer.close();
return result.audioData;
}
},
error => {
console.log(error);
synthesizer.close();
});
}
Hämta resultat som en minnes minnesström
För många scenarier i talprogramutveckling behöver du förmodligen resulterande ljuddata som en minnes minnesström i stället för att skriva direkt till en fil. På så sätt kan du skapa anpassade beteenden, inklusive:
- Abstrahera den resulterande bytematrisen som en sök-kan-ström för anpassade underordnade tjänster.
- Integrera resultatet med andra API:er eller tjänster.
- Ändra ljuddata, skriva
.wavanpassade rubriker osv.
Det är enkelt att göra den här ändringen från föregående exempel. Ta först bort AudioConfig blocket eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka sedan undefined för AudioConfig i SpeechSynthesizer konstruktorn.
Anteckning
Om du passerar för , i stället för att utelämna det som i exemplet med talarutdata ovan, spelas inte ljudet upp som standard på den undefined AudioConfig aktuella aktiva utdataenheten.
Den här gången sparar du resultatet i en SpeechSynthesisResult variabel. Egenskapen SpeechSynthesisResult.audioData returnerar en ArrayBuffer av utdata, som är standardtypen för webbläsarströmmen. För serverkod konverterar du arrayBuffer till en buffertström.
Följande kod fungerar för kod på klientsidan.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
const synthesizer = new sdk.SpeechSynthesizer(speechConfig);
synthesizer.speakTextAsync(
"Getting the response as an in-memory stream.",
result => {
synthesizer.close();
return result.audioData;
},
error => {
console.log(error);
synthesizer.close();
});
}
Härifrån kan du implementera ett anpassat beteende med hjälp av det resulterande ArrayBuffer objektet. ArrayBuffer är en vanlig typ att ta emot i en webbläsare och spela upp från det här formatet.
Om du behöver arbeta med data som en dataström för valfri serverbaserad kod måste du konvertera objektet till en dataström i stället för en ArrayBuffer.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
const synthesizer = new sdk.SpeechSynthesizer(speechConfig);
synthesizer.speakTextAsync(
"Getting the response as an in-memory stream.",
result => {
const { audioData } = result;
synthesizer.close();
// convert arrayBuffer to stream
// return stream
const bufferStream = new PassThrough();
bufferStream.end(Buffer.from(audioData));
return bufferStream;
},
error => {
console.log(error);
synthesizer.close();
});
}
Anpassa ljudformat
I följande avsnitt visas hur du anpassar attribut för ljudutdata, inklusive:
- Ljudfiltyp
- Samplingshastighet
- Bitdjup
Om du vill ändra ljudformatet använder speechSynthesisOutputFormat du -egenskapen för SpeechConfig -objektet. Den här egenskapen förväntar sig enum en av typen , som du använder för att välja SpeechSynthesisOutputFormat utdataformat. En lista över tillgängliga ljudformat finns i referensdokumenten.
Det finns olika alternativ för olika filtyper beroende på dina krav. Observera att råformat som t.ex. Raw24Khz16BitMonoPcm inte innehåller ljudrubriker per definition. Använd endast rådataformat när du vet att din nedströmsimplementering kan avkoda en rå bitström, eller om du planerar att manuellt skapa huvuden baserat på bitdjup, samplingshastighet, antal kanaler osv.
I det här exemplet anger du ett RIFF-format med hög återgivning Riff24Khz16BitMonoPcm genom att ange för speechSynthesisOutputFormat SpeechConfig -objektet. På ett liknande sätt som i exemplet i föregående avsnitt hämtar du ArrayBuffer ljuddata och interagerar med dem.
function synthesizeSpeech() {
const speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
// Set the output format
speechConfig.speechSynthesisOutputFormat = SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm;
const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);
synthesizer.speakTextAsync(
"Customizing audio output format.",
result => {
// Interact with the audio ArrayBuffer data
const audioData = result.audioData;
console.log(`Audio data byte size: ${audioData.byteLength}.`)
synthesizer.close();
},
error => {
console.log(error);
synthesizer.close();
});
}
Om du kör programmet igen skriver du en .wav fil till den angivna sökvägen.
Anpassa talegenskaper med hjälp av SSML
Med Speech Synthesis Markup Language (SSML) kan du finjustera tonhöjd, uttal, talhastighet, volym och mer av text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten, men en mer detaljerad guide finns i SSML-artikelnom instruktioner.
Om du vill börja använda SSML för anpassning gör du en enkel ändring som växlar rösten.
Skapa först en ny XML-fil för SSML-konfigurationsfilen i rotprojektkatalogen, i det här exemplet ssml.xml . Rotelementet är alltid <speak> , och genom att omsluta texten i ett element kan du ändra <voice> rösten med hjälp av name parametern . Se den fullständiga listan över neurala röster som stöds.
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-ChristopherNeural">
When you're on the freeway, it's a good idea to use a GPS.
</voice>
</speak>
Därefter måste du ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är i stort sett densamma, men i stället för att speakTextAsync() använda funktionen använder du speakSsmlAsync() . Den här funktionen förväntar sig en XML-sträng, så först skapar du en funktion för att läsa in en XML-fil och returnera den som en sträng.
function xmlToString(filePath) {
const xml = readFileSync(filePath, "utf8");
return xml;
}
Mer information om readFileSync finns i Node.js filsystem. Härifrån är resultatobjektet exakt samma som i föregående exempel.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
const synthesizer = new sdk.SpeechSynthesizer(speechConfig, undefined);
const ssml = xmlToString("ssml.xml");
synthesizer.speakSsmlAsync(
ssml,
result => {
if (result.errorDetails) {
console.error(result.errorDetails);
} else {
console.log(JSON.stringify(result));
}
synthesizer.close();
},
error => {
console.log(error);
synthesizer.close();
});
}
Anteckning
Om du vill ändra rösten utan att använda SSML kan du ange egenskapen för SpeechConfig med hjälp av SpeechConfig.speechSynthesisVoiceName = "en-US-ChristopherNeural";
Hämta ansiktsställningshändelser
Tal kan vara ett bra sätt att driva animeringen av ansiktsuttryck. Visemes används ofta för att representera nyckelpositioner i observerat tal, till exempel positionen för ansiktena, skaften och ansiktena när du producerar ett visst fonem. Du kan prenumerera på viseme-händelsen i Speech SDK. Sedan kan du använda viseme-händelser för att animera ansiktet på ett tecken när talljud spelas upp. Lär dig hur du hämtar viseme-händelser.
Du kan syntetisera tal från text med hjälp av Speech SDK för Swift och Objective-C.
Förutsättningar
I följande exempel förutsätts att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Installera Speech SDK och exempel
Den Cognitive Services Speech SDK innehåller exempel skrivna i Swift och Objective-C för iOS och Mac. Klicka på en länk om du vill se installationsanvisningar för varje exempel:
- Syntetisera tal i Objective-C på macOS
- Syntetisera tal i Swift på macOS
- Syntetisera tal i Objective-C på iOS
- Syntetisera tal i Swift på iOS
- Ytterligare exempel för Objective-C på iOS
Vi tillhandahåller också en Speech SDK online för Objective-C-referens.
I den här snabbstarten lär du dig vanliga designmönster för att göra text-till-tal-syntes med hjälp av Speech SDK. Du börjar med grundläggande konfiguration och syntes och går vidare till mer avancerade exempel för anpassad programutveckling, inklusive:
- Få svar som minnesbaserade strömmar
- Anpassa exempelfrekvens för utdata och bithastighet
- Skicka syntesbegäranden med hjälp av SSML (märkspråk för talsyntes)
- Använda neurala röster
Hoppa till exempel på GitHub
Om du vill hoppa direkt till exempelkoden kan du gå till Snabbstartsexempel för Python på GitHub.
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Installera Speech SDK
Innan du kan göra något måste du installera Speech SDK.
pip install azure-cognitiveservices-speech
Om du använder macOS och får installationsproblem kan du behöva köra det här kommandot först.
python3 -m pip install --upgrade pip
När Speech SDK har installerats inkluderar du följande importutdrag överst i skriptet.
from azure.cognitiveservices.speech import AudioDataStream, SpeechConfig, SpeechSynthesizer, SpeechSynthesisOutputFormat
from azure.cognitiveservices.speech.audio import AudioOutputConfig
Skapa en talkonfiguration
Om du vill anropa Speech-tjänsten med hjälp av Speech SDK måste du skapa en SpeechConfig . Den här klassen innehåller information om din prenumeration, till exempel din talnyckel och tillhörande plats/region, slutpunkt, värd eller auktoriseringstoken.
Anteckning
Oavsett om du utför taligenkänning, talsyntes, översättning eller avsiktsigenkänning skapar du alltid en konfiguration.
Det finns några sätt att initiera en SpeechConfig :
- Med en prenumeration: skicka in en talnyckel och den associerade platsen/regionen.
- Med en slutpunkt: skicka in en speech-tjänstslutpunkt. En talnyckel eller auktoriseringstoken är valfri.
- Med en värd: skicka in en värdadress. En talnyckel eller auktoriseringstoken är valfri.
- Med en auktoriseringstoken: skicka in en auktoriseringstoken och den associerade platsen/regionen.
I det här exemplet skapar du en med SpeechConfig hjälp av en talnyckel och plats/region. Hämta dessa autentiseringsuppgifter genom att följa stegen i Prova Speech-tjänsten kostnadsfritt.
speech_config = SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")
Välja syntesspråk och röst
Azure Text till tal service stöder fler än 250 röster och över 70 språk och varianter.
Du kan hämta den fullständiga listaneller prova dem i text till tal-demo.
Ange språk eller röst för för SpeechConfig att matcha din indatatext och använd den önskade rösten.
# Note: if only language is set, the default voice of that language is chosen.
speech_config.speech_synthesis_language = "<your-synthesis-language>" # e.g. "de-DE"
# The voice setting will overwrite language setting.
# The voice setting will not overwrite the voice element in input SSML.
speech_config.speech_synthesis_voice_name ="<your-wanted-voice>"
Syntetisera tal till en fil
Därefter skapar du ett -objekt som kör SpeechSynthesizer text-till-tal-konverteringar och -utdata till talare, filer eller andra utdataströmmar. accepterar som parameter objektet som skapades i föregående steg och ett SpeechSynthesizer SpeechConfig -objekt AudioOutputConfig som anger hur utdataresultat ska hanteras.
Börja genom att skapa en AudioOutputConfig för att automatiskt skriva utdata till en fil med hjälp av .wav filename konstruktorparamen.
audio_config = AudioOutputConfig(filename="path/to/write/file.wav")
Skapa sedan en instans SpeechSynthesizer av ett genom att skicka objektet och objektet som speech_config audio_config params. Sedan är det lika enkelt att köra talsyntes och skriva till en fil som att speak_text_async() köra med en textsträng.
synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
synthesizer.speak_text_async("A simple test to write to a file.")
Kör programmet så skrivs en synteterad .wav fil till den plats som du har angett. Det här är ett bra exempel på den mest grundläggande användningen, men härnäst ska du titta på att anpassa utdata och hantera utdatasvaret som en minnesanpassad dataström för att arbeta med anpassade scenarier.
Syntetisera till talarutdata
I vissa fall kanske du vill mata ut syntetiserat tal direkt till en talare. Det gör du genom att använda exemplet i föregående avsnitt, men ändra genom AudioOutputConfig att ta filename bort parametern och ange use_default_speaker=True . Detta matar ut till den aktuella aktiva utdataenheten.
audio_config = AudioOutputConfig(use_default_speaker=True)
Hämta resultat som en minnes minnesström
För många scenarier i talprogramutveckling behöver du förmodligen resulterande ljuddata som en minnes minnesström i stället för att skriva direkt till en fil. På så sätt kan du skapa anpassade beteenden, inklusive:
- Abstrahera den resulterande bytematrisen som en sök-kan-ström för anpassade underordnade tjänster.
- Integrera resultatet med andra API:er eller tjänster.
- Ändra ljuddata, skriva
.wavanpassade rubriker osv.
Det är enkelt att göra den här ändringen från föregående exempel. Ta först bort AudioConfig , eftersom du hanterar utdatabeteendet manuellt från och med nu för ökad kontroll. Skicka sedan None för AudioConfig i SpeechSynthesizer konstruktorn.
Anteckning
Om du passerar för , i stället för att utelämna det som i exemplet med talarutdata ovan, spelas inte ljudet upp som standard på den None AudioConfig aktuella aktiva utdataenheten.
Den här gången sparar du resultatet i en SpeechSynthesisResult variabel. Egenskapen audio_data innehåller ett objekt för bytes utdata. Du kan arbeta med det här objektet manuellt eller använda klassen AudioDataStream för att hantera den minnesbaserade dataströmmen. I det här exemplet använder du AudioDataStream konstruktorn för att hämta en dataström från resultatet.
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)
Härifrån kan du implementera anpassade beteenden med hjälp av det resulterande stream objektet.
Anpassa ljudformat
I följande avsnitt visas hur du anpassar attribut för ljudutdata, inklusive:
- Ljudfiltyp
- Samplingshastighet
- Bitdjup
Om du vill ändra ljudformatet använder set_speech_synthesis_output_format() du funktionen för SpeechConfig -objektet. Den här funktionen förväntar sig enum en av typen , som du använder för att välja SpeechSynthesisOutputFormat utdataformat. En lista över tillgängliga ljudformat finns i referensdokumenten.
Det finns olika alternativ för olika filtyper beroende på dina krav. Observera att råformat som t.ex. Raw24Khz16BitMonoPcm inte innehåller ljudrubriker per definition. Använd endast rådataformat när du vet att din nedströmsimplementering kan avkoda en rå bitström, eller om du planerar att manuellt skapa huvuden baserat på bitdjup, samplingshastighet, antal kanaler osv.
I det här exemplet anger du ett RIFF-format med hög återgivning Riff24Khz16BitMonoPcm genom att ange för SpeechSynthesisOutputFormat SpeechConfig -objektet. På samma sätt som i exemplet i föregående avsnitt använder du för att hämta en minnes minneslik ström av resultatet och AudioDataStream sedan skriva den till en fil.
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")
Om du kör programmet igen skriver du en anpassad .wav fil till den angivna sökvägen.
Använda SSML för att anpassa talegenskaper
Med Speech Synthesis Markup Language (SSML) kan du finjustera tonhöjd, uttal, talhastighet, volym och mer av text till tal-utdata genom att skicka dina begäranden från ett XML-schema. Det här avsnittet visar ett exempel på hur du ändrar rösten, men en mer detaljerad guide finns i SSML-artikelnom instruktioner.
Om du vill börja använda SSML för anpassning gör du en enkel ändring som växlar rösten.
Skapa först en ny XML-fil för SSML-konfigurationsfilen i rotprojektkatalogen, i det här exemplet ssml.xml . Rotelementet är alltid <speak> , och genom att omsluta texten i ett element kan du ändra <voice> rösten med hjälp av name parametern . Se den fullständiga listan över neurala röster som stöds.
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-ChristopherNeural">
When you're on the freeway, it's a good idea to use a GPS.
</voice>
</speak>
Därefter måste du ändra begäran om talsyntes så att den refererar till XML-filen. Begäran är i stort sett densamma, men i stället för att speak_text_async() använda funktionen använder du speak_ssml_async() . Den här funktionen förväntar sig en XML-sträng, så du läser först SSML-config som en sträng. Härifrån är resultatobjektet exakt samma som i föregående exempel.
Anteckning
Om din innehåller i början av strängen måste du ta bort ssml_string  BOM-formatet, annars returnerar tjänsten ett fel. Du gör detta genom att ange encoding parametern så här: 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")
Anteckning
Om du vill ändra rösten utan att använda SSML kan du ange egenskapen för SpeechConfig med hjälp av SpeechConfig.speech_synthesis_voice_name = "en-US-ChristopherNeural"
Hämta ansiktsställningshändelser
Tal kan vara ett bra sätt att driva animeringen av ansiktsuttryck. Visemes används ofta för att representera nyckelpositioner i observerat tal, till exempel positionen för ansiktena, skaften och ansiktena när du producerar ett visst fonem. Du kan prenumerera på viseme-händelsen i Speech SDK. Sedan kan du använda viseme-händelser för att animera ansiktet på ett tecken när talljud spelas upp. Lär dig hur du hämtar viseme-händelser.
I den här snabbstarten lär du dig att konvertera text till tal med hjälp av Speech-tjänsten och cURL.
En översikt över text till tal-begrepp finns i översiktsartikeln.
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en prenumeration på Speech-tjänsten. Om du inte har ett konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Konvertera text till tal
Kör följande kommando i en kommandotolk. Du måste infoga följande värden i kommandot.
- Din prenumerationsnyckel för Speech-tjänsten.
- Taltjänstens region.
Du kanske också vill ändra följande värden.
X-Microsoft-OutputFormatRubrikvärdet, som styr ljudutdataformatet. Du hittar en lista över ljudutdataformat som stöds i text till tal-REST API referens .- Utdatarösten. En lista över röster som är tillgängliga för talslutpunkten finns i nästa avsnitt.
- Utdatafilen. I det här exemplet dirigerar vi svaret från servern till en fil med namnet
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-JennyNeural'\''>
my voice is my passport verify me
</voice>
</speak>' > output.mp3
Lista tillgängliga röster för speech-slutpunkten
Om du vill visa en lista över tillgängliga röster för speech-slutpunkten kör du följande kommando.
curl --location --request GET 'https://INSERT_ENDPOINT_HERE.tts.speech.microsoft.com/cognitiveservices/voices/list' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'
Du bör få ett svar som liknar följande.
[
{
"Name": "Microsoft Server Speech Text to Speech Voice (ar-EG, Hoda)",
"DisplayName": "Hoda",
"LocalName": "هدى",
"ShortName": "ar-EG-Hoda",
"Gender": "Female",
"Locale": "ar-EG",
"SampleRateHertz": "16000",
"VoiceType": "Standard"
},
{
"Name": "Microsoft Server Speech Text to Speech Voice (ar-SA, Naayf)",
"DisplayName": "Naayf",
"LocalName": "نايف",
"ShortName": "ar-SA-Naayf",
"Gender": "Male",
"Locale": "ar-SA",
"SampleRateHertz": "16000",
"VoiceType": "Standard"
},
{
"Name": "Microsoft Server Speech Text to Speech Voice (bg-BG, Ivan)",
"DisplayName": "Ivan",
"LocalName": "Иван",
"ShortName": "bg-BG-Ivan",
"Gender": "Male",
"Locale": "bg-BG",
"SampleRateHertz": "16000",
"VoiceType": "Standard"
},
{
// This response is truncated. The response will include
// a complete list of supported languages and specific
// details like short name, gender, etc.
}
]
I den här snabbstarten lär du dig vanliga designmönster för att göra text-till-tal-syntes med hjälp av Speech SDK. Du börjar med grundläggande konfiguration och syntes och går vidare till mer avancerade exempel för anpassad programutveckling, inklusive:
- Få svar som minnesbaserade strömmar
- Anpassa exempelfrekvens för utdata och bithastighet
- Skicka syntesbegäranden med hjälp av SSML (märkspråk för talsyntes)
- Använda neurala röster
Förutsättningar
Den här artikeln förutsätter att du har ett Azure-konto och en speech-tjänstprenumeration. Om du inte har något konto och en prenumeration kan du prova Speech-tjänsten utan kostnad.
Hämta och installera
Följ dessa steg för att installera Speech CLI på Windows:
På Windows behöver du Microsoft Visual C++ Redistributable för Visual Studio 2019 för din plattform. Om du installerar detta för första gången kan det krävas en omstart.
Installera .NET Core 3.1 SDK.
Installera Speech CLI med NuGet genom att ange följande kommando:
dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
Skriv spx för att se hjälpen för Speech CLI.
Anteckning
Som ett alternativ till NuGet kan du ladda ned och extrahera Speech CLI för Windows som en zip-fil.
Teckenbegränsningar
På Windows kan Speech CLI endast visa teckensnitt som är tillgängliga för kommandotolken på den lokala datorn. Windows-terminal alla teckensnitt som produceras interaktivt av Speech CLI.
Om du matar ut till en fil kan en textredigerare som Anteckningar eller en webbläsare som Microsoft Edge också visa alla teckensnitt.
Syntetisera tal till en högtalare
Nu är du redo att köra Speech CLI för att syntetisera tal från text. Från kommandoraden ändrar du till den katalog som innehåller speech CLI-binärfilen. Kör sedan följande kommando.
spx synthesize --text "The speech synthesizer greets you!"
Speech CLI producerar naturligt språk på engelska via datortalaren.
Syntetisera tal till en fil
Kör följande kommando för att ändra utdata från talaren till en .wav fil.
spx synthesize --text "The speech synthesizer greets you!" --audio output greetings.wav
Speech CLI skapar naturligt språk på engelska i greetings.wav ljudfilen.
I Windows du spela upp ljudfilen genom att ange start greetings.wav .
Hämta positionsinformation
Ditt projekt kan behöva veta när ett ord talas med text till tal så att det kan vidta specifika åtgärder baserat på den tidpunkten. Om du till exempel vill markera ord när de talades behöver du veta vad du ska markera, när du ska markera det och hur länge det ska markeras.
Du kan åstadkomma detta med hjälp av WordBoundary den händelse som är tillgänglig i SpeechSynthesizer .
Den här händelsen utlöses i början av varje nytt talat ord och ger en tidsförskjutning i den talade strömmen och en textförskjutning i indatauppmatten.
AudioOffsetrapporterar det utgående ljudets tid mellan början av syntesen och början av nästa ord. Detta mäts i hundra nanosekundersenheter (HNS) med 10 000 HNS motsvarande 1 millisekunder.WordOffsetrapporterar teckenpositionen i indatasträngen (ursprunglig text eller SSML)omedelbart före det ord som ska talas.
Anteckning
WordBoundary händelser utlöses när utdata från ljuddata blir tillgängliga, vilket är snabbare än uppspelning till en utdataenhet. Korrekt synkronisering av strömtidsinställningen till "realtid" måste utföras av anroparen.
Du hittar exempel på användning WordBoundary i text till tal-exemplen på GitHub.
Nästa steg
- Komma igång med Custom Voice
- Förbättra syntesen med SSML
- Lär dig hur du använder API:et för långt ljud för stora textexempel som böcker och nyhetsartiklar
- Se snabbstartsexempel på GitHub