Logo

包括的な開発者ガイドとベストプラクティスで、すばやく開発を始められます。

チュートリアル

音声認識

ローカル音声の Base64 エンコードから JSON 一括結果取得、タイムスタンプと字幕、SSE 逐次配信まで、音声認識の実戦フローをまとめます。

本チュートリアルは POST /api/v1/audio/transcriptions を軸に進めます。本エンドポイントは Base64 エンコード済み音声バイトを受け取り、プレーンテキストと任意のタイムスタンプを返します。SSE による逐次配信にも対応します。

ステップ 1:音声データを準備する

音声を読み込み Base64 へエンコードします。data:audio/...;base64, プレフィックスは必ず除去してください。エンドポイントは生の Base64 文字列のみを受け付けます。サーバは音声の実際の内容から形式を自動検出するため拡張子は無関係ですが、内容は対応形式のいずれかである必要があります。

  • 対応形式:MP3、WAV、M4A、FLAC、OGG、WEBM。
  • JSON(Base64)経路は raw 音声 ≤ 1 MB。超過時は 413 audio_too_long。
  • 1 MB を超える音声は multipart/form-data で元ファイルをアップロード(≤ 15 MB):`params` JSON フィールド(本チュートリアルのパラメータから audio_data を除いたもの)は `audio` ファイルフィールドより先に送信必須。詳細は API リファレンスの ASR エンドポイントを参照。
  • 形式検出失敗は 422 unsupported_audio_format、デコード失敗は 422 asr_audio_decode_error。

ローカル音声を 1 行の Base64 文字列に変換します。base64 -w 0 で改行を抑止します。

bash
# Encode a local audio file (no line wrapping)
AUDIO_B64=$(base64 -w 0 ./meeting.mp3)
echo "$AUDIO_B64" | head -c 80
# Output (truncated): SUQzBAAAAAACSlBNTAAA...

ステップ 2:JSON モードでリクエストを送る

既定の stream=false では認識完了を待って結果を一括返却します。language には言語コードまたは "auto"(モデル自動検出)を指定。punctuation は既定 true で、認識結果に句読点を自動補完します。

JSON モード curl:jq で Base64 文字列を注入し、シェルによる特殊文字の取り違えを防ぎます。

bash
curl -X POST "https://abemono.abestar.com.tw/api/v1/audio/transcriptions" \
  -H "X-API-Key: $ABESTAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg a "$AUDIO_B64" '{
    audio_data: $a,
    language: "zh-TW",
    timestamp_format: "json",
    diarization: true
  }')"

成功応答例(HTTP 200)。timestamp_format="json" では segments、srt / webvtt では timestamps 文字列に充填されます。

json
{
  "text": "今天的會議改到下午三點。",
  "detected_language": "zh-TW",
  "segments": [
    {
      "id": 0,
      "start": 0.0,
      "end": 2.4,
      "text": "今天的會議改到下午三點。",
      "speaker": "A"
    }
  ],
  "timestamps": null,
  "usage": {
    "quota_percent": {
      "used": 35
    }
  },
  "forced_replacement_count": 0,
  "vocabulary_used": false
}

追加機能パラメータ

以下のパラメータはすべて任意で、JSON / SSE いずれのモードとも自由に組み合わせられます。省略時は既定値が適用されます。上位 7 行はテキスト翻訳エンドポイントと共通、下位 3 行は音声認識専用です。

上位 7 行は翻訳エンドポイントと共通、下位 3 行は音声認識専用です。
パラメータ既定値説明
modelstring"tranc-std-v1"認識モデルコード。利用可能な一覧は GET /audio/models で取得できます。
domainstring"general"内容領域のヒント("medical" / "legal" / "finance" など)。専門用語の認識を補助します。
context{ speech: string }[][]場面背景や先行対話の補足を時系列順で渡します。
harm_content_filterbooleanfalse有害コンテンツフィルタを有効化します。拒否時は 400 asr_content_policy_violation。
punctuationbooleantrue認識テキストの句読点を自動補完します。既定は true で、テキスト翻訳エンドポイントの false とは逆です。
number_format"spoken" | "arabic""spoken"数字の書き起こし方式:spoken は口語表記、arabic はアラビア数字(1234)。
date_format"natural" | "yyyy-MM-dd" | "yyyy/MM/dd" | "MM/dd/yyyy" | "dd-MM-yyyy""natural"日付の表現方式:natural は言語慣例に従い、その他は固定テンプレートです。
timestamp_format"json" | "srt" | "webvtt"省略時は出力しない音声認識専用。"json" は構造化された segments、"srt" / "webvtt" は字幕文字列をそのまま返します。
diarizationbooleanfalse音声認識専用。true で segments に話者ラベル("A" / "B" / "C"…)が付き、複数話者の会議に使えます。
processing_mode"fast" | "balanced""balanced"音声認識専用。fast は高速、balanced は高精度。長尺音声や精度重視の場面では balanced を維持します。

punctuation の既定値は両エンドポイントで逆

音声認識では punctuation の既定が true(句読点を自動付与)、テキスト翻訳では false です。句読点なしの生の認識結果が必要な場合は punctuation: false を明示的に送信してください。

辞書を併用する

音声認識エンドポイントはテキスト翻訳と同じ 2 種類の辞書を受け付けます。vocabulary はソフトヒントで、一致した語彙が好適語としてモデルに渡されるため、人名・製品名・専門用語に適します。forced_replacement は後処理置換で、認識完了後に出力へ文字列置換を適用します。どちらも UUID を vocabulary_dictionary_id / forced_replacement_dictionary_id に指定します。

JSON モードでは両方の辞書を同時に指定できます。language は明示的な言語コードである必要があり、auto は使用できません。

bash
curl -X POST "https://abemono.abestar.com.tw/api/v1/audio/transcriptions" \
  -H "X-API-Key: $ABESTAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg a "$AUDIO_B64" '{
    audio_data: $a,
    language: "zh-TW",
    vocabulary_dictionary_id: "f3c1e9a2-9c2b-4f7a-9d3a-7e2b8a1c4d5e",
    forced_replacement_dictionary_id: "1d2e3f4a-5b6c-7d8e-9f0a-1b2c3d4e5f6a"
  }')"

応答の vocabulary_used と forced_replacement_count で辞書が実際に効いたか確認できます。この 2 つは音声認識固有で、テキスト翻訳には後者のみがあります。

json
{
  "text": "請把這份合約交給法務組長確認。",
  "detected_language": "zh-TW",
  "segments": null,
  "timestamps": null,
  "usage": {
    "quota_percent": {
      "used": 35
    }
  },
  "forced_replacement_count": 2,
  "vocabulary_used": true
}

vocabulary 辞書は language: "auto" と併用不可

語彙誘導は対応する語を適用するために音声の言語を先に知る必要があるため、language: "auto" と vocabulary_dictionary_id を同時に送信すると 400 validation_error が返ります。vocabulary 辞書を使う場合は language を明示してください。この制限は音声認識固有で、テキスト翻訳エンドポイントにはありません。また翻訳と同様に、stream: true では forced_replacement_dictionary_id を指定できません。

辞書の作成と詳細

作成、一括作成、CRUD、2 種類の辞書の使い分けについては「辞書操作の手順」と「辞書の概念」を参照してください。

SSE モード:逐次出力

リアルタイム字幕や逐次表示が必要な場合は stream=true を指定し、応答を text/event-stream へ切り替えます。イベント順序は head(detected_language)→ chunk*(テキスト片、0〜複数件)→ tail(任意で segments)→ meta(usage / vocabulary_used / forced_replacement_count)。失敗時は任意の時点で error イベントが残りを置換し、ストリームを終了します。

SSE モードの curl 例。-N で curl のバッファリングを無効化し、イベントを逐次出力します。

bash
curl -N -X POST "https://abemono.abestar.com.tw/api/v1/audio/transcriptions" \
  -H "X-API-Key: $ABESTAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg a "$AUDIO_B64" '{
    audio_data: $a,
    language: "auto",
    stream: true
  }')"

SSE と forced_replacement は併用不可

後処理置換は完全な認識結果を要するため、逐次配信とは原理的に両立しません。stream=true と forced_replacement_dictionary_id を同時送信すると 400 validation_error が返ります。SSE モードでは meta の forced_replacement_count は恒常 0 です。ストリーミングで置換が必要な場合は JSON モードに戻すか、クライアント側で置換してください。

翻訳 SSE との違い

音声認識の head は detected_language(翻訳は source_lang)、tail は任意で segments を併載、meta は usage に加えて vocabulary_used と forced_replacement_count を含みます。エラーコードはすべて asr_ プレフィックス(asr_failed / asr_timeout / asr_content_policy_violation)。