82
1
부
에이전트 시스템의 개념과 UX
latest_pcm_ts = 0 # 클라이언트로부터의 ms 타임스탬프
pending_marks = []
async def from_client() -> None:
"""브라우저에서 OpenAI로 마이크 PCM 청크를 중계"""
nonlocal latest_pcm_ts
async for msg in ws.iter_text():
data = json.loads(msg)
pcm = base64.b64decode(data["audio"])
latest_pcm_ts += int(len(pcm) / (PCM_SR * 2) * 1000) # 단순 ms 카운터
await openai_ws.send(json.dumps({
"type": "input_audio_buffer.append",
"audio": base64.b64encode(pcm).decode("ascii")
}))
async def to_client() -> None:
"""어시스턴트 오디오 중계 및 인터럽션 처리"""
nonlocal last_assistant_item, pending_marks
async for raw in openai_ws:
msg = json.loads(raw)
# 어시스턴트가 말하는 경우
if msg["type"] == "response.audio.delta":
pcm = base64.b64decode(msg["delta"])
await ws.send_json({"audio": ...