メインコンテンツへスキップ
これは WebSocket コンテキストを利用した入力ストリーミングの実践的なガイドです。Sonic における入力ストリーミングの動作についての概念的な概要は、入力ストリーミングガイド を参照してください。
多くのリアルタイムのユースケースでは、たとえば LLM を使って生成する場合のように、トランスクリプトを事前に用意できないことがあります。こうしたケースのために、Sonic は入力ストリーミングをサポートしています。
Cartesia API に渡すコンテキスト ID は、音声コンテキストを識別します。コンテキストは入力間でプロソディを維持するため、トランスクリプトを複数のパートに分けて送信し、シームレスな音声を受け取ることができます。 コンテキスト上で入力をストリーミングするには、後続の入力が続くことが想定されるすべての入力に continue フラグ (true に設定) を渡すだけです。(デフォルトでは、このフラグは false に設定されています。) コンテキストを終了するには、continuefalse に設定するだけです。最後のトランスクリプトを事前に把握できない場合は、空のトランスクリプトと continuefalse に設定した入力を送信できます。
コンテキストは、最後の音声出力がストリーミング送出されてから 1 秒後に自動的に期限切れになります。期限切れ後に同じコンテキスト ID で別の入力を送信することはサポートされていません。
continue
boolean
デフォルト:false
この入力に後続の入力が続く可能性があるかどうか。

入力フォーマット

  1. 同じコンテキスト上の入力では、transcriptcontinueduration 以外のすべてのフィールドを同一に保つ必要があります。
  2. トランスクリプトはそのまま連結されるため、つなげたときに有効なトランスクリプトを構成することを確認してください。必要に応じて、単語と単語の間や句読点の前後にスペースを入れるようにしてください。たとえばスペースで単語を区切る言語の場合、先行するトランスクリプトの末尾にスペースを含める必要があります。例: トランスクリプト 1 は Thanks for coming, 、トランスクリプト 2 は it was great to see you.

「Hello, Sonic! I’m streaming inputs.」の音声を生成しようとしているとします。次のように入力をストリーミングしてください (簡潔さのため繰り返しのフィールドは省略しています)。注意: その他すべてのフィールド (たとえば model_idlanguage) は必須で、入力ストリーミングを伴うリクエスト間で変更せずに渡す必要があります。
Input Streaming
{"transcript": "Hello, Sonic!", "continue": true, "context_id": "happy-monkeys-fly"}
{"transcript": " I'm streaming ", "continue": true, "context_id": "happy-monkeys-fly"}
{"transcript": "inputs.", "continue": false, "context_id": "happy-monkeys-fly"}
入力トークンをストリーミング する場合は、max_buffer_delay_ms の使用を推奨します。これは、モデルが生成を開始する前にテキストをバッファする最大時間を設定します。このオプションを設定しない場合、モデルは最初のリクエストですぐに生成を開始するため、入力のバッファリングを完全に制御できます。
最後のトランスクリプトを事前に把握できない場合は、空のトランスクリプトと continuefalse に設定した入力を送信できます:
Input Streaming
{"transcript": "Hello, Sonic!", "continue": true, "context_id": "happy-monkeys-fly"}
{"transcript": " I'm streaming ", "continue": true, "context_id": "happy-monkeys-fly"}
{"transcript": "inputs.", "continue": true, "context_id": "happy-monkeys-fly"}
{"transcript": "", "continue": false, "context_id": "happy-monkeys-fly"}

出力

done: true は、コンテキスト全体の出力が返された後にのみ受信します。 特定のコンテキストに対する出力は、常にストリーミングした入力の順序で返されます。(つまり、あるコンテキストで入力 A を送信した後に入力 B を送信した場合、まず入力 A に対応するチャンクを受信し、その後で入力 B に対応するチャンクを受信します。)

リクエストのキャンセル

送信中のリクエストを WebSocket 経由でキャンセルすることもできます。 リクエストをキャンセルするには、次の構造の JSON メッセージを送信します:
WebSocket Request
{
  "context_id": "happy-monkeys-fly",
  "cancel": true
}
キャンセルリクエストを送信した場合:
  1. レスポンスの生成がまだ開始されていないリクエストのみが停止されます。
  2. 現在生成中のリクエストは、完了までレスポンスの送信を続けます。
キャンセルリクエストの context_id は、キャンセルしたいリクエストの context_id と一致している必要があります。