Voice.

VOICE / DOCUMENTATION

サイトに、声の入口を。

開発プレビュー:一般受付は停止中です。以下は受付開始後の利用例です。現在の可否は GET /v1/health の enabled を確認してください。

既存の入力欄に音声入力を足す、小さなブラウザSDKです。利用者の登録やAPIキーは不要。SDKは外部依存なしで、ファイル変換とリアルタイム通信を扱います。

録音ファイルから文字に

サイトへ次のコードを追加します。HTTPS(開発時はlocalhost)で利用してください。

<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>

マイクからリアルタイムに

開始・終了ボタンと明示的な同意を用意し、イベントを結びます。

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();

入力欄にボタンを追加する

<textarea id="note"></textarea>
<button id="voice" type="button">音声で入力</button>
<script type="module">
import { mountVoiceInput } from 'https://voice.2-38.com/sdk.js';
const voice = mountVoiceInput({
  target: '#note', button: '#voice',
  onError: error => alert(error.message)
});
// ページ終了時やコンポーネント破棄時には呼び出してください。
window.addEventListener('pagehide', () => voice.destroy());
</script>

開始時に送信への同意を確認します。録音中にもう一度ボタンを押すと終了し、既存の文章に結果を追記します。

HTTP API

curl https://voice.2-38.com/v1/transcriptions \
  -H 'Content-Type: audio/wav' \
  --data-binary @audio.wav

# 戻り値の id で結果を取得
curl https://voice.2-38.com/v1/transcriptions/RETURNED_ID

直接送信はPCM16 little-endian・16kHz・モノラルのWAVに対応。multipartではなくraw bodyです。ブラウザSDKは読める音声形式をこの形式へ変換します。60秒以内。音声URL指定には対応していません。

結果のIDは秘密の閲覧キーです。第三者への共有やログ出力を避けてください。結果は1時間で失効します。全件一覧のAPIはありません。

上限とエラー

1回60秒、同じIPは1日10回、全体で1日120回、同時4件。429は回数・混雑上限、503は受付停止または一時的な障害です。無制限に再試行せず、待ってから再試行してください。無料の試験運用で、可用性は保証しません。

組み込み時の注意

音声を送信すること・外部サービスで処理されることを利用者に説明し、話者の権利と同意を確認してください。マイク許可が拒否された場合やネットワーク障害を表示し、画面終了時に録音を停止してください。対応形式はブラウザによって異なります。

OpenAPI仕様 ↗ · Markdownドキュメント · AI向け案内