From 0738c277e8aeeb83be01e38415fe93b39a58617f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 15 Feb 2026 15:29:03 +0900 Subject: [PATCH] =?UTF-8?q?fix:=EC=8A=A4=ED=86=A0=EB=A6=AC=EB=B3=B4?= =?UTF-8?q?=EB=93=9C=20PPTX=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EB=B3=B4=EC=A0=95=20(=EC=98=81=EC=97=AD=20=EC=B4=88=EA=B3=BC/?= =?UTF-8?q?=EC=97=AC=EB=B0=B1=20=EA=B0=9C=EC=84=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 와이어프레임 헤더 텍스트 너비 확장 (w:2 → w:6.4, 줄바꿈 방지) - 긴 프로젝트명 자동 폰트 축소 (15자 초과 시 8pt) - 모든 요소 좌표 재배치 (max x+w ≤ 6.8, 영역 초과 해소) - 수직 공간 균등 배분 (y:1.35~5.1 전체 활용) - Description 항목 간격 동적 계산 (항목수 기반) - 생성 이력 테이블에 4행 + 하단 액션 버튼 추가 Co-Authored-By: Claude Opus 4.6 --- docs/SAM_Tutorial_Video_Storyboard.pptx | Bin 443296 -> 450386 bytes docs/tutorial-video-storyboard-config.json | 330 +++++++++++---------- 2 files changed, 170 insertions(+), 160 deletions(-) diff --git a/docs/SAM_Tutorial_Video_Storyboard.pptx b/docs/SAM_Tutorial_Video_Storyboard.pptx index bf51785e38bdc9ea26f843d205975d7950c57065..8aace94a5bec464f0edb33f82cb601a02f93f496 100644 GIT binary patch delta 14081 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 XKbLgt`1`(B!T%!b&w9OvV)FVwCG(Kr diff --git a/docs/tutorial-video-storyboard-config.json b/docs/tutorial-video-storyboard-config.json index 3a9a0559..0406a538 100644 --- a/docs/tutorial-video-storyboard-config.json +++ b/docs/tutorial-video-storyboard-config.json @@ -42,46 +42,47 @@ { "title": "Phase 1: 입력 & AI 분석", "content": "스크린샷 업로드 또는 메뉴 선택 후 Gemini API가 UI 요소를 자동 인식하고 사용법 대본을 생성합니다.", - "markerX": 2.0, - "markerY": 1.6 + "markerX": 1.2, + "markerY": 2.1 }, { "title": "Phase 2: 주석 슬라이드", - "content": "각 Step별 스크린샷에 빨간 테두리, 번호 배지, 화살표, 딤 처리 등 시각적 주석을 오버레이합니다.", - "markerX": 3.5, - "markerY": 2.4 + "content": "각 Step별 스크린샷에 빨간 테두리, 번호 배지, 화살표 등 시각적 주석을 오버레이합니다.", + "markerX": 2.8, + "markerY": 2.1 }, { "title": "Phase 3: 나레이션 생성", "content": "Google Cloud TTS(ko-KR-Neural2-A, 여성)로 Step별 나레이션 음성 파일을 생성합니다.", - "markerX": 5.0, - "markerY": 3.2 + "markerX": 4.3, + "markerY": 2.1 }, { "title": "Phase 4: 영상 합성", - "content": "FFmpeg로 슬라이드 이미지 + 나레이션 + 전환효과(crossfade/zoom) + BGM을 합성하여 최종 MP4를 생성합니다.", - "markerX": 6.5, - "markerY": 4.0 + "content": "FFmpeg로 슬라이드 이미지 + 나레이션 + 전환효과 + BGM을 합성하여 최종 MP4를 생성합니다.", + "markerX": 5.8, + "markerY": 2.1 } ], "wireframeElements": [ - {"type": "rect", "x": 1.6, "y": 1.2, "w": 5.3, "h": 0.35, "fill": "1e293b", "text": "SAM 사용법 영상 생성 파이프라인", "fontSize": 11, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.7, "y": 1.7, "w": 1.1, "h": 0.8, "fill": "0d9488", "text": "Phase 1\nAI 분석", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 2.85, "y": 1.85, "w": 0.3, "h": 0.3, "text": "→", "fontSize": 14, "color": "64748b"}, - {"type": "rect", "x": 3.2, "y": 1.7, "w": 1.1, "h": 0.8, "fill": "0d9488", "text": "Phase 2\n슬라이드", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 4.35, "y": 1.85, "w": 0.3, "h": 0.3, "text": "→", "fontSize": 14, "color": "64748b"}, - {"type": "rect", "x": 4.7, "y": 1.7, "w": 1.1, "h": 0.8, "fill": "0d9488", "text": "Phase 3\n나레이션", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 5.85, "y": 1.85, "w": 0.3, "h": 0.3, "text": "→", "fontSize": 14, "color": "64748b"}, - {"type": "rect", "x": 6.2, "y": 1.7, "w": 1.1, "h": 0.8, "fill": "dc2626", "text": "Phase 4\n영상 합성", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 1.35, "w": 6.3, "h": 0.4, "fill": "1e293b", "text": "SAM 사용법 영상 생성 파이프라인", "fontSize": 10, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.7, "y": 2.7, "w": 1.1, "h": 0.5, "fill": "f1f5f9", "text": "Gemini\n스크린샷 분석", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 3.2, "y": 2.7, "w": 1.1, "h": 0.5, "fill": "f1f5f9", "text": "PHP GD\n주석 오버레이", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 4.7, "y": 2.7, "w": 1.1, "h": 0.5, "fill": "f1f5f9", "text": "Cloud TTS\n한국어 음성", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 6.2, "y": 2.7, "w": 1.1, "h": 0.5, "fill": "f1f5f9", "text": "FFmpeg\nMP4 생성", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.5, "y": 2.0, "w": 1.35, "h": 0.9, "fill": "0d9488", "text": "Phase 1\nAI 분석", "fontSize": 9, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 1.9, "y": 2.2, "w": 0.3, "h": 0.4, "text": "→", "fontSize": 16, "color": "64748b"}, + {"type": "rect", "x": 2.25, "y": 2.0, "w": 1.35, "h": 0.9, "fill": "0d9488", "text": "Phase 2\n슬라이드", "fontSize": 9, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 3.65, "y": 2.2, "w": 0.3, "h": 0.4, "text": "→", "fontSize": 16, "color": "64748b"}, + {"type": "rect", "x": 4.0, "y": 2.0, "w": 1.35, "h": 0.9, "fill": "0d9488", "text": "Phase 3\n나레이션", "fontSize": 9, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 5.4, "y": 2.2, "w": 0.3, "h": 0.4, "text": "→", "fontSize": 16, "color": "64748b"}, + {"type": "rect", "x": 5.75, "y": 2.0, "w": 1.05, "h": 0.9, "fill": "dc2626", "text": "Phase 4\n영상 합성", "fontSize": 9, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 3.5, "w": 5.7, "h": 0.35, "fill": "1e293b", "text": "출력: 최종 MP4 영상 (30초~3분) + PPTX 설명서", "fontSize": 9, "color": "FFFFFF"}, - {"type": "rect", "x": 1.6, "y": 4.0, "w": 2.8, "h": 0.3, "fill": "f59e0b", "text": "비용: ~$0.07/영상 | 생성시간: 1~2분", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 4.5, "y": 4.0, "w": 2.8, "h": 0.3, "fill": "0d9488", "text": "Veo3 대비 100배 저렴, 10배 빠름", "fontSize": 8, "color": "FFFFFF", "bold": true} + {"type": "rect", "x": 0.5, "y": 3.15, "w": 1.35, "h": 0.6, "fill": "f1f5f9", "text": "Gemini\n스크린샷 분석", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 2.25, "y": 3.15, "w": 1.35, "h": 0.6, "fill": "f1f5f9", "text": "PHP GD\n주석 오버레이", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 4.0, "y": 3.15, "w": 1.35, "h": 0.6, "fill": "f1f5f9", "text": "Cloud TTS\n한국어 음성", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 5.75, "y": 3.15, "w": 1.05, "h": 0.6, "fill": "f1f5f9", "text": "FFmpeg\nMP4 생성", "fontSize": 7, "color": "1e293b"}, + + {"type": "rect", "x": 0.5, "y": 4.1, "w": 6.3, "h": 0.4, "fill": "1e293b", "text": "출력: 최종 MP4 영상 (30초~3분) + PPTX 설명서", "fontSize": 9, "color": "FFFFFF"}, + {"type": "rect", "x": 0.5, "y": 4.7, "w": 3.05, "h": 0.35, "fill": "f59e0b", "text": "비용: ~$0.07/영상 | 생성시간: 1~2분", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 3.7, "y": 4.7, "w": 3.1, "h": 0.35, "fill": "0d9488", "text": "Veo3 대비 100배 저렴, 10배 빠름", "fontSize": 8, "color": "FFFFFF", "bold": true} ] }, { @@ -93,48 +94,48 @@ { "title": "메뉴 트리 선택", "content": "SAM의 메뉴 구조에서 설명 영상을 생성할 화면을 선택합니다. 자동으로 해당 화면의 스크린샷을 캡처합니다.", - "markerX": 2.0, - "markerY": 1.8 + "markerX": 1.8, + "markerY": 1.9 }, { "title": "스크린샷 업로드", "content": "메뉴 선택 대신 직접 스크린샷 이미지를 업로드하거나, URL을 입력하여 자동 캡처할 수 있습니다.", - "markerX": 5.0, - "markerY": 1.8 + "markerX": 4.5, + "markerY": 1.9 }, { "title": "미리보기 영역", "content": "선택/업로드된 스크린샷이 미리보기로 표시됩니다. Gemini AI가 이 이미지를 분석합니다.", - "markerX": 3.5, - "markerY": 3.5 + "markerX": 3.2, + "markerY": 3.6 }, { "title": "다음 단계 버튼", "content": "'AI 분석 시작' 버튼을 클릭하면 Gemini가 UI 요소를 자동 인식하고 사용법 대본을 생성합니다.", - "markerX": 6.0, - "markerY": 4.2 + "markerX": 5.5, + "markerY": 4.8 } ], "wireframeElements": [ - {"type": "rect", "x": 1.6, "y": 1.2, "w": 5.3, "h": 0.35, "fill": "1e293b", "text": "Step 1: 설명할 화면을 선택하세요", "fontSize": 11, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 1.35, "w": 6.3, "h": 0.4, "fill": "1e293b", "text": "Step 1: 설명할 화면을 선택하세요", "fontSize": 10, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 1.7, "w": 2.5, "h": 2.5, "fill": "f8fafc"}, - {"type": "rect", "x": 1.7, "y": 1.75, "w": 2.3, "h": 0.25, "fill": "0d9488", "text": "메뉴에서 선택", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.8, "y": 2.1, "w": 2.0, "h": 0.2, "text": "📁 견적 관리", "fontSize": 8, "color": "1e293b", "bold": true}, - {"type": "rect", "x": 2.0, "y": 2.35, "w": 1.8, "h": 0.18, "text": "├── 견적서 목록", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 2.0, "y": 2.55, "w": 1.8, "h": 0.18, "fill": "e0f2fe", "text": "├── 견적서 작성 ✓", "fontSize": 7, "color": "0d9488", "bold": true}, - {"type": "rect", "x": 2.0, "y": 2.75, "w": 1.8, "h": 0.18, "text": "└── 견적서 상세", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 1.8, "y": 3.0, "w": 2.0, "h": 0.2, "text": "📁 주문 관리", "fontSize": 8, "color": "1e293b", "bold": true}, - {"type": "rect", "x": 2.0, "y": 3.25, "w": 1.8, "h": 0.18, "text": "├── 주문 목록", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 2.0, "y": 3.45, "w": 1.8, "h": 0.18, "text": "└── 주문 상세", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 0.5, "y": 1.95, "w": 2.9, "h": 2.75, "fill": "f8fafc"}, + {"type": "rect", "x": 0.6, "y": 2.0, "w": 2.7, "h": 0.3, "fill": "0d9488", "text": "메뉴에서 선택", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.7, "y": 2.4, "w": 2.4, "h": 0.25, "text": "📁 견적 관리", "fontSize": 8, "color": "1e293b", "bold": true}, + {"type": "rect", "x": 0.95, "y": 2.7, "w": 2.1, "h": 0.22, "text": "├── 견적서 목록", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 0.95, "y": 2.95, "w": 2.1, "h": 0.22, "fill": "e0f2fe", "text": "├── 견적서 작성 ✓", "fontSize": 7, "color": "0d9488", "bold": true}, + {"type": "rect", "x": 0.95, "y": 3.2, "w": 2.1, "h": 0.22, "text": "└── 견적서 상세", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 0.7, "y": 3.55, "w": 2.4, "h": 0.25, "text": "📁 주문 관리", "fontSize": 8, "color": "1e293b", "bold": true}, + {"type": "rect", "x": 0.95, "y": 3.85, "w": 2.1, "h": 0.22, "text": "├── 주문 목록", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 0.95, "y": 4.1, "w": 2.1, "h": 0.22, "text": "└── 주문 상세", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 4.3, "y": 1.7, "w": 2.6, "h": 2.5, "fill": "f8fafc"}, - {"type": "rect", "x": 4.4, "y": 1.75, "w": 2.4, "h": 0.25, "fill": "0d9488", "text": "직접 업로드", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 4.5, "y": 2.15, "w": 2.2, "h": 1.0, "fill": "e2e8f0", "text": "📷 이미지를 드래그하거나\n클릭하여 업로드", "fontSize": 8, "color": "64748b"}, - {"type": "rect", "x": 4.5, "y": 3.3, "w": 2.2, "h": 0.25, "fill": "FFFFFF", "text": "🔗 URL 입력: https://sam.juil.co.kr/...", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 4.5, "y": 3.65, "w": 2.2, "h": 0.25, "fill": "1e293b", "text": "URL로 캡처", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 3.6, "y": 1.95, "w": 3.2, "h": 2.75, "fill": "f8fafc"}, + {"type": "rect", "x": 3.7, "y": 2.0, "w": 3.0, "h": 0.3, "fill": "0d9488", "text": "직접 업로드", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 3.8, "y": 2.45, "w": 2.8, "h": 1.1, "fill": "e2e8f0", "text": "📷 이미지를 드래그하거나\n클릭하여 업로드", "fontSize": 8, "color": "64748b"}, + {"type": "rect", "x": 3.8, "y": 3.7, "w": 2.8, "h": 0.3, "fill": "FFFFFF", "text": "🔗 URL: https://sam.juil.co.kr/...", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 3.8, "y": 4.1, "w": 2.8, "h": 0.3, "fill": "1e293b", "text": "URL로 캡처", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 5.5, "y": 4.3, "w": 1.4, "h": 0.35, "fill": "0d9488", "text": "🤖 AI 분석 시작", "fontSize": 9, "color": "FFFFFF", "bold": true} + {"type": "rect", "x": 4.9, "y": 4.9, "w": 1.9, "h": 0.35, "fill": "0d9488", "text": "🤖 AI 분석 시작", "fontSize": 9, "color": "FFFFFF", "bold": true} ] }, { @@ -145,47 +146,47 @@ "descriptions": [ { "title": "AI 분석 UI 요소", - "content": "Gemini가 인식한 UI 요소 목록입니다. 각 요소의 이름, 위치, 설명, 사용법을 확인하고 수정할 수 있습니다.", - "markerX": 2.0, - "markerY": 1.8 + "content": "Gemini가 인식한 UI 요소 목록. 이름, 위치, 설명, 사용법을 확인/수정합니다.", + "markerX": 1.5, + "markerY": 2.0 }, { "title": "Step별 순서 편집", - "content": "AI가 제안한 사용 순서(Step)를 드래그앤드롭으로 변경하거나, 요소를 추가/삭제할 수 있습니다.", - "markerX": 2.0, - "markerY": 3.0 + "content": "AI가 제안한 사용 순서를 드래그앤드롭으로 변경, 추가/삭제 가능합니다.", + "markerX": 1.5, + "markerY": 3.3 }, { "title": "나레이션 대본", - "content": "AI가 생성한 나레이션 대본을 직접 편집할 수 있습니다. 음성(여성/남성) 및 속도(1.0~1.5x)도 선택 가능합니다.", - "markerX": 5.0, + "content": "AI가 생성한 대본을 편집. 음성(여성/남성) 및 속도(1.0~1.5x) 선택 가능합니다.", + "markerX": 4.5, "markerY": 2.0 }, { "title": "미리보기 슬라이드", - "content": "주석이 적용된 슬라이드 미리보기입니다. 빨간 테두리, 번호 배지, 화살표 등의 시각적 주석을 확인합니다.", - "markerX": 5.0, - "markerY": 3.5 + "content": "주석 적용 슬라이드 미리보기. 빨간 테두리, 번호 배지, 화살표를 확인합니다.", + "markerX": 4.5, + "markerY": 3.8 } ], "wireframeElements": [ - {"type": "rect", "x": 1.6, "y": 1.2, "w": 5.3, "h": 0.35, "fill": "1e293b", "text": "Step 2: AI 분석 결과 확인 & 편집", "fontSize": 11, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 1.35, "w": 6.3, "h": 0.4, "fill": "1e293b", "text": "Step 2: AI 분석 결과 확인 & 편집", "fontSize": 10, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 1.7, "w": 2.8, "h": 0.25, "fill": "0d9488", "text": "🤖 AI가 분석한 UI 요소", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 2.0, "w": 2.8, "h": 0.4, "fill": "f8fafc", "text": "① 검색 필터 (form)\n 날짜, 거래처 등으로 검색합니다", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 1.6, "y": 2.45, "w": 2.8, "h": 0.4, "fill": "FFFFFF", "text": "② 신규 작성 버튼 (button)\n 새 견적서를 작성합니다", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 1.6, "y": 2.9, "w": 2.8, "h": 0.4, "fill": "f8fafc", "text": "③ 견적서 목록 (table)\n 조회된 견적서 목록입니다", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 1.6, "y": 3.35, "w": 2.8, "h": 0.4, "fill": "FFFFFF", "text": "④ 상세 보기 (link)\n 목록 행 클릭 시 상세 이동", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.5, "y": 1.95, "w": 3.1, "h": 0.3, "fill": "0d9488", "text": "🤖 AI가 분석한 UI 요소", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 2.3, "w": 3.1, "h": 0.45, "fill": "f8fafc", "text": "① 검색 필터 (form)\n 날짜, 거래처 등으로 검색합니다", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.5, "y": 2.8, "w": 3.1, "h": 0.45, "fill": "FFFFFF", "text": "② 신규 작성 버튼 (button)\n 새 견적서를 작성합니다", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.5, "y": 3.3, "w": 3.1, "h": 0.45, "fill": "f8fafc", "text": "③ 견적서 목록 (table)\n 조회된 견적서 목록입니다", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.5, "y": 3.8, "w": 3.1, "h": 0.45, "fill": "FFFFFF", "text": "④ 상세 보기 (link)\n 목록 행 클릭 시 상세 이동", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 4.6, "y": 1.7, "w": 2.3, "h": 0.25, "fill": "0d9488", "text": "📝 나레이션 대본", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 4.6, "y": 2.0, "w": 2.3, "h": 1.2, "fill": "f8fafc", "text": "이 화면은 견적서 관리\n화면입니다.\n\n상단의 검색 필터에서\n원하는 조건을 선택한 후\n검색 버튼을 클릭하세요...", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 4.6, "y": 3.25, "w": 1.1, "h": 0.25, "text": "음성: 여성 ▼", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 5.75, "y": 3.25, "w": 1.1, "h": 0.25, "text": "속도: 1.2x ▼", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 3.8, "y": 1.95, "w": 3.0, "h": 0.3, "fill": "0d9488", "text": "📝 나레이션 대본", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 3.8, "y": 2.3, "w": 3.0, "h": 1.3, "fill": "f8fafc", "text": "이 화면은 견적서 관리\n화면입니다.\n\n상단의 검색 필터에서\n원하는 조건을 선택한 후\n검색 버튼을 클릭하세요...", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 3.8, "y": 3.65, "w": 1.4, "h": 0.25, "text": "음성: 여성 ▼", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.3, "y": 3.65, "w": 1.4, "h": 0.25, "text": "속도: 1.2x ▼", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 4.6, "y": 3.65, "w": 2.3, "h": 1.0, "fill": "e2e8f0", "text": "📸 슬라이드 미리보기\n◀ [1/4] ▶\n(빨간 테두리 + ① 번호)", "fontSize": 8, "color": "64748b"}, + {"type": "rect", "x": 3.8, "y": 4.05, "w": 3.0, "h": 1.0, "fill": "e2e8f0", "text": "📸 슬라이드 미리보기\n◀ [1/4] ▶\n(빨간 테두리 + ① 번호)", "fontSize": 8, "color": "64748b"}, - {"type": "rect", "x": 1.6, "y": 4.3, "w": 1.5, "h": 0.35, "fill": "64748b", "text": "◀ 이전 단계", "fontSize": 9, "color": "FFFFFF"}, - {"type": "rect", "x": 5.5, "y": 4.3, "w": 1.4, "h": 0.35, "fill": "0d9488", "text": "다음 단계 ▶", "fontSize": 9, "color": "FFFFFF", "bold": true} + {"type": "rect", "x": 0.5, "y": 4.85, "w": 1.8, "h": 0.35, "fill": "64748b", "text": "◀ 이전 단계", "fontSize": 9, "color": "FFFFFF"}, + {"type": "rect", "x": 5.0, "y": 4.85, "w": 1.8, "h": 0.35, "fill": "0d9488", "text": "다음 단계 ▶", "fontSize": 9, "color": "FFFFFF", "bold": true} ] }, { @@ -196,39 +197,39 @@ "descriptions": [ { "title": "슬라이드 캐러셀", - "content": "생성된 주석 슬라이드를 좌우 화살표로 순서대로 확인할 수 있습니다. 각 슬라이드에는 번호, 하이라이트, 화살표가 표시됩니다.", - "markerX": 3.5, - "markerY": 2.2 + "content": "주석 슬라이드를 좌우 화살표로 순서대로 확인합니다. 번호, 하이라이트, 화살표가 표시됩니다.", + "markerX": 3.2, + "markerY": 2.5 }, { "title": "영상 생성 버튼", - "content": "슬라이드 + 나레이션 + BGM을 합성하여 MP4 영상을 생성합니다. Queue Job으로 비동기 처리되며, 진행률이 실시간으로 표시됩니다.", - "markerX": 2.5, - "markerY": 4.2 + "content": "슬라이드 + 나레이션 + BGM을 합성하여 MP4 영상을 생성합니다. Queue Job으로 비동기 처리됩니다.", + "markerX": 1.5, + "markerY": 4.75 }, { "title": "PPTX 다운로드", - "content": "영상과 함께 PPTX 파일도 생성됩니다. 고객이 직접 편집할 수 있는 PowerPoint 설명서를 다운로드합니다.", - "markerX": 5.0, - "markerY": 4.2 + "content": "영상과 함께 PPTX도 생성됩니다. 고객이 직접 편집 가능한 PowerPoint를 다운로드합니다.", + "markerX": 4.0, + "markerY": 4.75 } ], "wireframeElements": [ - {"type": "rect", "x": 1.6, "y": 1.2, "w": 5.3, "h": 0.35, "fill": "1e293b", "text": "Step 3: 미리보기 & 영상 생성", "fontSize": 11, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 1.35, "w": 6.3, "h": 0.4, "fill": "1e293b", "text": "Step 3: 미리보기 & 영상 생성", "fontSize": 10, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 1.7, "w": 5.3, "h": 2.3, "fill": "f8fafc"}, - {"type": "rect", "x": 1.7, "y": 1.75, "w": 0.3, "h": 2.2, "fill": "e2e8f0", "text": "◀", "fontSize": 12, "color": "64748b"}, - {"type": "rect", "x": 2.1, "y": 1.8, "w": 4.0, "h": 2.1, "fill": "FFFFFF"}, - {"type": "rect", "x": 2.2, "y": 1.9, "w": 3.8, "h": 0.25, "fill": "1e293b", "text": "견적서 관리 - Step 1: 검색 필터", "fontSize": 8, "color": "FFFFFF"}, - {"type": "rect", "x": 2.3, "y": 2.25, "w": 3.6, "h": 1.2, "fill": "e2e8f0", "text": "[스크린샷 이미지]\n\n🔴 ① 검색 필터 영역\n(빨간 테두리 하이라이트)", "fontSize": 8, "color": "64748b"}, - {"type": "rect", "x": 2.3, "y": 3.5, "w": 3.6, "h": 0.25, "fill": "1e293b", "text": "\"상단의 검색 필터에서 원하는 조건을 선택합니다\"", "fontSize": 7, "color": "FFFFFF"}, - {"type": "rect", "x": 6.2, "y": 1.75, "w": 0.3, "h": 2.2, "fill": "e2e8f0", "text": "▶", "fontSize": 12, "color": "64748b"}, + {"type": "rect", "x": 0.5, "y": 1.95, "w": 6.3, "h": 2.5, "fill": "f8fafc"}, + {"type": "rect", "x": 0.6, "y": 2.0, "w": 0.4, "h": 2.4, "fill": "e2e8f0", "text": "◀", "fontSize": 14, "color": "64748b"}, + {"type": "rect", "x": 1.1, "y": 2.05, "w": 4.8, "h": 2.3, "fill": "FFFFFF"}, + {"type": "rect", "x": 1.2, "y": 2.15, "w": 4.6, "h": 0.3, "fill": "1e293b", "text": "견적서 관리 - Step 1: 검색 필터", "fontSize": 8, "color": "FFFFFF"}, + {"type": "rect", "x": 1.3, "y": 2.55, "w": 4.4, "h": 1.3, "fill": "e2e8f0", "text": "[스크린샷 이미지]\n\n🔴 ① 검색 필터 영역\n(빨간 테두리 하이라이트)", "fontSize": 8, "color": "64748b"}, + {"type": "rect", "x": 1.3, "y": 3.95, "w": 4.4, "h": 0.3, "fill": "1e293b", "text": "\"상단의 검색 필터에서 원하는 조건을 선택합니다\"", "fontSize": 7, "color": "FFFFFF"}, + {"type": "rect", "x": 6.0, "y": 2.0, "w": 0.4, "h": 2.4, "fill": "e2e8f0", "text": "▶", "fontSize": 14, "color": "64748b"}, - {"type": "rect", "x": 3.6, "y": 3.85, "w": 0.6, "h": 0.2, "text": "1 / 4", "fontSize": 8, "color": "64748b", "bold": true}, + {"type": "rect", "x": 3.0, "y": 4.5, "w": 0.8, "h": 0.2, "text": "1 / 4", "fontSize": 8, "color": "64748b", "bold": true}, - {"type": "rect", "x": 1.6, "y": 4.2, "w": 2.0, "h": 0.4, "fill": "0d9488", "text": "🎬 영상 생성 (MP4)", "fontSize": 9, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 3.8, "y": 4.2, "w": 2.0, "h": 0.4, "fill": "1e293b", "text": "📄 PPTX 다운로드", "fontSize": 9, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 6.0, "y": 4.2, "w": 0.9, "h": 0.4, "fill": "64748b", "text": "◀ 이전", "fontSize": 8, "color": "FFFFFF"} + {"type": "rect", "x": 0.5, "y": 4.85, "w": 2.2, "h": 0.4, "fill": "0d9488", "text": "🎬 영상 생성 (MP4)", "fontSize": 9, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 2.9, "y": 4.85, "w": 2.2, "h": 0.4, "fill": "1e293b", "text": "📄 PPTX 다운로드", "fontSize": 9, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 5.3, "y": 4.85, "w": 1.5, "h": 0.4, "fill": "64748b", "text": "◀ 이전 단계", "fontSize": 8, "color": "FFFFFF"} ] }, { @@ -239,62 +240,71 @@ "descriptions": [ { "title": "영상 목록 테이블", - "content": "생성된 튜토리얼 영상 목록입니다. 제목, 상태, 생성일, 비용 등을 확인할 수 있습니다.", - "markerX": 3.5, + "content": "생성된 튜토리얼 영상 목록입니다. 제목, 상태, 생성일, 비용을 확인합니다.", + "markerX": 3.0, "markerY": 2.0 }, { "title": "상태 표시", "content": "영상 생성 진행 상태를 실시간으로 표시합니다. (대기중/분석중/생성중/완료/실패)", - "markerX": 5.5, - "markerY": 2.5 + "markerX": 4.5, + "markerY": 2.8 }, { "title": "재생/다운로드", - "content": "완료된 영상을 바로 재생하거나 MP4/PPTX 파일을 다운로드할 수 있습니다.", - "markerX": 6.2, - "markerY": 3.0 + "content": "완료된 영상을 바로 재생하거나 MP4/PPTX 파일을 다운로드합니다.", + "markerX": 6.0, + "markerY": 2.8 }, { "title": "재생성/삭제", - "content": "화면이 변경된 경우 재생성하거나, 불필요한 영상을 삭제할 수 있습니다.", - "markerX": 6.2, - "markerY": 3.5 + "content": "화면 변경 시 재생성하거나, 불필요한 영상을 삭제합니다.", + "markerX": 3.0, + "markerY": 4.5 } ], "wireframeElements": [ - {"type": "rect", "x": 1.6, "y": 1.2, "w": 5.3, "h": 0.35, "fill": "1e293b", "text": "튜토리얼 영상 생성 이력", "fontSize": 11, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 1.35, "w": 6.3, "h": 0.4, "fill": "1e293b", "text": "튜토리얼 영상 생성 이력", "fontSize": 10, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 1.7, "w": 5.3, "h": 0.3, "fill": "0d9488"}, - {"type": "rect", "x": 1.65, "y": 1.72, "w": 0.3, "h": 0.25, "text": "☐", "fontSize": 8, "color": "FFFFFF"}, - {"type": "rect", "x": 2.0, "y": 1.72, "w": 1.8, "h": 0.25, "text": "제목", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 3.9, "y": 1.72, "w": 0.8, "h": 0.25, "text": "상태", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 4.8, "y": 1.72, "w": 0.8, "h": 0.25, "text": "생성일", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 5.7, "y": 1.72, "w": 0.5, "h": 0.25, "text": "비용", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 6.3, "y": 1.72, "w": 0.6, "h": 0.25, "text": "액션", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 2.0, "w": 6.3, "h": 0.35, "fill": "0d9488"}, + {"type": "rect", "x": 0.55, "y": 2.02, "w": 0.35, "h": 0.3, "text": "☐", "fontSize": 8, "color": "FFFFFF"}, + {"type": "rect", "x": 0.95, "y": 2.02, "w": 2.0, "h": 0.3, "text": "제목", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 3.05, "y": 2.02, "w": 0.9, "h": 0.3, "text": "상태", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 4.05, "y": 2.02, "w": 0.9, "h": 0.3, "text": "생성일", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 5.05, "y": 2.02, "w": 0.7, "h": 0.3, "text": "비용", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 5.85, "y": 2.02, "w": 0.9, "h": 0.3, "text": "액션", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 2.05, "w": 5.3, "h": 0.3, "fill": "f8fafc"}, - {"type": "rect", "x": 2.0, "y": 2.07, "w": 1.8, "h": 0.25, "text": "견적서 관리 사용법", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 3.9, "y": 2.07, "w": 0.8, "h": 0.25, "fill": "10b981", "text": "완료", "fontSize": 7, "color": "FFFFFF"}, - {"type": "rect", "x": 4.8, "y": 2.07, "w": 0.8, "h": 0.25, "text": "02.15", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 5.7, "y": 2.07, "w": 0.5, "h": 0.25, "text": "$0.07", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 6.3, "y": 2.07, "w": 0.6, "h": 0.25, "text": "▶ 📥", "fontSize": 7, "color": "0d9488"}, + {"type": "rect", "x": 0.5, "y": 2.4, "w": 6.3, "h": 0.4, "fill": "f8fafc"}, + {"type": "rect", "x": 0.95, "y": 2.45, "w": 2.0, "h": 0.3, "text": "견적서 관리 사용법", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 3.05, "y": 2.45, "w": 0.9, "h": 0.3, "fill": "10b981", "text": "완료", "fontSize": 7, "color": "FFFFFF"}, + {"type": "rect", "x": 4.05, "y": 2.45, "w": 0.9, "h": 0.3, "text": "02.15", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.05, "y": 2.45, "w": 0.7, "h": 0.3, "text": "$0.07", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.85, "y": 2.45, "w": 0.9, "h": 0.3, "text": "▶ 📥", "fontSize": 7, "color": "0d9488"}, - {"type": "rect", "x": 1.6, "y": 2.4, "w": 5.3, "h": 0.3, "fill": "FFFFFF"}, - {"type": "rect", "x": 2.0, "y": 2.42, "w": 1.8, "h": 0.25, "text": "주문 관리 사용법", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 3.9, "y": 2.42, "w": 0.8, "h": 0.25, "fill": "f59e0b", "text": "생성중", "fontSize": 7, "color": "FFFFFF"}, - {"type": "rect", "x": 4.8, "y": 2.42, "w": 0.8, "h": 0.25, "text": "02.15", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 5.7, "y": 2.42, "w": 0.5, "h": 0.25, "text": "-", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 6.3, "y": 2.42, "w": 0.6, "h": 0.25, "text": "⏳ 75%", "fontSize": 7, "color": "f59e0b"}, + {"type": "rect", "x": 0.5, "y": 2.85, "w": 6.3, "h": 0.4, "fill": "FFFFFF"}, + {"type": "rect", "x": 0.95, "y": 2.9, "w": 2.0, "h": 0.3, "text": "주문 관리 사용법", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 3.05, "y": 2.9, "w": 0.9, "h": 0.3, "fill": "f59e0b", "text": "생성중", "fontSize": 7, "color": "FFFFFF"}, + {"type": "rect", "x": 4.05, "y": 2.9, "w": 0.9, "h": 0.3, "text": "02.15", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.05, "y": 2.9, "w": 0.7, "h": 0.3, "text": "-", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.85, "y": 2.9, "w": 0.9, "h": 0.3, "text": "⏳ 75%", "fontSize": 7, "color": "f59e0b"}, - {"type": "rect", "x": 1.6, "y": 2.75, "w": 5.3, "h": 0.3, "fill": "f8fafc"}, - {"type": "rect", "x": 2.0, "y": 2.77, "w": 1.8, "h": 0.25, "text": "거래처 관리 사용법", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 3.9, "y": 2.77, "w": 0.8, "h": 0.25, "fill": "10b981", "text": "완료", "fontSize": 7, "color": "FFFFFF"}, - {"type": "rect", "x": 4.8, "y": 2.77, "w": 0.8, "h": 0.25, "text": "02.14", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 5.7, "y": 2.77, "w": 0.5, "h": 0.25, "text": "$0.07", "fontSize": 7, "color": "64748b"}, - {"type": "rect", "x": 6.3, "y": 2.77, "w": 0.6, "h": 0.25, "text": "▶ 📥", "fontSize": 7, "color": "0d9488"}, + {"type": "rect", "x": 0.5, "y": 3.3, "w": 6.3, "h": 0.4, "fill": "f8fafc"}, + {"type": "rect", "x": 0.95, "y": 3.35, "w": 2.0, "h": 0.3, "text": "거래처 관리 사용법", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 3.05, "y": 3.35, "w": 0.9, "h": 0.3, "fill": "10b981", "text": "완료", "fontSize": 7, "color": "FFFFFF"}, + {"type": "rect", "x": 4.05, "y": 3.35, "w": 0.9, "h": 0.3, "text": "02.14", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.05, "y": 3.35, "w": 0.7, "h": 0.3, "text": "$0.07", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.85, "y": 3.35, "w": 0.9, "h": 0.3, "text": "▶ 📥", "fontSize": 7, "color": "0d9488"}, - {"type": "rect", "x": 1.6, "y": 3.3, "w": 5.3, "h": 0.5, "fill": "f8fafc", "text": "선택된 항목: 0개 | 전체: 3건", "fontSize": 8, "color": "64748b"} + {"type": "rect", "x": 0.5, "y": 3.75, "w": 6.3, "h": 0.4, "fill": "FFFFFF"}, + {"type": "rect", "x": 0.95, "y": 3.8, "w": 2.0, "h": 0.3, "text": "생산 관리 사용법", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 3.05, "y": 3.8, "w": 0.9, "h": 0.3, "fill": "dc2626", "text": "실패", "fontSize": 7, "color": "FFFFFF"}, + {"type": "rect", "x": 4.05, "y": 3.8, "w": 0.9, "h": 0.3, "text": "02.14", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.05, "y": 3.8, "w": 0.7, "h": 0.3, "text": "$0.01", "fontSize": 7, "color": "64748b"}, + {"type": "rect", "x": 5.85, "y": 3.8, "w": 0.9, "h": 0.3, "text": "🔄 재시도", "fontSize": 7, "color": "dc2626"}, + + {"type": "rect", "x": 0.5, "y": 4.4, "w": 3.0, "h": 0.35, "text": "선택된 항목: 0개 | 전체: 4건", "fontSize": 8, "color": "64748b"}, + {"type": "rect", "x": 4.5, "y": 4.4, "w": 1.1, "h": 0.35, "fill": "dc2626", "text": "🗑 삭제", "fontSize": 8, "color": "FFFFFF"}, + {"type": "rect", "x": 5.7, "y": 4.4, "w": 1.1, "h": 0.35, "fill": "0d9488", "text": "🔄 재생성", "fontSize": 8, "color": "FFFFFF"} ] }, { @@ -305,54 +315,54 @@ "descriptions": [ { "title": "MNG (Laravel) 서비스", - "content": "TutorialVideoController → ScreenAnalysisService(Gemini) → SlideImageService(PHP GD) → TutorialAssemblyService(FFmpeg) 순서로 처리됩니다.", + "content": "Controller → ScreenAnalysis → SlideImage → TutorialAssembly 순서로 처리됩니다.", "markerX": 3.0, - "markerY": 1.8 + "markerY": 2.2 }, { "title": "Queue Job 비동기 처리", - "content": "영상 생성은 TutorialVideoJob으로 Queue에 등록되어 비동기로 처리됩니다. 진행률을 실시간 조회 가능합니다.", - "markerX": 2.0, - "markerY": 2.8 + "content": "TutorialVideoJob으로 Queue에 등록, 비동기 처리됩니다. 진행률 실시간 조회 가능.", + "markerX": 1.5, + "markerY": 3.0 }, { "title": "Google Cloud APIs", - "content": "Gemini 3.0 Flash(스크린샷 분석), Cloud TTS(나레이션), Lyria(BGM), GCS(영상 저장)를 활용합니다.", - "markerX": 5.5, - "markerY": 3.2 + "content": "Gemini Flash(분석), Cloud TTS(나레이션), Lyria(BGM), GCS(저장)를 활용합니다.", + "markerX": 5.2, + "markerY": 3.6 }, { "title": "기존 코드 재사용", - "content": "TtsService, BgmService, GCS 서비스 등 Veo3 Shorts에서 이미 구현된 서비스를 재사용합니다.", - "markerX": 5.5, + "content": "TtsService, BgmService, GCS 등 Veo3에서 구현된 서비스를 재사용합니다.", + "markerX": 2.5, "markerY": 4.0 } ], "wireframeElements": [ - {"type": "rect", "x": 1.6, "y": 1.2, "w": 5.3, "h": 0.35, "fill": "1e293b", "text": "시스템 아키텍처", "fontSize": 11, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 1.35, "w": 6.3, "h": 0.4, "fill": "1e293b", "text": "시스템 아키텍처", "fontSize": 10, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.6, "y": 1.7, "w": 4.3, "h": 0.25, "fill": "0d9488", "text": "MNG (Laravel) - 서비스 레이어", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 0.5, "y": 1.95, "w": 4.8, "h": 0.3, "fill": "0d9488", "text": "MNG (Laravel) - 서비스 레이어", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 1.7, "y": 2.05, "w": 1.3, "h": 0.5, "fill": "f1f5f9", "text": "Tutorial\nVideoController", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 3.1, "y": 2.15, "w": 0.2, "h": 0.3, "text": "→", "fontSize": 10, "color": "64748b"}, - {"type": "rect", "x": 3.4, "y": 2.05, "w": 1.2, "h": 0.5, "fill": "f1f5f9", "text": "Screen\nAnalysisService", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 4.7, "y": 2.15, "w": 0.2, "h": 0.3, "text": "→", "fontSize": 10, "color": "64748b"}, - {"type": "rect", "x": 5.0, "y": 2.05, "w": 1.2, "h": 0.5, "fill": "f1f5f9", "text": "SlideImage\nService (GD)", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.6, "y": 2.4, "w": 1.5, "h": 0.55, "fill": "f1f5f9", "text": "Tutorial\nVideoController", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 2.2, "y": 2.5, "w": 0.3, "h": 0.35, "text": "→", "fontSize": 12, "color": "64748b"}, + {"type": "rect", "x": 2.6, "y": 2.4, "w": 1.5, "h": 0.55, "fill": "f1f5f9", "text": "Screen\nAnalysisService", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 4.2, "y": 2.5, "w": 0.3, "h": 0.35, "text": "→", "fontSize": 12, "color": "64748b"}, + {"type": "rect", "x": 4.6, "y": 2.4, "w": 1.5, "h": 0.55, "fill": "f1f5f9", "text": "SlideImage\nService (GD)", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 1.7, "y": 2.7, "w": 1.3, "h": 0.5, "fill": "f59e0b", "text": "Tutorial\nVideoJob", "fontSize": 7, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 3.1, "y": 2.8, "w": 0.2, "h": 0.3, "text": "→", "fontSize": 10, "color": "64748b"}, - {"type": "rect", "x": 3.4, "y": 2.7, "w": 1.2, "h": 0.5, "fill": "f1f5f9", "text": "TTS Service\n(기존 재사용)", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 4.7, "y": 2.8, "w": 0.2, "h": 0.3, "text": "→", "fontSize": 10, "color": "64748b"}, - {"type": "rect", "x": 5.0, "y": 2.7, "w": 1.2, "h": 0.5, "fill": "f1f5f9", "text": "Tutorial\nAssembly (FFmpeg)", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.6, "y": 3.15, "w": 1.5, "h": 0.55, "fill": "f59e0b", "text": "Tutorial\nVideoJob", "fontSize": 7, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 2.2, "y": 3.25, "w": 0.3, "h": 0.35, "text": "→", "fontSize": 12, "color": "64748b"}, + {"type": "rect", "x": 2.6, "y": 3.15, "w": 1.5, "h": 0.55, "fill": "f1f5f9", "text": "TTS Service\n(기존 재사용)", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 4.2, "y": 3.25, "w": 0.3, "h": 0.35, "text": "→", "fontSize": 12, "color": "64748b"}, + {"type": "rect", "x": 4.6, "y": 3.15, "w": 1.5, "h": 0.55, "fill": "f1f5f9", "text": "Tutorial\nAssembly (FFmpeg)", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 1.7, "y": 3.35, "w": 1.3, "h": 0.5, "fill": "f1f5f9", "text": "Pptx\nGenerator", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 3.4, "y": 3.35, "w": 1.2, "h": 0.5, "fill": "f1f5f9", "text": "BGM Service\n(기존 재사용)", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 0.6, "y": 3.9, "w": 1.5, "h": 0.55, "fill": "f1f5f9", "text": "Pptx\nGenerator", "fontSize": 7, "color": "1e293b"}, + {"type": "rect", "x": 2.6, "y": 3.9, "w": 1.5, "h": 0.55, "fill": "f1f5f9", "text": "BGM Service\n(기존 재사용)", "fontSize": 7, "color": "1e293b"}, - {"type": "rect", "x": 5.0, "y": 3.35, "w": 1.9, "h": 0.25, "fill": "0d9488", "text": "Google Cloud APIs", "fontSize": 8, "color": "FFFFFF", "bold": true}, - {"type": "rect", "x": 5.0, "y": 3.65, "w": 0.9, "h": 0.35, "fill": "f1f5f9", "text": "Gemini\n3.0 Flash", "fontSize": 6, "color": "1e293b"}, - {"type": "rect", "x": 5.95, "y": 3.65, "w": 0.9, "h": 0.35, "fill": "f1f5f9", "text": "Cloud\nTTS", "fontSize": 6, "color": "1e293b"}, - {"type": "rect", "x": 5.0, "y": 4.05, "w": 0.9, "h": 0.35, "fill": "f1f5f9", "text": "Lyria\nBGM", "fontSize": 6, "color": "1e293b"}, - {"type": "rect", "x": 5.95, "y": 4.05, "w": 0.9, "h": 0.35, "fill": "f1f5f9", "text": "GCS\n저장소", "fontSize": 6, "color": "1e293b"} + {"type": "rect", "x": 4.6, "y": 3.9, "w": 2.1, "h": 0.3, "fill": "0d9488", "text": "Google Cloud APIs", "fontSize": 8, "color": "FFFFFF", "bold": true}, + {"type": "rect", "x": 4.6, "y": 4.25, "w": 1.0, "h": 0.4, "fill": "f1f5f9", "text": "Gemini\n3.0 Flash", "fontSize": 6, "color": "1e293b"}, + {"type": "rect", "x": 5.65, "y": 4.25, "w": 1.0, "h": 0.4, "fill": "f1f5f9", "text": "Cloud\nTTS", "fontSize": 6, "color": "1e293b"}, + {"type": "rect", "x": 4.6, "y": 4.7, "w": 1.0, "h": 0.4, "fill": "f1f5f9", "text": "Lyria\nBGM", "fontSize": 6, "color": "1e293b"}, + {"type": "rect", "x": 5.65, "y": 4.7, "w": 1.0, "h": 0.4, "fill": "f1f5f9", "text": "GCS\n저장소", "fontSize": 6, "color": "1e293b"} ] } ]