{"id":209,"date":"2026-03-21T22:47:22","date_gmt":"2026-03-21T14:47:22","guid":{"rendered":"https:\/\/pa.yingzhi8.cn\/index.php\/2026\/03\/21\/plugins-voice-call\/"},"modified":"2026-03-21T23:08:57","modified_gmt":"2026-03-21T15:08:57","slug":"plugins-voice-call","status":"publish","type":"post","link":"https:\/\/pa.yingzhi8.cn\/index.php\/2026\/03\/21\/plugins-voice-call\/","title":{"rendered":"Voice Call \u63d2\u4ef6"},"content":{"rendered":"<h1>Voice Call \u63d2\u4ef6<\/h1>\n<h1>Voice Call\uff08\u63d2\u4ef6\uff09<\/h1>\n<p>\u901a\u8fc7\u63d2\u4ef6\u4e3a OpenClaw \u63d0\u4f9b\u8bed\u97f3\u901a\u8bdd\u3002\u652f\u6301\u51fa\u7ad9\u901a\u77e5\u548c\u5e26\u6709\u5165\u7ad9\u7b56\u7565\u7684\u591a\u8f6e\u5bf9\u8bdd\u3002<\/p>\n<p>\u5f53\u524d\u63d0\u4f9b\u5546\uff1a<\/p>\n<ul>\n<li><code>twilio<\/code>\uff08Programmable Voice + Media Streams\uff09<\/li>\n<li><code>telnyx<\/code>\uff08Call Control v2\uff09<\/li>\n<li><code>plivo<\/code>\uff08Voice API + XML transfer + GetInput speech\uff09<\/li>\n<li><code>mock<\/code>\uff08\u5f00\u53d1\/\u65e0\u7f51\u7edc\uff09<\/li>\n<\/ul>\n<p>\u5feb\u901f\u5fc3\u667a\u6a21\u578b\uff1a<\/p>\n<ul>\n<li>\u5b89\u88c5\u63d2\u4ef6<\/li>\n<li>\u91cd\u542f Gateway \u7f51\u5173<\/li>\n<li>\u5728 <code>plugins.entries.voice-call.config<\/code> \u4e0b\u914d\u7f6e<\/li>\n<li>\u4f7f\u7528 <code>openclaw voicecall ...<\/code> \u6216 <code>voice_call<\/code> \u5de5\u5177<\/li>\n<\/ul>\n<h2>\u8fd0\u884c\u4f4d\u7f6e\uff08\u672c\u5730 vs \u8fdc\u7a0b\uff09<\/h2>\n<p>Voice Call \u63d2\u4ef6\u8fd0\u884c\u5728 <strong>Gateway \u7f51\u5173\u8fdb\u7a0b\u5185\u90e8<\/strong>\u3002<\/p>\n<p>\u5982\u679c\u4f60\u4f7f\u7528\u8fdc\u7a0b Gateway \u7f51\u5173\uff0c\u5728<strong>\u8fd0\u884c Gateway \u7f51\u5173\u7684\u673a\u5668<\/strong>\u4e0a\u5b89\u88c5\/\u914d\u7f6e\u63d2\u4ef6\uff0c\u7136\u540e\u91cd\u542f Gateway \u7f51\u5173\u4ee5\u52a0\u8f7d\u5b83\u3002<\/p>\n<h2>\u5b89\u88c5<\/h2>\n<h3>\u9009\u9879 A\uff1a\u4ece npm \u5b89\u88c5\uff08\u63a8\u8350\uff09<\/h3>\n<p>&#8220;`bash  theme={&#8220;theme&#8221;:{&#8220;light&#8221;:&#8221;min-light&#8221;,&#8221;dark&#8221;:&#8221;min-dark&#8221;}}<br \/>\nopenclaw plugins install @openclaw\/voice-call<\/p>\n<pre><code>\n\u4e4b\u540e\u91cd\u542f Gateway \u7f51\u5173\u3002\n\n### \u9009\u9879 B\uff1a\u4ece\u672c\u5730\u6587\u4ef6\u5939\u5b89\u88c5\uff08\u5f00\u53d1\uff0c\u4e0d\u590d\u5236\uff09\n\n```bash  theme={&quot;theme&quot;:{&quot;light&quot;:&quot;min-light&quot;,&quot;dark&quot;:&quot;min-dark&quot;}}\nopenclaw plugins install .\/extensions\/voice-call\ncd .\/extensions\/voice-call &amp;&amp; pnpm install\n<\/code><\/pre>\n<p>\u4e4b\u540e\u91cd\u542f Gateway \u7f51\u5173\u3002<\/p>\n<h2>\u914d\u7f6e<\/h2>\n<p>\u5728 <code>plugins.entries.voice-call.config<\/code> \u4e0b\u8bbe\u7f6e\u914d\u7f6e\uff1a<\/p>\n<p>&#8220;`json5  theme={&#8220;theme&#8221;:{&#8220;light&#8221;:&#8221;min-light&#8221;,&#8221;dark&#8221;:&#8221;min-dark&#8221;}}<br \/>\n{<br \/>\n  plugins: {<br \/>\n    entries: {<br \/>\n      &#8220;voice-call&#8221;: {<br \/>\n        enabled: true,<br \/>\n        config: {<br \/>\n          provider: &#8220;twilio&#8221;, \/\/ \u6216 &#8220;telnyx&#8221; | &#8220;plivo&#8221; | &#8220;mock&#8221;<br \/>\n          fromNumber: &#8220;+15550001234&#8221;,<br \/>\n          toNumber: &#8220;+15550005678&#8221;,<\/p>\n<pre><code>      twilio: {\n        accountSid: \"ACxxxxxxxx\",\n        authToken: \"...\",\n      },\n\n      plivo: {\n        authId: \"MAxxxxxxxxxxxxxxxxxxxx\",\n        authToken: \"...\",\n      },\n\n      \/\/ Webhook \u670d\u52a1\u5668\n      serve: {\n        port: 3334,\n        path: \"\/voice\/webhook\",\n      },\n\n      \/\/ \u516c\u5f00\u66b4\u9732\uff08\u9009\u4e00\u4e2a\uff09\n      \/\/ publicUrl: \"https:\/\/example.ngrok.app\/voice\/webhook\",\n      \/\/ tunnel: { provider: \"ngrok\" },\n      \/\/ tailscale: { mode: \"funnel\", path: \"\/voice\/webhook\" }\n\n      outbound: {\n        defaultMode: \"notify\", \/\/ notify | conversation\n      },\n\n      streaming: {\n        enabled: true,\n        streamPath: \"\/voice\/stream\",\n      },\n    },\n  },\n},\n<\/code><\/pre>\n<p>},<br \/>\n}<\/p>\n<pre><code>\n\u6ce8\u610f\u4e8b\u9879\uff1a\n\n* Twilio\/Telnyx \u9700\u8981**\u53ef\u516c\u5f00\u8bbf\u95ee**\u7684 webhook URL\u3002\n* Plivo \u9700\u8981**\u53ef\u516c\u5f00\u8bbf\u95ee**\u7684 webhook URL\u3002\n* `mock` \u662f\u672c\u5730\u5f00\u53d1\u63d0\u4f9b\u5546\uff08\u65e0\u7f51\u7edc\u8c03\u7528\uff09\u3002\n* `skipSignatureVerification` \u4ec5\u7528\u4e8e\u672c\u5730\u6d4b\u8bd5\u3002\n* \u5982\u679c\u4f60\u4f7f\u7528 ngrok \u514d\u8d39\u7248\uff0c\u5c06 `publicUrl` \u8bbe\u7f6e\u4e3a\u786e\u5207\u7684 ngrok URL\uff1b\u7b7e\u540d\u9a8c\u8bc1\u59cb\u7ec8\u5f3a\u5236\u6267\u884c\u3002\n* `tunnel.allowNgrokFreeTierLoopbackBypass: true` \u5141\u8bb8\u5e26\u6709\u65e0\u6548\u7b7e\u540d\u7684 Twilio webhooks\uff0c**\u4ec5\u5f53** `tunnel.provider=&quot;ngrok&quot;` \u4e14 `serve.bind` \u662f loopback\uff08ngrok \u672c\u5730\u4ee3\u7406\uff09\u65f6\u3002\u4ec5\u7528\u4e8e\u672c\u5730\u5f00\u53d1\u3002\n* Ngrok \u514d\u8d39\u7248 URL \u53ef\u80fd\u4f1a\u66f4\u6539\u6216\u6dfb\u52a0\u4e2d\u95f4\u9875\u9762\u884c\u4e3a\uff1b\u5982\u679c `publicUrl` \u6f02\u79fb\uff0cTwilio \u7b7e\u540d\u5c06\u5931\u8d25\u3002\u5bf9\u4e8e\u751f\u4ea7\u73af\u5883\uff0c\u4f18\u5148\u4f7f\u7528\u7a33\u5b9a\u57df\u540d\u6216 Tailscale funnel\u3002\n\n## \u901a\u8bdd\u7684 TTS\n\nVoice Call \u4f7f\u7528\u6838\u5fc3 `messages.tts` \u914d\u7f6e\uff08OpenAI \u6216 ElevenLabs\uff09\u8fdb\u884c\u901a\u8bdd\u4e2d\u7684\u6d41\u5f0f\u8bed\u97f3\u3002\u4f60\u53ef\u4ee5\u5728\u63d2\u4ef6\u914d\u7f6e\u4e0b\u4f7f\u7528**\u76f8\u540c\u7684\u7ed3\u6784**\u8986\u76d6\u5b83\u2014\u2014\u5b83\u4f1a\u4e0e `messages.tts` \u6df1\u5ea6\u5408\u5e76\u3002\n\n```json5  theme={&quot;theme&quot;:{&quot;light&quot;:&quot;min-light&quot;,&quot;dark&quot;:&quot;min-dark&quot;}}\n{\n  tts: {\n    provider: &quot;elevenlabs&quot;,\n    elevenlabs: {\n      voiceId: &quot;pMsXgVXv3BLzUgSXRplE&quot;,\n      modelId: &quot;eleven_multilingual_v2&quot;,\n    },\n  },\n}\n<\/code><\/pre>\n<p>\u6ce8\u610f\u4e8b\u9879\uff1a<\/p>\n<ul>\n<li><strong>\u8bed\u97f3\u901a\u8bdd\u5ffd\u7565 Edge TTS<\/strong>\uff08\u7535\u8bdd\u97f3\u9891\u9700\u8981 PCM\uff1bEdge \u8f93\u51fa\u4e0d\u53ef\u9760\uff09\u3002<\/li>\n<li>\u5f53\u542f\u7528 Twilio \u5a92\u4f53\u6d41\u65f6\u4f7f\u7528\u6838\u5fc3 TTS\uff1b\u5426\u5219\u901a\u8bdd\u56de\u9000\u5230\u63d0\u4f9b\u5546\u539f\u751f\u8bed\u97f3\u3002<\/li>\n<\/ul>\n<h3>\u66f4\u591a\u793a\u4f8b<\/h3>\n<p>\u4ec5\u4f7f\u7528\u6838\u5fc3 TTS\uff08\u65e0\u8986\u76d6\uff09\uff1a<\/p>\n<p>&#8220;`json5  theme={&#8220;theme&#8221;:{&#8220;light&#8221;:&#8221;min-light&#8221;,&#8221;dark&#8221;:&#8221;min-dark&#8221;}}<br \/>\n{<br \/>\n  messages: {<br \/>\n    tts: {<br \/>\n      provider: &#8220;openai&#8221;,<br \/>\n      openai: { voice: &#8220;alloy&#8221; },<br \/>\n    },<br \/>\n  },<br \/>\n}<\/p>\n<pre><code>\n\u4ec5\u4e3a\u901a\u8bdd\u8986\u76d6\u4e3a ElevenLabs\uff08\u5176\u4ed6\u5730\u65b9\u4fdd\u6301\u6838\u5fc3\u9ed8\u8ba4\uff09\uff1a\n\n```json5  theme={&quot;theme&quot;:{&quot;light&quot;:&quot;min-light&quot;,&quot;dark&quot;:&quot;min-dark&quot;}}\n{\n  plugins: {\n    entries: {\n      &quot;voice-call&quot;: {\n        config: {\n          tts: {\n            provider: &quot;elevenlabs&quot;,\n            elevenlabs: {\n              apiKey: &quot;elevenlabs_key&quot;,\n              voiceId: &quot;pMsXgVXv3BLzUgSXRplE&quot;,\n              modelId: &quot;eleven_multilingual_v2&quot;,\n            },\n          },\n        },\n      },\n    },\n  },\n}\n<\/code><\/pre>\n<p>\u4ec5\u4e3a\u901a\u8bdd\u8986\u76d6 OpenAI \u6a21\u578b\uff08\u6df1\u5ea6\u5408\u5e76\u793a\u4f8b\uff09\uff1a<\/p>\n<p>&#8220;`json5  theme={&#8220;theme&#8221;:{&#8220;light&#8221;:&#8221;min-light&#8221;,&#8221;dark&#8221;:&#8221;min-dark&#8221;}}<br \/>\n{<br \/>\n  plugins: {<br \/>\n    entries: {<br \/>\n      &#8220;voice-call&#8221;: {<br \/>\n        config: {<br \/>\n          tts: {<br \/>\n            openai: {<br \/>\n              model: &#8220;gpt-4o-mini-tts&#8221;,<br \/>\n              voice: &#8220;marin&#8221;,<br \/>\n            },<br \/>\n          },<br \/>\n        },<br \/>\n      },<br \/>\n    },<br \/>\n  },<br \/>\n}<\/p>\n<pre><code>\n## \u5165\u7ad9\u901a\u8bdd\n\n\u5165\u7ad9\u7b56\u7565\u9ed8\u8ba4\u4e3a `disabled`\u3002\u8981\u542f\u7528\u5165\u7ad9\u901a\u8bdd\uff0c\u8bbe\u7f6e\uff1a\n\n```json5  theme={&quot;theme&quot;:{&quot;light&quot;:&quot;min-light&quot;,&quot;dark&quot;:&quot;min-dark&quot;}}\n{\n  inboundPolicy: &quot;allowlist&quot;,\n  allowFrom: [&quot;+15550001234&quot;],\n  inboundGreeting: &quot;Hello! How can I help?&quot;,\n}\n<\/code><\/pre>\n<p>\u81ea\u52a8\u54cd\u5e94\u4f7f\u7528\u667a\u80fd\u4f53\u7cfb\u7edf\u3002\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u8c03\u6574\uff1a<\/p>\n<ul>\n<li><code>responseModel<\/code><\/li>\n<li><code>responseSystemPrompt<\/code><\/li>\n<li><code>responseTimeoutMs<\/code><\/li>\n<\/ul>\n<h2>CLI<\/h2>\n<p><code>bash  theme={\"theme\":{\"light\":\"min-light\",\"dark\":\"min-dark\"}}<br \/>\nopenclaw voicecall call --to \"+15555550123\" --message \"Hello from OpenClaw\"<br \/>\nopenclaw voicecall continue --call-id &lt;id&gt; --message \"Any questions?\"<br \/>\nopenclaw voicecall speak --call-id &lt;id&gt; --message \"One moment\"<br \/>\nopenclaw voicecall end --call-id &lt;id&gt;<br \/>\nopenclaw voicecall status --call-id &lt;id&gt;<br \/>\nopenclaw voicecall tail<br \/>\nopenclaw voicecall expose --mode funnel<\/code><\/p>\n<h2>\u667a\u80fd\u4f53\u5de5\u5177<\/h2>\n<p>\u5de5\u5177\u540d\u79f0\uff1a<code>voice_call<\/code><\/p>\n<p>\u64cd\u4f5c\uff1a<\/p>\n<ul>\n<li><code>initiate_call<\/code>\uff08message\u3001to?\u3001mode?\uff09<\/li>\n<li><code>continue_call<\/code>\uff08callId\u3001message\uff09<\/li>\n<li><code>speak_to_user<\/code>\uff08callId\u3001message\uff09<\/li>\n<li><code>end_call<\/code>\uff08callId\uff09<\/li>\n<li><code>get_status<\/code>\uff08callId\uff09<\/li>\n<\/ul>\n<p>\u6b64\u4ed3\u5e93\u5728 <code>skills\/voice-call\/SKILL.md<\/code> \u63d0\u4f9b\u4e86\u914d\u5957\u7684 skill \u6587\u6863\u3002<\/p>\n<h2>Gateway \u7f51\u5173 RPC<\/h2>\n<ul>\n<li><code>voicecall.initiate<\/code>\uff08<code>to?<\/code>\u3001<code>message<\/code>\u3001<code>mode?<\/code>\uff09<\/li>\n<li><code>voicecall.continue<\/code>\uff08<code>callId<\/code>\u3001<code>message<\/code>\uff09<\/li>\n<li><code>voicecall.speak<\/code>\uff08<code>callId<\/code>\u3001<code>message<\/code>\uff09<\/li>\n<li><code>voicecall.end<\/code>\uff08<code>callId<\/code>\uff09<\/li>\n<li><code>voicecall.status<\/code>\uff08<code>callId<\/code>\uff09<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Voice Call \u63d2\u4ef6 Voice Call\uff08\u63d2\u4ef6\uff09 \u901a\u8fc7\u63d2\u4ef6\u4e3a OpenClaw \u63d0\u4f9b\u8bed\u97f3\u901a\u8bdd\u3002\u652f\u6301\u51fa\u7ad9 [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-209","post","type-post","status-publish","format-standard","hentry","category-docs"],"_links":{"self":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts\/209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/comments?post=209"}],"version-history":[{"count":1,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts\/209\/revisions"}],"predecessor-version":[{"id":504,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/posts\/209\/revisions\/504"}],"wp:attachment":[{"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/media?parent=209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/categories?post=209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pa.yingzhi8.cn\/index.php\/wp-json\/wp\/v2\/tags?post=209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}