API för långt ljud
API:et för långt ljud tillhandahåller asynkron syntes av text till tal i långt format (till exempel ljudböcker, nyhetsartiklar och dokument). Det här API:et returnerar inte syntetiserat ljud i realtid. I stället söker du efter svar och använder utdata när tjänsten gör dem tillgängliga. Till skillnad från text till tal-API:et som används av Speech SDK kan API:et för långt ljud skapa syntetiserat ljud som är längre än 10 minuter. Detta gör det idealiskt för utgivare och ljudinnehållsplattformar att skapa långt ljudinnehåll som ljudböcker i en batch.
Fler fördelar med API:et för långt ljud:
- Syntetiserat tal som returneras av tjänsten använder de bästa neurala rösterna.
- Du behöver inte distribuera en röstslutpunkt.
Anteckning
Long Audio-API:et stöder både offentliga neurala röster och anpassade neurala röster.
Arbetsflöde
När du använder API:et för långt ljud skickar du vanligtvis en textfil eller filer som ska syntetiseras, söker efter status och laddar ned ljudutdata när statusen visar att det lyckades.
Det här diagrammet ger en översikt över arbetsflödet på hög nivå.

Förbereda innehåll för syntes
När du förbereder textfilen ska du kontrollera att den:
- Är antingen oformaterad text (.txt) eller SSML-text (.txt).
- Kodas som UTF-8 med BOM (Byte Order Mark).
- Är en enskild fil, inte en zip-fil.
- Innehåller fler än 400 tecken för oformaterad text eller 400 fakturerbara tecken för SSML-text och mindre än 10 000 stycken.
- För oformaterad text avgränsas varje stycke genom att trycka på Retur/Retur. Se exempel på oformaterad textinmatning.
- För SSML-text betraktas varje SSML-del som ett stycke. Avgränsa SSML-delar med olika stycken. Se exempel på SSML-textinmatning.
Exempelkod
Resten av den här sidan fokuserar på Python, men exempelkoden för API:et för långt ljud är tillgänglig på GitHub för följande programmeringsspråk:
Python-exempel
Det här avsnittet innehåller Python-exempel som visar den grundläggande användningen av LONG Audio-API:et. Skapa ett nytt Python-projekt med valfri IDE eller redigeringsprogram. Kopiera sedan det här kodfragmentet till en fil med namnet long_audio_synthesis_client.py .
import json
import ntpath
import requests
De här biblioteken används för att konstruera HTTP-begäran och anropa den långa text till tal-ljudsyntesen REST API.
Hämta en lista över röster som stöds
Om du vill hämta en lista över röster som stöds skickar du en GET-begäran till https://<endpoint>/api/texttospeech/v3.0/longaudiosynthesis/voices .
Den här koden hämtar en fullständig lista över röster som du kan använda i en specifik region/slutpunkt.
def get_voices():
region = '<region>'
key = '<your_key>'
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis/voices'.format(region)
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.get(url, headers=header)
print(response.text)
get_voices()
Ersätt följande värden:
- Ersätt
<your_key>med prenumerationsnyckeln för Speech-tjänsten. Den här informationen finns på fliken Översikt för din resurs i Azure Portal. - Ersätt
<region>med den region där speech-resursen skapades (tilleastusexempel: ellerwestus). Den här informationen finns på fliken Översikt för din resurs i Azure Portal.
Du ser utdata som ser ut så här:
{
"values": [
{
"locale": "en-US",
"voiceName": "en-US-AriaNeural",
"description": "",
"gender": "Female",
"createdDateTime": "2020-05-21T05:57:39.123Z",
"properties": {
"publicAvailable": true
}
},
{
"id": "8fafd8cd-5f95-4a27-a0ce-59260f873141"
"locale": "en-US",
"voiceName": "my custom neural voice",
"description": "",
"gender": "Male",
"createdDateTime": "2020-05-21T05:25:40.243Z",
"properties": {
"publicAvailable": false
}
}
]
}
Om properties.publicAvailable är sant är rösten en offentlig neural röst. Annars är det en anpassad neural röst.
Konvertera text till tal
Förbered en indatatextfil, antingen i oformaterad text eller SSML-text, och lägg sedan till följande kod i long_audio_synthesis_client.py :
Anteckning
concatenateResult är en valfri parameter. Om den här parametern inte har angetts genereras ljudutdata per stycke. Du kan också sammanfoga ljuden till en utdata genom att inkludera parametern .
outputFormat är också valfritt. Ljudutdata är som standard inställda på riff-16khz-16bit-mono-pcm . Mer information om ljudutdataformat som stöds finns i Ljudutdataformat.
def submit_synthesis():
region = '<region>'
key = '<your_key>'
input_file_path = '<input_file_path>'
locale = '<locale>'
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis'.format(region)
header = {
'Ocp-Apim-Subscription-Key': key
}
voice_identities = [
{
'voicename': '<voice_name>'
}
]
payload = {
'displayname': 'long audio synthesis sample',
'description': 'sample description',
'locale': locale,
'voices': json.dumps(voice_identities),
'outputformat': 'riff-16khz-16bit-mono-pcm',
'concatenateresult': True,
}
filename = ntpath.basename(input_file_path)
files = {
'script': (filename, open(input_file_path, 'rb'), 'text/plain')
}
response = requests.post(url, payload, headers=header, files=files)
print('response.status_code: %d' % response.status_code)
print(response.headers['Location'])
submit_synthesis()
Ersätt följande värden:
- Ersätt
<your_key>med prenumerationsnyckeln för Speech-tjänsten. Den här informationen finns på fliken Översikt för din resurs i Azure Portal. - Ersätt
<region>med den region där speech-resursen skapades (tilleastusexempel: ellerwestus). Den här informationen finns på fliken Översikt för din resurs i Azure Portal. - Ersätt
<input_file_path>med sökvägen till textfilen som du har förberett för text till tal. - Ersätt
<locale>med önskade utdata. Mer information finns i språkstöd.
Använd en av de röster som returnerades av ditt tidigare anrop till /voices slutpunkten.
- Om du använder offentlig neural röst ersätter du
<voice_name>med önskad utdataröst. - Om du vill använda en anpassad neural röst ersätter du variabeln med följande och
voice_identities<voice_id>ersätteridmed för din anpassade neurala röst.
voice_identities = [
{
'id': '<voice_id>'
}
]
Du ser utdata som ser ut så här:
response.status_code: 202
https://<endpoint>/api/texttospeech/v3.0/longaudiosynthesis/<guid>
Anteckning
Om du har fler än en indatafil måste du skicka flera begäranden och det finns begränsningar att överväga.
- Klienten kan skicka upp till 5 begäranden per sekund för varje Azure-prenumerationskonto. Om den överskrider begränsningen returneras en 429-felkod (för många begäranden). Minska frekvensen för inskickade bidrag för att undvika den här gränsen.
- Servern kan köa upp till 120 begäranden för varje Azure-prenumerationskonto. Om kön överskrider den här begränsningen returnerar servern 429-felkod (för många begäranden). Vänta på slutförda begäranden innan du skickar ytterligare begäranden.
Du kan använda URL:en i utdata för att hämta status för begäran.
Hämta information om en skickad begäran
Om du vill hämta status för en skickad syntesbegäran skickar du en GET-begäran till url:en som returnerades i föregående steg.
def get_synthesis():
url = '<url>'
key = '<your_key>'
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.get(url, headers=header)
print(response.text)
get_synthesis()
Utdata ser ut så här:
response.status_code: 200
{
"models": [
{
"voiceName": "en-US-AriaNeural"
}
],
"properties": {
"outputFormat": "riff-16khz-16bit-mono-pcm",
"concatenateResult": false,
"totalDuration": "PT5M57.252S",
"billableCharacterCount": 3048
},
"id": "eb3d7a81-ee3e-4e9a-b725-713383e71677",
"lastActionDateTime": "2021-01-14T11:12:27.240Z",
"status": "Succeeded",
"createdDateTime": "2021-01-14T11:11:02.557Z",
"locale": "en-US",
"displayName": "long audio synthesis sample",
"description": "sample description"
}
Egenskapen status ändras från status till och slutligen till eller NotStarted Running Succeeded Failed . Du kan avssöka det här API:et i en loop tills statusen Succeeded blir eller Failed .
Ladda ned ljudresultat
När en syntesbegäran lyckas kan du ladda ned ljudresultatet genom att anropa /files GET-API:et.
def get_files():
id = '<request_id>'
region = '<region>'
key = '<your_key>'
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis/{}/files'.format(region, id)
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.get(url, headers=header)
print('response.status_code: %d' % response.status_code)
print(response.text)
get_files()
Ersätt <request_id> med ID:t för begäran som du vill ladda ned resultatet för. Du hittar den i svaret från föregående steg.
Utdata ser ut så här:
response.status_code: 200
{
"values": [
{
"name": "2779f2aa-4e21-4d13-8afb-6b3104d6661a.txt",
"kind": "LongAudioSynthesisScript",
"properties": {
"size": 4200
},
"createdDateTime": "2021-01-14T11:11:02.410Z",
"links": {
"contentUrl": "https://customvoice-usw.blob.core.windows.net/artifacts/input.txt?st=2018-02-09T18%3A07%3A00Z&se=2018-02-10T18%3A07%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=e05d8d56-9675-448b-820c-4318ae64c8d5"
}
},
{
"name": "voicesynthesis_waves.zip",
"kind": "LongAudioSynthesisResult",
"properties": {
"size": 9290000
},
"createdDateTime": "2021-01-14T11:12:27.226Z",
"links": {
"contentUrl": "https://customvoice-usw.blob.core.windows.net/artifacts/voicesynthesis_waves.zip?st=2018-02-09T18%3A07%3A00Z&se=2018-02-10T18%3A07%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=e05d8d56-9675-448b-820c-4318ae64c8d5"
}
}
]
}
Exempelutdata innehåller information för två filer. Den med är "kind": "LongAudioSynthesisScript" det indataskript som skickas. Den andra med "kind": "LongAudioSynthesisResult" är resultatet av den här begäran.
Resultatet är zip som innehåller ljudutdatafilerna som genereras, tillsammans med en kopia av indatatexten.
Båda filerna kan laddas ned från URL:en i sin links.contentUrl egenskap.
Hämta alla syntesbegäranden
I följande kod visas alla skickade begäranden:
def get_synthesis():
region = '<region>'
key = '<your_key>'
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis/'.format(region)
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.get(url, headers=header)
print('response.status_code: %d' % response.status_code)
print(response.text)
get_synthesis()
Utdata ser ut så här:
response.status_code: 200
{
"values": [
{
"models": [
{
"id": "8fafd8cd-5f95-4a27-a0ce-59260f873141",
"voiceName": "my custom neural voice"
}
],
"properties": {
"outputFormat": "riff-16khz-16bit-mono-pcm",
"concatenateResult": false,
"totalDuration": "PT1S",
"billableCharacterCount": 5
},
"id": "f9f0bb74-dfa5-423d-95e7-58a5e1479315",
"lastActionDateTime": "2021-01-05T07:25:42.433Z",
"status": "Succeeded",
"createdDateTime": "2021-01-05T07:25:13.600Z",
"locale": "en-US",
"displayName": "Long Audio Synthesis",
"description": "Long audio synthesis sample"
},
{
"models": [
{
"voiceName": "en-US-AriaNeural"
}
],
"properties": {
"outputFormat": "riff-16khz-16bit-mono-pcm",
"concatenateResult": false,
"totalDuration": "PT5M57.252S",
"billableCharacterCount": 3048
},
"id": "eb3d7a81-ee3e-4e9a-b725-713383e71677",
"lastActionDateTime": "2021-01-14T11:12:27.240Z",
"status": "Succeeded",
"createdDateTime": "2021-01-14T11:11:02.557Z",
"locale": "en-US",
"displayName": "long audio synthesis sample",
"description": "sample description"
}
]
}
Egenskapen values visar dina syntesbegäranden. Listan är sidnumrerad, med en maximal sidstorlek på 100. Om det finns fler än 100 begäranden tillhandahålls en egenskap för "@nextLink" att hämta nästa sida i den sidnumrerade listan.
"@nextLink": "https://<endpoint>/api/texttospeech/v3.0/longaudiosynthesis/?top=100&skip=100"
Du kan också anpassa sidstorlek och hoppa över antal genom att ange skip och top i URL-parametern.
Ta bort tidigare begäranden
Tjänsten behåller upp till 20 000 begäranden för varje Azure-prenumerationskonto. Om din begäran överskrider den här begränsningen kan du ta bort tidigare begäranden innan du gör nya. Om du inte tar bort befintliga begäranden får du ett felmeddelande.
Följande kod visar hur du tar bort en specifik syntesbegäran.
def delete_synthesis():
id = '<request_id>'
region = '<region>'
key = '<your_key>'
url = 'https://{}.customvoice.api.speech.microsoft.com/api/texttospeech/v3.0/longaudiosynthesis/{}/'.format(region, id)
header = {
'Ocp-Apim-Subscription-Key': key
}
response = requests.delete(url, headers=header)
print('response.status_code: %d' % response.status_code)
Om begäran tas bort blir svarsstatuskoden HTTP 204 (inget innehåll).
response.status_code: 204
Anteckning
Begäranden med statusen NotStarted eller kan inte tas bort eller tas Running bort.
Slutförda long_audio_synthesis_client.py är tillgängliga på GitHub.
HTTP-statuskoder
Följande tabell innehåller information om HTTP-svarskoder och meddelanden från REST API.
| API | HTTP-statuskod | Beskrivning | Lösning |
|---|---|---|---|
| Skapa | 400 | Röstsyntesen är inte aktiverad i den här regionen. | Ändra Speech-prenumerationsnyckeln till en region som stöds. |
| 400 | Endast en Speech-prenumeration med prisnivån Standard är giltig för den här regionen. | Ändra Speech-prenumerationsnyckeln till prisnivån Standard. | |
| 400 | Gränsen på 20 000 begäranden överskrids för Azure-kontot. Ta bort några begäranden innan du skickar nya. | Servern behåller upp till 20 000 begäranden för varje Azure-konto. Ta bort några begäranden innan du skickar nya. | |
| 400 | Den här modellen kan inte användas i röstsyntesen: {modelID}. | Kontrollera att tillståndet för {modelID} är korrekt. | |
| 400 | Regionen för begäran matchar inte regionen för modellen: {modelID}. | Kontrollera att regionen för {modelID} matchar regionen för begäran. | |
| 400 | Röstsyntesen stöder endast textfiler med UTF-8-kodning med byte-ordningsmarkering. | Kontrollera att indatafilerna använder UTF-8-kodning med byte-ordningsmarkering. | |
| 400 | Endast giltiga SSML-indata tillåts i röstsyntesbegäran. | Kontrollera att SSML-indatauttrycken är korrekta. | |
| 400 | Röstnamnet {voiceName} hittades inte i indatafilen. | Det inmatade SSML-röstnamnet stämmer inte överens med modell-ID:t. | |
| 400 | Antalet stycken i indatafilen måste vara mindre än 10 000. | Kontrollera att antalet stycken i filen är mindre än 10 000. | |
| 400 | Indatafilen måste vara längre än 400 tecken. | Kontrollera att indatafilen är längre än 400 tecken. | |
| 404 | Det går inte att hitta modellen som deklarerats i röstsyntesdefinitionen: {modelID}. | Kontrollera att {modelID} är korrekt. | |
| 429 | Gränsen för aktiv röstsyntes överskrids. Vänta tills några begäranden har avslutats. | Servern kan köra och ha upp till 120 begäranden i kö för varje Azure-konto. Vänta och skicka inte nya begäranden förrän några av begärandena har slutförts. | |
| Alla | 429 | Det finns för många begäranden. | Klienten kan skicka upp till 5 begäranden till servern per sekund för varje Azure-konto. Minska antalet begäranden per sekund. |
| Ta bort | 400 | Röstsyntesuppgiften används fortfarande. | Du kan bara ta bort begäranden som har slutförts eller misslyckats. |
| GetByID | 404 | Det går inte att hitta den angivna entiteten. | Kontrollera att syntes-ID:t är korrekt. |
Regioner och slutpunkter
Api:et för långt ljud är tillgängligt i flera regioner med unika slutpunkter.
| Region | Slutpunkt |
|---|---|
| East US | https://eastus.customvoice.api.speech.microsoft.com |
| Indien, centrala | https://centralindia.customvoice.api.speech.microsoft.com |
| Sydostasien | https://southeastasia.customvoice.api.speech.microsoft.com |
| Storbritannien, södra | https://uksouth.customvoice.api.speech.microsoft.com |
| Europa, västra | https://westeurope.customvoice.api.speech.microsoft.com |
Ljudutdataformat
Vi stöder flexibla ljudutdataformat. Du kan generera ljudutdata per stycke eller sammanfoga ljudutdata till en enda utdata genom att ange concatenateResult parametern . Följande ljudutdataformat stöds av LONG Audio-API:et:
Anteckning
Standardljudformatet är riff-16khz-16bit-mono-pcm.
- riff-8khz-16bit-mono-pcm
- riff-16khz-16bit-mono-pcm
- riff-24khz-16bit-mono-pcm
- riff-48khz-16bit-mono-pcm
- audio-16khz-32kbitrate-mono-mp3
- audio-16khz-64kbitrate-mono-mp3
- audio-16khz-128kbitrate-mono-mp3
- audio-24khz-48kbitrate-mono-mp3
- audio-24khz-96kbitrate-mono-mp3
- audio-24khz-160kbitrate-mono-mp3