Realtime ASR(音声認識)— WebSocket
このページでは、Kotoba の Realtime ASR(speech-to-text) API(WebSocket)について説明します。
エンドポイント
wss://api.kotobatech.ai/v1/realtime
認証
サーバーサイド(推奨)
APIキーを Bearer トークンとして利用します。
Authorization: Bearer <KOTOBA_API_KEY>
ブラウザ / クライアントサイド(APIキーを埋め込まないでください)
ブラウザなどのクライアントサイド環境から接続したい場合は、まずサーバー側で有効期限付きの client secret を発行します。
POST https://api.kotobatech.ai/v1/realtime/transcription_sessions
その後、ブラウザから WebSocket のサブプロトコルを使って接続します(ブラウザは WebSocket に任意ヘッダーを付与できないため)。
sec-websocket-protocol: realtime, kotoba-insecure-api-key.<CLIENT_SECRET_VALUE>
Errors / error codes
Realtime のエラーは JSON イベントとして配信され、以下を含みます。
type: "error"error.code:KotobaErrorCodeのいずれか(サイドバーの Errors schema を参照)
Realtime ASR でよく見る code:
invalid_api_key(HTTP 401 / error event): APIキーが不正 / 未指定rate_limit_exceeded/too_many_concurrent_requests(HTTP 429 / error event): レート / 同時接続の制限quota_exceeded: クレジット不足invalid_parameters: session 設定 / event payload が不正invalid_event: client event のtypeが不正invalid_json: JSON が不正payload_too_large: 音声 chunk が大きすぎる(小さく分割してください)
全体の流れ(概要)
- WebSocket に接続します。
- サーバーイベント
transcription_session.createdを待ちます。 - 1回だけ
transcription_session.updateを送って session を設定します(音声形式、言語など)。 input_audio_buffer.appendで音声 chunk をストリーミングします。conversation.item.input_audio_transcription.delta(必要に応じて.completed)で書き起こし結果を受け取ります。- 終了時に
input_audio_buffer.commitを送ってから接続を閉じます。
Client → Server events
transcription_session.update(必須)
{
"type": "transcription_session.update",
"session": {
"input_audio_format": "pcm16",
"input_audio_sample_rate": 24000,
"input_audio_number_of_channels": 1,
"input_audio_transcription": {
"language": "ja",
"target_language": "ja"
}
}
}
input_audio_buffer.append
base64 化した音声バイト列を送信します。
{
"event_id": "optional_any_id_1",
"type": "input_audio_buffer.append",
"audio": "Base64EncodedAudioData"
}
input_audio_buffer.commit
{
"type": "input_audio_buffer.commit"
}
Server → Client events(代表例)
transcription_session.createdtranscription_session.updatedconversation.item.createdconversation.item.input_audio_transcription.deltaconversation.item.input_audio_transcription.completedinput_audio_buffer.committederror
例: Node.js(サーバーサイドで Authorization ヘッダー)
import WebSocket from "ws";
const ws = new WebSocket("wss://api.kotobatech.ai/v1/realtime", {
headers: { Authorization: `Bearer ${process.env.KOTOBA_API_KEY}` },
});
ws.on("open", () => {
// 本番では、session.created を受け取った後に transcription_session.update を送ってください。
// 簡単なデモ用途であれば、ここで即送信しても動作します。
ws.send(JSON.stringify({
type: "transcription_session.update",
session: {
input_audio_format: "pcm16",
input_audio_sample_rate: 24000,
input_audio_number_of_channels: 1,
input_audio_transcription: { language: "en", target_language: "en" }
}
}));
});
ws.on("message", (msg) => {
console.log(JSON.parse(msg.toString()));
});
例: ブラウザ(client secret をサブプロトコルで利用)
// CLIENT_SECRET_VALUE はサーバーサイドで発行してください:
// POST https://api.kotobatech.ai/v1/realtime/transcription_sessions
const ws = new WebSocket(
"wss://api.kotobatech.ai/v1/realtime",
["realtime", "kotoba-insecure-api-key." + CLIENT_SECRET_VALUE]
);
ws.onmessage = (m) => console.log(JSON.parse(m.data));