← 블로그 목록3. 코드 —
Gemini Live API 로 한국어 voice agent 5분 만들기 — ClawOps 070 직접 연결
Google Gemini Live API + ClawOps 070 번호 인프라로 한국어 음성 에이전트를 5분 만에 만드는 가이드. 코드 30줄 + 시스템 프롬프트 예시.
Gemini Live API 로 한국어 voice agent 5분 만들기 — ClawOps 070 직접 연결
Google Gemini Live API 는 한국어 발음 자연도가 OpenAI Realtime 보다 좋고 단가도 저렴. 하지만 한국 사용자에게 진짜로 닿으려면 한국 070 번호가 필요한데, Google 은 telephony 인프라를 직접 제공 안 한다. ClawOps 070 + Gemini Live 직접 연결로 30줄 코드 + 5분에 한국어 voice agent 완성.
0. 사전 준비
- Python 3.10+
- ClawOps 계정 (https://claw-ops.com, 무료 Trial, 카드 X)
- Google AI Studio API key (https://aistudio.google.com/apikey)
1. ClawOps SDK 설치
pip install "clawops[agent,gemini]"
agent extras: 음성 에이전트 런타임 (SIP/WebRTC bridge, RTP 인코딩, turn-taking).
gemini extras: Gemini Live API 연동.
2. 환경변수
export CLAWOPS_API_KEY="sk_..."
export GOOGLE_API_KEY="AIzaSy..."
3. 코드 — agent.py
import asyncio
from clawops import ClawOps
from clawops.agent import ClawOpsAgent, GeminiRealtime
client = ClawOps() # CLAWOPS_API_KEY 자동 인식
number = client.numbers.create() # 070 번호 즉시 발급
print(f"발급된 070 번호: {number.number}")
agent = ClawOpsAgent(
from_=number.number,
session=GeminiRealtime(
voice="Kore", # 한국어 자연 보이스
language="ko",
system_prompt=(
"당신은 ABC 회사의 인바운드 상담원입니다.\n"
"- 제품 문의·가격·일정 질문을 짧고 친절하게 응대\n"
"- 견적이 필요하면 회사명·연락처·예산을 받아 메모\n"
"- 답변 어려운 건 담당자 연결 약속 후 hang_up\n"
"- 한국어로만 응대, 영어 섞지 말 것"
),
),
)
asyncio.run(agent.serve()) # ngrok 없이 바로 inbound 수신
agent.serve() 만 호출하면:
- ClawOps 가 발급된 070 으로 들어오는 모든 inbound SIP 트래픽을 자동 라우팅
- WebSocket bridge 로 Gemini Live API 에 음성 stream 전달
- Gemini 응답을 다시 SIP RTP 로 변환해 통화에 회신
- turn-taking (말 끊김·동시 발화) 자동 처리
4. 테스트 통화
python agent.py
다른 휴대폰에서 출력된 070 번호로 전화 → AI 상담원이 응답.
5. Outbound (전화 걸기)
발신도 같은 에이전트 인스턴스로 겁니다. agent.call() 을 호출하면 그 통화가 위에서 만든 Gemini Live 세션으로 연결됩니다.
import asyncio
from clawops.agent import ClawOpsAgent, GeminiRealtime
agent = ClawOpsAgent(
from_=number.number,
session=GeminiRealtime(
voice="Kore",
language="ko",
system_prompt=(
"당신은 OOO 회사의 영업담당입니다.\n"
"내일 오후 2시 시연 약속을 잡아주세요.\n"
"시간 안 맞으면 다른 시간대 받아오세요.\n"
"5분 안에 마무리하고 통화를 종료하세요."
),
),
)
async def main():
call = await agent.call("01012345678") # connect() 는 자동으로 먼저 수행된다
print(f"call_id: {call.call_id}")
await agent.serve() # 통화가 끝날 때까지 세션 유지
asyncio.run(main())
시스템 프롬프트는 인스턴스 단위입니다. 고객마다 다른 내용으로 대량 발신해야 한다면, 인스턴스를 매번 새로 띄우는 대신 콘솔에서 만든 매니지드 에이전트에 agent_id 로 거는 방식이 적합합니다. 그 경우 통화별 지시는 call_context 로 넘깁니다.
client.calls.create(
to="01012345678",
from_=number.number,
agent_id=SALES_AGENT_ID,
call_context={"instruction": "내일 오후 2시 시연 약속을 잡아주세요."},
)
6. 통화 종료 후 — 요약·전사
# 통화 끝난 뒤 (callback webhook 또는 polling)
result = client.calls.get(call.call_id)
print(result.status) # "completed"
print(result.recording_url) # 녹음 다운로드 경로
summary = client.calls.get_summary(call.call_id) # AI 가 생성한 한국어 요약
transcript = client.calls.get_transcript(call.call_id) # 전사 결과
add_on=summary 활성화시 통화 요약이 자동 생성된다 (₩10/분).
7. Gemini Live vs OpenAI Realtime (한국어 통화 기준)
| 항목 | Gemini Live | OpenAI Realtime |
|---|---|---|
| 한국어 보이스 자연도 | 매우 우수 (Aoede/Puck) | 우수 (alloy/verse) |
| latency | ~600ms | ~700ms |
| input 가격 | 약 50% | 기준 |
| audio output 가격 | 약 40% | 기준 |
| 함수 호출 | 지원 (tools) | 지원 (tools) |
| 한국 전화 지원 | ❌ 직접 안 됨 → ClawOps 필요 | ❌ 직접 안 됨 → ClawOps 필요 |
8. 작동 원리
[한국 사용자 휴대폰]
↕ PSTN
[한국 통신사 070]
↕ SIP/2.0 + SRTP
[ClawOps SIP gateway, GCP 서울]
↕ WebSocket (RTP ↔ PCM)
[Gemini Live API, Google]
↕ inference
[Gemini 2.0 Flash Realtime]
9. 비용 (월 100분 통화 기준)
- ClawOps Individual: ₩19,000/월 (발신 100분 포함, 수신 1,000분)
- Gemini Live: 무료 quota 안에서 시작 가능, 초과시 기본 약 $0.0001/sec output audio
- 총합: 5만원 이내에서 한국어 voice agent 1개 운영 가능