# Voice API / SDK

開発プレビュー。現在は一般受付停止中（503）。GET https://voice.2-38.com/v1/health の enabled を確認し、falseなら利用可能と案内しないでください。

公開後は無料・登録不要・利用者APIキー不要です。音声送信と外部処理への明示的な同意が必要です。

## ブラウザのファイル入力

```html
<input type="file" id="audio" accept="audio/*">
<textarea id="text"></textarea>
<script type="module">
import { transcribe } from 'https://voice.2-38.com/sdk.js';
const input = document.querySelector('#audio');
const output = document.querySelector('#text');
input.onchange = async () => {
  if (!input.files[0]) return;
  if (!confirm('話者の許可を得た音声を外部サービスへ送信します。よろしいですか？')) return;
  input.disabled = true;
  try {
    output.value = await transcribe(input.files[0]);
  } catch (error) {
    alert(error.message);
  } finally { input.disabled = false; }
};
</script>
```

## リアルタイム

```js
import { startRecording } from 'https://voice.2-38.com/sdk.js';

// ユーザーの同意を確認したクリックイベント内から実行。
const recording = await startRecording({
  onTranscript: ({ text }) => { output.value = text; },
  onError: (error) => { console.error(error.message); },
  onStop: () => { /* ボタンを開始状態へ戻す */ }
});
// 終了ボタンから呼び出す。最後の文字を確定し、マイクを解放。
await recording.stop();
```

## HTTP

- POST /v1/transcriptions : raw audio/wav、PCM16LE・16kHz・mono、最長60秒。202 {id,status}。
- GET /v1/transcriptions/:id : 進捗と完了時のtext。idは秘密の閲覧キー。1時間で失効。
- WSS /v1/realtime : ready後にPCM16LE・16kHz・mono binary。stop controlは {"type":"stop"}。transcript{text,final_text,partial_text}, done{text}, error{error:{code,message}}。
- GET /v1/limits
- OpenAPI: https://voice.2-38.com/openapi.json

上限:1回60秒/同一IP10回・全体120回/日/同時4件。429は上限、503は受付停止または障害。無制限再試行は禁止。マイク利用はHTTPS/localhostとユーザーの許可が必要。SDKやAudioWorkletの読み込みがサイトCSPで許可されているか確認してください。

既存の /login /app /v1/audio/transcriptions /v1/jobs /docs/agent-setup は別の既存アカウント型サービス用で、今回の無料APIとは別です。既存連携の認証やURLを勝手に書き換えないでください。
