STT 이벤트에 sessionId 추가 및 오디오 청크 처리 시간 15초로 변경

- TranscriptionEvent.SegmentCreated에 sessionId 필드 추가
- AudioBatchProcessor의 스케줄링 간격을 10초에서 15초로 변경
- AI 서비스의 TranscriptSegmentReadyEvent에도 sessionId 필드 추가
- 이벤트 발행 시 sessionId에 meetingId 값 할당

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Minseo-Jo 2025-10-30 09:03:19 +09:00
parent d48969c406
commit b1ef088795
3 changed files with 66 additions and 6 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -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<AudioChunkDto> 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