From c2ddb625fb31f9b86f9731250aeb4a5adefe6348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 8 Mar 2026 12:51:08 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[rd]=20TTS=20500=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20AI=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=ED=8C=8C=EC=8B=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 짧은 텍스트(4자 미만) TTS 요청 시 따옴표 래핑으로 Gemini TTS 인식률 개선 - TTS API 에러 시 실제 에러 메시지 반환 (기존: 일괄 500) - AI 생성 temperature 0.9→0.7, maxOutputTokens 2048→4096으로 응답 안정성 개선 - 프롬프트에 name/desc 길이 제한 추가하여 JSON 잘림 방지 --- app/Http/Controllers/RdController.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/RdController.php b/app/Http/Controllers/RdController.php index 16d93c82..4418a935 100644 --- a/app/Http/Controllers/RdController.php +++ b/app/Http/Controllers/RdController.php @@ -408,6 +408,7 @@ public function soundLogoGenerate(Request $request): JsonResponse - 카테고리 특성에 맞는 synth와 ADSR 선택 - 음악적으로 조화롭고 기억에 남는 멜로디 설계 - 최소 2개, 최대 12개 음표 사용 +- name은 10자 이내, desc는 30자 이내로 간결하게 작성 PROMPT; try { @@ -418,8 +419,8 @@ public function soundLogoGenerate(Request $request): JsonResponse ['parts' => [['text' => $prompt]]], ], 'generationConfig' => [ - 'temperature' => 0.9, - 'maxOutputTokens' => 2048, + 'temperature' => 0.7, + 'maxOutputTokens' => 4096, 'responseMimeType' => 'application/json', ], ] @@ -469,12 +470,18 @@ public function soundLogoTts(Request $request): JsonResponse return response()->json(['success' => false, 'error' => 'Gemini API 키가 설정되지 않았습니다.'], 500); } + // 짧은 텍스트는 TTS 모델이 텍스트 생성으로 인식할 수 있으므로 발화 컨텍스트 추가 + $ttsText = $request->text; + if (mb_strlen($ttsText) < 4) { + $ttsText = "'{$ttsText}' "; + } + try { $response = Http::timeout(30)->post( "{$baseUrl}/models/gemini-2.5-flash-preview-tts:generateContent?key={$apiKey}", [ 'contents' => [ - ['parts' => [['text' => $request->text]]], + ['parts' => [['text' => $ttsText]]], ], 'generationConfig' => [ 'responseModalities' => ['AUDIO'], @@ -495,7 +502,11 @@ public function soundLogoTts(Request $request): JsonResponse } if (! $response->successful()) { - return response()->json(['success' => false, 'error' => 'TTS 생성 실패: '.$response->status()], 500); + $body = $response->json(); + $msg = $body['error']['message'] ?? ('TTS 생성 실패: '.$response->status()); + Log::warning('SoundLogo TTS API 에러', ['status' => $response->status(), 'body' => $msg]); + + return response()->json(['success' => false, 'error' => $msg], $response->status()); } $data = $response->json();