음성 활동 감지

음성 활동 감지 (Voice activity detection, VAD)

출처: 문서

Voice activity detection(VAD)은 Realtime API에서 사용할 수 있는 기능으로, 사용자가 말하기 시작했는지 또는 멈췄는지를 자동으로 감지해요. speech-to-speech Realtime 세션에서는 기본적으로 활성화되지만, 선택 사항이라 끌 수도 있어요. transcription Realtime 세션에서는 턴 감지(turn detection) 지원 여부가 transcription 모델에 따라 달라져요. VAD를 지원하는 모델은 기본적으로 server_vad를 사용하며, gpt-live-transcribe와 gpt-realtime-whisper는 턴 감지를 생략하거나 null로 설정해야 해요. 이 모델들에서는 각 오디오 턴을 끝내기 위해 input_audio_buffer.commit을 보내야 해요.

개요

VAD가 활성화되면 오디오가 자동으로 청크로 나뉘고, Realtime API가 사용자가 말하기 시작했는지 또는 멈췄는지를 나타내는 이벤트를 보내요:

  • input_audio_buffer.speech_started: 음성 턴의 시작
  • input_audio_buffer.speech_stopped: 음성 턴의 끝

이 이벤트들을 사용해 애플리케이션에서 음성 턴을 처리할 수 있어요. 예를 들어 대화 상태를 관리하거나, 전사를 청크 단위로 처리하는 데 사용할 수 있어요.

VAD는 session.update 클라이언트 이벤트에서 session.audio.input.turn_detection을 설정해 구성할 수 있어요.

VAD에는 두 가지 모드가 있어요:

  • server_vad: 침묵 구간을 기준으로 오디오를 자동으로 청크로 나눠요.
  • semantic_vad: 사용자가 말한 단어를 바탕으로 모델이 발화를 마쳤다고 판단할 때 오디오를 청크로 나눠요.

VAD를 지원하는 세션과 모델의 기본값은 server_vad예요.

아래에서 각 모드에 대해 더 알아보세요.

Server VAD

Server VAD는 speech-to-speech 세션과 턴 감지를 지원하는 transcription 세션의 기본 모드예요. 침묵 구간을 사용해 오디오를 자동으로 청크로 나눠요.

다음 속성을 조정해 VAD 설정을 세밀하게 튜닝할 수 있어요:

  • threshold: 활성화 임계값(0~1). 임계값이 높을수록 모델을 활성화하려면 더 큰 소리가 필요하므로, 시끄러운 환경에서 더 잘 작동할 수 있어요.
  • prefix_padding_ms: VAD가 감지한 발화 앞에 포함할 오디오 양(밀리초).
  • silence_duration_ms: 발화 종료를 감지할 침묵 지속 시간(밀리초). 값이 짧을수록 턴이 더 빨리 감지돼요.

VAD 구성 예시:

{
  "type": "session.update",
  "session": {
    "type": "realtime",
    "audio": {
      "input": {
        "turn_detection": {
          "type": "server_vad",
          "threshold": 0.5,
          "prefix_padding_ms": 300,
          "silence_duration_ms": 500,
          "create_response": true, // only in conversation mode
          "interrupt_response": true // only in conversation mode
        }
      }
    }
  }
}

transcription 세션에서도 동일한 session.audio.input.turn_detection 필드를 사용해요. gpt-live-transcribe와 gpt-realtime-whisper에서는 턴 감지를 생략하거나 null로 설정해요.

create_response와 interrupt_response 필드는 speech-to-speech 대화에서만 사용돼요. transcription 세션에서는 VAD가 오디오가 청크로 나뉘는 방식만 제어해요.

Semantic VAD

Semantic VAD는 사용자가 발화한 단어를 바탕으로 말하기를 마쳤는지 감지하는 시맨틱 분류기(semantic classifier)를 사용하는 새로운 모드예요. 이 분류기는 사용자가 말을 다 했을 확률에 따라 입력 오디오에 점수를 매겨요. 확률이 낮으면 모델이 타임아웃을 기다리고, 확률이 높으면 기다릴 필요가 없어요. 예를 들어 발화가 흐려지는(끝이 흐릿한) 사용자 오디오는 명확한 문장보다 긴 타임아웃을 초래해요.

이 모드에서는 speech-to-speech 대화 중 모델이 사용자를 덜 방해하며, 사용자가 말을 다 하기 전에 전사를 청크로 나눌 가능성도 낮아요.

Semantic VAD는 session.audio.input.turn_detection.type을 semantic_vad로 설정하면 활성화돼요.

다음과 같이 구성할 수 있어요:

{
  "type": "session.update",
  "session": {
    "type": "realtime",
    "audio": {
      "input": {
        "turn_detection": {
          "type": "semantic_vad",
          "eagerness": "low" | "medium" | "high" | "auto", // optional
          "create_response": true, // only in conversation mode
          "interrupt_response": true, // only in conversation mode
        }
      }
    }
  }
}

동일한 session.audio.input.turn_detection 필드가 VAD를 지원하는 모델의 transcription 세션에도 적용돼요. create_response와 interrupt_response 필드는 대화 모드 전용이에요.

선택 사항인 eagerness 속성은 모델이 사용자를 방해하려는 성향(최대 대기 타임아웃 튜닝)을 제어하는 방법이에요. transcription 모드에서는 모델이 응답하지 않더라도 오디오가 청크로 나뉘는 방식에 영향을 줘요.

  • auto는 기본값이며 medium과 동일해요.
  • low는 사용자가 말할 시간을 충분히 주는 설정이에요.
  • high는 가능한 한 빨리 오디오를 청크로 나눠요.

대화 모드에서 모델이 더 자주 응답하길 원하거나, transcription 모드에서 전사 이벤트를 더 빨리 받고 싶다면 eagerness를 high로 설정해요. 반대로 대화 모드에서 사용자가 방해받지 않고 말하길 원하거나, transcription 모드에서 더 큰 전사 청크를 원한다면 eagerness를 low로 설정할 수 있어요.