Speech to Text API
1つの音声ファイルをアップロードすると、完成したtranscriptをJSONまたはplain textで返します。multipart fieldとレスポンスはOpenAI transcription APIで 一般的な形式を採用していますが、endpointが異なるため、OpenAI SDKのBase URL だけを変更する方法には対応していません。
API概要
| 項目 | 値 |
|---|---|
| Base URL | https://api.kitschlabs.com |
| Endpoint | POST /v1/speech-to-text |
| 認証 | Authorization: Bearer <API_KEY>またはxi-api-key: <API_KEY> |
| リクエスト | multipart/form-data |
| モデル | kitsch-stt-v1 |
| 最大ファイルサイズ | 100 MiB |
| デフォルトレスポンス | JSON |
Speech to Textは、認証済みのすべてのアカウントでデフォルトで利用できます。
ファイルを変換するには?
- cURL
- Python
- JavaScript
curl --request POST \
"https://api.kitschlabs.com/v1/speech-to-text" \
--header "Authorization: Bearer <API_KEY>" \
--form "file=@speech.wav" \
--form "model=kitsch-stt-v1" \
--form "language=ja" \
--form "response_format=json"
import os
import requests
with open("speech.wav", "rb") as audio:
response = requests.post(
"https://api.kitschlabs.com/v1/speech-to-text",
headers={"Authorization": f"Bearer {os.environ['KITSCH_API_KEY']}"},
data={
"model": "kitsch-stt-v1",
"language": "ja",
"response_format": "json",
},
files={"file": audio},
timeout=120,
)
response.raise_for_status()
print(response.json()["text"])
import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("file", new Blob([await readFile("speech.wav")]), "speech.wav");
form.append("model", "kitsch-stt-v1");
form.append("language", "ja");
form.append("response_format", "json");
const response = await fetch("https://api.kitschlabs.com/v1/speech-to-text", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.KITSCH_API_KEY}` },
body: form,
});
if (!response.ok) {
throw new Error(`${response.status}: ${await response.text()}`);
}
console.log((await response.json()).text);
どのfieldを送信できますか?
| Field | 型 | 必須 | 説明 |
|---|---|---|---|
file | file | はい | 変換する音声ファイル。最大100 MiB |
model | string | はい | kitsch-stt-v1 |
language | string | いいえ | 予想される言語のISO 639-1コード。例:ko、en、ja |
prompt | string | いいえ | 固有名詞や文脈を示す短いヒント |
response_format | string | いいえ | json(デフォルト)またはtext |
stream | boolean | いいえ | falseのみ対応 |
kitsch_options | JSON string | いいえ | 高度な認識オプション |
temperature、stream=true、他のモデルID、未対応のレスポンス形式は
エラーになります。音声をリアルタイムで送信する場合は
Streaming APIを使用してください。
高度なオプション
kitsch_optionsはJSON文字列として送信します。対応するkeyは次のとおりです。
language_hints,language_hints_strictenable_speaker_diarizationenable_language_identificationcontexttranslation
--form 'kitsch_options={"language_hints":["ja","en"],"enable_speaker_diarization":true}'
不明なkeyはエラーになります。
レスポンス形式
response_format=jsonのレスポンス:
{
"text": "こんにちは。",
"usage": {
"type": "duration",
"seconds": 1.25
}
}
response_format=textではUTF-8 plain textを返します。サポートや障害調査のため、
レスポンスのx-kitsch-request-idを記録してください。
課金方法
成功したリクエストは、入力音声の長さを開始済みの1秒単位に切り上げ、 1秒あたり0.1 creditで計算します。たとえば4.2秒と5.0秒はそれぞれ0.5 credit、 5.1秒は0.6 creditです。失敗したリクエストや入力検証で拒否されたリクエストは 課金されません。
エラー処理
エラーbodyにはerror.message、error.type、error.param、error.codeが
含まれます。
{
"error": {
"message": "The uploaded file is too large.",
"type": "invalid_request_error",
"param": "file",
"code": "file_too_large"
}
}
| Status | 意味 | 推奨対応 |
|---|---|---|
400・422 | ファイル、モデル、オプションが無効 | fieldと音声ファイルを確認 |
401 | APIキーがない、または無効 | 認証ヘッダーを確認 |
402 | credit不足 | 残高と請求状態を確認 |
413 | ファイルサイズ超過 | 100 MiB以下にして再送信 |
429 | リクエストまたは処理容量の上限 | Retry-Afterに従いbackoffを適用 |
503 | 一時的に利用不可 | request IDを記録し、限定的に再試行 |