From b1ef088795c6b5dd1792d729adaeabeaec183244 Mon Sep 17 00:00:00 2001 From: Minseo-Jo Date: Thu, 30 Oct 2025 09:03:19 +0900 Subject: [PATCH] =?UTF-8?q?STT=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EC=97=90=20se?= =?UTF-8?q?ssionId=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=98=A4=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EC=B2=AD=ED=81=AC=20=EC=B2=98=EB=A6=AC=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=2015=EC=B4=88=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TranscriptionEvent.SegmentCreated에 sessionId 필드 추가 - AudioBatchProcessor의 스케줄링 간격을 10초에서 15초로 변경 - AI 서비스의 TranscriptSegmentReadyEvent에도 sessionId 필드 추가 - 이벤트 발행 시 sessionId에 meetingId 값 할당 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../event/TranscriptSegmentReadyEvent.java | 57 +++++++++++++++++++ .../hgzero/stt/event/TranscriptionEvent.java | 4 +- .../stt/service/AudioBatchProcessor.java | 11 ++-- 3 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 ai-java-back/src/main/java/com/unicorn/hgzero/ai/infra/event/TranscriptSegmentReadyEvent.java diff --git a/ai-java-back/src/main/java/com/unicorn/hgzero/ai/infra/event/TranscriptSegmentReadyEvent.java b/ai-java-back/src/main/java/com/unicorn/hgzero/ai/infra/event/TranscriptSegmentReadyEvent.java new file mode 100644 index 0000000..be64afc --- /dev/null +++ b/ai-java-back/src/main/java/com/unicorn/hgzero/ai/infra/event/TranscriptSegmentReadyEvent.java @@ -0,0 +1,57 @@ +package com.unicorn.hgzero.ai.infra.event; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * STT Service에서 발행하는 음성 변환 세그먼트 이벤트 + * Azure Event Hub를 통해 전달됨 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TranscriptSegmentReadyEvent { + + /** + * 녹음 ID + */ + private String recordingId; + + /** + * 회의 ID + */ + private String meetingId; + + /** + * 세션 ID + */ + private String sessionId; + + /** + * 변환 텍스트 세그먼트 ID + */ + private String transcriptId; + + /** + * 변환된 텍스트 + */ + private String text; + + /** + * 타임스탬프 (ms) + */ + private Long timestamp; + + /** + * 신뢰도 점수 (0-1) + */ + private Double confidence; + + /** + * 이벤트 발생 시간 + */ + private String eventTime; +} diff --git a/stt/src/main/java/com/unicorn/hgzero/stt/event/TranscriptionEvent.java b/stt/src/main/java/com/unicorn/hgzero/stt/event/TranscriptionEvent.java index a9bdd68..57196c4 100644 --- a/stt/src/main/java/com/unicorn/hgzero/stt/event/TranscriptionEvent.java +++ b/stt/src/main/java/com/unicorn/hgzero/stt/event/TranscriptionEvent.java @@ -25,6 +25,7 @@ public class TranscriptionEvent { private String segmentId; private String recordingId; private String meetingId; + private String sessionId; private String text; private String speakerId; private String speakerName; @@ -34,7 +35,7 @@ public class TranscriptionEvent { private Boolean warningFlag; private LocalDateTime eventTime; - public static SegmentCreated of(String segmentId, String recordingId, String meetingId, + public static SegmentCreated of(String segmentId, String recordingId, String meetingId, String sessionId, String text, String speakerId, String speakerName, LocalDateTime timestamp, Double duration, Double confidence, Boolean warningFlag) { return SegmentCreated.builder() @@ -43,6 +44,7 @@ public class TranscriptionEvent { .segmentId(segmentId) .recordingId(recordingId) .meetingId(meetingId) + .sessionId(sessionId) .text(text) .speakerId(speakerId) .speakerName(speakerName) diff --git a/stt/src/main/java/com/unicorn/hgzero/stt/service/AudioBatchProcessor.java b/stt/src/main/java/com/unicorn/hgzero/stt/service/AudioBatchProcessor.java index 78f68fd..4222d34 100644 --- a/stt/src/main/java/com/unicorn/hgzero/stt/service/AudioBatchProcessor.java +++ b/stt/src/main/java/com/unicorn/hgzero/stt/service/AudioBatchProcessor.java @@ -16,7 +16,7 @@ import java.util.UUID; /** * 오디오 배치 프로세서 - * 5초마다 Redis에 축적된 오디오를 처리하여 텍스트로 변환 + * 15초마다 Redis에 축적된 오디오를 처리하여 텍스트로 변환 * * Note: STT 결과는 DB에 저장하지 않고, Event Hub와 WebSocket으로만 전송 * 최종 회의록은 AI 서비스에서 저장 @@ -32,13 +32,13 @@ public class AudioBatchProcessor { private final AudioWebSocketHandler webSocketHandler; /** - * 5초마다 오디오 배치 처리 + * 15초마다 오디오 배치 처리 * - Redis에서 오디오 청크 조회 * - Azure Speech로 텍스트 변환 * - Event Hub 이벤트 발행 (AI 서비스로 전송) * - WebSocket 실시간 전송 (클라이언트 표시) */ - @Scheduled(fixedDelay = 5000, initialDelay = 10000) // 5초마다 실행, 최초 10초 후 시작 + @Scheduled(fixedDelay = 15000, initialDelay = 15000) // 15초마다 실행, 최초 15초 후 시작 public void processAudioBatch() { try { // 활성 회의 목록 조회 @@ -68,7 +68,7 @@ public class AudioBatchProcessor { */ private void processOneMeeting(String meetingId) { try { - // Redis에서 최근 5초 오디오 청크 조회 + // Redis에서 최근 15초 오디오 청크 조회 List chunks = audioBufferService.getAudioChunks(meetingId); if (chunks.isEmpty()) { @@ -78,7 +78,7 @@ public class AudioBatchProcessor { log.info("오디오 청크 조회 완료 - meetingId: {}, chunks: {}개", meetingId, chunks.size()); - // 오디오 청크 병합 (5초 분량) + // 오디오 청크 병합 (15초 분량) byte[] mergedAudio = audioBufferService.mergeAudioChunks(chunks); if (mergedAudio.length == 0) { @@ -123,6 +123,7 @@ public class AudioBatchProcessor { UUID.randomUUID().toString(), // segmentId meetingId, // recordingId meetingId, // meetingId + meetingId, // sessionId (meetingId와 동일) result.getText(), // text "UNKNOWN", // speakerId "참석자", // speakerName