phone-caller
Make AI-powered outbound calls via Twilio, voiced by ElevenLabs, with optional live GPT-powered conversation.
Two Modes
Mode 1: One-way message — Generate audio with ElevenLabs, upload it, play it on a Twilio call. Simple, fast, no server needed.
Mode 2: Interactive conversation — Start server.py, call with a webhook URL. The AI listens to responses (Twilio STT), thinks (GPT), and speaks back (ElevenLabs) in real-time. Ends with auto-summary sent via iMessage.
Required Credentials (env vars)
CODEBLOCK0
Mode 1: One-way Call
CODEBLOCK1
See references/voices.md for curated voice IDs.
Mode 2: Interactive Conversation
Step 1 — Start a tunnel (needed so Twilio can reach your server)
CODEBLOCK2
Step 2 — Start the server
CODEBLOCK3
Step 3 — Make the call
CODEBLOCK4
When the call ends, a GPT-generated summary is automatically sent via iMessage to MASTER_PHONE env var.
Scheduling a Call
Use macOS cron for timed calls:
CODEBLOCK5
Voice Selection
- - Default: Clara
tyepWYJJwJM9TTFIg5U7 — Australian female, warm, clear, professional - See
references/voices.md for full curated list with IDs and descriptions
Key Notes
- - Twilio trial accounts: Can only call verified numbers. Upgrade or verify numbers at console.twilio.com → Verified Caller IDs
- Audio hosting: Scripts use tmpfiles.org for one-off calls (60 min TTL). For scheduled calls, server.py serves audio at
/audio/<file> via the tunnel - localtunnel: Free, no account needed. ngrok requires a free account + authtoken
- Interactive mode latency: ~3-5s per turn (ElevenLabs TTS + GPT + audio upload). Normal for phone conversations
phone-caller
通过Twilio进行AI驱动的外呼电话,由ElevenLabs提供语音,可选实时GPT驱动的对话功能。
两种模式
模式1:单向消息 — 使用ElevenLabs生成音频,上传后在Twilio通话中播放。简单、快速,无需服务器。
模式2:交互式对话 — 启动server.py,通过webhook URL发起通话。AI实时监听回复(Twilio STT)、思考(GPT)并回话(ElevenLabs)。通话结束后通过iMessage自动发送摘要。
所需凭证(环境变量)
bash
ELEVENLABSAPIKEY # 来自 elevenlabs.io
TWILIOACCOUNTSID # 来自 console.twilio.com(以 AC... 开头)
TWILIOAUTHTOKEN # 来自 console.twilio.com
TWILIOPHONENUMBER # 你的Twilio号码,例如 +12025551234
OPENAIAPIKEY # 用于交互模式的大脑
模式1:单向通话
bash
python3 scripts/onewaycall.py \
--to +13105551234 \
--text 嘿!打电话只是想道个早安。 \
--voice tyepWYJJwJM9TTFIg5U7 # 可选,默认为Clara(澳大利亚女声)
查看 references/voices.md 获取精选语音ID列表。
模式2:交互式对话
第1步 — 启动隧道(Twilio需要此隧道才能访问你的服务器)
bash
npx localtunnel --port 5050 --subdomain my-caller
记下URL:https://my-caller.loca.lt
第2步 — 启动服务器
bash
export CLARA
PUBLICURL=https://my-caller.loca.lt
python3 scripts/server.py
第3步 — 发起通话
bash
python3 scripts/interactive_call.py \
--to +13105551234 \
--url https://my-caller.loca.lt \
--persona 你正在给一家餐厅打电话,预订今晚8点两个人的桌位。 \
--opening 你好!我想预订今晚8点左右两个人的位置。请问还有空位吗?
通话结束时,GPT生成的摘要会自动通过iMessage发送到 MASTER_PHONE 环境变量指定的号码。
定时通话
使用macOS cron进行定时通话:
bash
添加到crontab — 此示例在早上8:45发起通话
crontab -e
45 8 24 2 * python3 /path/to/scripts/one
waycall.py --to +1... --text 早上好! >> /tmp/call.log 2>&1
语音选择
- - 默认语音:Clara tyepWYJJwJM9TTFIg5U7 — 澳大利亚女声,温暖、清晰、专业
- 查看 references/voices.md 获取包含ID和描述的完整精选列表
关键说明
- - Twilio试用账户:只能拨打已验证的号码。升级或在 console.twilio.com → 已验证主叫ID 中验证号码
- 音频托管:脚本使用tmpfiles.org进行一次性通话(60分钟TTL)。对于定时通话,server.py通过隧道在 /audio/ 提供音频服务
- localtunnel:免费,无需注册。ngrok需要免费账户+authtoken
- 交互模式延迟:每轮约3-5秒(ElevenLabs TTS + GPT + 音频上传)。电话通话中属于正常范围