diff --git a/src/main/kotlin/com/tondo/api/application/ArtworkOrchestrator.kt b/src/main/kotlin/com/tondo/api/application/ArtworkOrchestrator.kt index cde41ac..e714ba0 100644 --- a/src/main/kotlin/com/tondo/api/application/ArtworkOrchestrator.kt +++ b/src/main/kotlin/com/tondo/api/application/ArtworkOrchestrator.kt @@ -69,7 +69,8 @@ class ArtworkOrchestrator( averageHz = request.averageHz, averageVolume = request.averageVolulme, averageTimbre = request.averageTimbre, - base64Image = Base64.getDecoder().decode(request.base64Image) + base64Image = Base64.getDecoder().decode(request.base64Image), + voiceColor = request.voiceColor ) } catch (e: IllegalArgumentException) { log.error("Invalid Base64 image data provided for request with uuid: {}", request.uuid) diff --git a/src/main/kotlin/com/tondo/api/domain/ArtworkRepresentation.kt b/src/main/kotlin/com/tondo/api/domain/ArtworkRepresentation.kt index cd739a4..ab64d6e 100644 --- a/src/main/kotlin/com/tondo/api/domain/ArtworkRepresentation.kt +++ b/src/main/kotlin/com/tondo/api/domain/ArtworkRepresentation.kt @@ -10,6 +10,7 @@ data class ArtworkRepresentation( val averageVolume: Double, val averageTimbre: Double, val base64Image: ByteArray, // 현행 기획 및 설계 상 중복 제거와 같은 비교 로직이 필요하지 않음 -> hashCode(), equals() 오버라이드 불필요 + val voiceColor: String, // 음색의 HEX CODE val creatdAt: LocalDateTime = LocalDateTime.now(), // LLM 호출 이후 채울 필드 : nullable 로 선언 diff --git a/src/main/kotlin/com/tondo/api/dto/ArtworkCreateRequest.kt b/src/main/kotlin/com/tondo/api/dto/ArtworkCreateRequest.kt index 85eff09..5e0928a 100644 --- a/src/main/kotlin/com/tondo/api/dto/ArtworkCreateRequest.kt +++ b/src/main/kotlin/com/tondo/api/dto/ArtworkCreateRequest.kt @@ -8,5 +8,6 @@ data class ArtworkCreateRequest( val averageHz: Double, val averageVolulme: Double, val averageTimbre: Double, - val base64Image: String // 이 필드의 크기가 클 수 있습니다! JSON 페이로드 크기 보고, request body size limit 늘려야할 수 있습니다! + val base64Image: String, // 이 필드의 크기가 클 수 있습니다! JSON 페이로드 크기 보고, request body size limit 늘려야할 수 있습니다! + val voiceColor: String // 음색의 HEX CODE ) diff --git a/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/dto/BedrockImageRequest.kt b/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/dto/BedrockImageRequest.kt index 5a8b31c..cc7d625 100644 --- a/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/dto/BedrockImageRequest.kt +++ b/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/dto/BedrockImageRequest.kt @@ -12,7 +12,7 @@ data class BedrockImageRequest( ) { companion object { fun fromDomain(rep: ArtworkRepresentation): BedrockImageRequest { - val generatedPrompt = BedrockPromptTemplate.createImageGenerationPrompt() + val generatedPrompt = BedrockPromptTemplate.createImageGenerationPrompt(rep.voiceColor) // ArtworkRepresentation의 base64Image가 ByteArray이므로 AWS 스펙에 맞게 Base64 String으로 인코딩합니다. val encodedImage = java.util.Base64.getEncoder().encodeToString(rep.base64Image) diff --git a/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/service/BedrockService.kt b/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/service/BedrockService.kt index e2596d3..824ea26 100644 --- a/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/service/BedrockService.kt +++ b/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/service/BedrockService.kt @@ -38,7 +38,8 @@ class BedrockService( val prompt = BedrockPromptTemplate.createDocentPrompt( averageHz = artworkRepresentation.averageHz, averageTimbre = artworkRepresentation.averageTimbre, - averageVolume = artworkRepresentation.averageVolume + averageVolume = artworkRepresentation.averageVolume, + voiceColor = artworkRepresentation.voiceColor ) val requestBody = objectMapper.writeValueAsString( diff --git a/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/template/BedrockPromptTemplate.kt b/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/template/BedrockPromptTemplate.kt index 33f8acd..5cbe582 100644 --- a/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/template/BedrockPromptTemplate.kt +++ b/src/main/kotlin/com/tondo/api/infrastructure/aws/bedrock/template/BedrockPromptTemplate.kt @@ -13,7 +13,7 @@ object BedrockPromptTemplate { averageHz: Double, averageTimbre: Double, averageVolume: Double, - hexColor: String = "#97b6e1" // 필요시 동적으로 주입할 수 있도록 기본값 파라미터화 + voiceColor: String = "#97b6e1" // 필요시 동적으로 주입할 수 있도록 기본값 파라미터화 ): String { return """ 당신은 미디어 아트 페스티벌의 수석 도슨트입니다. 아래의 관람객 음성 추출 데이터와 이 파동을 시각화하기 위해 AI에 적용된 아트워크 스타일과 실제 적용된 이미지를 바탕으로 도슨트 해설을 작성해 주세요. @@ -24,7 +24,7 @@ object BedrockPromptTemplate { - 목소리 크기 (에너지): ${averageVolume}dB [시각화 적용 스타일 및 색상] - - 메인 색상 코드: ${hexColor} (이 색상을 기반으로 어두움과 밝음이 배치됨) + - 메인 색상 코드: ${voiceColor} (이 색상을 기반으로 어두움과 밝음이 배치됨) - 렌더링 기법: 캔버스 질감이 살아있는 정교한 아크릴화 - 세부 묘사: 대담하고 대칭적인 구조, 미세한 점들을 선으로 재해석한 이분법적 점묘 기법 @@ -55,11 +55,11 @@ object BedrockPromptTemplate { // Ensure a perfect harmony between symmetrical structure and rich, thick paint texture. // """.trimIndent() // } - fun createImageGenerationPrompt(hexColor: String = "#97b6e1"): String { + fun createImageGenerationPrompt(voiceColor: String = "#97b6e1"): String { return """ High-quality acrylic painting on canvas, intricate Chladni pattern with geometric symmetry, - primary color palette of $hexColor with deep contrasting shadows, + primary color palette of $voiceColor with deep contrasting shadows, thick brushstroke texture, rhythmic pointillism, modern abstract art style, 8k resolution, masterpiece. """.trimIndent()