バッチ合成 API (プレビュー) によるテキスト読み上げ

バッチ合成 API (プレビュー) は、大量のテキスト入力をその長短にかかわらず非同期的に合成できます。 パブリッシャーとオーディオ コンテンツ プラットフォームは、長い音声コンテンツをバッチで作成できます。 たとえば、オーディオブック、ニュース記事、ドキュメントなどです。 10 分を超える合成音声をバッチ合成 API で作成できます。

重要

バッチ合成 API は現在パブリック プレビュー段階です。 その一般提供が開始された後、Long Audio API は非推奨となる予定です。 詳細については、バッチ合成 API への移行に関する記事を参照してください。

バッチ合成 API は非同期であり、合成された音声をリアルタイムでは返しません。 合成するテキスト ファイルを送信し、状態をポーリングして、状態で成功が示されたときにオーディオ出力をダウンロードします。 テキスト入力は、プレーン テキストまたは SSML (音声合成マークアップ言語) テキストである必要があります。

次の図は、ワークフローの概要を示しています。

Diagram of the Batch Synthesis API workflow.

ヒント

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" に設定されている場合、synthesisConfigvoice プロパティも設定する必要があります。 次の例では、textType が "SSML" に設定されているため、speechSynthesis は設定されていません。
  • 必須の displayName プロパティを設定します。 後で参照できる名前を選択してください。 表示名が一意である必要はありません。
  • 必要に応じて、descriptiontimeToLive などのプロパティを設定することもできます。 詳細については、「バッチ合成のプロパティ」を参照してください。

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 へと推移します。 SucceededFailed のどちらかの状態が返されるまで、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 には、必要に応じて、skiptop (ページ サイズ) のクエリ パラメーターを設定できます。 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."
  }
}

次の手順