방송 (Broadcast)
방송 API는 준비된 문구를 음성으로 보내는 tts, 진행 상태를 실시간 추적하는 subscribe, 즉석 발화를 송출하는 mic 세 묶음으로 구성됩니다. 모든 호출은 createClient로 만든 oe에서 시작합니다.
broadcast.tts.send()
텍스트를 음성으로 변환해 대상 그룹·디바이스에 방송하고, 접수 영수증(BroadcastReceipt)을 반환합니다.
send(input: TtsSendInput): Promise<BroadcastReceipt>입력 — TtsSendInput
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
targetHandle | string | 예 | 대상 그룹/디바이스 핸들 |
text | string | 예 | 방송할 문구 |
language | string | 예 | 언어 코드(예 ko) |
idempotencyKey | string | 예 | 멱등성 키(crypto.randomUUID()) |
partial | boolean | 아니오 | 부분 대상 허용 여부 |
expectedRevision | number | 아니오 | 대상 revision 낙관적 검증 |
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()로 종료합니다.
subscribe(sessionId: string, handlers: SubscribeHandlers): { close: () => void }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되지 않고 subscribe의 onError 콜백으로 전달됩니다. try/catch가 아니라 콜백에서 처리하세요.
broadcast.mic.isSupported()
브라우저가 실시간 MIC(WebRTC)를 지원하는지 동기로 확인합니다(RTCPeerConnection 존재 여부). 네트워크 호출이 없습니다.
if (oe.broadcast.mic.isSupported()) {
// MIC 사용 가능
}broadcast.mic.preload()
MIC 구현 청크를 미리 로드해 start() 직전 지연을 없앱니다. 단일-flight라 중복 호출이 안전합니다. self-host/CDN 단일 UMD는 MIC가 인라인이라 즉시 반환합니다.
await oe.broadcast.mic.preload(); // 선택적 워밍업broadcast.mic.start()
실시간 마이크 세션을 시작합니다(MicStartInput → MicSession). 세션의 stop()으로 종료합니다.
start(input: MicStartInput): Promise<MicSession>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 요구사항은 에러 문서를 참조하세요.

