# 文字おこしくん 開発者向けドキュメント(全文) > https://moji.kaitoranma.com/docs/ の全ページの Markdown を順につなげたもの。各ページの元の URL は に書いてある。機械可読な仕様は [openapi.yaml](https://moji.kaitoranma.com/docs/openapi.yaml)(OpenAPI 3.1、HTTP)、[asyncapi.yaml](https://moji.kaitoranma.com/docs/asyncapi.yaml)(AsyncAPI 3.1、WebSocket)、[JSON Schema](https://moji.kaitoranma.com/docs/schemas/common.json)(2020-12)、[errors.json](https://moji.kaitoranma.com/docs/errors.json)。規約・ポリシー(このファイルには含まない): [利用規約](https://moji.kaitoranma.com/legal/terms.html)・[プライバシーポリシー](https://moji.kaitoranma.com/legal/privacy.html)・[特定商取引法に基づく表記](https://moji.kaitoranma.com/legal/tokushoho.html)・[データの流れと保存期間](https://moji.kaitoranma.com/legal/data-flow.html)。 # 開発者向けドキュメント > ボットの追加・字幕の見方・応援して機能を強化など、プログラムを書かずに使う方法は[使い方](https://moji.kaitoranma.com/help/index.md)にあります。 あなたのプログラムは、公式の表示ページと同じ、話している人ごとのリアルタイムの発話を、API で受け取れます。 ## 何が作れるか | 作りたいもの | 使う API | ガイド | |---|---|---| | OBS の字幕・自作のオーバーレイ・配信画面 | WebSocket(Subscribe) | [オーバーレイ](https://moji.kaitoranma.com/docs/guides/overlay.md) | | Discord・Slack などへの中継ボット、翻訳・要約ボット | WebSocket(Subscribe) | [ボットへの中継](https://moji.kaitoranma.com/docs/guides/bot-relay.md) | | 議事録の保存・書き出し・検索 | HTTP(書き出し)+ WebSocket | [記録と書き出し](https://moji.kaitoranma.com/docs/guides/archive.md) | | 発言量・話者ごとの統計 | HTTP(書き出し)+ WebSocket | [分析](https://moji.kaitoranma.com/docs/guides/analytics.md) | | Discord 以外の音声(マイク・録音・別の通話アプリ)の文字起こし | WebSocket(Ingest) | [音声を送る](https://moji.kaitoranma.com/docs/ingest.md) | | 文字起こしが終わるたびの記録の書き出し・文字起こしの最初からの発言の購読 | Webhook + HTTP(書き出し)+ WebSocket | [Webhook リファレンス](https://moji.kaitoranma.com/docs/webhooks.md) | 公式の表示ページ・配信用オーバーレイの見た目を変えるだけなら、プログラムは要りません。見た目の変え方は[表示ページの URL パラメータと CSS](https://moji.kaitoranma.com/docs/viewer.md)に、表示ページのリンクの OBS への貼り方は使い方の[表示ページと OBS](https://moji.kaitoranma.com/help/obs.md)にあります。 ## 始めるのに要るもの | 資格情報 | 誰がどこで出すか | ブラウザ・OBS に置いてよいか | |---|---|---| | API キー(`mjk_live_…`) | ボットを入れた Discord サーバーの管理者が、[管理画面](https://moji.kaitoranma.com/app/)で作る([手順](https://moji.kaitoranma.com/docs/quickstart.md#from-api-key)) | **置かない**。サーバー側のコードだけに置く(キーが漏れると、キーを手に入れた人が、その Discord サーバーの記録を読んだり消したりできる) | | セッショントークン(使えるセッションも権限も 1 つだけで、期限がある) | Discord サーバーのメンバーが Discord で `/link` を実行すると、文字おこしくんが、トークンの入ったリンクを返答のボタンで渡す。API キーを持つあなたのサーバー側のコードも、トークンを発行できる | 置いてよい | | Webhook の署名のシークレット(`whsec_…`。Webhook を使うときだけ) | ボットを入れた Discord サーバーの管理者が[管理画面](https://moji.kaitoranma.com/app/)で Webhook の送信先を作ると、管理画面がシークレットを 1 回だけ表示する([送信先を登録する](https://moji.kaitoranma.com/docs/webhooks.md#register)) | **置かない**。Webhook を受け取るサーバー側のコードだけに置く(シークレットを手に入れた人は文字おこしくんからの知らせを装える) | ブラウザからは、文字おこしくんの HTTP API を呼べません(文字おこしくんの HTTP API は CORS のヘッダーを返しません)。HTTP API は、あなたのサーバー側のコードから呼んでください。 **次に読む**: [クイックスタート](https://moji.kaitoranma.com/docs/quickstart.md)(字幕を受け取るまで) ## 仕様ファイルと参照実装 - 機械可読な仕様: [openapi.yaml](https://moji.kaitoranma.com/docs/openapi.yaml)(HTTP と Webhook の本文〔`webhooks`〕。OpenAPI 3.1)・[asyncapi.yaml](https://moji.kaitoranma.com/docs/asyncapi.yaml)(WebSocket。AsyncAPI 3.1)・JSON Schema 2020-12([common](https://moji.kaitoranma.com/docs/schemas/common.json)・[subscribe-client-message](https://moji.kaitoranma.com/docs/schemas/subscribe-client-message.json)・[subscribe-server-message](https://moji.kaitoranma.com/docs/schemas/subscribe-server-message.json)・[ingest-client-message](https://moji.kaitoranma.com/docs/schemas/ingest-client-message.json)・[ingest-server-message](https://moji.kaitoranma.com/docs/schemas/ingest-server-message.json))・[errors.json](https://moji.kaitoranma.com/docs/errors.json) - 参照実装(依存なし。そのままコピーして使える): WebSocket で受け取るもの [mojiokoshi-subscribe.js](https://moji.kaitoranma.com/docs/examples/mojiokoshi-subscribe.js)・[mojiokoshi_subscribe.py](https://moji.kaitoranma.com/docs/examples/mojiokoshi_subscribe.py)、HTTP API を呼ぶもの(サーバー側だけ) [mojiokoshi-http.ts](https://moji.kaitoranma.com/docs/examples/mojiokoshi-http.ts)・[mojiokoshi_http.py](https://moji.kaitoranma.com/docs/examples/mojiokoshi_http.py)、Webhook の署名を確かめるもの(サーバー側だけ) [mojiokoshi-webhook.ts](https://moji.kaitoranma.com/docs/examples/mojiokoshi-webhook.ts)・[mojiokoshi_webhook.py](https://moji.kaitoranma.com/docs/examples/mojiokoshi_webhook.py) - 文字おこしくんは、TypeScript の SDK を npm にまだ公開していません。参照実装を使ってください。 コーディングエージェントにクライアントのコードを書かせるときは、[llms.txt](https://moji.kaitoranma.com/docs/llms.txt)(全文は [llms-full.txt](https://moji.kaitoranma.com/docs/llms-full.txt))か [Agent Skill](https://moji.kaitoranma.com/docs/skill/SKILL.md)、各ページの Markdown 版(同じパスの `.md`)をエージェントに渡してください。 --- # クイックスタート ## 1. 接続先とトークンを手に入れる 字幕を受け取るには、**Subscribe の URL**(`wss:///v1/subscribe`)と、**`transcript:read` のセッショントークン**の 2 つが要ります。今すぐ試すなら A で、続けて使うサーバー側のコードを書くなら B で、URL とトークンを手に入れます。 ### A. Discord のリンクから(今すぐ試す) {#from-discord} A の方法は、文字起こしが動いている VC で使えます。文字起こしが動いている VC は、誰かが `/start` で文字起こしを始めた VC か、自動入室でボットが入っている VC です。 1. Discord で `/link` を実行し、返答の「配信用オーバーレイ(OBS 用)」のボタンを押します。 2. 開いたブラウザのアドレス欄の URL をコピーします。URL は `https://moji.kaitoranma.com/#token=…&overlay=1` の形です。URL に `#token=` が入っていれば、トークンを取れています。 3. コピーした URL から、接続先とトークンを取り出します。 ```js // オーバーレイの URL から接続先とトークンを取り出す const overlay = new URL("https://moji.kaitoranma.com/#token=eyJ2Ijox...&overlay=1"); const token = new URLSearchParams(overlay.hash.slice(1)).get("token"); const url = `${overlay.protocol === "https:" ? "wss:" : "ws:"}//${overlay.host}/v1/subscribe`; ``` Discord のリンクのトークンには期限があります。Discord のリンクのトークンでは、リンクを取ったときに動いている文字起こしの字幕だけを受け取れます。 ### B. API キーから(続けて使う・サーバー側のコード) {#from-api-key} あなたは API キー(`mjk_live_…`、スコープ `transcripts:read`)で、動いている文字起こし(セッション)を探して、トークンを発行します。 API キーを作る手順: 1. Discord サーバーの管理者(「サーバーの管理」か「管理者」の権限を持つ人、または所有者)が、文字起こしを使う Discord サーバーに、文字おこしくんのボットを追加します([Discord に追加](https://moji.kaitoranma.com/invite))。 2. その Discord サーバーの管理者が、[管理画面](https://moji.kaitoranma.com/app/)に Discord でログインします。 3. その Discord サーバーの管理者が、管理画面でその Discord サーバーを選び、「開発者向け設定」(`https://moji.kaitoranma.com/app/guilds/<サーバー ID>/keys`)でキーを作ります。管理画面は作ったキーを 1 回だけ表示します。 あなたがその Discord サーバーの管理者でなければ、その Discord サーバーの管理者に API キーを作ってもらうか、A で試してください。 **API キーはソースに書かず、ブラウザに渡さないでください。** ブラウザには、発行したトークンだけを渡してください。 ```sh BASE=https://moji.kaitoranma.com KEY=$MOJIOKOSHI_API_KEY # mjk_live_…(ソースに書かず、環境変数などから読む) # 動いているセッションを新しい順に一覧し、先頭の sessionId を取り出す(jq を使う例) curl -sS "$BASE/v1/sessions?status=active&limit=5" -H "Authorization: Bearer $KEY" SID=$(curl -sS "$BASE/v1/sessions?status=active&limit=1" -H "Authorization: Bearer $KEY" | jq -r '.sessions[0].sessionId') # そのセッションの transcript:read のトークンを発行する(ttlSeconds は 1〜86400、既定 3600) curl -sS -X POST "$BASE/v1/sessions/$SID/tokens" \ -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{"scope":"transcript:read","ttlSeconds":3600}' # → {"token":"eyJ2Ijox…","expiresAt":1790355000000} ``` API キーでセッションを探してトークンを発行する TypeScript・Python の例は、[HTTP API リファレンス](https://moji.kaitoranma.com/docs/http.md#examples)の最後にあります。 ## 2. 受け取る 依存なしの参照実装 [examples/mojiokoshi-subscribe.js](https://moji.kaitoranma.com/docs/examples/mojiokoshi-subscribe.js)(ブラウザ / Node 22 以降)をダウンロードして、次のコード(quickstart.mjs)と同じフォルダに置きます。参照実装は再接続・生存確認・改訂の置き換え・再接続せずに終えるべきエラーの扱いまで実装しています。 ```js // node quickstart.mjs import { subscribe, speakerName } from "./mojiokoshi-subscribe.js"; const [url, token] = process.argv.slice(2); subscribe({ url, token, onChange(state, message) { // 確定した発話だけを出す。同じ utteranceId の改訂(refined)は置き換えとして届く。 if (message.type === "utterance" && message.utterance.stage !== "partial") { console.log(`${speakerName(state, message.utterance)}: ${message.utterance.text}`); } }, onStatus(status, detail) { console.error(`[${status}]`, detail?.code ?? ""); if (status === "ended" || status === "failed") process.exitCode = status === "failed" ? 1 : 0; }, }); ``` プログラムが `[open]` と出した後に VC で誰かが話すと、プログラムは、確定した発言を `たろう: こんにちは。` のように 1 行ずつ出します。発言が出ないとき: - `[failed] unauthorized` と出た: トークンの期限が切れています。1 の手順でトークンを取り直してください([トークンの期限](https://moji.kaitoranma.com/docs/reconnection.md#token-expiry))。 - `[ended]` と出た: トークンを取った文字起こしは、もう終わっています。文字起こしを始め直してから、1 に戻ってください。 参照実装はブラウザでも ` ``` - **`file://` で開くと、ブラウザが ES モジュールの読み込みを拒むことがあります。** 2 つのファイルは、GitHub Pages・Cloudflare Pages などの静的ホスティングか、ローカルの静的サーバー(`npx serve` など)に置いてください。1 ファイルにしたいときは、参照実装の中身を `