コンテンツにスキップ

Reki Serverで文字起こしとLLM中継を共有する

Reki Serverは、Reki noteとは別に配布しているアプリです。同じLAN上の端末から使える文字起こしサーバーと、LLMサーバーへの中継を、この1つのアプリで担当します。音声はサーバーとして動かしている端末へ送られ、その端末で文字起こしします。版数・自動更新・保存先はReki noteと独立しているため、Reki noteを更新するたびに入れ直す必要はありません。

最終更新日:2026年10月14日

Reki Serverには2つの役割があります。

  • 文字起こし:同じLANの端末から音声を受け取り、サーバー端末のエンジン(Apple Speech EnhancedまたはWhisper)で文字起こしします。
  • LLMの中継:利用端末から届いたOpenAI互換の要求を、設定した1台のLLMサーバー(LM Studio、Ollamaなど)へそのまま渡します。モデルの実行はLLMサーバー側が担当し、Reki Serverは推論しません。

文字起こしと中継は別々に使えます。文字起こしだけを使い、中継は使わない構成にもできます。どちらもクラウドのAIサービスへは送信しません。

端末内だけで完結させたい場合は、このアプリを使わず端末内の文字起こしやローカルLLMを使ってください。

「サーバー運用」タブで設定し、右下の「設定を保存」で確定します。設定はサーバーを停止している間だけ保存でき、未保存の変更がある間はサーバーを開始できません。

設定内容
待受範囲「社内LAN」は同じLANの端末から、「このPCだけ」は同じPCからの接続に限ります。
ポート既定は 39010(1024〜65535)。変更したときは、利用端末に入れるURLのポートも変えます。
エンジンApple Speech Enhanced(macOS 26以降と対象言語のモデルが必要)またはWhisper。
言語既定は日本語。利用端末が明示しないときは、この言語で送信します。
最大同時処理数1〜4件。Whisperのときは1件(本体と共通のクライアントが1件ずつ処理するため)。
WhisperモデルReki noteと共通の保存先から選びます。どちらかで1回ダウンロードすれば、両方で使えます。
LLMの中継使うときは中継先のLLMサーバーを1台選びます。
起動時の動作「アプリ設定」タブの「ログイン時にアプリを起動」と「起動時にサーバーを開始」(既定はオン)。

サーバーの開始と停止は、画面上部のバーのスイッチで行います。停止すると新規の受付を止め、処理と待機が終わってから待受を閉じます。

Windowsでは、初めて待ち受けるときに受信の許可を求められます。「受信を許可」を実行すると、待受ポートのファイアウォール規則が追加されます。許可しないと、別の端末から接続できません。Macでは、ローカルネットワークへのアクセス許可を求められることがあります。

「接続情報」に、利用端末へ入力するURLと共有トークンが表示されます。コピーして利用端末へ渡します。

  • 文字起こしのURL:http://192.168.1.10:39010/reki-sound/v1(サーバー端末のLAN内IPv4アドレス)
  • LLMの中継先URL:http://192.168.1.10:39010/reki-llm/v1
  • 共有トークン:すべてのAPIで使うトークン。同じ値を使う端末は、すべてのジョブを取得・取り消しできます。

トークンを再発行するときは、サーバーを停止してから実行します。再発行後は、利用端末側で入力し直すまで接続できません。

Reki ServerはIPv4で待ち受けます。同じPCから接続する場合は 127.0.0.1 を使えます。IPv6、DNS名、公開IP、URL内の認証情報、リダイレクトには対応していません。

  1. Serverの「接続情報」から、URLと共有トークンを控えます。
  2. Reki noteの「設定」→「文字起こし」で「Reki ローカルサーバー文字起こし」を選びます。
  3. 「Server URL」にURLを入力します。「Reki Serverを探す」を使うと、このPC内とLAN内の候補から選べます。
  4. 「認証トークン」に共有トークンを入力します。
  5. 「接続テストをして使用する」を押します。モデルの準備ができていれば、そのまま使い始められます。

URLにはバージョン(/reki-sound/v1)まで入力します。バージョンのないURLは受け付けません。

  1. Reki noteの「設定」→「データ処理」で「ローカルエンドポイント」を選びます。
  2. 「サーバーURL」に http://<ServerのIPv4>:39010/reki-llm/v1 を入力します。
  3. 「APIキー」に共有トークンを入力します。空のままでも、Reki noteに保存済みのReki Server認証トークンがあればそれを使います。
  4. 「モデル一覧を更新」でモデルを選び、「接続テストをして確定」を押します。

Reki noteは、接続先を設定している間、60秒ごとに在席をServerへ知らせます。文字起こしを送っていない端末も「利用端末」に並びます。知らせが3回分(180秒)途切れると切断とみなし、一覧から外れます。

この一覧は、端末が申告した表示名です。端末ごとの認証やアクセス制御ではなく、同じトークンを使う端末は同じ権限を持ちます。

すべてのAPIに、Authorization: Bearer <共有トークン> が必要です。Originヘッダが付いたリクエストは拒否します(ブラウザからは利用できません)。Cookie、CORS、リダイレクト、本文のログは扱いません。

用途がURLで分かるように、文字起こしは /reki-sound/v1、LLMの中継は /reki-llm/v1 の下だけにAPIを提供します。接頭辞やバージョンのないパスは404で、/reki-llm で文字起こしは受け付けません。

メソッドパス用途
GET/reki-sound/v1/healthAPIバージョン、エンジンの準備状態、受付状態、キューの件数
POST/reki-sound/v1/transcriptions音声を送って文字起こしを依頼(202とjobId)
GET/reki-sound/v1/jobs/<jobId>ジョブの状態と完了結果
GET/reki-sound/v1/jobs/by-key/<idempotencyKey>受理済みジョブIDの回収
POST/reki-sound/v1/jobs/<jobId>/ack完了結果の受領通知
DELETE/reki-sound/v1/jobs/<jobId>待機・処理中ジョブの取り消し
POST/reki-sound/v1/clients/heartbeat端末の在席を記録(文字起こしは送らない)
GET/reki-llm/v1/models中継先のモデル一覧
POST/reki-llm/v1/chat/completions中継先へチャット要求(ストリーム対応)
POST /reki-sound/v1/transcriptions?engine=apple-enhanced&language=ja&format=wav
Authorization: Bearer <共有トークン>
Idempotency-Key: <任意のキー>
X-Reki-Client: MacBook Air
  • engine:apple-enhanced または whisper。省略するとServerの設定を使います。準備できているエンジンと一致しない場合は受け付けません。
  • language:ja、en-US のような言語。省略するとServerの設定を使います。
  • format:音声の形式。省略すると webm。
  • Idempotency-Key:同じ送信を1件にまとめるためのキー。英数字と : . _ - で最大128文字。
  • X-Reki-Client:利用端末の表示名。「利用端末」の一覧に使います。

受け付けられると 202 と {"jobId":"...","reused":false} を返します。同じキー・同じ音声・同じ条件の再送は、既存のジョブIDを reused: true で返します。同じキーで内容が違う場合は 409 です。

項目値
音声の形式wav webm m4a mp3 ogg flac mp4
音声のサイズ256MiBまで
同時に受け取るアップロード4件
待機できる件数20件
保持するジョブ100件
完了結果の保持完了から10分(メモリ内。再起動で消えます)
中継する本文のサイズ32MiBまで
状態コード意味
401unauthorizedトークンがない・違う・Originヘッダが付いている
400invalid_requestエンジン・言語・形式・キーの指定が不正
404not_found / job_not_foundパスが違う、またはジョブが見つからない
409idempotency_conflict同じキーで内容が違う
409job_not_finished未完了のジョブに受領通知をした
413audio_too_large / request_too_large音声または中継の本文が上限を超えている
429queue_full待機が上限に達している
502upstream_unreachable中継先に接続できない
503engine_not_readyエンジンが準備できていない
503server_busy / server_stopping受付を停止している、または停止処理中
503relay_not_configured中継先が設定されていない
  • GET /reki-sound/v1/jobs/<jobId> で状態を確認します。完了すると、Reki noteの文字起こし結果と同じ形式の result が入ります。
  • health が resultAcknowledgement: true を返すサーバーでは、結果を解析したあとに POST /reki-sound/v1/jobs/<jobId>/ack で受領を知らせます。取得だけでは受領になりません。
  • health が idempotencyLookup: true を返すサーバーでは、送信の前に GET /reki-sound/v1/jobs/by-key/<idempotencyKey> で既存のジョブを探せます。送信の応答を失っても、音声を送り直さずにジョブIDを回収できます。
  • 不要になったジョブは DELETE /reki-sound/v1/jobs/<jobId> で取り消します。処理中でも取り消せます。
  • 中継するのは GET /v1/models と POST /v1/chat/completions だけです。それ以外のパスは中継しません。
  • 中継先は、同じPC内または同じネットワーク内のアドレスに限ります。認証が必要なLLMサーバーには対応していません。受け取った共有トークンは中継先へ渡しません。
  • 要求と応答の本文はServerを通りますが、保存も記録もしません。記録するのは、時刻・モデル名・文字数・ストリームの有無・結果・初回応答までの時間・全体の時間・応答サイズ・エラーコードだけです。直近200件をメモリ内に持ち、再起動で消えます。画面の「書き出す」でJSONに保存できます。
  • 受付を停止すると中継も止まります。中継先に接続できないときは502、サイズが上限を超えたときは413を返します。利用端末が切断すると、中継先への要求も止めます。
  • 受付を停止すると、新規の音声を受け付けません。待受は、処理と待機が終わったあとに、完了結果の受領通知か60秒の猶予の終了で閉じます。処理中の文字起こしが終わるまで閉じません。
  • アプリの更新は、ジョブがない状態で適用します。
  • アップロードされた音声はServer専用の領域に置き、完了・失敗・取り消し・アップロード中断のときに削除します。異常終了で残った音声は、次の起動時に削除します。
  • ジョブと結果はメモリ内だけです。再起動で失われます。画面に文字起こしの本文は表示しません。音声・文字起こし・接続URL・共有トークンはテレメトリとして送信しません。
  • サーバーが見つからない:Serverが起動しているか、待受範囲が「社内LAN」か、同じネットワークかを確認します。Windowsではファイアウォールの受信許可、Macではローカルネットワークへのアクセス許可も確認します。
  • 接続できない・認証エラーになる:URLのポート、共有トークン、URLにバージョン(/v1)が含まれるかを確認します。トークンを再発行したときは、利用端末にも入れ直します。
  • 「モデル準備中」と出る:Serverでエンジンを用意し、受付を開始します。Whisperはモデルを選んでダウンロードし、Apple Speech EnhancedはmacOS 26以降と対象言語のモデルが必要です。
  • 文字起こしが始まらない:受付が停止していないか、待機(20件)や保持(100件)の上限に達していないかを確認します。
  • 中継に失敗する:中継先のLLMサーバーが起動しているか、モデルが読み込まれているか、中継が有効かを確認します。中継先が別PCの場合は、そのPCの待受設定とファイアウォールも確認します。