feat: [sound-logo] 아이 목소리 옵션 + 말하기 속도 조절 추가

- 스타일 옵션에 어린이(5~7세), 초등학생(8~12세), 청소년(13~18세) 추가
- 말하기 속도 슬라이더 추가 (매우느리게~매우빠르게 5단계)
- 속도와 스타일을 TTS 프롬프트 지시문으로 조합하여 Gemini API에 전달
- 음성 목록 여성/남성/중성 순서로 정렬
This commit is contained in:
김보곤
2026-03-08 14:05:22 +09:00
parent 64b3ad2b59
commit 0e86636354
2 changed files with 42 additions and 11 deletions

View File

@@ -487,6 +487,7 @@ public function soundLogoTts(Request $request): JsonResponse
'text' => 'required|string|max:200',
'voice_name' => 'nullable|string|max:30',
'voice_style' => 'nullable|string|max:100',
'voice_speed' => 'nullable|integer|min:1|max:5',
]);
$apiKey = config('services.gemini.api_key');
@@ -498,13 +499,29 @@ public function soundLogoTts(Request $request): JsonResponse
$voiceName = $request->voice_name ?: 'Kore';
$voiceStyle = $request->voice_style ?: '';
$voiceSpeed = $request->voice_speed ?: 3;
// 속도 지시문 매핑
$speedDirectives = [
1 => '아주 천천히 또박또박 말해주세요.',
2 => '조금 느린 속도로 말해주세요.',
3 => '', // 보통 — 지시 없음
4 => '조금 빠른 속도로 말해주세요.',
5 => '아주 빠른 속도로 말해주세요.',
];
// TTS에 전달할 텍스트 구성
$ttsText = $request->text;
// 스타일 지시가 있으면 프롬프트로 감싸기
$directives = [];
if ($voiceStyle) {
$ttsText = "{$voiceStyle}: {$ttsText}";
$directives[] = $voiceStyle;
}
if (! empty($speedDirectives[$voiceSpeed])) {
$directives[] = $speedDirectives[$voiceSpeed];
}
$ttsText = $request->text;
if (! empty($directives)) {
$ttsText = implode(' ', $directives)." \n\n{$ttsText}";
}
// 짧은 텍스트는 TTS 모델이 텍스트 생성으로 인식할 수 있으므로 발화 컨텍스트 추가