コンソール

リアルタイム対話の作成

WSS/v1/realtime

WebSocketで継続的な双方向のリアルタイムセッションを確立し、音声、カメラまたは画面の映像を連続して入力して、テキストと音声のレスポンスをストリーミングで受信します。自然な割り込みに対応し、複雑な推論や長時間のタスクをお客様自身のバックエンドに委任して実行し、実行中もユーザーとの会話を続けます。

接続と認証

HTTP GETでWebSocketにアップグレードします。接続先はwss://api.mosi.cn/v1/realtimeで、modelクエリパラメータでモデルを指定する必要があります。APIキーはAuthorizationリクエストヘッダーにのみ指定できます。

フィールド型必須説明
model: query string必須

モデルIDです。安定版IDを推奨し、スナップショットIDにも対応しています。WebSocket接続URLのmodelクエリパラメータで指定します。

user: query string任意

呼び出し側が管理する安定したエンドユーザーIDで、URLエンコードが必要です。memory_scope=userを使用する場合は必須で、再接続時は同じuserを使用します。例:wss://api.mosi.cn/v1/realtime?model=moss-live-1.0&user=customer_001。

Authorization: HTTP header必須

Bearer <API Key>。WebSocketハンドシェイクのAuthorizationリクエストヘッダーに指定します。

セッションの流れ

段階クライアントサーバー側の応答と判定
接続の確立WebSocketハンドシェイクを完了し、attach_sessionを送信します接続が開いた後にセッションに参加します
設定ボイスを指定する場合はchange_voiceを送信します。ペルソナ、セッション指示、カスタムツールが必要な場合はsession.updateを送信します。音声形式を変更する場合はmedia.configureを送信します。クライアント委任はattach_sessionで設定しますsession_attachedを待ちます。change_voiceを送信した場合はvoice_changedを、session.updateを送信した場合はsession.updatedを待ち、data.errorが空文字列であることを確認します。media.configureを送信した場合はmedia.configuredを待ちます
音声と動画の送信マイクを有効にして音声をアップロードし続けます。動画は必要に応じて有効にします音声と映像の入力を受信します
回答テキストを表示し、音声を再生して、再生確認を送信しますinput.transcript.done、output.transcript.done、response.endedを受信します。音声の返答が完了または中断された後も対話を続けられます
継続または終了入力を続けるか、WebSocketを閉じますこのターンが完了すれば継続できます。接続を閉じるとセッションが終了します

クライアントイベント

フィールド型説明
attach_session: event

新しいセッションを作成するか、既存のセッションを再開します。接続後の最初のメッセージとしてこのイベントを送信します。

再接続する場合は、先に古い接続を切断し、元のsession_id、同じuser、同じ作成オプションを使用します。再開できない場合は新しいセッションを作成します。タスクとツールの実行記録はアプリ側で保持してください。

session.update: event

ペルソナ、セッション指示、カスタムツールを設定します。初期化時は、音声を有効にする前に設定を完了してください。

省略した設定項目は元の値が保持され、検証に失敗した場合は今回の更新は適用されません。instructionsのみを渡すと元のペルソナは保持されます。persona=nullでデフォルトのペルソナに戻ります。

change_voice: event

現在のセッションのボイスを切り替えます。session_attachedを受信した後、同じWebSocketで送信します。

mic_state: event

マイク入力をオンまたはオフにします。

media.mode: event

動画を送信する前に、種別プレフィックス付きのメディア形式を有効にします。

media.configure: event

この接続の音声形式、画像キャプチャのパラメータ、再生確認の方式を選択します。attach_sessionの後はいつでも、何度でも送信できます。送信しない場合はデフォルトの形式を使用し、フィールドを何も含めない場合は現在の設定のみが返されます。切断後に再接続した場合は再度送信する必要があります。ネットワーク環境が悪い場合は、profileをlowに設定すると低ビットレートで伝送できます。

client_context.update: event

デバイスのタイムゾーンと、任意でデバイスの位置を報告します。アシスタントはこのタイムゾーンに基づいて現地の時刻や日付を答え、「午後3時」のような時刻を計算します。報告しない場合は北京時間が使用されます。接続の確立後に1回送信し、タイムゾーンや位置が変わったときに再度送信することを推奨します。contextにnullを渡すとクリアされます。

media.output.configure: event

この接続で配信される音声の音量と話速を調整します。ユーザーのデバイスのスピーカー音量が小さすぎる・大きすぎる場合や、もう少しゆっくり話してほしい場合に適しています。2つのフィールドのうち少なくとも1つを指定します。attach_sessionの後はいつでも、何度でも送信でき、次の音声チャンクから適用されます(再生中の返答も変化します)。送信しない場合はデフォルトの音量と通常の話速です。切断後に再接続した場合は再度送信する必要があります。

video.state: event

カメラまたは画面の映像を制御します。映像をオフにしてもセッションは終了しません。

video.stream_focus: event

主に注目する映像ソースを選択します。

playback.chunk.completed: event

音声チャンクが実際に最後まで再生された後に送信します。

playback.completed: event

response.audio.doneを受信済みで、その返答の音声がすべて実際に再生し終わりました。

playback.stopped: event

再生の停止が完了した後、実際の進捗を報告します。まず最後まで再生し終えたチャンクを確認し、次に現在再生途中のチャンクの再生済み時間を報告します。

conversation.item.create: event

ツールの実行結果を送信します。失敗した場合も、モデルが利用できる失敗の説明を返してください。

response.create: event

送信済みのツール結果を使って、モデルに返答を続けさせます。ツール呼び出し後の回答の継続に使用します。通常の音声対話ではモデルが自動的に応答します。

session.thinking.append: event

事実や進捗を送信します。

session.commentary.append: event

ユーザーに伝えられる進捗や結果を送信します。

session.instructions.append: event

セッションレベルの指示を追加します。

session.delegation.cancel: event

指定した委任のキャンセルを要求します。アプリ自身の実行器やデバイス操作の停止も、アプリ側で行います。

ping: event

任意の接続キープアライブイベントです。アプリのキープアライブ周期に合わせて送信できます。

サーバーイベント

フィールド型説明
session_attached: event

セッションの準備ができました。セッションIDを保存し、返された実際の設定に従って接続を続けます。

session.updated: event

セッション設定の処理結果。まずdata.errorを確認し、入力を開始するかどうかを判断します。

voice_changed: event

ボイス設定の成功通知。data.nameは現在のセッションに設定されたボイスIDです。

media.configured: event

media.configureへの応答で、この接続で現在有効な設定を示します。以降の下りの音声は、このoutput_audioに従ってデコードします。

client_context.updated: event

client_context.updateへの応答。

media.output.configured: event

media.output.configureへの応答。ユーザーが対話の中でもっとゆっくり、またはもっと速く話すよう求めた場合も、サーバーはこのイベントを送信して新しい話速をアプリに通知します。

input.speech.started: event

ユーザーの音声活動の開始通知。アプリはこれに基づいてユーザーが話している状態を更新できます。再生の停止と確認通知は引き続き割り込みイベントに従って処理します。

input.speech.stopped: event

ユーザーの音声活動の停止通知。ユーザーの発話状態の更新に使用します。モデルの返答と接続の状態は、それぞれ対応するイベントに従って処理します。

session.closing: event

サーバーは接続を閉じる前にこの通知を送信することがあります。接続のクローズは、アプリでWebSocketのcloseイベントによって処理します。

input.transcript.updated: event

現在のユーザーの音声テキストの更新。

input.transcript.done: event

現在のユーザーの音声テキストの確定。

input.transcript.revised: event

確定済みのユーザー音声テキストを修正します。turnに基づいて履歴の項目を更新し、新しい対話は追加しません。

output.transcript.updated: event

モデルの音声テキストの更新。

output.transcript.done: event

正常に完了した場合の、モデルの最終的な音声テキスト。

response.audio.started: event

対応する返答の音声出力が始まりました。

response.audio.context: event

次のバイナリ音声チャンクの関連情報。保存して、後続のPCMフレームと対応付けます。

response.audio.done: event

対応する返答の音声の送信が完了しました。ローカルのプレーヤーで再生し終わるまで待つ必要があります。

response.audio.stop: event

指定した返答の再生を直ちに停止し、再生待ちの音声をクリアします。新しい返答の受信は続けます。

response.ended: event

今回の返答が終了しました。接続は引き続き使用できます。正常な完了、発話前の中止、失敗がこのイベントで通知されます。

response.interrupted: event

発話済みの返答が割り込まれたか、再生に失敗しました。このイベントは対応する返答の最終状態であり、アプリはこれに基づいてその返答を終了します。

response.function_call_arguments.done: event

ツール呼び出しの引数がすべて揃いました。nameでツールを選択し、argumentsを解析して実行します。

response.done: event

ツール呼び出しの出力のまとめ。引数完了イベントと同じ呼び出しを含む場合があるため、call_idで重複を排除します。ツールの実行や音声の再生の完了を示すものではありません。

conversation.item.created: event

ツールの結果を受け付けました。続けてresponse.createを送信して返答を続けます。

session.delegation.created: event

アプリで実行するタスクがあります。delegation.idを保存し、objectiveとcontextに基づいて呼び出しを準備します。タスクを非同期で実行している間も、リアルタイム音声の処理を続けます。

session.thinking.appended: event

サーバーが今回の更新を受け付けたことを確認します。音声の再生状態は、プレーヤーと再生確認によって記録されます。

session.commentary.appended: event

サーバーが今回の更新を受け付けたことを確認します。音声の再生状態は、プレーヤーと再生確認によって記録されます。

session.instructions.appended: event

サーバーが今回の更新を受け付けたことを確認します。音声の再生状態は、プレーヤーと再生確認によって記録されます。

session.delegation.cancelled: event

委任がキャンセル済みとしてマークされました。アプリは実際の実行を停止し、まだ返送していない古い結果を破棄してください。

pong: event

公開のキープアライブ応答は{action, data}を使用し、時刻フィールドはすべてdataに含まれます。

error: event

リクエストまたはセッションのエラー。エラーコードに従って対応するリクエストを処理し、接続の状態に応じてセッションを続けるか再接続します。

カスタムツール呼び出し

session.update.session.toolsでツールを定義し、アプリで実行します。カスタムツールはclientモードとnoneモードのどちらでも使用できます。

ツールの実行中は、WebSocketの送受信や音声処理をブロックしないでください。ツールはデフォルトで同期です。モデルのこのターンの返答はツールの結果を待ちます。待機時間には上限があり、タイムアウトした場合は結果を受信しなかったものとして扱われます。実行に約2秒を超える可能性のあるツール(お客様のバックエンドへの照会、注文、承認、サードパーティサービスの呼び出し)は非同期ツールとして宣言してください。「非同期ツール」を参照してください。ユーザーは話し続けることができ、結果が返送された後にアシスタントが回答を続けます。

ツール定義

フィールド型必須説明
type: string必須

functionを指定します。

name: string必須

英字またはアンダースコアで始まり、英字、数字、アンダースコアのみを含む最大64文字の名前。リスト内で重複できません。名前が使用できない場合は、設定の確認でエラーが返されます。

description: string必須

空でない文字列。用途と適用条件を説明します。

parameters: object任意

引数のJSON Schema。省略した場合はプロパティのないobjectを使用します。実行前にアプリで引数を検証します。

execution_mode: string任意

実行方式。デフォルトはsyncです。「非同期ツール」を参照してください。

read_only: boolean任意

読み取り専用かどうか。async_queryではtrue、async_effectではfalseである必要があり、そうでない場合はsession.update全体が拒否されます。

syncツールでも指定できます。trueは読み取り専用の照会を示し、ユーザーが新たに発話した後や、途中で書き込み操作があった後は再度照会し、同じターン内で引数が同じ照会は前回の結果を再利用します。

ツールを定義
{
  "action": "session.update",
  "session": {
    "tools": [
      {
        "type": "function",
        "name": "get_order_status",
        "description": "指定した注文の現在の状態を照会します",
        "parameters": {
          "type": "object",
          "properties": {
            "order_id": {
              "type": "string"
            }
          },
          "required": [
            "order_id"
          ]
        }
      }
    ]
  }
}

session.updatedで設定の成功を確認 → response.function_call_arguments.doneを受信 → アプリで実行 → conversation.item.createで結果を返送 → conversation.item.createdを受信 → response.createで返答を続けます。

response.doneにも同じ呼び出しが含まれる場合があるため、call_idで重複を排除し、各呼び出しを1回だけ実行します。ツールのリストは更新時に全体が置き換えられ、tools: []を渡すとクリアされます。

ツールのリストを安定させる

  • 同じアプリのすべてのセッションで同じツール定義を使用し、名前、順序、説明、引数を一字一句変えないでください。
  • ユーザー、時刻、注文番号などの動的な情報はツールの説明に含めず、セッション指示またはツールの結果に含めてください。
  • 音声を有効にする前に、session.updateで一度に設定を完了してください。セッションの途中ではできるだけツールのリストを変更しないでください。

ツール結果の返送と回答の継続

ツールを実行した後、同じcall_idで結果を送信します。outputはテキストまたはJSON文字列です。

ツール結果を返送
{
  "action": "conversation.item.create",
  "item": {
    "type": "function_call_output",
    "call_id": "<受信したcall_id>",
    "output": "{\"status\":\"発送済み\"}"
  }
}

対応する結果の確認を受信します。

結果の確認
{
  "action": "conversation.item.created",
  "data": {
    "type": "conversation.item.created",
    "item": {
      "id": "<item_id>",
      "type": "function_call_output",
      "call_id": "<受信したcall_id>"
    }
  }
}

続けてresponse.createを送信し、モデルに回答の継続を要求します。

回答を続ける
{
  "action": "response.create",
  "response": {
    "call_ids": [
      "<確認済みのcall_id>"
    ]
  }
}

response.doneは関数呼び出しの出力をまとめたものです。同じcall_idは1回だけ実行します。カスタムツールはclientモードとnoneモードのどちらでも使用できます。

非同期ツール

同期ツールでは、モデルのこのターンの返答は結果が返るまで待ち続け、その間ユーザーは待つしかありません。実行に約2秒を超える可能性のあるツールは、ツール定義にexecution_modeを追加してください。読み取り専用の照会にはasync_query、副作用のある操作にはasync_effectを指定します。

非同期ツールを宣言
{
  "action": "session.update",
  "session": {
    "tools": [
      {
        "type": "function",
        "name": "lookup_inventory",
        "description": "現在の在庫を照会します",
        "parameters": {"type": "object", "properties": {"sku": {"type": "string"}}, "required": ["sku"]},
        "execution_mode": "async_query"
      }
    ]
  }
}
  1. モデルが非同期ツールを呼び出すと、サーバーは通常どおりresponse.function_call_arguments.doneを送信し、execution_mode、task_id、revision、arguments_sha256を付加します。アシスタントはまず処理中であることをユーザーに短く伝え、このターンはそのまま終了し、ユーザーは話し続けることができます。
  2. アプリはWebSocketの送受信と音声のループの外で呼び出しを実行します。
  3. 結果が得られたら、同じcall_idでconversation.item.createを送信し、conversation.item.createdを受信した後にresponse.create(call_idsにはその呼び出しを指定)を送信します。サーバーは新しい返答を開始し、結果をユーザーに伝えます。

call_idはバージョンごとに異なるため、call_idで重複を排除して実行します。モデルとアプリのどちらも、未完了のタスクを変更またはキャンセルできます。

フィールド型説明
session.tool_task.revise: event

未完了の非同期タスクの引数を変更します。サーバーは新しいcall_idとrevisionで呼び出しを再度送信します。

session.tool_task.cancel: event

未完了の非同期タスクをキャンセルします。すでに実行された副作用のある操作は、キャンセルによって取り消すことはできません。

session.tool_task.updated: event

変更またはキャンセルが成功した後の応答。

response.function_call.cancel_requested: event

サーバーが呼び出しの停止を要求しています。タスクがモデルによって変更またはキャンセルされたか、待機がタイムアウトしました。実行を停止し、その後に遅れて届いた結果は破棄してください。このイベントは、お客様の実行器やデバイスがすでに停止したことを示すものではありません。

  • expected_revisionがサーバーと一致しない場合、または引数がschemaに準拠していない場合はエラーtool_task_conflictが返されます。タスクが存在しない場合はunknown_tool_taskが返されます。
  • 非同期タスクはセッションごとに最大128個(終了したものを含む)、タスクごとに最大32バージョンで、同時に実行できるのは最大4個です。1回の実行は、送信から結果の受信まで最長120秒です。容量が上限に達すると新しいタスクは拒否され、進行中のタスクが押し出されることはありません。

クライアント委任

バックエンドのモデル、Agent、ツールはお客様の環境で実行されます。セッション作成時にclientを有効にします。省略した場合はnoneとなり、フロントエンドのカスタムツールには影響しません。

クライアント委任を有効にする
{
  "action": "attach_session",
  "delegation": {
    "type": "client"
  }
}

session_attached.data.delegation=clientを確認 → session.delegation.createdを受信 → 非同期で実行 → 進捗または結果を返送 → 対応するappendedの確認を処理します。タスクの実行中も音声の送受信を続けます。

イベント用途
session.thinking.append事実や進捗を発話せずに返送し、後続の回答で利用できるようにします。
session.commentary.appendin_progressで読み上げ可能な進捗を返送し、completed / failedで最終結果を返送します。reasoningタスクも含みます。
session.instructions.append以降の対話の業務指示を追加します。

delegation.idでタスクを関連付け、返送時はdelegation_idを指定します。timeout_msは現在の返答が結果を待つ時間を指定します。待機の終了後もバックエンドのタスクは実行を続け、実行のタイムアウトはアプリで制御します。

session.delegation.cancelledを受信したら、タスクをキャンセル済みとしてマークして実行器を停止し、そのタスクのその後の進捗と結果を破棄します。すでに行われた業務上の操作の取り消しは、アプリで処理します。

返送を再試行する場合は、元のタスク結果、event_id、ペイロードを再利用します。サーバーは現在のセッションの直近256件の成功したevent_idの範囲で重複を排除します。範囲外やサービスの再起動後の再試行では、アプリで処理状態を確認してください。1回の内容は最大2000 Unicode文字で、長い結果は先に要約してください。

JavaScript SDKと実行器

@mossai/mossliveを使うと、既存のリアルタイム接続上でPiまたは独自の実行フレームワークを接続できます。どちらも同じ実行器の契約を使用します。

SDKをインストール
npm install @mossai/mosslive@0.1.0

Piを接続する

まずdelegation: { type: "client" }を有効にしたセッションを作成し、同じ接続上に実行器をアタッチします。次の例のwsとsessionIdは既存の接続から取得したものです。

Piを接続
import { attachDelegation } from '@mossai/mosslive';
import { createPiRunner } from '@mossai/mosslive/pi';

// wsとsessionIdは既存の音声接続から取得します。このセッションは
// delegation: { type: 'client' }を設定して作成する必要があります。
const run = createPiRunner({
  provider: 'custom',
  model: 'YOUR-BACKEND-MODEL',
  baseUrl: 'https://YOUR-PROVIDER/v1',
  api: 'openai-completions',
  keyEnv: 'CUSTOMER_BACKEND_KEY',
  workspaceRoot: './workspace',
  stateDir: './private-pi-state',
  tools: ['read', 'grep', 'find', 'ls'],
});
const bridge = attachDelegation({ socket: ws, sessionId, run });
// アプリの終了時にawait bridge.close()を呼び出し、その後アプリが所有するwsを閉じます。

connectLiveで接続を作成する場合、urlにはwss://api.mosi.cn/v1/realtimeをクエリパラメーターなしで指定し、モデルはmodel: "moss-live-1.0"として別に渡します。

共通の実行器の契約

実行器の契約
type TaskRunner = (
  task: {
    sessionId: string;
    delegationId: string;
    objective: string;
    purpose: 'task' | 'reasoning';
    context: readonly { role: string; content: string }[];
  },
  context: {
    signal: AbortSignal;
    reportProgress: (text: string, options?: { spoken?: boolean }) => boolean;
    limits?: { maxProgressBytes: number; maxResultChars: number };
  }
) => Promise<string>;

実行器はタスクを受け取り、最終的なテキストを返します。新しい進捗はreportProgressで報告します。signalでキャンセルが通知されたら、実際の処理を停止してリソースを解放してから、Promiseを完了させます。

進捗はデフォルトで1件あたり600 UTF-8バイトまでで、maxProgressBytesで調整できます。最終結果は2000 Unicode文字までで、長い結果はsummarizeResultで要約できます。appendプロトコルの1回の内容の上限は2000 Unicode文字です。

reportProgress(text)でタスクの進捗を返送します。{ spoken: true }を指定すると、モデルが発話に使える進捗として送信します。SDKは実行器が返した最終テキストを返送します。実行に失敗した場合はエラーをスローしてください。

その他の実行フレームワークを接続する

アダプタープロジェクトを生成
npx @mossai/mosslive@0.1.0 init-adapter --directory my-adapter
cd my-adapter
npm install
npm test

生成されたプロジェクトには、実行器のテンプレート、AGENTS.md、契約テストが含まれます。ガイドに従ってTaskRunnerを実装し、attachDelegation({ socket, sessionId, run })に渡します。

イベントの振り分けを自分で管理する場合は、createDelegationBridgeを使用できます。アプリの終了時にはBridgeを閉じ、アプリが所有する接続も閉じます。

現在のプロトコル値

項目要件
音声デフォルトは上り16 kHz、下り48 kHz、モノラルのPCM S16LE、WAVヘッダーなしで、media.configureで変更できます。リアルタイムの速度でアップロードし続け、発話の終了後も無音を送信し続けます。割り込みに対応するため、再生中もキャプチャを続けます。
メディアのカプセル化音声のみの場合はPCMをそのまま送信できます。tagged-v1を有効にした後は、音声は0x00 + PCM(またはOpusパケットテーブル)、カメラは0x01 + JPEG、画面は0x02 + JPEGです。映像をオフにした後も音声にはプレフィックスが付きます。下りのバイナリにはプレフィックスは付きません。
映像JPEGは1フレームにつき1件のバイナリメッセージで送信し、音声と同じWebSocketを共用します。Base64、MP4、H.264は送信しません。media.configured.videoに従ってキャプチャし、デフォルトは長辺512、品質0.75、毎秒1フレームです。過負荷時は古いフレームが破棄されることがあります。
テキストの更新textは完全なスナップショットのため、表示を置き換えます。ユーザーのturnとモデルのturn_idはそれぞれ対応する記録に関連付けます。再生確認はプレーヤーの実際の再生進捗に基づいて送信します。
ペルソナと指示persona.promptは最大8000 Unicode文字、セッション指示は累計で最大16000文字です。
ツール最大128個。名前は最大64文字です。
コンテキストの返送appendは1回あたり最大2000 Unicode文字です。委任のcontextは直近最大6件、1件あたり600文字です。instructionsは最大16000 Unicode文字です。
委任の記録セッションごとに最大32件で、終了したタスクは回収される場合があります。古いIDで返送するとunknown_delegation_idが返されることがあります。

エラーコード

接続確立時の認証、権限、レート制限、一般的なHTTPエラーについては、エラーコードを参照してください。以下では、MOSS-LIVE API固有のプロトコルエラーのみを示します。

エラーコード対処方法
memory_scope_requires_user安定したuserを指定するか、session範囲のセッションを作成してください。
memory_scope_immutable / invalid_memory_scope有効な記憶範囲を使用してください。セッションを再開する場合は元の設定を維持してください。
session_option_mismatch / invalid_session_option作成時のオプションを確認してください。再接続時は元の設定を引き継いでください。
invalid_content / content_too_long空でない内容を指定してください。1回の内容は2000 Unicode文字を超えてはならず、超えた場合はcontent_too_longが返されます。
invalid_delegation_id / unknown_delegation_id委任IDと所属するセッションを確認してください。セッションレベルのコンテキストにはnullを使用します。
invalid_statuscommentary.statusにはcompleted、in_progress、failedのいずれかを使用してください。
instructions_fullセッション指示が累計の上限に達しています。続けて呼び出すとこのエラーが返されます。指示を整理して再設定するか、必要に応じて新しいセッションを作成してください。
unknown_call_idcall_idに対応する呼び出しの状態を確認し、完了した呼び出しの結果を再利用してください。
invalid_public_requestイベント名、フィールド、型、またはaction/typeが一致しない場合に返されます。確認してから再試行してください。また、session.updateで16000 Unicode文字を超える指示を一度に送信した場合もこのエラーが返され、その設定は反映されません。
invalid_event_idevent_idは文字列である必要があり、現在の長さの上限は256バイトです。
event_id_conflict同じevent_idに異なるリクエストが対応しています。IDとペイロードを確認してください。
delegation_terminal委任は終了しています。新しい進捗や結果の送信を停止してください。
delegation_cancel_failedタスクIDと状態を確認し、実行器が実際に停止したかを確認してください。
presentation_capacity読み上げ待ちの結果が多すぎます。完了したタスクの結果を保持し、しばらくしてから返送を再試行してください。

同時通訳

1系統のリアルタイム音声を別の言語に翻訳し、原文のテキスト、訳文のテキスト、訳文の音声をストリーミングで返します。翻訳のみを行い、内容には回答しません。リアルタイム対話と同じサービスで、接続方法と認証も同じです。パスは/v1/realtime/interpretです。例:wss://api.mosi.cn/v1/realtime/interpret?model=moss-live-1.0&source=en&target=zh。

フィールド型必須説明
model: query string必須

モデルID。リアルタイム対話と同じです。

target: query string必須

訳文の言語コード:zh 中国語、en 英語、ja 日本語、ko 韓国語、de ドイツ語、fr フランス語、es スペイン語、ru ロシア語、it イタリア語、pt ポルトガル語、tr トルコ語、el ギリシャ語、id インドネシア語、ms マレー語。

source: query string任意

原文の言語コード。指定可能な値はtargetと同じです。省略した場合は自動で判定されます。bidirectional=1の場合は必須です。

bidirectional: query string任意

双方向翻訳の切り替え。

voice: query string任意

訳文の音声のボイスID。ボイス一覧の取得で返されるdata[].idです。省略した場合はデフォルトのボイスを使用します。

接続後の最初のメッセージとしてattach_sessionを送信し、次にmedia.mode(tagged-v1)を送信し、必要に応じてmedia.configureを送信します。その後はリアルタイムの速度で音声を送信し続け(0x00 + 16 kHz PCM16、または0x00 + Opusパケットテーブル)、誰も話していないときも無音を送信し続け、最後の文のresponse.audio.doneが届いてから接続を閉じます。1つの接続で扱う話者は1人のみで、複数人の場合は1人につき1つの接続を使用してください。

クライアントイベント

以下のイベントのみを受け付けます。その他のイベントにはerror(invalid_request)が返され、接続は維持されます。

フィールド型説明
attach_session: event

セッションを作成します。接続後の最初のメッセージです。その他のフィールドは無視されます。接続ごとに新しいセッションとなり、再開には対応していません。

media.mode: event

上りのバイナリメッセージに1バイトの種別が付くことを宣言します。音声は0x00です。

media.configure: event

音声形式と再生確認の方式を選択します。指定可能な値は前述のmedia.configureと同じです。videoは使用しません。

playback.chunk.completed: event

訳文の音声チャンクが実際に再生し終わった後に送信します。playbackがclient(デフォルト)の場合は送信が必須で、送信しないと次の文がずっと待機します。serverの場合は不要です。

playback.completed: event

1文の訳文のresponse.audio.doneが届き、すべてのチャンクを再生し終えた後に送信します。

playback.stopped: event

クライアントが自ら文の再生を停止したときに送信します。

mic_state: event

マイク入力をオンまたはオフにします。

ping: event

任意の接続キープアライブイベントです。

サーバーイベント

フィールド型説明
session_attached: event

セッションが確立されました。

media.configured: event

media.configureへの応答。フィールドは前述のmedia.configuredと同じです(videoを除く)。

input.speech.started: event

原文の音声が始まりました。

input.speech.stopped: event

原文の音声が途切れました。

input.transcript.updated: event

原文の1区間のリアルタイムのスナップショット。毎回その区間の完全なテキストのため、表示を置き換えます。

input.transcript.done: event

原文の1区間の最終的なテキスト。

response.audio.started: event

1文の訳文の音声が始まりました。原文の1区間が複数の文に翻訳される場合があります。訳文の音声は、原文のinput.transcript.doneより前に始まる場合があります。

response.audio.context: event

直後のバイナリメッセージは、この文の音声チャンクです。

output.transcript.updated: event

この文の訳文テキストの段階的なスナップショット。

output.transcript.done: event

この文の訳文の最終的なテキスト。

response.audio.done: event

この文の音声がすべて送信されました。

response.audio.stop: event

この文の音声が途中で停止しました。まだ再生していない部分は破棄してください。

response.ended: event

この文が終了しました。

session.closing: event

サーバーが接続を閉じる前の通知。

error: event

リクエストの誤り、またはサーバー側のエラー。

エラー

  • クエリパラメータが不正な場合:ハンドシェイクでHTTP 400が返され、接続は確立されません。
  • 最初のメッセージがattach_sessionでない場合:error(invalid_request)が返され、その後クローズコード1008でクローズされます。
  • 同時接続数が上限に達しているか、サービスのメンテナンス中の場合:クローズコード1013でクローズされます(説明はSession limitまたはServer draining)。しばらくしてから再接続し、再試行の間隔を徐々に延ばしてください。