OPWS Developers

방송 (Broadcast)

방송 API는 준비된 문구를 음성으로 보내는 tts, 진행 상태를 실시간 추적하는 subscribe, 즉석 발화를 송출하는 mic 세 묶음으로 구성됩니다. 모든 호출은 createClient로 만든 oe에서 시작합니다.

broadcast.tts.send()

텍스트를 음성으로 변환해 대상 그룹·디바이스에 방송하고, 접수 영수증(BroadcastReceipt)을 반환합니다.

ts
send(input: TtsSendInput): Promise<BroadcastReceipt>

입력 — TtsSendInput

필드타입필수설명
targetHandlestring대상 그룹/디바이스 핸들
textstring방송할 문구
languagestring언어 코드(예 ko)
idempotencyKeystring멱등성 키(crypto.randomUUID())
partialboolean아니오부분 대상 허용 여부
expectedRevisionnumber아니오대상 revision 낙관적 검증
ts
const receipt = await oe.broadcast.tts.send({
  targetHandle: "grp_main",
  text: "출입을 통제합니다",
  language: "ko",
  idempotencyKey: crypto.randomUUID(),
});

if (receipt.status === "ADMITTED") {
  console.log(receipt.sessionId, receipt.resolvedDeviceCount);
}

BroadcastReceipt: status(ADMITTED|DENIED_BUSINESS) · sessionId · resolvedDeviceCount · revision · denyReason · skipped[]. sessionId로 아래 subscribe()에 연결합니다.

broadcast.subscribe()

SSE로 방송 진행 단계를 실시간 구독합니다. 반환된 핸들의 close()로 종료합니다.

ts
subscribe(sessionId: string, handlers: SubscribeHandlers): { close: () => void }
ts
const sub = oe.broadcast.subscribe(receipt.sessionId!, {
  onPhase: (snapshot) => {
    console.log(snapshot.phase, snapshot.terminal);
    if (snapshot.terminal) sub.close();
  },
  onError: (err) => console.error(err.code, err.httpStatus),
  onClose: () => console.log("closed"),
});

PhaseSnapshot: sessionId · phase · terminal(true면 완료/실패, 더 이상 이벤트 없음) · reason · lastEventId(재연결 마커) · receipt.

SSE 에러는 throw되지 않고 subscribeonError 콜백으로 전달됩니다. try/catch가 아니라 콜백에서 처리하세요.

broadcast.mic.isSupported()

브라우저가 실시간 MIC(WebRTC)를 지원하는지 동기로 확인합니다(RTCPeerConnection 존재 여부). 네트워크 호출이 없습니다.

ts
if (oe.broadcast.mic.isSupported()) {
  // MIC 사용 가능
}

broadcast.mic.preload()

MIC 구현 청크를 미리 로드해 start() 직전 지연을 없앱니다. 단일-flight라 중복 호출이 안전합니다. self-host/CDN 단일 UMD는 MIC가 인라인이라 즉시 반환합니다.

ts
await oe.broadcast.mic.preload(); // 선택적 워밍업

broadcast.mic.start()

실시간 마이크 세션을 시작합니다(MicStartInputMicSession). 세션의 stop()으로 종료합니다.

ts
start(input: MicStartInput): Promise<MicSession>
ts
if (oe.broadcast.mic.isSupported()) {
  await oe.broadcast.mic.preload();          // 선택

  const mic = await oe.broadcast.mic.start({
    targetHandle: "grp_main",
    idempotencyKey: crypto.randomUUID(),
  });

  // ...방송...
  await mic.stop();                          // 세션 종료
}

멱등성 키 규칙·MIC 로드 실패(MicChunkLoadFailed)·CSP 요구사항은 에러 문서를 참조하세요.