Začínáme s převodem textu na řeč
V tomto rychlém startu se seznámíte s běžnými vzory návrhu pro syntézu textu na řeč pomocí sady Speech SDK. Začnete základní konfigurací a syntézou a přesunete se k pokročilejším příkladům pro vývoj vlastních aplikací, mezi které patří:
- Získání odpovědí jako datových proudů v paměti
- Přizpůsobení vzorkovací frekvence výstupu a přenosové rychlosti
- Odesílání žádostí o syntézu pomocí jazyka SSML (speech synthesis markup language)
- Použití neurálních hlasů
Přeskočit na ukázky na GitHub
Pokud chcete přeskočit přímo na ukázkový kód, podívejte se na ukázky rychlého startu pro C# na GitHub.
Požadavky
Tento článek předpokládá, že máte účet Azure a předplatné služby Speech. Pokud nemáte účet a předplatné, vyzkoušejte si službu Speech zdarma.
Instalace sady Speech SDK
Než budete moci cokoli udělat, budete si muset nainstalovat sadu Speech SDK. V závislosti na vaší platformě postupujte podle následujících pokynů:
Import závislostí
Příklady v tomto článku spustíte tak, že na začátek skriptu zahrníte using následující příkazy.
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
Vytvoření konfigurace řeči
Pokud chcete volat službu Speech pomocí sady Speech SDK, musíte vytvořit SpeechConfig . Tato třída obsahuje informace o vašem předplatném, jako je klíč řeči a přidružené umístění/oblast, koncový bod, hostitel nebo autorizační token.
Poznámka
Bez ohledu na to, jestli provádíte rozpoznávání řeči, syntézu řeči, překlad nebo rozpoznávání záměru, vždy vytvoříte konfiguraci.
Existuje několik způsobů, jak můžete inicializovat SpeechConfig :
- S předplatným: Předejte klíč a přidružené umístění nebo oblast.
- S koncovým bodem: Předání koncového bodu služby Speech Klíč nebo autorizační token je volitelný.
- S hostitelem: předejte adresu hostitele. Klíč nebo autorizační token je volitelný.
- S autorizačním tokenem: předejte autorizační token a přidružené umístění nebo oblast.
V tomto příkladu vytvoříte pomocí SpeechConfig klíče řeči a umístění nebo oblasti. Získejte tyto přihlašovací údaje podle pokynů v článku Vyzkoušejte si službu Speech zdarma. Vytvoříte také základní často používaný kód pro zbytek tohoto článku, který upravíte pro různá přizpůsobení.
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ýběr syntézy jazyka a hlasu
Služba Azure Převod textu na řeč podporuje více než 250 hlasů a více než 70 jazyků a variant.
Můžete získat úplný seznam nebo sije vyzkoušet v ukázce převodu textu na řeč.
Zadejte jazyk nebo hlas, který SpeechConfig odpovídá vašemu vstupnímu textu, a použijte jazyk, který chcete použít.
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>";
}
Syntetizuje řeč do souboru
Dále vytvoříte objekt , který provádí převody textu na řeč a výstupy pro mluvčí, soubory nebo SpeechSynthesizer jiné výstupní streamy. Přijímá jako parametr objekt vytvořený v předchozím kroku a objekt, který určuje, jak se mají zpracovat SpeechSynthesizer SpeechConfig výstupní AudioConfig výsledky.
Začněte tím, že pomocí funkce vytvoříte objekt , který automaticky zapíše výstup do souboru a vytvoří jeho instanci AudioConfig .wav FromWavFileOutput() using příkazem . Příkaz using v tomto kontextu automaticky uchová nespravované prostředky a způsobí, že objekt po vyřazení vypadne z oboru.
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");
}
Dále vytvořte instanci s SpeechSynthesizer jiným using příkazem . Předejte config objekt audioConfig a objekt jako params. Pak je spuštění syntézy řeči a zápisu do souboru stejně jednoduché jako spuštění SpeakTextAsync() s textovým řetězcem.
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.");
}
Spusťte program a syntetizovaný .wav soubor se zapisuje do zadaného umístění. Toto je dobrý příklad nejzákladnějšího využití, ale dále se podíváte na přizpůsobení výstupu a zpracování výstupní odpovědi jako datového proudu v paměti pro práci s vlastními scénáři.
Syntetizovat na výstup mluvčího
V některých případech můžete chtít přímo vypište syntetizovanou řeč přímo mluvčímu. To lze provést vynechání parametru AudioConfig při vytváření v SpeechSynthesizer příkladu výše. Tím se syntetizuje aktuální aktivní výstupní zařízení.
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.");
}
Získání výsledku jako datového proudu v paměti
Pro mnoho scénářů vývoje aplikace pro řeč budete pravděpodobně potřebovat výsledná zvuková data jako datový proud v paměti, a ne přímo do souboru. To vám umožní vytvořit vlastní chování, včetně:
- Abstrahujte výsledné pole bajtů jako datový proud s možností hledání pro vlastní podřízené služby.
- Integrujte výsledek s jinými rozhraními API nebo službami.
- Úprava zvukových dat, zápis
.wavvlastních hlaviček atd.
Tuto změnu je jednoduché provést z předchozího příkladu. Nejprve blok odeberte, protože budete chování výstupu spravovat ručně od této chvíli, aby se AudioConfig zvýšila kontrola. Pak null předejte pro AudioConfig v SpeechSynthesizer konstruktoru .
Poznámka
Předáním parametru se zvuk na aktuálním aktivním výstupním zařízení ve výchozím nastavení nenahraje jako v příkladu výstupu null AudioConfig mluvčího.
Tentokrát výsledek uložíte do SpeechSynthesisResult proměnné. Vlastnost AudioData obsahuje výstupní byte [] data. Můžete s tím pracovat ručně nebo můžete použít třídu ke správě datového byte [] AudioDataStream proudu v paměti. V tomto příkladu použijete AudioDataStream.FromResult() statickou funkci k získání datového proudu z výsledku.
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);
}
Tady můžete implementovat jakékoli vlastní chování pomocí výsledného stream objektu.
Přizpůsobení zvukového formátu
Následující část ukazuje, jak přizpůsobit atributy zvukového výstupu, včetně:
- Typ zvukového souboru
- Vzorkovací frekvence
- Bitová hloubka
Pokud chcete změnit formát zvuku, použijte SetSpeechSynthesisOutputFormat() funkci u SpeechConfig objektu . Tato funkce očekává typ enum SpeechSynthesisOutputFormat , který použijete k výběru výstupního formátu. Seznam dostupných zvukových formátů najdete v referenčních dokumentacích.
Pro různé typy souborů existují různé možnosti v závislosti na vašich požadavcích. Nezapomeňte, že nezpracované formáty, jako Raw24Khz16BitMonoPcm jsou , z definice nezahrnují zvukové hlavičky. Nezpracované formáty používejte pouze v případě, že víte, že vaše implementace podřízeného serveru může dekódovat nezpracovaný bitový stream, nebo pokud plánujete ručně vytvořit hlavičky na základě bitové hloubky, vzorkovací frekvence, počtu kanálů atd.
V tomto příkladu zadáte vysoce věrný formát RIFF nastavením objektu Riff24Khz16BitMonoPcm SpeechSynthesisOutputFormat na SpeechConfig . Podobně jako v příkladu v předchozí části použijete k získání datového proudu výsledku v paměti a jeho zápis AudioDataStream do souboru.
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");
}
Když program znovu po spuštění .wav zapíšete do zadané cesty, zapíše se soubor.
Přizpůsobení charakteristik řeči pomocí SSML
Jazyk SSML (Speech Synthesis Markup Language) umožňuje vyladit přednášku, výslovnost, rychlost řeči, objem a další výstup převodu textu na řeč odesláním požadavků ze schématu XML. Tato část ukazuje příklad změny hlasu, ale podrobnějšího průvodce najdete v článku s postupy pro SSML.
Pokud chcete začít používat SSML k přizpůsobení, proveďte jednoduchou změnu, která přepne hlas.
Nejprve vytvořte nový soubor XML pro konfiguraci SSML v kořenovém adresáři projektu, v tomto příkladu ssml.xml . Kořenový element je vždy a zabalení textu do elementu umožňuje změnit hlas <speak> <voice> pomocí name paramu. Podívejte se na úplný seznam podporovaných neurálních hlasů.
<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ále je potřeba změnit požadavek syntézy řeči tak, aby odkazovat na váš soubor XML. Požadavek je většinou stejný, ale místo použití SpeakTextAsync() funkce použijete SpeakSsmlAsync() . Tato funkce očekává řetězec XML, takže nejprve načtete svou konfiguraci SSML jako řetězec pomocí File.ReadAllText() . Odtud je výsledný objekt úplně stejný jako v předchozích příkladech.
Poznámka
Pokud používáte soubor Visual Studio, vaše konfigurace sestavení ve výchozím nastavení váš soubor XML pravděpodobně nenajde. Pokud chcete tento problém vyřešit, klikněte pravým tlačítkem na soubor XML a vyberte Vlastnosti. Změňte Akci sestavení na Obsah a změňte Kopírovat do výstupního adresáře na Kopírovat vždy.
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");
}
Poznámka
Pokud chcete změnit hlas bez použití SSML, můžete pro objekt nastavit vlastnost SpeechConfig pomocí . SpeechConfig.SpeechSynthesisVoiceName = "en-US-ChristopherNeural";
Získání událostí pozice obličeje
Řeč může být dobrým způsobem, jak řídit animaci výrazů tváře. Často se používají visemy, které reprezentují klíčové pozice ve pozorované řeči, jako je například pozice rtů, řídce a rtuť při vytváření konkrétního phonemu. Můžete se přihlásit k odběru události viseme v sadě Speech SDK. Pak můžete použít události viseme k animaci plochy znaku při přehrávání zvukového řeči. Naučte se, jak získat události viseme.
V tomto rychlém startu se naučíte běžné vzory návrhu pro provádění syntézy textu na řeč pomocí sady Speech SDK. Začnete tím, že provádíte základní konfiguraci a shrnutí a přejdete k pokročilejším příkladům pro vývoj vlastních aplikací, včetně:
- Získávání odpovědí jako proudů v paměti
- Přizpůsobení výstupní vzorkovací frekvence a přenosové rychlosti
- Odesílání požadavků na syntézu pomocí SSML (Speech syntézy Markup Language)
- Používání hlasů neuronové
Přeskočit na ukázky v GitHub
Pokud chcete přeskočit přímý na vzorový kód, přečtěte si ukázky pro rychlý Start C++ na GitHub.
Požadavky
V tomto článku se předpokládá, že máte účet Azure a předplatné služby Speech. Pokud účet a předplatné nemáte, Vyzkoušejte službu Speech Service zdarma.
Instalace sady Speech SDK
Předtím, než můžete cokoli udělat, musíte nainstalovat sadu Speech SDK. V závislosti na vaší platformě postupujte podle následujících pokynů:
Importovat závislosti
Chcete-li spustit příklady v tomto článku, zahrňte do using horní části skriptu následující příkazy import a import.
#include <iostream>
#include <fstream>
#include <string>
#include <speechapi_cxx.h>
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Audio;
Vytvoření konfigurace řeči
Chcete-li volat službu Speech pomocí sady Speech SDK, je třeba vytvořit SpeechConfig . Tato třída obsahuje informace o vašem předplatném, jako je váš klíč řeči a přidružené umístění/oblast, koncový bod, hostitele nebo autorizační token.
Poznámka
Bez ohledu na to, jestli provádíte rozpoznávání řeči, syntézu řeči, překlad nebo rozpoznávání záměrů, vždy vytvoříte konfiguraci.
Existuje několik způsobů, jak můžete inicializovat SpeechConfig :
- S předplatným: předejte klíč a přidružené umístění/oblast.
- S koncovým bodem: předejte koncový bod služby řeči. Klíč nebo autorizační token jsou volitelné.
- S hostitelem: předejte adresu hostitele. Klíč nebo autorizační token jsou volitelné.
- Pomocí autorizačního tokenu: předání autorizačního tokenu a přidruženého umístění/oblasti
V tomto příkladu vytvoříte SpeechConfig pomocí klíče a oblasti předplatného. Tyto přihlašovací údaje můžete získat podle kroků v části Vyzkoušejte si službu Speech Service zdarma. Také můžete vytvořit nějaký základní často používaný kód, který se použije pro zbytek tohoto článku, který můžete upravit pro různá přizpůsobení.
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ýběr jazyka syntézy a hlasu
Služba Azure Převod textu na řeč podporuje více než 250 hlasů a více než 70 jazyků a variant.
Můžete získat úplný seznamnebo si ho vyzkoušet v ukázce textu na řeč.
Zadejte jazyk nebo hlas, SpeechConfig který bude odpovídat vstupnímu textu a použijte požadovaný hlas.
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>");
}
Vysyntetizátorování řeči v souboru
V dalším kroku vytvoříte SpeechSynthesizer objekt, který provede převody textu na řeč a výstupy na reproduktory, soubory nebo jiné výstupní datové proudy. SpeechSynthesizerParametr přijímá jako je SpeechConfig objekt vytvořený v předchozím kroku a AudioConfig objekt, který určuje, jak by měly být zpracovány výsledky výstupu.
Chcete-li začít, vytvořte AudioConfig a automaticky zapište výstup do .wav souboru pomocí FromWavFileOutput() funkce.
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");
}
Dále vytvořte instanci a SpeechSynthesizer předání config objektu a audioConfig objektu jako param. Pak je provádění syntézy řeči a psaní do souboru jednoduché jako při spuštění SpeakTextAsync() s textovým řetězcem.
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();
}
Spusťte program a v .wav zadaném umístění se zapíše syntetizující soubor. Toto je dobrý příklad základního využití, ale další se můžete podívat na přizpůsobení výstupu a zpracování výstupní odezvy jako proud v paměti pro práci s vlastními scénáři.
Vysyntetizovat výstup mluvčího
V některých případech můžete chtít přímo vyprogramovat výstup syntetizované řeči přímo na mluvčí. Pokud to chcete provést, vynechejte AudioConfig parametr při vytváření SpeechSynthesizer v předchozím příkladu. Toto syntetizuje aktuální aktivní výstupní zařízení.
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();
}
Získat výsledek jako proud v paměti
Pro mnoho scénářů ve vývoji aplikací pro rozpoznávání řeči pravděpodobně budete potřebovat výsledná zvuková data jako proud v paměti, nikoli přímo zapisovat do souboru. To vám umožní vytvořit vlastní chování, včetně:
- Vyabstrakcte výsledné pole bajtů jako datový proud, který je možné vyhledat pro vlastní služby pro příjem dat.
- Integrujte výsledek s jinými službami nebo rozhraními API.
- Úprava zvukových dat, psaní vlastních
.wavhlaviček atd.
Tuto změnu je jednoduché provést v předchozím příkladu. Nejprve odeberte AudioConfig , protože budete spravovat chování výstupu ručně z tohoto bodu dále pro zvýšené řízení. Pak předejte NULL AudioConfig v SpeechSynthesizer konstruktoru.
Poznámka
Předání NULL pro AudioConfig místo toho, aby ho nemuseli vynechat jako v příkladu výstupu mluvčího, ve výchozím nastavení nebude přehrávat zvuk na aktuálním aktivním výstupním zařízení.
Tentokrát výsledek uložíte do SpeechSynthesisResult proměnné. GetAudioDataFunkce getter vrátí byte [] výstupní data. S tímto můžete pracovat byte [] ručně nebo můžete použít AudioDataStream třídu ke správě streamu v paměti. V tomto příkladu použijete AudioDataStream.FromResult() statickou funkci k získání datového proudu z výsledku.
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);
}
Odsud můžete implementovat jakékoli vlastní chování pomocí výsledného stream objektu.
Přizpůsobení formátu zvuku
V následující části se dozvíte, jak přizpůsobit atributy výstupů zvuku, včetně:
- Typ zvukového souboru
- Vzorkovací frekvence
- Bitová hloubka
Chcete-li změnit formát zvuku, použijte SetSpeechSynthesisOutputFormat() funkci na SpeechConfig objektu. Tato funkce očekává enum typ SpeechSynthesisOutputFormat výstupu, který použijete k výběru výstupního formátu. Seznam zvukových formátů , které jsou k dispozici, najdete v referenční dokumentaci.
V závislosti na vašich požadavcích máte k dispozici různé možnosti pro různé typy souborů. Všimněte si, že podle definice nezpracované formáty jako neobsahují Raw24Khz16BitMonoPcm zvukové hlavičky. Nezpracované formáty použijte jenom v případě, že vaše implementace pro příjem dat může dekódovat nezpracovaný Bitstream, nebo pokud plánujete ruční vytváření hlaviček na základě bitové hloubky, vzorkovací frekvence, počtu kanálů atd.
V tomto příkladu zadáte RIFF formát s vysokou přesností nastavením Riff24Khz16BitMonoPcm SpeechSynthesisOutputFormat SpeechConfig objektu na. Podobně jako v předchozím oddílu můžete použít AudioDataStream k získání streamu v paměti výsledku a pak ho zapsat do souboru.
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();
}
Po opětovném spuštění programu se zapíše .wav soubor do zadané cesty.
Přizpůsobení vlastností řeči pomocí SSML
SSML (Speech syntézy Language) umožňuje vyladit rozteč, výslovnost, míru řeči, objem a další výstup textu do mluvené řeči odesláním požadavků ze schématu XML. Tato část ukazuje příklad změny hlasu, ale podrobnější příručku najdete v článku SSML.
Chcete-li začít používat SSML k přizpůsobení, provedete jednoduchou změnu, která přepne hlas.
Nejprve vytvořte nový soubor XML pro SSML config v kořenovém adresáři projektu, v tomto příkladu ssml.xml . Kořenový element je vždy <speak> a zalamování textu v <voice> prvku umožňuje změnit hlas pomocí name param. Podívejte se na úplný seznam podporovaných neuronové hlasů.
<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ál je potřeba změnit požadavek na Shrnutí řeči, aby odkazoval na váš soubor XML. Požadavek je většinou stejný, ale namísto použití SpeakTextAsync() funkce použijte SpeakSsmlAsync() . Tato funkce očekává řetězec XML, takže nejdřív načtěte konfiguraci SSML jako řetězec. Z tohoto místa je objekt výsledku přesně stejný jako předchozí příklady.
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();
}
Poznámka
Chcete-li změnit hlas bez použití SSML, můžete nastavit vlastnost SpeechConfig na pomocí SpeechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")
Získat události pozice obličeje
Řeč může být dobrým způsobem, jak řídit animaci výrazů obličeje. Často se visemes používají k reprezentování klíčových pozic v pozorovaném řeči, jako je například pozice sad LIP, vidlice a jazyka při vytváření konkrétního foném. Můžete se přihlásit k odběru události viseme v sadě Speech SDK. Pak můžete použít události viseme k animaci plochy znaku při přehrávání zvukového řeči. Naučte se, jak získat události viseme.
V tomto rychlém startu se seznámíte s běžnými vzory návrhu pro syntézu textu na řeč pomocí sady Speech SDK.
Přeskočit na ukázky na GitHub
Pokud chcete přeskočit přímo na ukázkový kód, podívejte se na ukázky rychlého startu pro Go na GitHub.
Požadavky
Tento článek předpokládá, že máte účet Azure a předplatné služby Speech. Pokud nemáte účet a předplatné, vyzkoušejte si službu Speech zdarma.
Instalace sady Speech SDK
Než budete moci cokoli udělat, budete si muset nainstalovat sadu Speech SDK for Go.
Převod textu na řeč na mluvčího
Pomocí následující ukázky kódu spusťte syntézu řeči do výchozího zvukového výstupního zařízení.
Proměnné a nahraďte klíčem řeči a subscription region umístěním nebo oblastí.
Při spuštění skriptu se vstupní text předá výchozímu mluvčím.
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)
}
}
}
}
Spuštěním následujících příkazů vytvořte soubor, který odkazuje na komponenty go.mod hostované v GitHub.
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teď sestavte a spusťte kód.
go build
go run quickstart
Podrobné informace o třídách a najdete v SpeechConfig referenčních SpeechSynthesizer dokumentech.
Převod textu na řeč na datový proud v paměti
Pro mnoho scénářů vývoje aplikace pro řeč budete pravděpodobně potřebovat výsledná zvuková data jako datový proud v paměti, a ne přímo do souboru. To vám umožní vytvořit vlastní chování, včetně:
- Abstrahujte výsledné pole bajtů jako datový proud s možností hledání pro vlastní podřízené služby.
- Integrujte výsledek s jinými rozhraními API nebo službami.
- Úprava zvukových dat, zápis
.wavvlastních hlaviček atd.
Tuto změnu je jednoduché provést z předchozího příkladu. Nejprve odeberte , protože budete chování výstupu spravovat ručně od této chvíli, aby se AudioConfig zvýšila kontrola. Pak nil předejte pro AudioConfig v SpeechSynthesizer konstruktoru .
Poznámka
Předáním parametru se zvuk ve výchozím nastavení na aktuálním aktivním výstupním zařízení nehraje jako v příkladu výstupu nil AudioConfig mluvčího.
Tentokrát výsledek uložíte do SpeechSynthesisResult proměnné.
Vlastnost AudioData vrátí hodnotu []byte výstupních dat. Můžete s tím pracovat ručně nebo můžete použít třídu ke správě datového []byte AudioDataStream proudu v paměti.
V tomto příkladu použijete NewAudioDataStreamFromSpeechSynthesisResult() statickou funkci k získání datového proudu z výsledku.
Proměnné a nahraďte klíčem řeči a subscription region umístěním nebo oblastí.
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))
}
}
Spuštěním následujících příkazů vytvořte soubor, který odkazuje na komponenty go.mod hostované v GitHub.
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teď sestavte a spusťte kód.
go build
go run quickstart
Podrobné informace o třídách a najdete v SpeechConfig referenčních SpeechSynthesizer dokumentech.
Přizpůsobení charakteristik řeči pomocí SSML
Jazyk SSML (Speech Synthesis Markup Language) umožňuje vyladit přednášku, výslovnost, rychlost řeči, objem a další výstup převodu textu na řeč odesláním požadavků ze schématu XML. Tato část ukazuje příklad změny hlasu, ale podrobnějšího průvodce najdete v článku s postupy pro SSML.
Pokud chcete začít používat SSML k přizpůsobení, proveďte jednoduchou změnu, která přepne hlas.
Nejprve v kořenovém adresáři projektu vytvořte nový soubor XML pro konfiguraci SSML v tomto příkladu ssml.xml . Kořenový element je vždy a zabalení textu do elementu umožňuje změnit hlas <speak> <voice> pomocí name paramu. Podívejte se na úplný seznam podporovaných neurálních hlasů.
<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ále je potřeba změnit požadavek syntézy řeči tak, aby odkazovat na váš soubor XML.
Požadavek je většinou stejný, ale místo použití SpeakTextAsync() funkce použijete SpeakSsmlAsync() . Tato funkce očekává řetězec XML, takže nejprve načtete svou konfiguraci SSML jako řetězec. Odtud je výsledný objekt úplně stejný jako v předchozích příkladech.
Poznámka
Pokud chcete změnit hlas bez použití SSML, můžete pro objekt nastavit vlastnost SpeechConfig pomocí . speechConfig.SetSpeechSynthesisVoiceName("en-US-ChristopherNeural")
Získání událostí pozice obličeje
Řeč může být dobrým způsobem, jak řídit animaci výrazů tváře. Často se používají visemy, které reprezentují klíčové pozice ve pozorované řeči, jako je například pozice rtů, řídce a rtuť při vytváření konkrétního phonemu. Událost viseme můžete přihlásit k odběru v sadě Speech SDK. Potom můžete použít události viseme k animace tváře znaku při přehrávání řeči. Zjistěte, jak získat události viseme.
V tomto rychlém startu se seznámíte s běžnými vzory návrhu pro syntézu textu na řeč pomocí sady Speech SDK. Začnete základní konfigurací a syntézou a přesunete se k pokročilejším příkladům vývoje vlastních aplikací, mezi které patří:
- Získání odpovědí jako datových proudů v paměti
- Přizpůsobení vzorkovací frekvence výstupu a přenosové rychlosti
- Odesílání žádostí o syntézu pomocí jazyka SSML (speech synthesis markup language)
- Použití neurálních hlasů
Přeskočit na ukázky na GitHub
Pokud chcete přeskočit přímo na ukázkový kód, podívejte se na ukázky rychlého startu pro Javu na GitHub.
Požadavky
Tento článek předpokládá, že máte účet Azure a předplatné služby Speech. Pokud nemáte účet a předplatné, vyzkoušejte si službu Speech zdarma.
Instalace sady Speech SDK
Než budete moci cokoli udělat, budete si muset nainstalovat sadu Speech SDK. V závislosti na vaší platformě postupujte podle následujících pokynů:
Import závislostí
Příklady v tomto článku spustíte tak, že na začátek skriptu zahrníte následující příkazy importu.
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;
Vytvoření konfigurace řeči
Pokud chcete volat službu Speech pomocí sady Speech SDK, musíte vytvořit SpeechConfig . Tato třída obsahuje informace o vašem předplatném, jako je klíč řeči a přidružené umístění/oblast, koncový bod, hostitel nebo autorizační token.
Poznámka
Bez ohledu na to, jestli provádíte rozpoznávání řeči, syntézu řeči, překlad nebo rozpoznávání záměru, vždy vytvoříte konfiguraci.
Existuje několik způsobů, jak můžete inicializovat SpeechConfig :
- S předplatným: Předejte klíč řeči a přidružené umístění nebo oblast.
- S koncovým bodem: Předání koncového bodu služby Speech Klíč řeči nebo autorizační token je volitelný.
- S hostitelem: předejte adresu hostitele. Klíč řeči nebo autorizační token je volitelný.
- S autorizačním tokenem: předejte autorizační token a přidružené umístění nebo oblast.
V tomto příkladu vytvoříte pomocí SpeechConfig klíče řeči a umístění nebo oblasti. Získejte tyto přihlašovací údaje podle pokynů v článku Vyzkoušejte si službu Speech zdarma. Vytvoříte také základní často používaný kód pro zbytek tohoto článku, který upravíte pro různá přizpůsobení.
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ýběr syntézy jazyka a hlasu
Služba Azure Převod textu na řeč podporuje více než 250 hlasů a více než 70 jazyků a variant.
Můžete získat úplný seznam nebo sije vyzkoušet v ukázce převodu textu na řeč.
Zadejte jazyk nebo hlas, který odpovídá SpeechConfig vašemu vstupnímu textu, a použijte jazyk, který chcete použít.
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>");
}
Syntetizuje řeč do souboru
Dále vytvoříte objekt , který provádí převody textu na řeč a výstupy pro mluvčí, soubory nebo SpeechSynthesizer jiné výstupní streamy. Přijímá jako parametr objekt vytvořený v předchozím kroku a objekt, který určuje, jak se mají zpracovat SpeechSynthesizer SpeechConfig výstupní AudioConfig výsledky.
Začněte tím, že pomocí statické funkce vytvoříte objekt , který automaticky zapíše výstup AudioConfig .wav do fromWavFileOutput() souboru.
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");
}
Dále vytvořte instanci SpeechSynthesizer předacího objektu a speechConfig objektu jako audioConfig parametrů. Pak je spuštění syntézy řeči a zápisu do souboru stejně jednoduché jako spuštění SpeakText() s textovým řetězcem.
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.");
}
Spusťte program a syntetizovaný .wav soubor se zapisuje do zadaného umístění. Toto je dobrý příklad nejzákladnějšího využití, ale dále se podíváte na přizpůsobení výstupu a zpracování výstupní odpovědi jako datového proudu v paměti pro práci s vlastními scénáři.
Syntetizovat na výstup mluvčího
V některých případech můžete chtít přímo vypište syntetizovanou řeč přímo mluvčímu. To lze provést vytvořením instance AudioConfig pomocí fromDefaultSpeakerOutput() statické funkce. Výstupem je aktuální aktivní výstupní zařízení.
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.");
}
Získání výsledku jako datového proudu v paměti
Pro mnoho scénářů vývoje aplikace pro řeč budete pravděpodobně potřebovat výsledná zvuková data jako datový proud v paměti, a ne přímo do souboru. To vám umožní vytvořit vlastní chování, včetně:
- Abstrahujte výsledné pole bajtů jako datový proud s možností hledání pro vlastní podřízené služby.
- Integrujte výsledek s jinými rozhraními API nebo službami.
- Úprava zvukových dat, zápis
.wavvlastních hlaviček atd.
Tuto změnu je jednoduché provést z předchozího příkladu. Nejprve blok odeberte, protože budete chování výstupu spravovat ručně od této chvíli, aby se AudioConfig zvýšila kontrola. Pak null předejte pro AudioConfig v SpeechSynthesizer konstruktoru .
Poznámka
Předáním parametru se zvuk na aktuálním aktivním výstupním zařízení ve výchozím nastavení nenahraje jako v příkladu výstupu null AudioConfig mluvčího.
Tentokrát výsledek uložíte do SpeechSynthesisResult proměnné. Funkce SpeechSynthesisResult.getAudioData() vrátí hodnotu byte [] výstupních dat. Můžete s tím pracovat ručně nebo můžete použít třídu ke správě datového byte [] AudioDataStream proudu v paměti. V tomto příkladu použijete AudioDataStream.fromResult() statickou funkci k získání datového proudu z výsledku.
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());
}
Tady můžete implementovat jakékoli vlastní chování pomocí výsledného stream objektu.
Přizpůsobení formátu zvuku
Následující část ukazuje, jak přizpůsobit atributy zvukového výstupu, včetně:
- Typ zvukového souboru
- Vzorkovací frekvence
- Bitová hloubka
Pokud chcete změnit formát zvuku, použijte setSpeechSynthesisOutputFormat() funkci u SpeechConfig objektu . Tato funkce očekává typ enum SpeechSynthesisOutputFormat , který použijete k výběru výstupního formátu. Seznam dostupných formátů zvuku najdete v referenčních dokumentacích.
Pro různé typy souborů existují různé možnosti v závislosti na vašich požadavcích. Nezapomeňte, že nezpracované formáty, jako jsou , Raw24Khz16BitMonoPcm z definice nezahrnují zvukové hlavičky. Nezpracované formáty používejte pouze v případě, že víte, že vaše implementace podřízeného serveru může dekódovat nezpracovaný bitový stream, nebo pokud plánujete ručně vytvořit hlavičky na základě bitové hloubky, vzorkovací frekvence, počtu kanálů atd.
V tomto příkladu zadáte vysoce věrný formát RIFF nastavením objektu Riff24Khz16BitMonoPcm SpeechSynthesisOutputFormat na SpeechConfig . Podobně jako v příkladu v předchozí části použijete k získání datového proudu výsledku v paměti a jeho zápis AudioDataStream do souboru.
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");
}
Když program znovu po spuštění .wav zapíšete do zadané cesty, zapíše se soubor.
Přizpůsobení charakteristik řeči pomocí SSML
Jazyk SSML (Speech Synthesis Markup Language) umožňuje vyladění výšky, výslovnosti, rychlosti řeči, objemu a dalších výstupů převodu textu na řeč odesláním žádostí ze schématu XML. Tato část ukazuje příklad změny hlasu, ale podrobnějšího průvodce najdete v článku s postupy pro SSML.
Pokud chcete začít používat SSML k přizpůsobení, proveďte jednoduchou změnu, která přepne hlas.
Nejprve vytvořte nový soubor XML pro konfiguraci SSML v kořenovém adresáři projektu, v tomto příkladu ssml.xml . Kořenový element je vždy a zabalení textu do elementu umožňuje změnit hlas <speak> <voice> pomocí name paramu. Podívejte se na úplný seznam podporovaných neurálních hlasů.
<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ále je potřeba změnit požadavek syntézy řeči tak, aby odkazovat na váš soubor XML. Požadavek je většinou stejný, ale místo použití SpeakText() funkce použijete SpeakSsml() . Tato funkce očekává řetězec XML, takže nejprve vytvoříte funkci pro načtení souboru XML a vrácení jako řetězce.
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.";
}
}
Odtud je výsledný objekt úplně stejný jako v předchozích příkladech.
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");
}
Poznámka
Pokud chcete změnit hlas bez použití SSML, můžete pro objekt nastavit vlastnost SpeechConfig pomocí . SpeechConfig.setSpeechSynthesisVoiceName("en-US-ChristopherNeural");
Získání událostí pozice obličeje
Řeč může být dobrým způsobem, jak řídit animaci výrazů tváře. Často se používají visemy, které reprezentují klíčové pozice ve pozorované řeči, jako je například pozice rtů, řídce a rtuť při vytváření konkrétního phonemu. Můžete se přihlásit k odběru událostí viseme v sadě Speech SDK, abyste mohli získat data animace obličeje, a pak je použít na znak během animace obličeje. Zjistěte, jak získat události viseme.
V tomto rychlém startu se seznámíte s běžnými vzory návrhu pro syntézu textu na řeč pomocí sady Speech SDK. Začnete základní konfigurací a syntézou a přesunete se k pokročilejším příkladům pro vývoj vlastních aplikací, mezi které patří:
- Získání odpovědí jako datových proudů v paměti
- Přizpůsobení vzorkovací frekvence výstupu a přenosové rychlosti
- Odesílání žádostí o syntézu pomocí jazyka SSML (speech synthesis markup language)
- Použití neurálních hlasů
Přeskočit na ukázky na GitHub
Pokud chcete přeskočit přímo na ukázkový kód, podívejte se na ukázky v rychlém startu pro JavaScript na GitHub.
Požadavky
Tento článek předpokládá, že máte účet Azure a prostředek služby Speech. Pokud nemáte účet a prostředek, vyzkoušejte si službu Speech zdarma.
Instalace sady Speech SDK
Než budete moci cokoli udělat, budete si muset nainstalovat sadu Speech SDK pro JavaScript. V závislosti na vaší platformě postupujte podle následujících pokynů:
Kromě toho v závislosti na cílovém prostředí použijte jednu z následujících možností:
Stáhněte a extrahujte sadu Speech SDK pro javascriptový microsoft.cognitiveservices.speech.sdk.bundle.js a umístěte ji do složky přístupné pro váš soubor HTML.
<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;
Tip
Pokud cílíte na webový prohlížeč a používáte <script> značku , sdk předpona není potřeba. Předpona sdk je alias, který se používá k názvu require modulu.
Vytvoření konfigurace řeči
Pokud chcete volat službu Speech pomocí sady Speech SDK, musíte vytvořit SpeechConfig . Tato třída obsahuje informace o vašem prostředku, jako je klíč řeči a přidružené umístění/oblast, koncový bod, hostitel nebo autorizační token.
Poznámka
Bez ohledu na to, jestli provádíte rozpoznávání řeči, syntézu řeči, překlad nebo rozpoznávání záměru, vždy vytvoříte konfiguraci.
Existuje několik způsobů, jak můžete inicializovat SpeechConfig :
- S prostředekem: předejte klíč řeči a přidružené umístění nebo oblast.
- S koncovým bodem: Předání koncového bodu služby Speech Klíč řeči nebo autorizační token je volitelný.
- S hostitelem: předejte adresu hostitele. Klíč řeči nebo autorizační token je volitelný.
- S autorizačním tokenem: předejte autorizační token a přidružené umístění nebo oblast.
V tomto příkladu vytvoříte pomocí SpeechConfig klíče řeči a umístění nebo oblasti. Získejte tyto přihlašovací údaje podle pokynů v článku Vyzkoušejte si službu Speech zdarma. Vytvoříte také základní často používaný kód pro zbytek tohoto článku, který upravíte pro různá přizpůsobení.
function synthesizeSpeech() {
const speechConfig = sdk.SpeechConfig.fromSubscription("<paste-your-speech-key-here>", "<paste-your-speech-location/region-here>");
}
synthesizeSpeech();
Výběr syntézy jazyka a hlasu
Služba Azure Převod textu na řeč podporuje více než 250 hlasů a více než 70 jazyků a variant.
Můžete získat úplný seznam nebo sije vyzkoušet v ukázce převodu textu na řeč.
Zadejte jazyk nebo hlas, který SpeechConfig odpovídá vašemu vstupnímu textu, a použijte jazyk, který chcete použít.
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();
Syntetizuje řeč do souboru
Dále vytvoříte objekt , který provádí převody textu na řeč a výstupy pro mluvčí, soubory nebo SpeechSynthesizer jiné výstupní streamy. Přijímá jako parametr objekt vytvořený v předchozím kroku a objekt, který určuje, jak se mají zpracovat SpeechSynthesizer SpeechConfig výstupní AudioConfig výsledky.
Začněte tím, že pomocí statické funkce vytvoříte objekt , který automaticky zapíše výstup AudioConfig .wav do fromAudioFileOutput() souboru.
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");
}
V dalším kroku vytvořte instanci SpeechSynthesizer předající objekt a speechConfig objekt jako audioConfig paramy. Pak je spuštění syntézy řeči a zápisu do souboru stejně jednoduché jako spuštění speakTextAsync() s textovým řetězcem. Zpětné volání výsledku je skvělým místem pro volání , ve skutečnosti je toto volání potřeba, aby syntéza synthesizer.close() správně fungovala.
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();
});
}
Spusťte program a syntetizovaný .wav soubor se zapisuje do zadaného umístění. Toto je dobrý příklad nejzákladnějšího využití, ale dále se podíváte na přizpůsobení výstupu a zpracování výstupní odpovědi jako datového proudu v paměti pro práci s vlastními scénáři.
Syntetizovat na výstup mluvčího (jenom prohlížeč)
V některých případech můžete chtít přímo vypište syntetizovanou řeč přímo mluvčímu. To lze provést vytvořením instance AudioConfig pomocí fromDefaultSpeakerOutput() statické funkce. Výstupem je aktuální aktivní výstupní zařízení.
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();
});
}
Získání výsledku jako datového proudu v paměti
Pro mnoho scénářů vývoje aplikace pro řeč budete pravděpodobně potřebovat výsledná zvuková data jako datový proud v paměti, a ne přímo do souboru. To vám umožní vytvořit vlastní chování, včetně:
- Abstrahujte výsledné pole bajtů jako datový proud s možností hledání pro vlastní podřízené služby.
- Integrujte výsledek s jinými rozhraními API nebo službami.
- Úprava zvukových dat, zápis
.wavvlastních hlaviček atd.
Tuto změnu je jednoduché provést z předchozího příkladu. Nejprve blok odeberte, protože budete chování výstupu spravovat ručně od této chvíli, aby se AudioConfig zvýšila kontrola. Pak undefined předejte pro AudioConfig v SpeechSynthesizer konstruktoru .
Poznámka
Předáním parametru se zvuk na aktuálním aktivním výstupním zařízení ve výchozím nastavení nenahraje jako v příkladu výstupu undefined AudioConfig mluvčího.
Tentokrát výsledek uložíte do SpeechSynthesisResult proměnné. Vlastnost vrátí výchozí typ streamu prohlížeče s SpeechSynthesisResult.audioData ArrayBuffer výstupními daty. V případě kódu serveru převeďte poleBuffer na datový proud vyrovnávací paměti.
Následující kód funguje pro kód na straně klienta.
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();
});
}
Tady můžete implementovat jakékoli vlastní chování pomocí výsledného ArrayBuffer objektu. ArrayBuffer je běžný typ, který se má přijímat v prohlížeči a přehrávat z tohoto formátu.
Pokud u libovolného serverového kódu potřebujete pracovat s daty jako se streamem místo ArrayBuffer, musíte objekt převést na datový proud.
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();
});
}
Přizpůsobení zvukového formátu
Následující část ukazuje, jak přizpůsobit atributy zvukového výstupu, včetně:
- Typ zvukového souboru
- Vzorkovací frekvence
- Bitová hloubka
Pokud chcete změnit formát zvuku, použijte speechSynthesisOutputFormat vlastnost objektu SpeechConfig . Tato vlastnost očekává enum typ , který SpeechSynthesisOutputFormat použijete k výběru výstupního formátu. Seznam dostupných zvukových formátů najdete v referenčních dokumentacích.
Pro různé typy souborů existují různé možnosti v závislosti na vašich požadavcích. Nezapomeňte, že nezpracované formáty, jako Raw24Khz16BitMonoPcm jsou , z definice nezahrnují zvukové hlavičky. Nezpracované formáty používejte pouze v případě, že víte, že vaše implementace podřízeného serveru může dekódovat nezpracovaný bitový stream, nebo pokud plánujete ručně vytvořit hlavičky na základě bitové hloubky, vzorkovací frekvence, počtu kanálů atd.
V tomto příkladu zadáte vysoce věrný formát RIFF nastavením objektu Riff24Khz16BitMonoPcm speechSynthesisOutputFormat na SpeechConfig . Podobně jako v příkladu v předchozí části můžete získat zvuková data a ArrayBuffer pracovat s nimi.
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();
});
}
Když program znovu po spuštění .wav zapíšete do zadané cesty, zapíše se soubor.
Přizpůsobení charakteristik řeči pomocí SSML
Jazyk SSML (Speech Synthesis Markup Language) umožňuje vyladit přednášku, výslovnost, rychlost řeči, objem a další výstup převodu textu na řeč odesláním požadavků ze schématu XML. Tato část ukazuje příklad změny hlasu, ale podrobnějšího průvodce najdete v článku s postupy pro SSML.
Pokud chcete začít používat SSML k přizpůsobení, proveďte jednoduchou změnu, která přepne hlas.
Nejprve vytvořte nový soubor XML pro konfiguraci SSML v kořenovém adresáři projektu, v tomto příkladu ssml.xml . Kořenový element je vždy a zabalení textu do elementu umožňuje změnit hlas <speak> <voice> pomocí name paramu. Podívejte se na úplný seznam podporovaných neurálních hlasů.
<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ále je potřeba změnit požadavek syntézy řeči tak, aby odkazovat na váš soubor XML. Požadavek je většinou stejný, ale místo použití speakTextAsync() funkce použijete speakSsmlAsync() . Tato funkce očekává řetězec XML, takže nejprve vytvoříte funkci, která načte soubor XML a vrátí ho jako řetězec.
function xmlToString(filePath) {
const xml = readFileSync(filePath, "utf8");
return xml;
}
Další informace o najdete v readFileSync tématuNode.js systému souborů. Odtud je výsledný objekt úplně stejný jako v předchozích příkladech.
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();
});
}
Poznámka
Pokud chcete změnit hlas bez použití SSML, můžete pro objekt nastavit vlastnost SpeechConfig pomocí . SpeechConfig.speechSynthesisVoiceName = "en-US-ChristopherNeural";
Získat události pozice obličeje
Řeč může být dobrým způsobem, jak řídit animaci výrazů obličeje. Často se visemes používají k reprezentování klíčových pozic v pozorovaném řeči, jako je například pozice sad LIP, vidlice a jazyka při vytváření konkrétního foném. Můžete se přihlásit k odběru události viseme v sadě Speech SDK. Pak můžete použít události viseme k animaci plochy znaku při přehrávání zvukového řeči. Naučte se, jak získat události viseme.
Řeč můžete syntetizovat z textu pomocí sady Speech SDK pro Swift a Objective-C.
Požadavky
Následující ukázky předpokládají, že máte účet Azure a předplatné služby Speech. Pokud nemáte účet a předplatné, vyzkoušejte si službu Speech zdarma.
Instalace sady Speech SDK a ukázek
Sada Cognitive Services Speech SDK obsahuje ukázky napsané ve Swiftu a Objective-C pro iOS a Mac. Kliknutím na odkaz zobrazíte pokyny k instalaci jednotlivých ukázek:
- Syntetizuje řeč v Objective-C v macOS
- Syntetizovat řeč ve Swiftu v macOS
- Syntetizuje řeč v Objective-C v iOSu
- Syntetizovat řeč ve Swiftu v iOSu
- Další ukázky pro Objective-C v iOSu
Poskytujeme také online sadu Speech SDK pro referenční informace k Jazyku Objective-C.
V tomto rychlém startu se seznámíte s běžnými vzory návrhu pro syntézu textu na řeč pomocí sady Speech SDK. Začnete základní konfigurací a syntézou a přesunete se k pokročilejším příkladům pro vývoj vlastních aplikací, mezi které patří:
- Získání odpovědí jako datových proudů v paměti
- Přizpůsobení vzorkovací frekvence výstupu a přenosové rychlosti
- Odesílání žádostí o syntézu pomocí jazyka SSML (speech synthesis markup language)
- Použití neurálních hlasů
Přeskočit na ukázky na GitHub
Pokud chcete přeskočit přímo na ukázkový kód, podívejte se na ukázky rychlého startu pro Python na GitHub.
Požadavky
Tento článek předpokládá, že máte účet Azure a předplatné služby Speech. Pokud nemáte účet a předplatné, vyzkoušejte si službu Speech zdarma.
Instalace sady Speech SDK
Než budete moci cokoli udělat, budete si muset nainstalovat sadu Speech SDK.
pip install azure-cognitiveservices-speech
Pokud používáte macOS a dochází k problémům s instalací, možná budete muset nejprve spustit tento příkaz.
python3 -m pip install --upgrade pip
Po instalaci sady Speech SDK na začátek skriptu zahrnovat následující příkazy importu.
from azure.cognitiveservices.speech import AudioDataStream, SpeechConfig, SpeechSynthesizer, SpeechSynthesisOutputFormat
from azure.cognitiveservices.speech.audio import AudioOutputConfig
Vytvoření konfigurace řeči
Pokud chcete volat službu Speech pomocí sady Speech SDK, musíte vytvořit SpeechConfig . Tato třída obsahuje informace o vašem předplatném, jako je klíč řeči a přidružené umístění/oblast, koncový bod, hostitel nebo autorizační token.
Poznámka
Bez ohledu na to, jestli provádíte rozpoznávání řeči, syntézu řeči, překlad nebo rozpoznávání záměru, vždy vytvoříte konfiguraci.
Existuje několik způsobů, jak můžete inicializovat SpeechConfig :
- S předplatným: předejte klíč řeči a přidružené umístění nebo oblast.
- S koncovým bodem: Předání koncového bodu služby Speech Klíč řeči nebo autorizační token je volitelný.
- S hostitelem: předejte adresu hostitele. Klíč řeči nebo autorizační token je volitelný.
- S autorizačním tokenem: předejte autorizační token a přidružené umístění nebo oblast.
V tomto příkladu vytvoříte pomocí SpeechConfig klíče řeči a umístění nebo oblasti. Získejte tyto přihlašovací údaje podle pokynů v článku Vyzkoušejte si službu Speech zdarma.
speech_config = SpeechConfig(subscription="<paste-your-speech-key-here>", region="<paste-your-speech-location/region-here>")
Výběr syntézy jazyka a hlasu
Služba Azure Převod textu na řeč podporuje více než 250 hlasů a více než 70 jazyků a variant.
Můžete získat úplný seznam nebo sije vyzkoušet v ukázce převodu textu na řeč.
Zadejte jazyk nebo hlas, který SpeechConfig odpovídá vašemu vstupnímu textu, a použijte jazyk, který chcete použít.
# 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>"
Syntetizuje řeč do souboru
Dále vytvoříte objekt , který provádí převody textu na řeč a výstupy pro mluvčí, soubory nebo SpeechSynthesizer jiné výstupní streamy. Přijímá jako parametr objekt vytvořený v předchozím kroku a objekt, který určuje, jak se mají zpracovat SpeechSynthesizer SpeechConfig výstupní AudioOutputConfig výsledky.
Začněte tím, že pomocí parametru konstruktoru vytvoříte objekt , který automaticky zapíše AudioOutputConfig .wav výstup do filename souboru.
audio_config = AudioOutputConfig(filename="path/to/write/file.wav")
Dále vytvořte instanci předáním objektu a objektu SpeechSynthesizer speech_config jako audio_config parametrů. Pak je spuštění syntézy řeči a zápisu do souboru stejně jednoduché jako spuštění speak_text_async() s textovým řetězcem.
synthesizer = SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
synthesizer.speak_text_async("A simple test to write to a file.")
Spusťte program a syntetizovaný .wav soubor se zapisuje do zadaného umístění. Toto je dobrý příklad nejzákladnějšího využití, ale dále se podíváte na přizpůsobení výstupu a zpracování výstupní odpovědi jako datového proudu v paměti pro práci s vlastními scénáři.
Syntetizovat na výstup mluvčího
V některých případech můžete chtít přímo vypište syntetizovanou řeč přímo mluvčímu. Chcete-li to provést, použijte příklad v předchozí části, ale změňte odebráním param a AudioOutputConfig filename nastavte use_default_speaker=True . Výstupem je aktuální aktivní výstupní zařízení.
audio_config = AudioOutputConfig(use_default_speaker=True)
Získání výsledku jako datového proudu v paměti
Pro mnoho scénářů vývoje aplikace pro řeč budete pravděpodobně potřebovat výsledná zvuková data jako datový proud v paměti, a ne přímo do souboru. To vám umožní vytvořit vlastní chování, včetně:
- Abstrahujte výsledné pole bajtů jako datový proud s možností hledání pro vlastní podřízené služby.
- Integrujte výsledek s jinými rozhraními API nebo službami.
- Úprava zvukových dat, zápis
.wavvlastních hlaviček atd.
Tuto změnu je jednoduché provést z předchozího příkladu. Nejprve odeberte , protože budete chování výstupu spravovat ručně od této chvíli, aby se AudioConfig zvýšila kontrola. Pak None předejte pro AudioConfig v SpeechSynthesizer konstruktoru .
Poznámka
Předáním parametru se zvuk na aktuálním aktivním výstupním zařízení ve výchozím nastavení nenahraje jako v příkladu výstupu None AudioConfig mluvčího.
Tentokrát výsledek uložíte do SpeechSynthesisResult proměnné. Vlastnost audio_data obsahuje bytes objekt výstupních dat. S tímto objektem můžete pracovat ručně nebo můžete použít třídu ke správě datového AudioDataStream proudu v paměti. V tomto příkladu použijete AudioDataStream konstruktor k získání datového proudu z výsledku.
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)
Tady můžete implementovat jakékoli vlastní chování pomocí výsledného stream objektu.
Přizpůsobení zvukového formátu
Následující část ukazuje, jak přizpůsobit atributy zvukového výstupu, včetně:
- Typ zvukového souboru
- Vzorkovací frekvence
- Bitová hloubka
Pokud chcete změnit formát zvuku, použijte set_speech_synthesis_output_format() funkci u SpeechConfig objektu . Tato funkce očekává typ enum SpeechSynthesisOutputFormat , který použijete k výběru výstupního formátu. Seznam dostupných zvukových formátů najdete v referenčních dokumentacích.
Pro různé typy souborů existují různé možnosti v závislosti na vašich požadavcích. Nezapomeňte, že nezpracované formáty, jako Raw24Khz16BitMonoPcm jsou , z definice nezahrnují zvukové hlavičky. Nezpracované formáty používejte pouze v případě, že víte, že vaše implementace podřízeného serveru může dekódovat nezpracovaný bitový stream, nebo pokud plánujete ručně vytvořit hlavičky na základě bitové hloubky, vzorkovací frekvence, počtu kanálů atd.
V tomto příkladu zadáte vysoce věrný formát RIFF nastavením objektu Riff24Khz16BitMonoPcm SpeechSynthesisOutputFormat na SpeechConfig . Podobně jako v příkladu v předchozí části použijete k získání datového proudu výsledku v paměti a jeho zápis AudioDataStream do souboru.
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")
Při spuštění programu znovu se do zadané .wav cesty zapíše přizpůsobený soubor.
Přizpůsobení charakteristik řeči pomocí SSML
Jazyk SSML (Speech Synthesis Markup Language) umožňuje vyladit přednášku, výslovnost, rychlost řeči, objem a další výstup převodu textu na řeč odesláním požadavků ze schématu XML. Tato část ukazuje příklad změny hlasu, ale podrobnějšího průvodce najdete v článku s postupy pro SSML.
Pokud chcete začít používat SSML k přizpůsobení, proveďte jednoduchou změnu, která přepne hlas.
Nejprve vytvořte nový soubor XML pro konfiguraci SSML v kořenovém adresáři projektu, v tomto příkladu ssml.xml . Kořenový element je vždy a zabalení textu do elementu umožňuje změnit hlas <speak> <voice> pomocí name paramu. Podívejte se na úplný seznam podporovaných neurálních hlasů.
<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ále je potřeba změnit požadavek syntézy řeči tak, aby odkazovat na váš soubor XML. Požadavek je většinou stejný, ale místo použití speak_text_async() funkce použijete speak_ssml_async() . Tato funkce očekává řetězec XML, takže nejprve přečtete svou konfiguraci SSML jako řetězec. Odtud je výsledný objekt úplně stejný jako v předchozích příkladech.
Poznámka
Pokud soubor obsahuje na začátku řetězce, musíte formát BOM oříznout, jinak ssml_string  služba vrátí chybu. To můžete provést nastavením encoding parametru následujícím způsobem: 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")
Poznámka
Pokud chcete změnit hlas bez použití SSML, můžete pro objekt nastavit vlastnost SpeechConfig pomocí . SpeechConfig.speech_synthesis_voice_name = "en-US-ChristopherNeural"
Získání událostí pozice obličeje
Řeč může být dobrým způsobem, jak řídit animaci výrazů tváře. Často se používají visemy, které reprezentují klíčové pozice ve pozorované řeči, jako je například pozice rtů, řídce a rtuť při vytváření konkrétního phonemu. Událost viseme můžete přihlásit k odběru v sadě Speech SDK. Potom můžete použít události viseme k animace tváře znaku při přehrávání řeči. Zjistěte, jak získat události viseme.
V tomto rychlém startu se dozvíte, jak převést text na řeč pomocí služby Speech a cURL.
Základní informace o konceptech převodu textu na řeč najdete v článku s přehledem.
Požadavky
Tento článek předpokládá, že máte účet Azure a předplatné služby Speech. Pokud nemáte účet a předplatné, vyzkoušejte si službu Speech zdarma.
Převod textu na řeč
Na příkazovém řádku spusťte následující příkaz. Do příkazu budete muset vložit následující hodnoty.
- Klíč předplatného služby Speech.
- Oblast služby Speech.
Můžete také změnit následující hodnoty.
- Hodnota
X-Microsoft-OutputFormathlavičky, která řídí formát zvukového výstupu. Seznam podporovaných formátů zvukového výstupu najdete v referenčních REST API textu na řeč. - Výstupní hlas. Pokud chcete získat seznam hlasů dostupných pro koncový bod služby Speech, podívejte se na další část.
- Výstupní soubor V tomto příkladu nasměrujeme odpověď ze serveru do souboru s názvem
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
Zobrazení seznamu dostupných hlasů pro koncový bod služby Speech
Pokud chcete zobrazit seznam dostupných hlasů pro váš koncový bod služby Speech, spusťte následující příkaz.
curl --location --request GET 'https://INSERT_ENDPOINT_HERE.tts.speech.microsoft.com/cognitiveservices/voices/list' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'
Měla by se zobrazit odpověď podobná následující.
[
{
"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.
}
]
V tomto rychlém startu se naučíte běžné vzory návrhu pro provádění syntézy textu na řeč pomocí sady Speech SDK. Začnete tím, že provádíte základní konfiguraci a shrnutí a přejdete k pokročilejším příkladům pro vývoj vlastních aplikací, včetně:
- Získávání odpovědí jako proudů v paměti
- Přizpůsobení výstupní vzorkovací frekvence a přenosové rychlosti
- Odesílání požadavků na syntézu pomocí SSML (Speech syntézy Markup Language)
- Používání hlasů neuronové
Požadavky
V tomto článku se předpokládá, že máte účet Azure a předplatné služby Speech. Pokud účet a předplatné nemáte, Vyzkoušejte službu Speech Service zdarma.
Stažení a instalace
Postupujte podle těchto kroků a nainstalujte rozhraní příkazového řádku služby Speech Windows:
V Windows vaší platformě potřebujete Microsoft Visual C++ Redistributable pro Visual Studio 2019. První instalace může vyžadovat restartování.
Nainstalujte sadu .NET Core 3.1 SDK.
Nainstalujte rozhraní příkazového řádku služby Speech NuGet zadáním tohoto příkazu:
dotnet tool install --global Microsoft.CognitiveServices.Speech.CLI
Pokud spx chcete zobrazit nápovědu k rozhraní příkazového řádku služby Speech, zadejte .
Poznámka
Jako alternativu k NuGet si můžete stáhnout a extrahovat rozhraní příkazového řádku služby Speech pro Windows jako soubor ZIP.
Omezení písem
V Windows rozhraní příkazového řádku služby Speech může zobrazit pouze písma dostupná pro příkazový řádek v místním počítači. Terminál Windows podporuje všechna písma vytvořená interaktivně rozhraním příkazového řádku služby Speech.
Pokud vystupíte do souboru, může se v textovém editoru, jako je Poznámkový blok, nebo ve webovém prohlížeči, Microsoft Edge zobrazit také všechna písma.
Syntéza řeči do reproduktoru
Teď jste připraveni spustit rozhraní příkazového řádku pro rozpoznávání řeči od textu. Z příkazového řádku přejděte do adresáře, který obsahuje binární soubor funkce Speech CLI. Pak spusťte následující příkaz.
spx synthesize --text "The speech synthesizer greets you!"
Rozhraní příkazového řádku pro rozpoznávání řeči vytvoří přirozený jazyk v angličtině prostřednictvím mluvčího počítače.
Vysyntetizátorování řeči v souboru
Spuštěním následujícího příkazu změňte výstup z vašeho mluvčího na .wav soubor.
spx synthesize --text "The speech synthesizer greets you!" --audio output greetings.wav
Rozhraní příkazového řádku pro rozpoznávání řeči vytvoří v angličtině přirozený jazyk greetings.wav .
v Windows můžete zvukový soubor přehrát zadáním start greetings.wav .
Získat informace o pozici
Váš projekt může potřebovat znát, když je slovo mluvené pomocí převodu textu na řeč, aby bylo možné provést konkrétní akci na základě tohoto časování. Pokud byste například chtěli Zvýrazňovat slova při jejich mluveném, měli byste znát, co je třeba zvýraznit, kdy je zvýraznit a jak dlouho je zvýraznit.
To můžete provést pomocí WordBoundary události dostupné v rámci SpeechSynthesizer .
Tato událost se vyvolá na začátku každého nového mluveného slova a v rámci vstupní výzvy vám poskytne časový posun v rámci mluveného vysílání a posunu textu.
AudioOffsethlásí uplynulý čas výstupu mezi začátkem syntézy a začátkem následujícího slova. To se měří v jednotkách se stovkami (HNS) s 10 000, který odpovídá 1 milisekundu.WordOffsetoznamuje pozici znaku ve vstupním řetězci (původní text nebo SSML) těsně před slovem, který se má vymluvené.
Poznámka
WordBoundary události jsou vyvolány, protože výstupní zvuková data budou k dispozici, což bude rychlejší než přehrávání do výstupního zařízení. Správné synchronizace časování datového proudu do "reálného času" musí být provedeno volajícím.
Příklady použití WordBoundary v ukázkách textu na řeč najdete v GitHub.
Další kroky
- Začínáme se službou Custom Voice
- Vylepšení syntézy pomocí jazyka SSML
- Přečtěte si, jak používat dlouhé zvukové rozhraní API pro velké vzorky textu, jako jsou knihy a novinové články.
- Podívejte se na ukázky rychlý Start pro GitHub