From 7b94515180c8966c72a0a645309b8a4dfeb989ee Mon Sep 17 00:00:00 2001 From: "hehihoho3@gmail.com" Date: Thu, 25 Jun 2026 17:31:02 +0900 Subject: [PATCH] =?UTF-8?q?fix(rework):=20AI=20=EC=9E=90=EB=A7=89=20-=20?= =?UTF-8?q?=EC=9D=8C=EC=84=B1=20=EC=97=86=EC=9D=8C=EC=9D=80=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=95=84=EB=8B=8C=20=EC=95=88=EB=82=B4(=ED=9A=8C?= =?UTF-8?q?=EC=83=89)=EB=A1=9C=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 말소리 없는 영상(음악·화면자막만)의 음성 패널을 빨강 오류가 아니라 회색 안내 ('음성 없음 — 말소리가 없거나 전사 미실행')로 표시. renderAiPanel에 note 인자 추가. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/main/resources/templates/rework.html | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/resources/templates/rework.html b/src/main/resources/templates/rework.html index 496bdb3..be7d33b 100644 --- a/src/main/resources/templates/rework.html +++ b/src/main/resources/templates/rework.html @@ -470,14 +470,18 @@ } // ===== AI 자막 (음성 Whisper / 화면 Gemini) ===== - function renderAiPanel(elId, segs, error){ + // segs 있으면 목록, 없으면 error(빨강) 또는 note(회색 안내) 표시. + function renderAiPanel(elId, segs, error, note){ const box = document.getElementById(elId); + if(segs && segs.length){ + box.innerHTML = segs.map(sg => + '
' + + '' + mmss(sg.start) + '' + + '' + esc(sg.text) + '
').join(''); + return; + } if(error){ box.innerHTML = '
' + esc(error) + '
'; return; } - if(!segs || !segs.length){ box.innerHTML = '
자막 없음
'; return; } - box.innerHTML = segs.map(sg => - '
' - + '' + mmss(sg.start) + '' - + '' + esc(sg.text) + '
').join(''); + box.innerHTML = '
' + esc(note || '자막 없음') + '
'; } // 음성(Whisper 정밀+한국어) + 화면(Gemini 한국어)을 동시에 생성해 좌우 패널에 표시. @@ -490,7 +494,8 @@ // 왼쪽: 저장된 Whisper 세그먼트 → 한국어 번역(LibreTranslate) const audioP = (async () => { - if(!SEGMENTS || !SEGMENTS.length) return { error: '음성 자막 없음 — 이 영상에 말소리가 없거나(음악·화면자막만) 아직 ‘전사’ 미실행' }; + // 말소리가 없는(음악·화면자막만) 영상은 오류가 아니라 '음성 없음' 안내. + if(!SEGMENTS || !SEGMENTS.length) return { note: '음성 없음 — 말소리가 없거나(음악·화면자막만) ‘전사’ 미실행' }; const r = await api(API + '/' + VIDEO_ID + '/translate?target=ko&format=segments', { method:'POST' }); const ko = (r && r.texts) || []; return { segments: SEGMENTS.map((sg, i) => ({ start: sg.start, end: sg.end, text: (ko[i] != null ? ko[i] : (sg.text || '')) })) }; @@ -504,8 +509,8 @@ const [audio, screen] = await Promise.all([audioP, screenP]); AI_AUDIO = audio.segments || []; AI_SCREEN = screen.segments || []; - renderAiPanel('aiAudioList', AI_AUDIO, audio.error); - renderAiPanel('aiScreenList', AI_SCREEN, screen.error); + renderAiPanel('aiAudioList', AI_AUDIO, audio.error, audio.note); + renderAiPanel('aiScreenList', AI_SCREEN, screen.error, screen.note); status.style.color = '#4ade80'; status.textContent = '완료 · 음성 ' + AI_AUDIO.length + '개 · 화면 ' + AI_SCREEN.length + '개'