Skip to content

음성 인식 (STT) ​

음성 입력은 init()의 auto_send 옵션에 따라 두 가지 방식으로 동작합니다. 먼저 어떤 입력 방식을 사용할지 선택하세요.

입력 방식 선택 ​

방식InitOption호출 흐름사용자 발화 종료 처리
수동 전송 (기본)auto_send: falsestartListening() → 사용자 발화 → endListening()앱이 endListening()으로 전송을 확정
자동 전송auto_send: truestartListening()만 호출서버가 사용자 발화 종료를 감지하고 자동으로 응답 요청

수동 전송 — auto_send: false (기본값) ​

startListening()으로 듣기를 시작하고, 사용자의 발화가 끝나면 앱이 endListening()을 호출해 전송을 확정합니다. 마이크 버튼을 누르고 있는 동안의 음성만 입력으로 처리하는 Push-to-Talk형 UI에 적합합니다.

js
// 듣기 시작 — 음성 인식 구간 시작
SDK.startListening();

// 사용자 발화가 끝나면 호출 — 전송이 확정되고 아바타가 응답
SDK.endListening();

자동 전송 — auto_send: true ​

음성 입력을 기본 인터페이스로 사용하는 아바타에 적합합니다. startListening()만 호출하면 되고, 사용자 발화의 종료 감지와 응답 요청은 서버가 자동으로 처리하므로 endListening()을 호출할 필요가 없습니다. 연결 완료 시 자동으로 듣기를 시작하려면 다음과 같이 작성합니다.

js
SDK.onStatus((status) => {
  if (status === 'CONNECTED_FINISH') {
    SDK.startListening(); // 이후 사용자 발화의 종료 감지와 응답 요청은 서버가 자동 처리
  }
});

SDK.init({
  sdk_key: 'YOUR_SDK_KEY',
  avatar_id: 'YOUR_AVATAR_ID',
  auto_send: true,
}).catch((e) => console.error(e.message));

startListening() ​

음성 인식 구간을 시작합니다. 마이크 자체는 enable_microphone: true(기본값)면 연결 시점부터 켜져 있습니다. startListening()은 이 구간의 음성을 입력으로 처리하도록 서버에 알리는 동작이며, 이전에 endListening()·cancelListening()으로 비활성화된 마이크 트랙이 있으면 다시 활성화합니다. 자동 전송(auto_send: true) 모드에서는 이 호출 하나로 음성 대화가 시작됩니다.

js
SDK.startListening();

endListening() ​

수동 전송(auto_send: false) 모드에서 음성 인식 구간을 종료하고 마이크 트랙을 비활성화하며, 전송을 확정합니다. 인식 결과는 STT_RESULT 시그널로 전달되며, stt_only=false인 경우 해당 결과를 바탕으로 아바타가 응답합니다. 자동 전송(auto_send: true) 모드에서는 호출할 필요가 없습니다.

js
SDK.endListening();

cancelListening() ​

음성 인식을 취소하고 마이크를 비활성화합니다. 인식된 텍스트를 폐기하고 아바타가 응답하지 않습니다. 수동·자동 전송 양쪽 모드 모두에서 호출할 수 있습니다.

js
SDK.cancelListening();

stt_only 옵션 ​

stt_only: true로 초기화하면 아바타가 응답하지 않고 STT 인식 결과(STT_RESULT 시그널)만 전달됩니다. 기본값은 false이며, 이 경우 STT 결과 전달 후 아바타 응답이 이어집니다. auto_send와 독립적인 옵션이므로 두 입력 방식 모두와 조합할 수 있습니다.

한편 enable_microphone: false로 초기화하면 마이크 권한을 요청하지 않으므로 음성 입력 자체를 사용할 수 없습니다.

STT 관련 시그널 ​

STT 세션과 발화 구간은 별개입니다

startListening() / endListening()은 음성 인식 구간(듣기 구간)을 제어합니다. 마이크 자체는 enable_microphone: true면 연결 시점부터 켜져 있으며, endListening()·cancelListening() 호출 시 마이크 트랙이 비활성화되고 startListening() 호출 시 다시 활성화됩니다. USER_SPEECH_STARTED / USER_SPEECH_STOPPED는 서버가 감지한 발화 구간이며, 마이크가 켜져 있는 동안에는 듣기 구간 밖(예: 연결 직후 startListening() 호출 전)에서도 수신될 수 있습니다. USER_SPEECH_STOPPED을 수신해도 듣기 구간은 종료되지 않습니다. 수동 전송 모드에서는 endListening()을 호출해야 종료되며, 자동 전송 모드에서는 서버가 사용자 발화의 종료를 감지해 응답을 요청합니다.

js
SDK.onSignal((data) => {
  switch (data.signal) {
    case 'USER_SPEECH_STARTED':
      // 사용자가 말하기 시작 (마이크는 이미 켜져 있음)
      console.log('사용자 발화 시작');
      break;
    case 'USER_SPEECH_STOPPED':
      // 사용자가 말을 멈춤 (마이크는 여전히 켜져 있음)
      console.log('사용자 발화 종료');
      break;
    case 'STT_RESULT':
      console.log('인식 결과:', data.payload.text);
      break;
  }
});

전체 STT 흐름 ​

수동 전송 (auto_send: false) ​

stt_only=false 기준입니다. 마이크는 연결 시점부터 켜져 있으므로 USER_SPEECH_* 시그널은 startListening() 호출 전에도 수신될 수 있습니다. 아래는 대표적인 흐름입니다.

자동 전송 (auto_send: true) ​

endListening() 호출 없이 서버가 사용자 발화의 종료를 감지해 응답까지 이어집니다. stt_only=false 기준입니다.