본문으로 건너뛰기
가이드

Wixzel Voice API로 실제 전화 통화에 Gemini Live 연결하기

HTTP 요청 네 번이면 빈 계정에서 시작해 Google의 Gemini Live 모델이 통화하는 실제 전화를 울릴 수 있습니다. SIP 트렁크를 연결하고, 번호를 등록하고, 실시간 에이전트를 만들고, 전화를 겁니다. 다섯 번째 요청으로 대화 기록과 통화 비용이 담긴 기록을 읽어 옵니다. 통신사 설정이 이미 끝났다면 약 10분이 걸립니다. Gemini Live 엔진은 연결된 1분당 $0.0491로 요금표에서 가장 저렴하며, 3분 통화는 약 $0.15입니다. 선불 잔액에서 초 단위로 청구되고 통신사 요금이 별도로 붙습니다.

작성 · 게시 · 업데이트

소요 시간
통신사 설정이 끝난 상태에서 약 10분
엔진 사용 시간
연결된 1분당 $0.0491

시작하기 전에 무엇이 필요한가요?

  • 크레딧이 있는 Wixzel Voice API 키. 최소 충전 금액은 $5입니다.
  • 통신사의 SIP 트렁크와, 통신사가 발신자 번호로 표시하도록 허용한 번호.
  • curl, jq, uuidgen.

Wixzel Voice에서 단계별로 어떻게 만드나요?

  1. 01SIP 트렁크 연결하기

    키와 API 기본 주소를 한 번 설정한 뒤 트렁크를 만듭니다. ID 외에도 두 값이 필요하므로 tee로 전체 응답을 저장합니다.

    shell
    export WIXZEL_API_KEY="wv_live_..."
    API=https://api.voice.wixzel.com/v1
    
    TRUNK_ID=$(curl -s $API/sip-trunks \
      -H "Authorization: Bearer $WIXZEL_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "My carrier",
        "host": "sip.your-carrier.example",
        "username": "your-sip-username",
        "password": "your-sip-password"
      }' | tee trunk.json | jq -r .id)
    
    jq -r '.platform_ip, .origination_uri' trunk.json

    통신사가 IP로 인증한다면 username과 password는 빼십시오. 어느 경우든 통신사에서 platform_ip를 허용 목록에 추가해 플랫폼에서 오는 통화를 받게 해야 합니다. origination_uri는 통신사가 수신 통화를 보낼 주소이며, 이 가이드에서는 필요하지 않습니다.

  2. 02발신에 쓸 번호 등록하기

    직접 보유한 번호를 E.164 형식으로 사용합니다.

    shell
    NUMBER_ID=$(jq -n --arg trunk "$TRUNK_ID" \
      '{phone_number: "+14155550100", sip_trunk_id: $trunk}' |
      curl -s $API/phone-numbers \
        -H "Authorization: Bearer $WIXZEL_API_KEY" \
        -H "Content-Type: application/json" \
        -d @- | jq -r .id)
  3. 03Gemini Live 에이전트 만들기

    음성은 세 단계가 아니라 실시간 모델 하나입니다.

    shell
    AGENT_ID=$(jq -n --arg number "$NUMBER_ID" '{
        name: "Gemini Live",
        system_prompt: "You are a friendly assistant on a phone call. Keep answers to one or two sentences.",
        opening_message: "Hi, this is an automated assistant. Do you have a minute?",
        outbound_phone_number_id: $number,
        voice: { realtime: { model: "google/gemini-live", voice: "Charon" } }
      }' |
      curl -s $API/agents \
        -H "Authorization: Bearer $WIXZEL_API_KEY" \
        -H "Content-Type: application/json" \
        -d @- | jq -r .id)

    voice.realtime은 듣기, 추론, 말하기로 이루어진 대화 턴 전체를 Gemini Live에 맡기므로 stt, llm, tts 블록이 없습니다. 두 구성을 모두 지정한 음성은 API가 거부합니다. Charon은 Gemini의 기본 제공 음성 중 하나이며, GET /v1/engines/gemini_live/voices가 Google의 한 단어 설명과 함께 전체 목록을 보여 줍니다.

    outbound_phone_number_id는 에이전트에 발신자 번호를 지정하며, 덕분에 다음 요청에서 from_number_id를 생략할 수 있습니다.

  4. 04전화 걸기

    to 번호를 전화를 걸 번호로 바꿉니다.

    shell
    CALL_ID=$(jq -n --arg agent "$AGENT_ID" '{to: "+14155551234", agent_id: $agent}' |
      curl -s $API/calls \
        -H "Authorization: Bearer $WIXZEL_API_KEY" \
        -H "Idempotency-Key: $(uuidgen)" \
        -H "Content-Type: application/json" \
        -d @- | jq -r .id)

    API는 즉시 status: "queued"와 함께 201로 응답하고, 잠시 후 전화가 울립니다. 여기서는 Idempotency-Key가 필수입니다. 네트워크 타임아웃만으로는 통화가 걸렸는지 알 수 없고, 같은 키로 재시도하면 두 번 거는 대신 원래 통화를 반환하므로, 스크립트에서 재시도한다면 키를 보관하십시오. 처음 15초를 충당할 수 없는 통화는 발신 전에 402로 거부됩니다.

  5. 05결과 확인하기

    다섯 번째 요청으로 통화를 읽어 옵니다.

    shell
    curl -s $API/calls/$CALL_ID \
      -H "Authorization: Bearer $WIXZEL_API_KEY" | jq
    Example response, shortened
    {
      "id": "6a96a3ead6e886d42462dd3e",
      "object": "call",
      "session_id": "sip-5b0c7c0e-9d1f-4c52-8a9e-2f0d3a4b6c7d",
      "status": "completed",
      "direction": "outbound",
      "channel": "phone",
      "engine": "gemini_live",
      "to": "+14155551234",
      "duration_seconds": 94,
      "cost_micros": 76923,
      "failure_code": null,
      "failure_reason": null,
      "transcript": [
        { "role": "assistant", "content": "Hi, this is an automated assistant. Do you have a minute?" },
        { "role": "user", "content": "Sure, go ahead." }
      ]
    }

    status는 queued에서 ringing, in-progress를 거쳐 completed가 되거나, failed, busy, no-answer로 끝납니다. cost_micros는 통화가 정산될 때 기록되며(1,000,000이 $1.00), 연결되지 않은 통화는 요금이 없으므로 null로 남습니다. 통화가 실패하면 failure_code는 통신사의 Q.850 원인 코드(17 통화 중, 19 응답 없음, 21 통신사 거부)이고 failure_reason은 해결 방법을 알려 줍니다. GET /v1/usage/events?session_id=…는 모든 요금을 항목별로 보여 줍니다.

Wixzel Voice에서 이 빌드의 비용은 얼마인가요?

gemini-live 엔진에서 연결된 1분당 $0.0491로 3분 통화를 할 때의 엔진 사용 시간 비용: 통화당 약 $0.15. 전화 통신은 자체 트렁크에서 통신사 요금으로 청구되며 포함되지 않습니다.

이 가이드 빌드의 월 엔진 비용
월 통화 수연결된 시간(분)월 엔진 비용
300900$44.19
1,5004,500$221
6,00018,000$884

분당 요금은 일반적인 말하기 속도 기준이며 오케스트레이션 수수료를 포함합니다. Gemini Live는 통화 중 오디오 토큰 단위로 계량되므로 조용한 통화는 예상보다 적게, 말이 많은 통화는 더 많이 나옵니다. 위 응답 예시는 94초 통화를 분당 요금으로 계산한 것입니다. 회선 요금은 통신사가 마진 없이 별도로 청구합니다.

선불이며 구독과 무료 등급이 없습니다. $5부터 크레딧을 충전하면 사용량만큼 차감됩니다. 내 사용량으로 추정해 보기.

이 빌드에는 Wixzel Voice의 어떤 한도가 적용되나요?

  • 전화 통화에는 직접 보유한 SIP 트렁크가 필요합니다. Wixzel Voice는 번호를 판매, 이전하거나 보유하지 않습니다. 콘솔에서 연결한 Twilio, Telnyx, Plivo, Vobiz, Vonage 계정에서는 번호를 대신 구매할 수 있으며, 요금은 통신사가 청구합니다.
  • POST /v1/agents/{id}/test-call의 테스트 통화는 한 문장을 classic 음성 파이프라인으로 말합니다. Gemini Live에는 한 문장만 말하는 모드가 없기 때문입니다. Gemini 음성 자체를 들어 보려면 일반 통화를 거십시오.
  • 계정당 기본적으로 동시에 5건의 통화를 진행할 수 있으며, 요청하면 한도를 늘려 드립니다.
  • 지연 시간 수치는 공개하지 않습니다. 실시간 엔진은 모델 자체가 응답하는 속도로 답합니다. Wixzel Voice의 동작 변경은 날짜 기반 Wixzel-Version 헤더로 구분되어 배포됩니다.

자주 묻는 질문

Gemini Live로 전화를 걸 수 있나요?

Gemini Live는 전화 서비스가 아니라 모델입니다. Wixzel Voice가 둘을 연결합니다. 음성이 {"realtime": {"model": "google/gemini-live"}}인 에이전트를 만들면, POST /v1/calls가 직접 보유한 SIP 트렁크로 실제 번호에 전화를 걸고 Gemini Live가 통화합니다.

Google Cloud나 Gemini API 키가 필요한가요?

아니요. 호스팅 플랫폼에서는 제공업체 계정을 Wixzel Voice가 보유합니다. wv_live_ API 키 하나와 선불 잔액으로 Gemini Live와 다른 모든 엔진을 사용할 수 있습니다.

Gemini Live는 통화에서 어떤 음성을 쓸 수 있나요?

Charon, Kore, Puck 같은 기본 제공 음성입니다. GET /v1/engines/gemini_live/voices가 전체 목록을 보여 줍니다. 다른 엔진 목록에 있는 음성은 에이전트 생성 시 거부됩니다.

Gemini Live 전화 통화 비용은 얼마인가요?

일반적인 말하기 속도 기준으로 연결된 1분당 $0.0491, 3분에 약 $0.15이며, 선불 크레딧에서 초 단위로 청구되고 통신사 요금이 별도로 붙습니다. 연결되지 않은 통화는 요금이 없습니다.

Gemini Live 에이전트가 수신 전화도 받을 수 있나요?

네. PATCH /v1/phone-numbers/{id}로 전화번호의 inbound_agent_id를 그 에이전트로 설정하고, 통신사의 수신 라우팅을 트렁크의 origination_uri로 지정합니다.

더 읽을거리

  • 빠른 시작문서

    같은 네 요청을 TypeScript SDK와 Dart SDK로도 보여 줍니다.

  • 음성 엔진문서

    실시간 음성 구성, 음성 목록, 언어.

  • SIP 트렁크문서

    허용 목록 추가, 수신 라우팅, 각 실패 코드의 의미.

  • 멱등성문서

    POST /v1/calls에 키가 필요한 이유와 재요청 처리 방식.

에이전트형 전화 통신을 위한 API

Wixzel Voice 소개

Wixzel Voice는 자체 SIP 트렁크로 실제 전화를 걸고 받거나 웹·모바일 앱에서 사람들과 대화하는 AI 에이전트를 만들기 위한 음성 AI API입니다. API 키 하나와 선불 잔액 하나로 모든 음성 엔진을 사용하며, 실제 사용량에 따라 초 단위로 과금됩니다.

Wixzel Voice MCP 서버로 Claude에게 실제 전화 회선 연결하기

Claude Code나 claude.ai의 Claude가 SIP 트렁크로 실제 전화를 걸고 대화 기록을 읽어 주는 상태. 전화를 걸기 전에는 항상 확인을 거칩니다.

Wixzel Voice로 Node.js에서 Twilio AI 접수원 만들기

Node.js로 만든 AI 접수원이 기존 Twilio 번호로 오는 전화를 받고 API에 예약을 잡는 상태.

Wixzel Voice sarvam 엔진으로 만드는 힌디어·말라얄람어 전화 에이전트

Sarvam의 인도 언어 모델로 동작하며 SIP 트렁크로 전화를 받거나 거는 전화 에이전트 두 개(힌디어 하나, 말라얄람어 하나).

Wixzel Voice로 WebSocket 기반 Flutter 음성 에이전트 추가하기

API 키는 서버에 두고, 전화번호 없이 사용자가 WebSocket으로 음성 에이전트와 대화하는 Flutter 앱.

Wixzel Voice로 AI 리드 선별 캠페인 실행하기

에이전트가 SIP 트렁크로 리드 목록에 동시 통화 한도에 맞춘 배치 단위로 전화를 걸고, 모든 통화의 상태와 대화 기록을 읽어 오는 상태.

Wixzel Voice로 웹사이트에 말하는 AI 마스코트 추가하기

웹사이트 구석에서 방문자가 브라우저로 통화하는 말하는 마스코트. 지정한 도메인과 일일 한도 안에서만 동작하고, 모든 발신자가 목록에 남습니다.

Wixzel Voice로 Flutter 앱에 에이전트 마스코트 표시하기

실시간 통화 중 에이전트 음성에 맞춰 입을 움직이는 에이전트 마스코트가 있는 Flutter 화면. API 키는 서버에 둡니다.

첫 음성 에이전트를 만드세요