⚙️Backend

음성 통화 세션 자동 종료로 불필요한 비용 절감하기

음성 통화 세션이 불필요하게 유지되어 발생하는 비용 문제, 해결책은? 무발화 및 종료 의사 표현 감지로 세션을 자동 종료하는 방법을 공유합니다.

📅 2026년 6월 20일·📖 5분 읽기·👁 8

음성 통화 세션이 불필요하게 유지되어 비용이 발생하는 문제, 겪어보셨나요? 특히 Live 세션 환경에서 이런 일이 자주 발생하는데요. 이 글에서는 무발화 또는 말로 종료 시 자동으로 세션을 종료하는 기능을 구현하여 비용을 절감한 경험을 공유합니다.

시도와 함정

처음에는 단순히 일정 시간 동안 발화가 없으면 세션을 종료하는 로직을 생각했습니다. 하지만 이게 생각보다 까다롭더라고요. 사용자가 잠시 말을 멈춘 건지, 아니면 정말 통화를 끝내고 싶은 건지 구분하기 어려웠습니다.

# 초기 시도: 단순 무발화 타임아웃
def check_silence_and_terminate(session_id, last_activity_time, timeout_duration):
    current_time = datetime.now()
    if (current_time - last_activity_time).total_seconds() > timeout_duration:
        print(f"세션 {session_id} 무발화로 종료합니다.")
        # 세션 종료 로직...

이 코드는 사용자가 숨을 고르거나 잠시 생각하는 시간에도 세션이 종료될 위험이 있었습니다. 결국 이 방식으로는 만족스러운 결과를 얻지 못하고 3시간 정도 삽질을 하게 되었습니다.

원인

문제의 핵심은 '사용자의 의도'를 파악하는 것이었습니다. 단순히 발화가 없는 것만을 기준으로 삼으면 오탐지가 발생했습니다. 사용자가 명확하게 통화를 종료하겠다는 의사를 표현하는 경우(예: "끊을게요", "종료")와, 아무 말도 하지 않는 경우를 구분해야 했습니다.

해결

그래서 최종적으로는 다음과 같은 두 가지 조건을 결합하여 세션 종료 로직을 구현했습니다.

  1. 무발화 감지: 일정 시간 동안 음성 입력이 없을 때.
  2. 종료 의사 표현 감지: 특정 키워드(예: "종료", "끊어", "안녕")가 포함된 발화 감지.

이 두 가지 조건을 만족할 때만 세션을 종료하도록 변경했습니다.

# 개선된 세션 종료 로직
def should_terminate_session(session_data):
    current_time = datetime.now()
    last_activity_time = session_data['last_activity_time']
    silence_timeout = 60  # 60초 무발화 시
    last_utterance = session_data.get('last_utterance', '')
    keywords_to_terminate = ['종료', '끊어', '안녕', '마칠게']
# 1. 무발화로 일정 시간 경과 시
if (current_time - last_activity_time).total_seconds() > silence_timeout:
    print(f"세션 {session_data['id']} 무발화로 종료 대상입니다.")
    return True

# 2. 사용자가 명시적으로 종료 의사 표현 시
for keyword in keywords_to_terminate:
    if keyword in last_utterance.lower():
        print(f"세션 {session_data['id']} 명시적 종료 의사 감지: '{last_utterance}'")
        return True

return False

예시 데이터

session_info = { 'id': 'session_abc', 'last_activity_time': datetime.now() - timedelta(seconds=70), 'last_utterance': '네, 알겠습니다. 그럼 다음에 봐요.' }

if should_terminate_session(session_info): print("세션 종료 처리 진행...") else: print("세션 유지...")

session_info_2 = { 'id': 'session_xyz', 'last_activity_time': datetime.now() - timedelta(seconds=10), 'last_utterance': '네, 이제 끊을게요.' }

if should_terminate_session(session_info_2): print("세션 종료 처리 진행...") else: print("세션 유지...")

이 로직 덕분에 사용자가 잠시 말을 멈추더라도 불필요하게 세션이 종료되지 않으면서, 사용자가 통화를 끝내고 싶을 때는 명확하게 감지하여 세션을 종료할 수 있게 되었습니다.

결과

  • Live 세션 유지 시간의 불필요한 연장 감소
  • 음성 통화 관련 서비스 비용 절감 효과 확인
  • 사용자 경험 저하 없이 비용 효율성 증대

정리 — 같은 함정 안 빠지려면

  • [ ] 음성 세션 종료 로직 구현 시, 단순 무발화 시간만으로 판단하지 않기
  • [ ] 사용자의 명시적인 종료 의사 표현(키워드 감지 등)을 함께 고려하기
  • [ ] 테스트 단계에서 다양한 발화 패턴(잠시 멈춤, 의도적인 종료 발언 등)으로 충분히 검증하기

태그

#음성 통화#세션 자동 종료#비용 절감#무발화 감지#종료 키워드#Live 세션#백엔드 개발