バッチ合成 API (プレビュー) によるテキスト読み上げ
バッチ合成 API (プレビュー) は、大量のテキスト入力をその長短にかかわらず非同期的に合成できます。 パブリッシャーとオーディオ コンテンツ プラットフォームは、長い音声コンテンツをバッチで作成できます。 たとえば、オーディオブック、ニュース記事、ドキュメントなどです。 10 分を超える合成音声をバッチ合成 API で作成できます。
重要
バッチ合成 API は現在パブリック プレビュー段階です。 その一般提供が開始された後、Long Audio API は非推奨となる予定です。 詳細については、バッチ合成 API への移行に関する記事を参照してください。
バッチ合成 API は非同期であり、合成された音声をリアルタイムでは返しません。 合成するテキスト ファイルを送信し、状態をポーリングして、状態で成功が示されたときにオーディオ出力をダウンロードします。 テキスト入力は、プレーン テキストまたは SSML (音声合成マークアップ言語) テキストである必要があります。
次の図は、ワークフローの概要を示しています。
ヒント
Speech SDK を使い、テキストを反復処理してチャンクで合成することにより、10 分より長い合成音声を作ることもできます。 C# の例については、GitHub をご覧ください。
バッチ合成には、次の REST API 操作を使用できます。
操作 | Method | REST API の呼び出し |
---|---|---|
バッチ合成の作成 | POST |
texttospeech/3.1-preview1/batchsynthesis |
バッチ合成の取得 | GET |
texttospeech/3.1-preview1/batchsynthesis/{id} |
バッチ合成の一覧表示 | GET |
texttospeech/3.1-preview1/batchsynthesis |
バッチ合成の削除 | DELETE |
texttospeech/3.1-preview1/batchsynthesis/{id} |
コード サンプルについては、GitHub を参照してください。
バッチ合成を作成する
バッチ合成要求を送信するには、次の手順に従って HTTP POST 要求本文を構築します。
- 必須の
textType
プロパティを設定します。 textType
プロパティが "PlainText" に設定されている場合、synthesisConfig
でvoice
プロパティも設定する必要があります。 次の例では、textType
が "SSML" に設定されているため、speechSynthesis
は設定されていません。- 必須の
displayName
プロパティを設定します。 後で参照できる名前を選択してください。 表示名が一意である必要はありません。 - 必要に応じて、
description
やtimeToLive
などのプロパティを設定することもできます。 詳細については、「バッチ合成のプロパティ」を参照してください。
Note
許容される最大 JSON ペイロード サイズは 500 KB (キロバイト) です。 各 Speech リソースは、バッチ合成ジョブを最大 200 個受け取って同時に実行することができます。
HTTP POST 要求は、次の例に示すように URI を使用して行います。 YourSpeechKey
は実際の Speech リソース キーに、YourSpeechRegion
は実際の Speech リソース リージョンに置き換えたうえで、前述のように要求本文のプロパティを設定してください。
curl -v -X POST -H "Ocp-Apim-Subscription-Key: YourSpeechKey" -H "Content-Type: application/json" -d '{
"displayName": "batch synthesis sample",
"description": "my ssml test",
"textType": "SSML",
"inputs": [
{
"text": "<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.customvoice.api.speech.microsoft.com/api/texttospeech/3.1-preview1/batchsynthesis"
応答本文は次の形式で返されます。
{
"textType": "SSML",
"synthesisConfig": {},
"customVoices": {},
"properties": {
"timeToLive": "P31D",
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false
},
"lastActionDateTime": "2022-11-16T15:07:04.121Z",
"status": "NotStarted",
"id": "1e2e0fe8-e403-417c-a382-b55eb2ea943d",
"createdDateTime": "2022-11-16T15:07:04.121Z",
"displayName": "batch synthesis sample",
"description": "my ssml test"
}
status
プロパティは、NotStarted
状態から Running
に、そして最後に Succeeded
または Failed
へと推移します。 Succeeded
と Failed
のどちらかの状態が返されるまで、GET バッチ合成 API を定期的に呼び出すことができます。
バッチ合成を取得する
バッチ合成ジョブの状態を取得するには、以下の例に示した URI を使用して HTTP GET 要求を行います。 YourSynthesisId
をバッチ合成 ID に置き換え、YourSpeechKey
を Speech リソース キーに置き換えて、YourSpeechRegion
を Speech リソース リージョンに置き換えます。
curl -v -X GET "https://YourSpeechRegion.customvoice.api.speech.microsoft.com/api/texttospeech/3.1-preview1/batchsynthesis/YourSynthesisId" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
応答本文は次の形式で返されます。
{
"textType": "SSML",
"synthesisConfig": {},
"customVoices": {},
"properties": {
"audioSize": 100000,
"durationInTicks": 31250000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"duration": "PT3.125S",
"billingDetails": {
"customNeural": 0,
"neural": 33
},
"timeToLive": "P31D",
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false
},
"outputs": {
"result": "https://cvoiceprodeus.blob.core.windows.net/batch-synthesis-output/41b83de2-380d-45dc-91af-722b68cfdc8e/results.zip?SAS_Token"
},
"lastActionDateTime": "2022-11-05T14:00:32.523Z",
"status": "Succeeded",
"id": "41b83de2-380d-45dc-91af-722b68cfdc8e",
"createdDateTime": "2022-11-05T14:00:31.523Z",
"displayName": "batch synthesis sample",
"description": "my test"
}
音声 (0001.wav
など)、概要、デバッグの詳細を含んだ ZIP ファイルを outputs.result
からダウンロードできます。 詳細については、「バッチ合成の結果」を参照してください。
バッチ合成を一覧表示する
Speech リソースのすべてのバッチ合成ジョブを一覧表示するには、以下の例に示したように、URI を使用して HTTP GET 要求を行います。 YourSpeechKey
は Speech リソースのキーに、YourSpeechRegion
は Speech リソースのリージョンに置き換えます。 URL には、必要に応じて、skip
と top
(ページ サイズ) のクエリ パラメーターを設定できます。 skip
の既定値は 0 で、top
の既定値は 100 です。
curl -v -X GET "https://YourSpeechRegion.customvoice.api.speech.microsoft.com/api/texttospeech/3.1-preview1/batchsynthesis?skip=0&top=2" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
応答本文は次の形式で返されます。
{
"values": [
{
"textType": "SSML",
"synthesisConfig": {},
"customVoices": {},
"properties": {
"audioSize": 100000,
"durationInTicks": 31250000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"duration": "PT3.125S",
"billingDetails": {
"customNeural": 0,
"neural": 33
},
"timeToLive": "P31D",
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false
},
"outputs": {
"result": "https://cvoiceprodeus.blob.core.windows.net/batch-synthesis-output/41b83de2-380d-45dc-91af-722b68cfdc8e/results.zip?SAS_Token"
},
"lastActionDateTime": "2022-11-05T14:00:32.523Z",
"status": "Succeeded",
"id": "41b83de2-380d-45dc-91af-722b68cfdc8e",
"createdDateTime": "2022-11-05T14:00:31.523Z",
"displayName": "batch synthesis sample",
"description": "my test"
}
{
"textType": "PlainText",
"synthesisConfig": {
"voice": "en-US-JennyNeural",
"style": "chat",
"rate": "+30.00%",
"pitch": "x-high",
"volume": "80"
},
"customVoices": {},
"properties": {
"audioSize": 79384,
"durationInTicks": 24800000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"duration": "PT2.48S",
"billingDetails": {
"customNeural": 0,
"neural": 33
},
"timeToLive": "P31D",
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false
},
"outputs": {
"result": "https://cvoiceprodeus.blob.core.windows.net/batch-synthesis-output/38e249bf-2607-4236-930b-82f6724048d8/results.zip?SAS_Token"
},
"lastActionDateTime": "2022-11-05T18:52:23.210Z",
"status": "Succeeded",
"id": "38e249bf-2607-4236-930b-82f6724048d8",
"createdDateTime": "2022-11-05T18:52:22.807Z",
"displayName": "batch synthesis sample",
"description": "my test"
},
],
// The next page link of the list of batch synthesis.
"@nextLink": "https://{region}.customvoice.api.speech.microsoft.com/api/texttospeech/3.1-preview1/batchsynthesis?skip=0&top=2"
}
音声 (0001.wav
など)、概要、デバッグの詳細を含んだ ZIP ファイルを outputs.result
からダウンロードできます。 詳細については、「バッチ合成の結果」を参照してください。
合成要求は、json 応答の values
プロパティにリストされます。 一覧は改ページ調整され、最大ページ サイズは 100 です。 ページ分割されたリストの後続ページを取得するための "@nextLink"
プロパティが必要に応じて提供されます。
バッチ合成を削除する
音声出力の結果を取得したらバッチ合成のジョブ履歴を削除します。 Speech サービスによって各合成の履歴が保持される期間は、最大 31 日間または要求の timeToLive
プロパティの期間のどちらか早い方となります。 "Succeeded" または "Failed" 状態の合成ジョブでは、自動削除の日時は lastActionDateTime
+ timeToLive
プロパティと等しくなります。
バッチ合成ジョブを取得するには、以下の例に示した URI を使用して HTTP DELETE 要求を行います。 YourSynthesisId
をバッチ合成 ID に置き換え、YourSpeechKey
を Speech リソース キーに置き換えて、YourSpeechRegion
を Speech リソース リージョンに置き換えます。
curl -v -X DELETE "https://YourSpeechRegion.customvoice.api.speech.microsoft.com/api/texttospeech/3.1-preview1/batchsynthesis/YourSynthesisId" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
削除要求が成功した場合、応答ヘッダーには HTTP/1.1 204 No Content
が含まれ明日。
バッチ合成の結果
status
が "Succeeded" である バッチ合成ジョブを取得したら、音声出力の結果をダウンロードできます。 バッチ合成を取得したときに返される outputs.result
プロパティから得られる URL を使用します。
バッチ合成の結果ファイルを取得するには、以下の例に示した URI を使用して HTTP GET 要求を行います。 YourOutputsResultUrl
は、バッチ合成を取得したときに返される 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": "41b83de2-380d-45dc-91af-722b68cfdc8e",
"status": "Succeeded",
"results": [
{
"texts": [
"<speak version='1.0' xml:lang='en-US'>\n\t\t\t\t<voice name='en-US-JennyNeural'>\n\t\t\t\t\tThe rainbow has seven colors.\n\t\t\t\t</voice>\n\t\t\t</speak>"
],
"status": "Succeeded",
"billingDetails": {
"CustomNeural": "0",
"Neural": "33"
},
"audioFileName": "0001.wav",
"properties": {
"audioSize": "100000",
"duration": "PT3.1S",
"durationInTicks": "31250000"
}
}
]
}
文の境界データが要求された場合 ("sentenceBoundaryEnabled": true
の場合)、対応する [nnnn].sentence.json
ファイルが結果に追加されます。 同様に、単語の境界データが要求された場合 ("wordBoundaryEnabled": true
の場合)、対応する [nnnn].word.json
ファイルが結果に追加されます。
音声のオフセットと時間 (ミリ秒単位) を含んだ単語データ ファイルの例を次に示します。
[
{
"Text": "the",
"AudioOffset": 38,
"Duration": 153
},
{
"Text": "rainbow",
"AudioOffset": 201,
"Duration": 326
},
{
"Text": "has",
"AudioOffset": 567,
"Duration": 96
},
{
"Text": "seven",
"AudioOffset": 673,
"Duration": 96
},
{
"Text": "colors",
"AudioOffset": 778,
"Duration": 451
},
]
バッチ合成の待機時間とベスト プラクティス
音声を合成するためにバッチ合成を使用する場合、それにともなう待機時間を考慮し、最適な結果を得るためのベスト プラクティスを実践する必要があります。
バッチ合成の待機時間
バッチ合成の待機時間は、入力テキストの複雑さ、バッチに含まれる入力の数、基になるハードウェアの処理能力など、さまざまな要因によって異なります。
バッチ合成の待機時間 (おおよそ) は次のとおりです。
合成された音声出力の 50% の待機時間は 10 から 20 秒以内です。
合成された音声出力の 95% の待機時間は 120 秒以内です。
ベスト プラクティス
アプリケーションのバッチ合成を検討するとき、待機時間が要件を満たしているかどうか評価することをお勧めします。 待機時間が目的のパフォーマンスと一致する場合、バッチ合成が適切な選択肢となりえます。 ただし、待機時間がニーズを満たしていない場合、リアルタイム API の使用を検討してください。
HTTP 状態コード
このセクションでは、バッチ合成 API の HTTP 応答コードとメッセージについて詳しく取り上げます。
HTTP 200 OK
HTTP 200 OK は、要求が成功したことを示します。
HTTP 201 Created
HTTP 201 Created は、(HTTP POST での) バッチ合成要求の作成が成功したことを示します。
HTTP 204 エラー
HTTP 204 エラーは、要求は成功したが、リソースが存在しないことを示します。 次に例を示します。
- 存在しない合成ジョブを取得または削除しようとしました。
- 合成ジョブが正常に削除されました。
HTTP 400 エラー
400 エラーが発生する可能性のある例を次に示します。
outputFormat
がサポートされていないか無効である。 有効なフォーマット値を指定してください。既定の設定を使用する場合はoutputFormat
を空のままにします。- 要求されたテキスト入力の数が上限である 1,000 件を超えた。
top
クエリ パラメーターが上限である 100 を超えている。- 無効なデプロイ ID または正常にデプロイされていないカスタム音声を使用しようとした。 Speech リソースがカスタム音声にアクセスできること、また、カスタム音声が正常にデプロイされていることを確認してください。 また、バッチ合成要求における
{"your-custom-voice-name": "your-deployment-ID"}
のマッピングが正しいことを確認する必要があります。 - 開始されていないバッチ合成ジョブ、または実行が完了していないバッチ合成ジョブを削除しようとした。 バッチ合成ジョブは、状態が "Succeeded" または "Failed" である場合にのみ削除できます。
- F0 Speech リソースを使おうとしたが、リージョンでサポートされている Speech リソースの価格レベルが Standard のみである。
- アクティブなジョブの上限である 200 を超える新しいバッチ合成ジョブを作成しようとした。 各 Speech リソースには、状態が "Succeeded" でも "Failed" でもない最大 200 個のバッチ合成ジョブを割り当てることができます。
HTTP 404 エラー
指定されたエンティティが見つかりません。 合成 ID が正しいことを確認してください。
HTTP 429 エラー
直近の要求が多すぎます。 各クライアント アプリケーションが各 Speech リソースに対して送信できる要求は 5 秒につき 50 個までです。 1 秒あたりの要求の数を減らしてください。
レート制限と残りのクォータは、HTTP ヘッダーを使用して確認できます。その例を次に示します。
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 49
X-RateLimit-Reset: 2022-11-11T01:49:43Z
HTTP 500 エラー
HTTP 500 内部サーバー エラーは、要求が失敗したことを示します。 エラー メッセージは応答本文に含まれています。
HTTP エラーの例
ここに示したのは、top
クエリ パラメーターが 100 より大きい値に設定されているために HTTP 400 エラーになる要求の例です。
curl -v -X GET "https://YourSpeechRegion.customvoice.api.speech.microsoft.com/api/texttospeech/3.1-preview1/batchsynthesis?skip=0&top=200" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
この場合、応答ヘッダーには HTTP/1.1 400 Bad Request
が格納されます。
応答本文は、次の例に示す JSON のようになります。
{
"code": "InvalidRequest",
"message": "The top parameter should not be greater than 100.",
"innerError": {
"code": "InvalidParameter",
"message": "The top parameter should not be greater than 100."
}
}