API Synthèse par lots pour la synthèse vocale
L’API Synthèse par lots peut synthétiser un grand volume d’entrées de texte (longues et courtes) de manière asynchrone. Les éditeurs et les plateformes de contenu audio peuvent créer du contenu audio long dans un lot. Par exemple : livres audio, articles de presse et documents. L’API Synthèse par lots peut créer du contenu audio synthétisé d’une durée de plus de 10 minutes.
Important
L’API Synthèse par lots est en disponibilité générale. L’API Audio long sera retirée le 1er avril 2027. Pour plus d’informations, consultez Migrer vers l’API Synthèse par lots.
L’API Synthèse par lots est asynchrone et ne retourne pas l’audio synthétisé en temps réel. Vous envoyez des fichiers texte à synthétiser, interrogez l’état et téléchargez la sortie audio lorsque l’état indique la réussite de l’opération. Les entrées de texte doivent être au format texte brut ou texte SSML (Speech Synthesis Markup Language).
Le diagramme suivant donne une vue d’ensemble du workflow.
Conseil
Vous pouvez également utiliser le Kit de développement logiciel (SDK) Speech pour créer un audio synthétisé de plus de 10 minutes en itérant sur le texte et en le synthétisant en blocs. Pour obtenir un exemple C#, consultez GitHub.
Vous pouvez utiliser les opérations d’API REST suivantes pour la synthèse par lots :
Opération | Méthode | Appel d’API REST |
---|---|---|
Créer une synthèse par lots | PUT |
texttospeech/batchsyntheses/YourSynthesisId |
Obtenir une synthèse par lots | GET |
texttospeech/batchsyntheses/YourSynthesisId |
Lister une synthèse par lots | GET |
texttospeech/batchsyntheses |
Supprimer une synthèse par lots | DELETE |
texttospeech/batchsyntheses/YourSynthesisId |
Pour obtenir des exemples de code, consultez GitHub.
Créer une synthèse par lots
Pour envoyer une requête de synthèse par lots, créez le chemin et le corps de la requête HTTP PUT selon les instructions suivantes :
- Définissez la propriété requise
inputKind
. - Si la propriété
inputKind
est définie sur « PlainText », vous devez également définir la propriétévoice
danssynthesisConfig
. Dans l’exemple ci-dessous,inputKind
est défini sur « SSML », etsynthesisConfig
n’est donc pas défini. - Si vous le souhaitez, vous pouvez définir d’autres propriétés, comme
description
ettimeToLiveInHours
. Pour plus d’informations, consultez Propriétés de la synthèse par lots.
Remarque
La taille maximale de la charge utile JSON qui est acceptée est de 2 mégaoctets.
Définissez le YourSynthesisId
requis dans le chemin. L’YourSynthesisId
doit être unique. Il doit comprendre entre 3 et 64 caractères, contenir uniquement des chiffres, des lettres, des traits d’union, des traits de soulignement et des points, et commencer et se terminer par une lettre ou un chiffre.
Effectuez une requête HTTP PUT en utilisant l’URI, comme illustré dans l’exemple suivant. Remplacez YourSpeechKey
par votre clé de ressource Speech, remplacez YourSpeechRegion
par votre région de ressource Speech et définissez les propriétés du corps de la requête comme décrit précédemment.
curl -v -X PUT -H "Ocp-Apim-Subscription-Key: YourSpeechKey" -H "Content-Type: application/json" -d '{
"description": "my ssml test",
"inputKind": "SSML",
"inputs": [
{
"content": "<speak version=\"1.0\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">The rainbow has seven colors.</voice></speak>"
}
],
"properties": {
"outputFormat": "riff-24khz-16bit-mono-pcm",
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"concatenateResult": false,
"decompressOutputFiles": false
}
}' "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01"
Vous devriez recevoir un corps de réponse au format suivant :
{
"id": "YourSynthesisId",
"internalId": "7ab84171-9070-4d3b-88d4-1b8cc1cb928a",
"status": "NotStarted",
"createdDateTime": "2024-03-12T07:23:18.0097387Z",
"lastActionDateTime": "2024-03-12T07:23:18.0097388Z",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false
}
}
La propriété status
doit passer de l’état NotStarted
à Running
, puis à l’état final Succeeded
ou Failed
. Vous pouvez appeler régulièrement l’API Synthèse par lots GET jusqu’à ce que l’état retourné soit Succeeded
ou Failed
.
Obtenir une synthèse par lots
Pour obtenir l’état du travail de synthèse par lots, effectuez une requête HTTP GET en utilisant l’URI comme indiqué dans l’exemple suivant. Remplacez YourSpeechKey
par votre clé de ressource Speech et remplacez YourSpeechRegion
par votre région de ressource Speech.
curl -v -X GET "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
Vous devriez recevoir un corps de réponse au format suivant :
{
"id": "YourSynthesisId",
"internalId": "7ab84171-9070-4d3b-88d4-1b8cc1cb928a",
"status": "Succeeded",
"createdDateTime": "2024-03-12T07:23:18.0097387Z",
"lastActionDateTime": "2024-03-12T07:23:18.7979669",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"sizeInBytes": 120000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"durationInMilliseconds": 2500,
"billingDetails": {
"neuralCharacters": 29
}
},
"outputs": {
"result": "https://stttssvcuse.blob.core.windows.net/batchsynthesis-output/29f2105f997c4bfea176d39d05ff201e/YourSynthesisId/results.zip?SAS_Token"
}
}
À partir de outputs.result
, vous pouvez télécharger un fichier ZIP qui contient l’audio (0001.wav
par exemple), un résumé et des détails de débogage. Pour plus d’informations, consultez Résultats de la synthèse par lots.
Lister une synthèse par lots
Pour lister tous les travaux de synthèse par lots pour la ressource Speech, effectuez une requête HTTP GET en utilisant l’URI comme indiqué dans l’exemple suivant. Remplacez YourSpeechKey
par la clé de la ressource Speech et remplacez YourSpeechRegion
par la région de la ressource Speech. Si vous le souhaitez, vous pouvez définir les paramètres de requête skip
et maxpagesize
(jusqu’à 100) dans l’URL. Les paramètres skip
et maxpagesize
ont les valeurs par défaut 0 et 100, respectivement.
curl -v -X GET "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses?api-version=2024-04-01&skip=1&maxpagesize=2" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
Vous devriez recevoir un corps de réponse au format suivant :
{
"value": [
{
"id": "my-job-03",
"internalId": "5f7e9ab6-2c92-4dcb-b5ee-ec0983ee4db0",
"status": "Succeeded",
"createdDateTime": "2024-03-12T07:28:32.5690441Z",
"lastActionDateTime": "2024-03-12T07:28:33.0042293",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"sizeInBytes": 120000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"durationInMilliseconds": 2500,
"billingDetails": {
"neuralCharacters": 29
}
},
"outputs": {
"result": "https://stttssvcuse.blob.core.windows.net/batchsynthesis-output/29f2105f997c4bfea176d39d05ff201e/my-job-03/results.zip?SAS_Token"
}
},
{
"id": "my-job-02",
"internalId": "5577585f-4710-4d4f-aab6-162d14bd7ee0",
"status": "Succeeded",
"createdDateTime": "2024-03-12T07:28:29.6418211Z",
"lastActionDateTime": "2024-03-12T07:28:30.0910306",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"sizeInBytes": 120000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"durationInMilliseconds": 2500,
"billingDetails": {
"neuralCharacters": 29
}
},
"outputs": {
"result": "https://stttssvcuse.blob.core.windows.net/batchsynthesis-output/29f2105f997c4bfea176d39d05ff201e/my-job-02/results.zip?SAS_Token"
}
}
],
"nextLink": "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses?skip=3&maxpagesize=2&api-version=2024-04-01"
}
À partir de outputs.result
, vous pouvez télécharger un fichier ZIP qui contient l’audio (0001.wav
par exemple), un résumé et des détails de débogage. Pour plus d’informations, consultez Résultats de la synthèse par lots.
La propriété value
dans la réponse JSON liste vos requêtes de synthèse. La liste est paginée, avec une taille de page maximale de 100. La propriété "nextLink"
est fournie si nécessaire pour obtenir la page suivante de la liste paginée.
Supprimer une synthèse par lots
Supprimez l’historique des travaux de synthèse par lots après avoir récupéré les résultats de sortie audio. Le service Speech conserve chaque historique de synthèse jusqu’à 31 jours, ou pendant la durée spécifiée par la propriété timeToLiveInHours
de la requête, selon la première de ces éventualités. La date et l’heure de la suppression automatique (pour les travaux de synthèse ayant l’état « Réussite » ou « Échec ») sont celles définies par les propriétés lastActionDateTime
+ timeToLiveInHours
.
Pour supprimer un travail de synthèse par lots, effectuez une requête HTTP DELETE en utilisant l’URI comme indiqué dans l’exemple suivant. Remplacez YourSynthesisId
par l’ID de la synthèse par lots, remplacez YourSpeechKey
par la clé de la ressource Speech et remplacez YourSpeechRegion
par la région de la ressource Speech.
curl -v -X DELETE "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
Les en-têtes de réponse contiennent HTTP/1.1 204 No Content
si la requête de suppression a réussi.
Résultats de la synthèse par lots
Une fois que vous avez obtenu un travail de synthèse par lots avec l’état status
« Réussite », vous pouvez télécharger les résultats de sortie audio. Utilisez l’URL figurant dans la propriété outputs.result
de la réponse à la requête de synthèse par lots GET.
Pour obtenir le fichier de résultats de la synthèse par lots, effectuez une requête HTTP GET en utilisant l’URI comme indiqué dans l’exemple suivant. Remplacez YourOutputsResultUrl
par l’URL figurant dans la propriété outputs.result
de la réponse à la requête de synthèse par lots GET. Remplacez YourSpeechKey
par votre clé de ressource Speech.
curl -v -X GET "YourOutputsResultUrl" -H "Ocp-Apim-Subscription-Key: YourSpeechKey" > results.zip
Les résultats sont fournis dans un fichier ZIP qui contient l’audio (0001.wav
par exemple), un résumé et des détails de débogage. Le préfixe numéroté de chaque nom de fichier (illustré ci-dessous sous la forme [nnnn]
) suit le même ordre que les entrées de texte que vous avez utilisées au moment de la création de la synthèse par lots.
Remarque
Le fichier [nnnn].debug.json
contient l’ID du résultat de la synthèse et d’autres informations utiles pour résoudre d’éventuels problèmes. Du fait que les propriétés dans ce fichier sont susceptibles de changer, vous ne devez pas avoir de dépendances sur le format JSON.
Le fichier de résumé contient les résultats de la synthèse pour chaque entrée de texte. Voici un exemple de fichier summary.json
:
{
"jobID": "7ab84171-9070-4d3b-88d4-1b8cc1cb928a",
"status": "Succeeded",
"results": [
{
"contents": [
"<speak version=\"1.0\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">The rainbow has seven colors.</voice></speak>"
],
"status": "Succeeded",
"audioFileName": "0001.wav",
"properties": {
"sizeInBytes": "120000",
"durationInMilliseconds": "2500"
}
}
]
}
Quand des données de limite de phrase sont demandées ("sentenceBoundaryEnabled": true
), un fichier [nnnn].sentence.json
correspondant est inclus dans les résultats. De la même façon, si des données de limite de mot sont demandées ("wordBoundaryEnabled": true
), un fichier [nnnn].word.json
correspondant est inclus dans les résultats.
Voici un exemple de fichier de données de mot qui spécifie un décalage audio et une durée en millisecondes :
[
{
"Text": "The",
"AudioOffset": 50,
"Duration": 137
},
{
"Text": "rainbow",
"AudioOffset": 200,
"Duration": 350
},
{
"Text": "has",
"AudioOffset": 562,
"Duration": 175
},
{
"Text": "seven",
"AudioOffset": 750,
"Duration": 300
},
{
"Text": "colors",
"AudioOffset": 1062,
"Duration": 625
},
{
"Text": ".",
"AudioOffset": 1700,
"Duration": 100
}
]
Latence de synthèse par lots et meilleures pratiques
Lorsque vous utilisez la synthèse par lots pour générer des paroles synthétisées, il est important de tenir compte de la latence impliquée et de suivre les meilleures pratiques pour obtenir des résultats optimaux.
Latence dans la synthèse par lots
La latence dans la synthèse par lots dépend de différents facteurs, notamment la complexité du texte d’entrée, le nombre d’entrées dans le lot et les capacités de traitement du matériel sous-jacent.
La latence pour la synthèse par lots est la suivante (approximativement) :
La latence de 50 % des sorties vocales synthétisées est de 10 à 20 secondes.
La latence de 95 % des sorties vocales synthétisées est de 120 secondes.
Bonnes pratiques
Lorsque vous envisagez la synthèse par lots pour votre application, il est recommandé d’évaluer si la latence répond à vos besoins. Si la latence s’aligne sur les performances souhaitées, la synthèse par lots peut être un choix approprié. Toutefois, si la latence ne répond pas à vos besoins, vous pouvez envisager d’utiliser l’API en temps réel.
Codes d’état HTTP
La section détaille les codes de réponse HTTP et les messages envoyés par l’API Synthèse par lots.
HTTP 200 OK
HTTP 200 OK indique que la requête a réussi.
HTTP 201 Created
HTTP 201 Created indique que la requête de création de la synthèse par lots (via HTTP PUT) a réussi.
Erreur HTTP 204
Une erreur HTTP 204 indique que la requête a réussi, mais que la ressource n’existe pas. Par exemple :
- Vous avez essayé d’obtenir ou de supprimer un travail de synthèse qui n’existe pas.
- Vous avez réussi à supprimer un travail de synthèse.
Erreur HTTP 400
Voici des exemples qui peuvent générer l’erreur 400 :
- Le paramètre
outputFormat
n’est pas pris en charge ou n’est pas valide. Fournissez une valeur de format valide, ou laissezoutputFormat
vide pour utiliser le paramètre par défaut. - Le nombre d’entrées de texte demandées a dépassé la limite de 10 000.
- Vous avez essayé d’utiliser un ID de déploiement non valide ou une voix personnalisée qui n’est pas correctement déployée. Vérifiez que la ressource Speech a accès à la voix personnalisée et que la voix personnalisée est correctement déployée. Vous devez également vous assurer que le mappage de
{"your-custom-voice-name": "your-deployment-ID"}
est correct dans votre requête de synthèse par lots. - Vous avez essayé d’utiliser une ressource Speech F0, mais la région prend uniquement en charge le niveau tarifaire Standard pour la ressource Speech.
Erreur HTTP 404
L’entité spécifiée est introuvable. Vérifiez que l’ID de synthèse est correct.
Erreur HTTP 429
Il y a trop de requêtes récentes. Chaque application cliente peut envoyer jusqu’à 100 requêtes toutes les 10 secondes pour chaque ressource Speech. Réduisez le nombre de requêtes par seconde.
Erreur HTTP 500
L’erreur serveur interne HTTP 500 indique que la requête a échoué. Le corps de la réponse contient le message d’erreur.
Exemple d’erreur HTTP
Voici un exemple de requête qui aboutit à une erreur HTTP 400, car la propriété inputs
est obligée de créer un travail.
curl -v -X PUT -H "Ocp-Apim-Subscription-Key: YourSpeechKey" -H "Content-Type: application/json" -d '{
"inputKind": "SSML"
}' "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01"
Dans ce cas, les en-têtes de réponse incluent HTTP/1.1 400 Bad Request
.
Le corps de la réponse ressemble à l’exemple JSON suivant :
{
"error": {
"code": "BadRequest",
"message": "The inputs is required."
}
}