Commit Graph

301 Commits

Author SHA1 Message Date
김보곤
f9665dd558 fix: [dashboard] 주간 날씨 목요일 데이터 누락 수정
- 기상청 중기예보 18시 발표는 D+5부터만 제공, 06시는 D+4부터 제공
- 여러 발표시각 데이터를 병합하여 빈 필드 보충 (최신 우선)
- 단기예보 TMN/TMX 없는 날은 중기예보 icon/pop 우선 사용
2026-02-22 19:14:24 +09:00
김보곤
14c9b787e9 fix: [dashboard] 주간 날씨 중기예보 데이터 누락 수정
- 18시 발표 중기예보 미발행 시 06시/전일 발표로 fallback
- 불완전한 날씨 데이터 캐시 TTL 10분으로 단축 (기존 3시간)
2026-02-22 19:14:24 +09:00
a4531e8d90 fix:품목관리 FG 수식 산출 401 오류 수정
- FormulaApiService의 Bearer token 조회를 session('api_explorer_token')에서
  ApiTokenService 기반으로 변경
- resolveApiToken() 메서드 추가: 세션 토큰 확인 → 만료시 HMAC 토큰 교환
- DocumentTemplateApiController와 동일한 인증 패턴 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 04:19:48 +09:00
김보곤
f4879de9ba feat: [video] 3-pass 크롭 검증 추가
- 2-pass 보정 후 각 step의 좌표 영역을 원본에서 크롭하여 Gemini 검증
- 크롭에 패딩 확장 (30% 또는 최소 80px) + 최소 크롭 200x150px 보장
- 빨간 사각형으로 타겟 영역 표시하여 false positive 방지
- 재추정 실패 시 그리드 오버레이 이미지로 3차 재시도
- _verification 메타데이터에 crop_verified, crop_corrected 추가
- PASS율: 37.5% → 100% (FAIL 5 → 0)
2026-02-21 18:30:57 +09:00
김보곤
7991f3e6d4 feat: [video] 좌표 검증 및 영상 메타데이터를 analysis_data에 저장
- 각 step별 검증 결과 저장 (accurate/corrected + 원본 좌표)
- 스크린 단위 검증 통계 저장 (정확/보정 수, 검증 시각)
- 영상 완료 시 _output 메타데이터 저장 (경로, GCS, 비용, 슬라이드수, 총 재생시간)
2026-02-21 16:37:08 +09:00
김보곤
cf6525c8f3 feat: [video] 좌표 검증 루프(Coordinate Verification Loop) 추가
- Gemini 2-pass 자기 검증 메커니즘 구현
- runCoordinateVerification: 검증 오케스트레이터
- createVerificationImage: 색상별 스포트라이트 렌더링
- verifyCoordinates: Gemini에게 좌표 정확도 확인 요청
- applyVerifiedCoordinates: 보정 좌표 적용
2026-02-21 16:02:10 +09:00
김보곤
1c9879b989 refactor: [video] 튜토리얼 영상 좌표 정교화 개선
- Phase 1: 그리드 오버레이를 비율 보존 레터박스 배치로 변경 (annotateSlideWithSpotlight과 동일)
- Phase 2: 그리드 밀도 10x10 → 20x12 향상, 주요 그리드선/좌표 라벨 추가
- Phase 3: 좌표 정규화 경계 클램핑 개선, 편향 패딩 구현, 디버깅 로그 추가
2026-02-21 15:30:37 +09:00
김보곤
c5f4c53a50 feat: [dashboard] 날씨 위젯에 강수확률 표시 추가
- 단기예보 POP (하루 최대값) + 중기예보 rnSt 병합
- 우산 아이콘 + 퍼센트 표시 (50% 이상 진한 파랑 강조)
- 강수확률 0%일 때는 표시하지 않음
2026-02-21 13:40:28 +09:00
김보곤
9a9922739d fix: [dashboard] 날씨 위젯 단기+중기 데이터 병합 로직 개선
- 단기예보 기온 없는 날 중기예보 기온으로 보충
- 데이터 없는 날 '준비 중' 표시
2026-02-21 13:38:02 +09:00
김보곤
48e8289c3d fix: [dashboard] 날씨 위젯 API 호출 수정 및 UI/UX 개선
- serviceKey 이중 인코딩 방지 (withOptions 사용)
- 오늘부터 7일간 표시 (데이터 없는 날은 '준비 중')
- 기온 바 그래프 추가 (파랑→빨강 그라데이션)
- 날씨 텍스트 표시, 강수일 강조
2026-02-21 13:30:42 +09:00
김보곤
e6f1d6ba46 feat: [dashboard] 주간 날씨 위젯 추가
- 기상청 공공데이터포털 API 연동 (단기+중기 7일 예보)
- WeatherService: 3시간 캐시, SKY/PTY 아이콘 매핑
- HTMX 비동기 로딩 + 스켈레톤 UI
- 오늘 카드 파란색 강조, 요일/날짜/아이콘/기온 표시
2026-02-21 13:10:54 +09:00
김보곤
9351e215e4 feat:통합정산 정산상세 승인취소 기능 추가 2026-02-20 19:26:42 +09:00
김보곤
fb47badb18 feat:정산관리 기간설정 체크박스 필터 추가 (시작~끝 년월 범위 조회)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 14:11:21 +09:00
김보곤
a945c63a83 Revert "feat:정산관리 기간설정 체크박스 필터 추가 (시작~끝 년월 범위 조회)"
This reverts commit 11c685bda7.
2026-02-20 14:08:01 +09:00
김보곤
11c685bda7 feat:정산관리 기간설정 체크박스 필터 추가 (시작~끝 년월 범위 조회)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 13:57:16 +09:00
f271f8bdc3 feat:품목관리 3-Panel 페이지 신규 구현 + FormulaEvaluatorService 연동
- 품목관리 3-Panel 레이아웃 (좌:목록, 중:BOM/수식산출, 우:상세)
- FormulaApiService로 API 견적수식 엔진 연동
- FG 품목 선택 시 기본값(W:1000, H:1000, QTY:1) 자동 산출
- 수식 산출 결과 트리 렌더링 (그룹별/소계/합계)
- 중앙 패널 클릭 시 우측 상세만 변경 (skipCenterUpdate)
- API 인증 버튼 전역 헤더로 이동 (모든 페이지에서 사용 가능)
- FormulaApiService에 Bearer 토큰 지원 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 10:50:24 +09:00
김보곤
14b4f5c98e fix:부서 권한 관리 전체 거부 버튼 제거 + 초기화 deny-all로 변경 + 로딩 오버레이 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 09:47:00 +09:00
김보곤
c06a0d39aa fix:denyAllPermissions 권한 삭제 로직 개선 (직접 DB 쿼리로 변경)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 09:30:33 +09:00
김보곤
7c93fd414e fix:수당 정산 DB 값 정상화 - 비즈니스 룰 반영
- 상수: DEFAULT_MANAGER_RATE 제거, 유치수당률 개인5%/단체3% 분리
- createCommission: 파트너 resolve fallback 추가, 매니저수당=구독료1개월
- approve/bulkApprove: 금액 0원 기존 레코드 승인 시 자동 재계산
- recalculateCommission: 신규 메서드 추가 (partner_id/금액 정상화)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 15:32:12 +09:00
김보곤
2c1b59249a feat:수당 정산 테이블에 개인/단체 구분 컬럼 추가
- 구분 컬럼: partner_type 기반 개인(sky)/단체(purple) 배지
- 단체: 파트너 30%, 매니저 0%, 유치 3%
- 개인: 파트너 20%, 매니저 5%, 유치 3%
- eager loading에 registeredBy.salesPartner 추가 (타입 판별용)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 15:04:03 +09:00
김보곤
bf51e14e54 fix:수당 정산 금액을 management 데이터에서 자동 계산
- commission 금액이 0일 때 management의 total_registration_fee/contractProducts에서 계산
- 기준액 = 총개발비 / 2, 입금액 = 기준액 (계약금/잔금 각 50%)
- 파트너수당 = 기준액 × 20%, 매니저수당 = 기준액 × 5%, 유치수당 = 기준액 × 3%
- eager loading에 management.contractProducts 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 15:01:38 +09:00
김보곤
706e1e3de4 fix:유치파트너를 영업파트너의 parent(상위자)로 표시
- 유치파트너 = 영업파트너 user의 parent_id (User→parent 관계)
- partner→user→parent, salesPartner→user→parent, registeredBy→parent 순 fallback
- eager loading 정리 (불필요한 referrer 체인 제거, parent 관계 추가)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:54:32 +09:00
김보곤
053e095da0 fix:영업파트너/유치파트너 tenantProspect.registeredBy fallback 추가
- 영업파트너: tenantProspect→registeredBy(가망고객 등록자) 경로 추가
- 유치파트너: registeredBy→salesPartner→referrer 경로 추가
- eager loading에 management.tenantProspect.registeredBy.salesPartner.referrer.user 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:50:30 +09:00
김보곤
0ae7498a74 fix:수당 정산 테이블 전체 fallback 로직 개선
- 입금액: commission이 0이면 management의 deposit/balance 금액으로 fallback
- 유치파트너: commission→referrerPartner → partner→referrer → management→salesPartner→referrer 순 fallback
- 매니저: commission→manager → management→manager 순 fallback
- 파트너/매니저/유치 수당 0원일 때 '-' 표시
- 수당률 0%일 때 숨김 처리
- eager loading에 partner.referrer.user, management.salesPartner.referrer.user 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:47:36 +09:00
김보곤
3fa56292b0 fix:영업파트너 이름 fallback 로직 추가
- partner→user 없을 시 management→salesPartner→user → management→manager 순으로 fallback
- eager loading에 management.salesPartner.user, management.manager 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:36:37 +09:00
김보곤
d2b099a166 fix:수당 정산 탭 테넌트 표시를 실제 고객사 기반으로 수정
- eager loading에 management.tenant, management.tenantProspect 추가
- 검색 필터를 management 기반 고객사명 검색으로 변경
- 테넌트 컬럼을 management→tenant/tenantProspect 기반으로 표시
- 본사 진행상태(hq_status) 배지 추가
- 입금액 0원일 때 '-' 표시로 개선

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:24:44 +09:00
9eeb62f819 feat: 트리거 감사로그 operation 단위 일괄 롤백 기능
- operation 상세 페이지 및 일괄 롤백 실행 기능 추가
- TriggerAuditLog에 scopeForOperation 스코프 추가
- 트리거 INSERT/UPDATE/DELETE에 operation_id 컬럼 포함
- 감사로그 목록에 작업 단위 링크 컬럼 추가
- 라우트: operation/{id}, batch-rollback 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 11:22:09 +09:00
김보곤
7bc412d9a1 feat:통합 정산관리 페이지 구현 (5개 탭 기반)
- SettlementController 신규 생성 (통합 정산관리 메인 + 탭별 HTMX)
- 5개 탭: 수당정산, 파트너별현황(NEW), 컨설팅비용, 고객사정산, 구독관리
- 수당정산 탭: 기존 영업수수료정산 이관 + 유치수당 컬럼/수당유형 필터 추가
- 파트너별 현황 탭: SalesPartner 수당 집계 + 필터/페이지네이션
- 컨설팅/고객사/구독 탭: React → Blade+Alpine.js 전환 (기존 API 재사용)
- 통합 통계카드 (미지급수당/승인대기/이번달예정/누적지급)
- 기존 4개 URL → 통합 페이지 리다이렉트
- SalesPartner 모델에 commissions 관계 추가
- SalesCommissionService에 commission_type 필터 + referrerPartner eager load 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 09:53:13 +09:00
김보곤
81bcd617fe feat:단체(Corporate) 파트너 UI 접근 제한 구현
- User 모델에 isGroupPartner() 헬퍼 추가
- 대시보드에서 단체 파트너는 판매자 카드만 표시 (관리자/협업지원금 카드 제외)
- 유치 파트너 현황 탭 단체 파트너에게 숨김
- 파트너 등록 create/store 접근 차단 (403)
- 파트너 목록에서 등록 버튼 숨김
- SidebarMenuService에 hide_for_group_partner 옵션 기반 메뉴 필터링 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 08:00:58 +09:00
김보곤
5a1fcb4140 feat:영업파트너 수정 모달에 개인/단체 유형 변경 기능 추가
- 승인 전(pending): 라디오 버튼으로 개인/단체 변경 가능
- 승인 후(approved): 읽기 전용 뱃지로 표시
- 유형 변경 시 수당률 자동 설정 (단체 30%, 개인 초기화)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 07:26:13 +09:00
김보곤
dab54b992c feat:영업파트너 리스트에 개인/단체 유형 열 추가
salesPartner 관계를 eager load하여 partner_type 표시
개인: 하늘색 뱃지, 단체: 주황색 뱃지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 07:23:16 +09:00
김보곤
b00fd45650 fix:트렌딩 키워드 가져오기 실패 개선 (빈 결과 캐시 방지 + 리프레이밍 폴백)
- 빈 결과를 30분간 캐시하는 문제 수정 (성공 결과만 캐시)
- 건강 키워드가 없을 때 리프레이밍 폴백 추가 (트렌드를 건강 관점으로 재해석)
- 최종 폴백: 원본 인기 키워드 표시
- 프론트엔드 에러/안내 메시지 분리 (오류 vs 건강 키워드 없음)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 06:16:13 +09:00
김보곤
0afe2d7896 fix:스포트라이트 UX 개선 (영역 크기/패딩/시각)
- ScreenAnalysisService: Gemini 프롬프트에 UI 타입별 최소 크기 가이드라인 추가
- ScreenAnalysisService: normalizeCoordinates에 타입별 최소크기 보정 + 1.5% 패딩
- SlideAnnotationService: STEP 배지 1/2 축소 (300x76→150x38)
- SlideAnnotationService: 이중 테두리 (안쪽 흰색 + 바깥 빨간색) 적용
- SlideAnnotationService: 번호 마커 위치를 테두리 바깥으로 이동

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 18:19:04 +09:00
김보곤
cf7cf9fd7a fix:ASS 자막 비활성화 (슬라이드 캡션바와 중복 제거)
- TutorialVideoJob: 자막 생성 제거, subtitlePath에 null 전달
- TutorialAssemblyService: subtitlePath 파라미터 nullable 변경
- VideoAssemblyService: subtitlePath nullable + null일 때 ass 필터 생략

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 18:10:38 +09:00
김보곤
edb832bc6a fix:슬라이드 폰트 크기 2배 확대 + 좌표 정확도 개선
- SlideAnnotationService: 아웃트로 메인텍스트 36→72, 서브텍스트 24→48
- ScreenAnalysisService: 그리드 오버레이 레터박스 제거 (전체 채움)
  → Gemini 좌표가 이미지 비율과 직접 매핑되어 스포트라이트 위치 정확도 향상

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 18:04:12 +09:00
김보곤
ff80d50c9b fix:자막 하단 정렬 + 인트로 자막 중복 제거
- FFmpeg subtitles 필터 → ass 필터 변경 (ASS 스타일 Alignment 완전 보존)
- 인트로/아웃트로 씬 자막 제거를 이중 보장:
  1. Job에서 자막용 scenes 복사본의 인트로/아웃트로 narration을 빈 문자열로 설정
  2. generateAssSubtitle에서 scene_number int 캐스팅 + <= 1 비교로 안전장치 강화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 17:39:39 +09:00
김보곤
c05ebab380 fix:튜토리얼 자막을 하단 한줄로 변경 (중앙 3줄 → 하단 1줄)
- generateAssSubtitle()에 layout 파라미터 추가 (portrait/landscape)
- landscape 모드: PlayRes 1920x1080, 폰트 48pt, Alignment=2(하단 중앙)
- WrapStyle=2 (줄바꿈 없음) + maxCharsPerLine=999 → 한줄 유지
- BorderStyle=3 (반투명 배경 박스) → 가독성 확보
- MarginL/R=20 (좌우 여백 최소) → 최대한 길게
- TutorialVideoJob에서 'landscape' 레이아웃으로 호출

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 17:22:02 +09:00
김보곤
098bb3d4a8 feat:스크린샷 1920x1080 정규화 + 그리드 좌표 라벨 개선
- 모든 스크린샷을 1920x1080으로 정규화 후 Gemini에 전송
  (비율 유지, 여백은 검정 → 일관된 해상도로 좌표 정확도 향상)
- 그리드 라벨에 실제 0-1000 좌표 병기 (0=0, 1=100, ..., 9=900)
- 교차점에 빨간 십자 마커 추가 (더 정밀한 참조점)
- 프롬프트에 정규화 해상도 + 그리드 간격 정보 명시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 17:07:52 +09:00
김보곤
c6bd8c8ae1 fix:인트로/아웃트로 자막 중복 표시 제거
인트로(scene 1)와 아웃트로(scene 999) 슬라이드는 이미지에
텍스트가 포함되어 있으므로 ASS 자막 생성에서 제외

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:59:05 +09:00
김보곤
b47c27614b feat:스크린샷 분석 좌표 정확도 개선 (그리드 오버레이 + 0-1000 좌표계)
- 10x10 그리드 오버레이를 스크린샷에 그려서 Gemini에 전송
  (가로 0~9, 세로 A~J 라벨로 AI에게 시각적 참조점 제공)
- 좌표계를 0~1 소수 → 0~1000 정수로 변경 (AI 추정 정확도 향상)
- ERP 화면 기준 좌표 예시 추가 (사이드바, 헤더, 테이블 등)
- normalizeCoordinates()로 1000좌표 → 0~1 비율 자동 변환
- 범위 클램핑으로 비정상 좌표 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:53:53 +09:00
김보곤
cf56285805 fix:GCS 서명 URL 경로 중복 버그 수정 (gs:// prefix 제거)
upload()이 gs://bucket/path 형식으로 저장하지만 getSignedUrl()과
delete()는 path만 기대하여 URL에 경로가 중복됨 → 404 발생
stripGsPrefix()로 자동 변환하여 해결

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:50:20 +09:00
김보곤
46f1577d65 feat:튜토리얼 영상 멀티스텝 개선 (8초 → 30초~2분)
- ScreenAnalysisService: Gemini 프롬프트를 멀티스텝(3~5 steps) 출력으로 변경 + 하위 호환 fallback
- SlideAnnotationService: 스포트라이트 효과(annotateSlideWithSpotlight), 인트로/아웃트로 슬라이드 생성
- TutorialVideoJob: screen→steps 중첩 루프 + 인트로/아웃트로 씬 추가
- index.blade.php: 단계별 나레이션 편집 UI + 예상 시간 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:36:56 +09:00
김보곤
768bc30a6d feat:사용자 매뉴얼 영상 자동 생성 기능 구현
- TutorialVideo 모델 (상태 관리, TenantScope)
- GeminiScriptService에 callGeminiWithParts() 멀티모달 지원 추가
- ScreenAnalysisService: Gemini Vision 스크린샷 AI 분석
- SlideAnnotationService: PHP GD 이미지 어노테이션 (마커, 캡션)
- TutorialAssemblyService: FFmpeg 이미지→영상 합성 (crossfade)
- TutorialVideoJob: 분석→슬라이드→TTS→BGM→합성 파이프라인
- TutorialVideoController: 업로드/분석/생성/상태/다운로드/이력 API
- React-in-Blade UI: 3단계 (업로드→분석확인→생성모니터링) + 이력

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 15:56:39 +09:00
김보곤
e4d8dbddb3 fix:자막-음성 싱크 개선 + 나레이션 밀도 증가 + BGM 볼륨 상향
1. 자막 싱크: ffprobe로 실제 TTS 오디오 길이 측정 → 자막 타이밍 반영
   - 기존: 장면 길이 * 0.75 추정 → 음성과 자막 불일치
   - 변경: 실제 나레이션 오디오 길이 기반 문장별 타이밍 계산
2. 나레이션 밀도: 장면당 40~70자 → 60~100자 (빈 시간 없이 채움)
3. BGM 볼륨: 0.4 → 1.2 (안 들리던 문제 해결)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:50:52 +09:00
김보곤
0f162d1df9 fix:건강 트렌드 필터에서 연예인/인물 키워드 제외
- 프롬프트에 엄격한 제외 규칙 추가 (연예인/정치인/스포츠선수/드라마 등)
- "간접 연결 가능하면 포함" 조건 삭제 (억지 건강 앵글 방지)
- 컨트롤러: 필터 결과가 비면 원본 대신 빈 배열 반환

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:39:58 +09:00
김보곤
073e4c4877 fix:자막 정규식 lookbehind → \K 방식으로 변경 (멀티바이트 호환)
PCRE lookbehind는 멀티바이트 문자 클래스에서 가변길이 오류 발생
→ \K (match reset)로 대체하여 구두점은 앞 문장에 유지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:38:04 +09:00
김보곤
e9ad735be9 fix:자막 preg_split 가변길이 lookbehind 오류 수정
PCRE는 (?<=[.!?]+) 가변길이 lookbehind 미지원
→ (?<=[.!?])(?![.!?]) 고정길이 lookbehind + negative lookahead 조합으로 변경

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:24:59 +09:00
김보곤
746d350c5e fix:자막 구두점(!?.)이 다음 페이지로 넘어가는 버그 수정
- splitIntoSentences 정규식: 연속 구두점(?!, !!, ?!?)을 하나로 취급
- 분리 조건: 구두점 후 공백이 있을 때만 분리 (공백 없으면 분리 안 함)
- 짧은 조각 병합 방향: forward → backward (이전 문장에 붙임)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:14:54 +09:00
김보곤
06c6005771 feat:Google Lyria API로 AI 배경음악 생성 연동
Lyria API 연동:
- Vertex AI 기반 Google Lyria 음악 생성 API 추가
- 분위기(mood)별 영어 프롬프트 매핑 (upbeat, energetic, calm 등 8종)
- 생성된 30초 WAV → MP3 변환 + 영상 길이에 맞춰 루프/트림
- 페이드인(1초) + 페이드아웃(3초) 자동 적용
- 비용: $0.06/30초

BGM 우선순위 변경:
- 1순위: Lyria AI 배경음악 (신규)
- 2순위: 프리셋 BGM 파일 (storage/app/bgm/)
- 3순위: FFmpeg 앰비언트 (기존 폴백)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 13:51:38 +09:00
김보곤
85e8d8635d fix:음성+자막 속도 20% 증가 (1.2x → 1.4x)
- TTS 속도: 1.2x → 1.4x
- 자막 타이밍: 장면의 90% → 75% 구간에 압축 (음성과 싱크)
- 쇼츠 트렌드에 맞춘 빠른 템포

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 13:35:50 +09:00