音声クローニングAPI
音声クローニングAPIは、参照音声、参照音声の正確な文字起こし、合成するテキストを 1回のmultipart requestで受け取り、音声を返します。
API概要
| 項目 | 値 |
|---|---|
| Base URL | https://api.kitschlabs.com |
| 認証 | xi-api-key: <API_KEY> |
| Method | POST |
| Endpoint | /v1/voice-cloning/text-to-speech |
| Content-Type | multipart/form-data |
| デフォルト出力 | mp3_44100_128 (audio/mpeg) |
| 追加出力 | wav_24000 (audio/wav) |
どのように認証しますか?
発行されたAPIキーをxi-api-keyヘッダーに送信します。実際のキーはサーバーの
環境変数またはシークレット管理サービスに保存し、ブラウザ、アプリのバンドル、
ログに残さないでください。
xi-api-key: <API_KEY>
音声を生成するには?
参照音声とreference_textは正確に一致する必要があります。以下の例では、
参照ファイルと合成する文章を1回のリクエストで送信します。
- cURL
- Python
- JavaScript
curl --request POST \
"https://api.kitschlabs.com/v1/voice-cloning/text-to-speech?output_format=wav_24000" \
--header "xi-api-key: <API_KEY>" \
--form "text=これは合成するテキストです。" \
--form "reference_text=これは参照音声の正確な文字起こしです。" \
--form "reference_audio=@reference.wav" \
--form "language_code=ja" \
--output speech.wav
import os
import requests
with open("reference.wav", "rb") as reference_audio:
response = requests.post(
"https://api.kitschlabs.com/v1/voice-cloning/text-to-speech",
params={"output_format": "wav_24000"},
headers={"xi-api-key": os.environ["KITSCH_API_KEY"]},
data={
"text": "これは合成するテキストです。",
"reference_text": "これは参照音声の正確な文字起こしです。",
"language_code": "ja",
},
files={"reference_audio": reference_audio},
timeout=120,
)
response.raise_for_status()
with open("speech.wav", "wb") as audio_file:
audio_file.write(response.content)
import { readFile, writeFile } from "node:fs/promises";
const form = new FormData();
form.append("text", "これは合成するテキストです。");
form.append("reference_text", "これは参照音声の正確な文字起こしです。");
form.append("reference_audio", new Blob([await readFile("reference.wav")]), "reference.wav");
form.append("language_code", "ja");
const response = await fetch(
"https://api.kitschlabs.com/v1/voice-cloning/text-to-speech?output_format=wav_24000",
{
method: "POST",
headers: {"xi-api-key": process.env.KITSCH_API_KEY},
body: form,
},
);
if (!response.ok) {
throw new Error(`${response.status}: ${await response.text()}`);
}
await writeFile("speech.wav", Buffer.from(await response.arrayBuffer()));
どのフィールドを送信しますか?
| フィールド | 位置 | 型 | 必須 | 説明 |
|---|---|---|---|---|
text | form | string | はい | 合成するテキスト |
reference_text | form | string | はい | 参照音声で実際に話されている正確な文字起こし |
reference_audio | form | file | はい | WAV、MP3、FLAC、OGGファイル |
language_code | form | string | いいえ | en、ko、ja、zhのいずれか |
instruct | form | string | いいえ | 話し方に関する自然言語の指示 |
speed | form | number | いいえ | 発話速度。0.25から4 |
output_format | query | string | いいえ | mp3_44100_128またはwav_24000 |
参照音声は最大25 MiB、20秒まで対応します。reference_textにはtimestamp、
話者名、字幕記号、翻訳を含めず、実際に聞こえる発話だけを記述してください。
参照音声はどのように準備しますか?
- 1人が話すクリアなspeech-only clipを使用します。
- 音楽、反響、背景の会話、強いnoiseを避けます。
- clipの先頭や末尾で発話を切らないようにします。
- 必要な発音とトーンが明確に含まれる部分を選びます。
- 自分の音声、または明示的に使用許可を得た音声のみを使用します。
使用する権利のある音声のみを利用してください
同意なく他人の音声を複製したり、なりすまし、欺瞞、権利侵害を目的として 利用したりしないでください。
レスポンスとエラー
成功すると、選択したoutput_formatのaudio binaryを返します。レスポンスを
ファイルに保存し、x-kitsch-request-idを運用ログに残してください。
| ステータス | 意味 | 推奨対応 |
|---|---|---|
400·422 | 必須値、文字起こし、ファイル形式のエラー | リクエスト値と参照音声を修正 |
401 | APIキーがない、または無効 | キーとxi-api-keyヘッダーを確認 |
402 | 利用可能なcreditが不足 | 請求の状態を確認 |
413 | 参照音声のサイズ超過 | 25 MiB以下にして再送信 |
429 | アカウントのリクエスト上限を超過 | Retry-Afterに従いbackoffを適用 |
5xx | 一時的なサーバーエラー | request IDを記録し、回数を制限して再試行 |