テキスト読み上げ用のバッチ合成 API
バッチ合成 API を使用すると、大量のテキスト入力をその長短にかかわらず非同期的に合成できます。 パブリッシャーとオーディオ コンテンツ プラットフォームは、長い音声コンテンツをバッチで作成できます。 たとえば、オーディオブック、ニュース記事、ドキュメントなどです。 10 分を超える合成音声をバッチ合成 API で作成できます。
重要
バッチ合成 API は一般提供されています。 Long Audio API は、2027 年 4 月 1 日に廃止されます。 詳細については、バッチ合成 API への移行に関する記事を参照してください。
バッチ合成 API は非同期であり、合成された音声をリアルタイムでは返しません。 合成するテキスト ファイルを送信し、状態をポーリングして、状態で成功が示されたときにオーディオ出力をダウンロードします。 テキスト入力は、プレーン テキストまたは SSML (音声合成マークアップ言語) テキストである必要があります。
次の図は、ワークフローの概要を示しています。
ヒント
Speech SDK を使い、テキストを反復処理してチャンクで合成することにより、10 分より長い合成音声を作ることもできます。 C# の例については、GitHub をご覧ください。
バッチ合成には、次の REST API 操作を使用できます。
操作 | Method | REST API の呼び出し |
---|---|---|
バッチ合成の作成 | PUT |
texttospeech/batchsyntheses/YourSynthesisId |
バッチ合成の取得 | GET |
texttospeech/batchsyntheses/YourSynthesisId |
バッチ合成の一覧表示 | GET |
texttospeech/batchsyntheses |
バッチ合成の削除 | DELETE |
texttospeech/batchsyntheses/YourSynthesisId |
コード サンプルについては、GitHub を参照してください。
バッチ合成を作成する
バッチ合成要求を送信するには、次の手順に従って HTTP PUT 要求パスおよび本文を構築します。
- 必須の
inputKind
プロパティを設定します。 inputKind
プロパティが "PlainText" に設定されている場合、synthesisConfig
でvoice
プロパティも設定する必要があります。 次の例では、inputKind
が "SSML" に設定されているため、synthesisConfig
は設定されていません。- 必要に応じて、
description
やtimeToLiveInHours
などのプロパティを設定することもできます。 詳細については、「バッチ合成のプロパティ」を参照してください。
Note
許容される最大 JSON ペイロード サイズは 2 メガバイトです。
パス内に必須の YourSynthesisId
を設定します。 YourSynthesisId
は一意である必要があります。 3 から 64 文字の長さにする必要があり、数字、文字、ハイフン、アンダースコア、ドットのみを含み、先頭と末尾は文字または数字にします。
次の の例に示すように、URI を使用して HTTP PUT 要求を行います。 YourSpeechKey
は実際の Speech リソース キーに、YourSpeechRegion
は実際の Speech リソース リージョンに置き換えたうえで、前述のように要求本文のプロパティを設定してください。
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"
応答本文は次の形式で返されます。
{
"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
}
}
status
プロパティは、NotStarted
状態から Running
に、そして最後に Succeeded
または Failed
へと推移します。 Succeeded
と Failed
のどちらかの状態が返されるまで、GET バッチ合成 API を定期的に呼び出すことができます。
バッチ合成を取得する
バッチ合成ジョブの状態を取得するには、以下の例に示した URI を使用して HTTP GET 要求を行います。 YourSpeechKey
を実際の音声リソース キーに置き換えて、YourSpeechRegion
を実際の音声リソース リージョンに置き換えます。
curl -v -X GET "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
応答本文は次の形式で返されます。
{
"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"
}
}
音声 (0001.wav
など)、概要、デバッグの詳細を含んだ ZIP ファイルを outputs.result
からダウンロードできます。 詳細については、「バッチ合成の結果」を参照してください。
バッチ合成を一覧表示する
Speech リソースのすべてのバッチ合成ジョブを一覧表示するには、以下の例に示したように、URI を使用して HTTP GET 要求を行います。 YourSpeechKey
は Speech リソースのキーに、YourSpeechRegion
は Speech リソースのリージョンに置き換えます。 URL には、必要に応じて、skip
と maxpagesize
(最大 100) のクエリ パラメーターを設定できます。 skip
の既定値は 0 で、maxpagesize
の既定値は 100 です。
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"
応答本文は次の形式で返されます。
{
"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"
}
音声 (0001.wav
など)、概要、デバッグの詳細を含んだ ZIP ファイルを outputs.result
からダウンロードできます。 詳細については、「バッチ合成の結果」を参照してください。
合成要求は、json 応答の value
プロパティにリストされます。 一覧は改ページ調整され、最大ページ サイズは 100 です。 ページ分割されたリストの後続ページを取得するための "nextLink"
プロパティが必要に応じて提供されます。
バッチ合成を削除する
音声出力の結果を取得したらバッチ合成のジョブ履歴を削除します。 音声サービスによってバッチ合成履歴が保持される期間は、31 日間または要求の timeToLiveInHours
プロパティの期間のどちらか短い方となります。 "Succeeded" または "Failed" 状態の合成ジョブでは、自動削除の日時は lastActionDateTime
+ timeToLiveInHours
プロパティと等しくなります。
バッチ合成ジョブを取得するには、以下の例に示した URI を使用して HTTP DELETE 要求を行います。 YourSynthesisId
をバッチ合成 ID に置き換え、YourSpeechKey
を Speech リソース キーに置き換えて、YourSpeechRegion
を 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"
削除要求が成功した場合、応答ヘッダーには HTTP/1.1 204 No Content
が含まれ明日。
バッチ合成の結果
status
が "Succeeded" である バッチ合成ジョブを取得したら、音声出力の結果をダウンロードできます。 バッチ合成 GET の応答の outputs.result
プロパティから得られる URL を使用します。
バッチ合成の結果ファイルを取得するには、以下の例に示した URI を使用して HTTP GET 要求を行います。 YourOutputsResultUrl
は、バッチ合成 GET の応答の outputs.result
プロパティから得られる URL に置き換えます。 YourSpeechKey
をSpeech リソース キーに置き換えます。
curl -v -X GET "YourOutputsResultUrl" -H "Ocp-Apim-Subscription-Key: YourSpeechKey" > results.zip
結果は、音声 (0001.wav
など)、概要、デバッグの詳細を含んだ ZIP ファイルに格納されます。 各ファイル名の番号付きプレフィックス (以下の例では [nnnn]
) は、バッチ合成を作成する際に使用したテキスト入力と同じ順序になります。
Note
[nnnn].debug.json
ファイルには、合成結果の ID など、トラブルシューティングに役立つ可能性のある情報が格納されています。 格納されるプロパティは変化する可能性があるので、どのような形であれ、この JSON 形式に依存することは避けてください。
各テキスト入力の合成結果は summary ファイルに格納されます。 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"
}
}
]
}
文の境界データが要求された場合 ("sentenceBoundaryEnabled": true
の場合)、対応する [nnnn].sentence.json
ファイルが結果に含められます。 同様に、単語の境界データが要求された場合 ("wordBoundaryEnabled": true
の場合)、対応する [nnnn].word.json
ファイルが結果に含められます。
音声のオフセットと時間 (ミリ秒単位) を含んだ単語データ ファイルの例を次に示します。
[
{
"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
}
]
バッチ合成の待機時間とベスト プラクティス
音声を合成するためにバッチ合成を使用する場合、それにともなう待機時間を考慮し、最適な結果を得るためのベスト プラクティスを実践する必要があります。
バッチ合成の待機時間
バッチ合成の待機時間は、入力テキストの複雑さ、バッチに含まれる入力の数、基になるハードウェアの処理能力など、さまざまな要因によって異なります。
バッチ合成の待機時間 (おおよそ) は次のとおりです。
合成された音声出力の 50% の待機時間は 10 から 20 秒以内です。
合成された音声出力の 95% の待機時間は 120 秒以内です。
ベスト プラクティス
アプリケーションのバッチ合成を検討するとき、待機時間が要件を満たしているかどうか評価することをお勧めします。 待機時間が目的のパフォーマンスと一致する場合、バッチ合成が適切な選択肢となりえます。 ただし、待機時間がニーズを満たしていない場合は、リアルタイム API の使用を検討してください。
HTTP 状態コード
このセクションでは、バッチ合成 API の HTTP 応答コードとメッセージについて詳しく取り上げます。
HTTP 200 OK
HTTP 200 OK は、要求が成功したことを示します。
HTTP 201 Created
HTTP 201 Created は、(HTTP PUT での) バッチ合成作成要求が成功したことを示します。
HTTP 204 エラー
HTTP 204 エラーは、要求は成功したが、リソースが存在しないことを示します。 次に例を示します。
- 存在しない合成ジョブを取得または削除しようとしました。
- 合成ジョブが正常に削除されました。
HTTP 400 エラー
400 エラーが発生する可能性のある例を次に示します。
outputFormat
がサポートされていないか無効である。 有効なフォーマット値を指定してください。既定の設定を使用する場合はoutputFormat
を空のままにします。- 要求されたテキスト入力の数が上限である 10,000 件を超えた。
- 無効なデプロイ ID または正常にデプロイされていないカスタム音声を使用しようとした。 Speech リソースがカスタム音声にアクセスできること、また、カスタム音声が正常にデプロイされていることを確認してください。 また、バッチ合成要求における
{"your-custom-voice-name": "your-deployment-ID"}
のマッピングが正しいことを確認する必要があります。 - F0 Speech リソースを使おうとしたが、リージョンでサポートされている Speech リソースの価格レベルが Standard のみである。
HTTP 404 エラー
指定されたエンティティが見つかりません。 合成 ID が正しいことを確認してください。
HTTP 429 エラー
直近の要求が多すぎます。 各クライアント アプリケーションが各 Speech リソースに対して送信できる要求は 10 秒につき 100 個までです。 1 秒あたりの要求の数を減らしてください。
HTTP 500 エラー
HTTP 500 内部サーバー エラーは、要求が失敗したことを示します。 エラー メッセージは応答本文に含まれています。
HTTP エラーの例
ここに示したのは、ジョブの作成には inputs
プロパティが必要であるために HTTP 400 エラーになる要求の例です。
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"
この場合、応答ヘッダーには HTTP/1.1 400 Bad Request
が含まれます。
応答本文は、次の例に示す JSON のようになります。
{
"error": {
"code": "BadRequest",
"message": "The inputs is required."
}
}