Голосовой звонок (плагин)
Голосовые звонки для OpenClaw через плагин. Поддерживает исходящие уведомления и многооборотные разговоры с политиками входящих.
Текущие провайдеры:
- twilio (Programmable Voice + Media Streams)
- telnyx (Call Control v2)
- plivo (Voice API + XML transfer + GetInput speech)
- mock (разработка/без сети)
Быстрая ментальная модель:
- Установить плагин
- Перезапустить Gateway
- Настроить в plugins.entries.voice-call.config
- Использовать openclaw voicecall ... или инструмент voice_call
Где он работает (локально vs удаленно)
Плагин голосовых звонков работает внутри процесса Gateway.
Если вы используете удаленный Gateway, установите/настройте плагин на машине, запускающей Gateway, затем перезапустите Gateway, чтобы загрузить его.
Установка
Вариант A: установка из npm (рекомендуется)
openclaw plugins install @openclaw/voice-call
Перезапустите Gateway после этого.
Вариант B: установка из локальной папки (разработка, без копирования)
openclaw plugins install ./extensions/voice-call
cd ./extensions/voice-call && pnpm install
Перезапустите Gateway после этого.
Конфигурация
Установите конфигурацию в plugins.entries.voice-call.config:
{
plugins: {
entries: {
"voice-call": {
enabled: true,
config: {
provider: "twilio", // или "telnyx" | "plivo" | "mock"
fromNumber: "+15550001234",
toNumber: "+15550005678",
twilio: {
accountSid: "ACxxxxxxxx",
authToken: "..."
},
plivo: {
authId: "MAxxxxxxxxxxxxxxxxxxxx",
authToken: "..."
},
// Webhook-сервер
serve: {
port: 3334,
path: "/voice/webhook"
},
// Публичный доступ (выберите один)
// publicUrl: "https://example.ngrok.app/voice/webhook",
// tunnel: { provider: "ngrok" },
// tailscale: { mode: "funnel", path: "/voice/webhook" }
outbound: {
defaultMode: "notify" // notify | conversation
},
streaming: {
enabled: true,
streamPath: "/voice/stream"
}
}
}
}
}
}
Примечания:
- Twilio/Telnyx требуют публично доступный URL webhook.
- Plivo требует публично доступный URL webhook.
- mock - это локальный провайдер для разработки (без сетевых вызовов).
- skipSignatureVerification только для локального тестирования.
- Если вы используете бесплатный уровень ngrok, установите publicUrl на точный URL ngrok; проверка подписи всегда применяется.
- tunnel.allowNgrokFreeTierLoopbackBypass: true разрешает webhooks Twilio с недействительными подписями только когда tunnel.provider="ngrok" и serve.bind - loopback (локальный агент ngrok). Используйте только для локальной разработки.
- URL бесплатного уровня Ngrok могут меняться или добавлять промежуточное поведение; если publicUrl расходится, подписи Twilio будут неудачными. Для продакшена предпочтите стабильный домен или Tailscale funnel.
TTS для звонков
Голосовой звонок использует основную конфигурацию messages.tts (OpenAI или ElevenLabs) для потоковой речи на звонках. Вы можете переопределить её в конфигурации плагина с той же формой — она глубоко объединяется с messages.tts.
{
tts: {
provider: "elevenlabs",
elevenlabs: {
voiceId: "pMsXgVXv3BLzUgSXRplE",
modelId: "eleven_multilingual_v2"
}
}
}
Примечания:
- Edge TTS игнорируется для голосовых звонков (телефонному аудио нужен PCM; вывод Edge ненадежен).
- Основной TTS используется, когда включен медиа-стриминг Twilio; иначе звонки возвращаются к нативным голосам провайдера.
Больше примеров
Использовать только основной TTS (без переопределения):
{
messages: {
tts: {
provider: "openai",
openai: { voice: "alloy" }
}
}
}
Переопределить на ElevenLabs только для звонков (сохранить основное по умолчанию в других местах):
{
plugins: {
entries: {
"voice-call": {
config: {
tts: {
provider: "elevenlabs",
elevenlabs: {
apiKey: "elevenlabs_key",
voiceId: "pMsXgVXv3BLzUgSXRplE",
modelId: "eleven_multilingual_v2"
}
}
}
}
}
}
}
Переопределить только модель OpenAI для звонков (пример глубокого объединения):
{
plugins: {
entries: {
"voice-call": {
config: {
tts: {
openai: {
model: "gpt-4o-mini-tts",
voice: "marin"
}
}
}
}
}
}
}
Входящие звонки
Политика входящих по умолчанию disabled. Чтобы включить входящие звонки, установите:
{
inboundPolicy: "allowlist",
allowFrom: ["+15550001234"],
inboundGreeting: "Здравствуйте! Чем могу помочь?"
}
Автоответы используют систему агента. Настройте с помощью:
- responseModel
- responseSystemPrompt
- responseTimeoutMs
CLI
openclaw voicecall call --to "+15555550123" --message "Привет от OpenClaw"
openclaw voicecall continue --call-id <id> --message "Есть вопросы?"
openclaw voicecall speak --call-id <id> --message "Один момент"
openclaw voicecall end --call-id <id>
openclaw voicecall status --call-id <id>
openclaw voicecall tail
openclaw voicecall expose --mode funnel
Инструмент агента
Имя инструмента: voice_call
Действия:
- initiate_call (message, to?, mode?)
- continue_call (callId, message)
- speak_to_user (callId, message)
- end_call (callId)
- get_status (callId)
Этот репозиторий поставляется с соответствующим документом навыка в skills/voice-call/SKILL.md.
Gateway RPC
- voicecall.initiate (to?, message, mode?)
- voicecall.continue (callId, message)
- voicecall.speak (callId, message)
- voicecall.end (callId)
- voicecall.status (callId)