feat: [sound-logo] TTS 음성 오버레이 기능 추가

- Gemini TTS API 연동 (한국어 Kore 음성)
- 사이드바에 음성 오버레이 컨트롤: 텍스트 입력, 시작 시점, 볼륨
- 재생/WAV 내보내기 시 신스 + 음성 자동 합성
- POST /rd/sound-logo/tts 엔드포인트 추가
- L16 PCM → AudioBuffer 디코더 구현
This commit is contained in:
김보곤
2026-03-08 12:44:05 +09:00
parent 75dbe2910a
commit 301369bb37
3 changed files with 207 additions and 2 deletions

View File

@@ -452,4 +452,63 @@ public function soundLogoGenerate(Request $request): JsonResponse
return response()->json(['success' => true, 'data' => $result]);
}
/**
* 사운드 로고 TTS 음성 생성 (Gemini TTS API)
*/
public function soundLogoTts(Request $request): JsonResponse
{
$request->validate([
'text' => 'required|string|max:200',
]);
$apiKey = config('services.gemini.api_key');
$baseUrl = config('services.gemini.base_url', 'https://generativelanguage.googleapis.com/v1beta');
if (! $apiKey) {
return response()->json(['success' => false, 'error' => 'Gemini API 키가 설정되지 않았습니다.'], 500);
}
try {
$response = Http::timeout(30)->post(
"{$baseUrl}/models/gemini-2.5-flash-preview-tts:generateContent?key={$apiKey}",
[
'contents' => [
['parts' => [['text' => $request->text]]],
],
'generationConfig' => [
'responseModalities' => ['AUDIO'],
'speechConfig' => [
'voiceConfig' => [
'prebuiltVoiceConfig' => [
'voiceName' => 'Kore',
],
],
],
],
]
);
} catch (\Exception $e) {
Log::error('SoundLogo TTS 생성 실패', ['error' => $e->getMessage()]);
return response()->json(['success' => false, 'error' => 'TTS 서버 연결 실패'], 500);
}
if (! $response->successful()) {
return response()->json(['success' => false, 'error' => 'TTS 생성 실패: '.$response->status()], 500);
}
$data = $response->json();
$inlineData = $data['candidates'][0]['content']['parts'][0]['inlineData'] ?? null;
if (! $inlineData || empty($inlineData['data'])) {
return response()->json(['success' => false, 'error' => '음성 데이터를 받지 못했습니다.'], 500);
}
return response()->json([
'success' => true,
'audio_data' => $inlineData['data'],
'mime_type' => $inlineData['mimeType'] ?? 'audio/L16;rate=24000',
]);
}
}