メインコンテンツまでスキップ

AITuberKit × AICU API 連携ガイド

AITuberKit で AICU TTS を使用するための設定ガイド

概要​

AITuberKit は AI キャラクターとの対話を実現する Web アプリケーションです。 AICU API の TTS を使用することで、高品質な日本語音声を生成できます。


環境変数設定​

.env.local に以下を追加:

# AICU API Settings
AICU_API_KEY=aicu_live_xxxxxxxxxxxxxxxx
AICU_API_URL=https://api.aicu.ai/v1

# Character Settings (slug または char_id を使用)
AICU_SLUG=luc4 # キャラクターslug
# AICU_CHAR_ID=0 # または数値ID

TypeScript 実装例​

TTS クライアント​

// lib/aicu-tts.ts

interface TTSOptions {
text: string;
slug?: string; // キャラクターslug (推奨)
char_id?: number; // または数値ID
voice?: string;
seed?: number;
instruct?: string;
force?: boolean; // キャッシュバイパス
}

export async function generateSpeech(options: TTSOptions): Promise<ArrayBuffer> {
const response = await fetch(`${process.env.AICU_API_URL}/tts/generate`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.AICU_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
text: options.text,
slug: options.slug || process.env.AICU_SLUG,
char_id: options.char_id,
voice: options.voice,
seed: options.seed,
instruct: options.instruct,
force: options.force,
format: 'mp3',
}),
});

if (!response.ok) {
throw new Error(`TTS Error: ${response.status}`);
}

// レスポンスヘッダーをログ
const cacheHit = response.headers.get('X-Cache-Hit');
const creditsUsed = response.headers.get('X-Credits-Used');
console.log(`Cache: ${cacheHit}, Credits: ${creditsUsed}`);

return response.arrayBuffer();
}

React Hook​

// hooks/useAicuTTS.ts
import { useState, useCallback } from 'react';

export function useAicuTTS() {
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState<string | null>(null);

const speak = useCallback(async (text: string) => {
setIsLoading(true);
setError(null);

try {
const res = await fetch('/api/tts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text }),
});

if (!res.ok) throw new Error('TTS failed');

const audioBlob = await res.blob();
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);

await audio.play();

// Cleanup
audio.onended = () => URL.revokeObjectURL(audioUrl);
} catch (err) {
setError(err instanceof Error ? err.message : 'Unknown error');
} finally {
setIsLoading(false);
}
}, []);

return { speak, isLoading, error };
}

API Route (Next.js)​

// app/api/tts/route.ts
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
const { text, slug, char_id, force } = await request.json();

const response = await fetch('https://api.aicu.ai/v1/tts/generate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.AICU_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
text,
slug: slug || process.env.AICU_SLUG || 'luc4',
char_id,
force,
format: 'mp3',
}),
});

if (!response.ok) {
return NextResponse.json(
{ error: 'TTS generation failed' },
{ status: response.status }
);
}

const audioBuffer = await response.arrayBuffer();

return new NextResponse(audioBuffer, {
headers: {
'Content-Type': 'audio/mpeg',
'X-Cache-Hit': response.headers.get('X-Cache-Hit') || 'false',
'X-Slug': response.headers.get('X-Slug') || '',
'X-Credits-Used': response.headers.get('X-Credits-Used') || '0',
},
});
}

キャラクター設定 (CharID)​

char_idslugNameVoiceSeed状態
0luc4LuC4aiden608public
1elenaElena Bloomono_anna330private
2meiMei Soleilono_anna721private
3minaMina Azureono_anna101private
4naoNao Verdeaiden505private
5sakiSaki Noirono_anna1031private

使用例:

// slug で指定(推奨)
await generateSpeech({ text: 'こんにちは', slug: 'luc4' });

// char_id で指定
await generateSpeech({ text: 'こんにちは', char_id: 0 });

音声スタイル指示 (instruct)​

instruct パラメータで音声の抑揚やスタイルを制御:

// 元気な挨拶
await generateSpeech({
text: 'おはようございます!',
voice: 'ono_anna',
instruct: 'Speak with energy and excitement',
});

// 落ち着いた説明
await generateSpeech({
text: '本日の予定を説明します。',
voice: 'serena',
instruct: 'Speak calmly and clearly like a professional narrator',
});

// ささやき声
await generateSpeech({
text: '秘密だよ...',
voice: 'vivian',
instruct: 'Whisper softly',
});

トラブルシューティング​

401 Unauthorized​

→ APIキーが無効です。ダッシュボードで再発行してください。

402 Payment Required​

→ クレジット不足です。アドオンを購入するかプランをアップグレードしてください。

429 Too Many Requests​

→ レート制限に達しました。プランに応じた制限を確認してください。


サポート​

© 2026 AICU Inc.