By codingjoe
Make and receive phone calls via AI agents: dial numbers, drive two-way conversations, deliver one-way TTS messages, transcribe incoming calls with Whisper, and echo speech back over SIP/RTP for testing.
Call a phone number and speak a one-way message, then hang up. Use when the user asks to call someone, deliver a voice message, announce something by phone, or send a spoken notification to a phone number. Also triggers on "phone someone", "call and tell", "read this over the phone".
Start a phone line that transcribes incoming call audio to text. Use when the user asks to transcribe a phone call, get a live transcript of a call, capture speech-to-text from a phone number, or convert call audio to text. Also triggers on "transcribe the call", "live transcript of incoming calls", "speech-to-text for phone".
Call a phone number and hold a two-way AI-driven conversation, returning the full transcript. Use when the user asks to call someone and talk to them, conduct a phone interview, have a conversation with a contact, or have an agent handle an outbound call. Also triggers on "call and talk to", "phone and have a conversation", "interview by phone", "agent call".
Start a phone line that echoes the caller's speech back to them after they finish speaking. Use when the user asks to set up an echo call, test a phone line by replaying speech, or mirror a caller's voice. Also triggers on "echo call", "echo my speech back", "test the phone line".
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
Documentation |
Issues |
Changelog |
Funding ♥
Async VoIP Python library for the AI age.
[!WARNING] This library is in early development and may contain breaking changes. Use with caution.
To get started, you will need a SIP account. One is usually included with ISP. Check your ISP's documentation or router for details.
You will need a SIP AOR (URI), which looks like this:
sip:USER:PASSWORD@SIP_SERVER
[!NOTE] This library defaults to UDP transport on port 5060 for
sip:URIs, which is the most widely supported configuration. To use TCP or TLS, add an explicittransportparameter, e.g.sip:user@host;transport=TCPorsips:user@host(SIPS always uses TLS on port 5061).
A simple echo call can be started with:
uvx 'voip[cli]' sip sip:alice:********@sip.example.com echo
Each command supports an optional --dial argument to initiate an
outbound call instead of waiting for an inbound one.
To dial a number, say a message, and hang up automatically:
uvx 'voip[cli]' sip sip:alice:********@sip.example.com say sip:[email protected] "Your package has arrived."
You can also talk to a local agent (needs Ollama):
uvx 'voip[cli]' sip sip:alice:********@sip.example.com agent --initial-prompt "Hi, I am looking for a Mr. Ron, first name Mo?"
The voip package ships a ready-made Model Context Protocol (MCP) server
that exposes tools to make phone calls on your behalf to any MCP client.
{
"mcpServers": {
"VoIP": {
"type": "stdio",
"command": "uvx",
"args": [
"voip[mcp]",
"mcp"
],
"env": {
"SIP_AOR": "sip:number:[email protected]"
}
}
}
}
uv add voip[audio,ai,pygments]
Subclass TranscribeCall and override transcription_received to handle results.
Pass it as session_class when answering an incoming call:
import asyncio
import dataclasses
from voip.ai import TranscribeCall
from voip.sip.protocol import SIP
from voip.sip.types import SipURI
from voip.sip.transactions import InviteTransaction
from voip.rtp import RealtimeTransportProtocol
from faster_whisper import WhisperModel
@dataclasses.dataclass(kw_only=True, slots=True)
class TranscribingCall(TranscribeCall):
def transcription_received(self, text) -> None:
print(text)
class TranscribeInviteTransaction(InviteTransaction):
def invite_received(self, request) -> None:
self.ringing()
self.answer(
session_class=TranscribingCall,
stt_model=WhisperModel("kyutai/stt-1b-en_fr-trfs", device="cuda"),
)
async def main():
loop = asyncio.get_running_loop()
_, rtp_protocol = await loop.create_datagram_endpoint(
RealtimeTransportProtocol,
local_addr=("0.0.0.0", 0),
)
await loop.create_connection(
lambda: SIP(
rtp=rtp_protocol,
aor=SipURI.parse("sip:alice:********@example.com"),
transaction_class=TranscribeInviteTransaction,
),
host="sip.example.com",
port=5060,
)
await asyncio.Future()
asyncio.run(main())
For raw audio access without transcription, subclass AudioCall and override
audio_received(self, audio: np.ndarray) instead.
npx claudepluginhub codingjoe/claude-plugins --plugin voipRegular Expression Linter — write your own linting rules using regular expressions. Skills for running relint and authoring new rules.
Auto-upgrade JavaScript and TypeScript syntax to new ECMAScript features based on browser support.
Naming conventions for classes, functions, variables, tests, time, abbreviations, units, and more. Use when writing or reviewing code to keep names clear and consistent.
CodingJoe's digital clone following his coding guidelines and best practices.
Standalone image generation plugin using Nano Banana MCP server. Generates and edits images, icons, diagrams, patterns, and visual assets via Gemini image models. No Gemini CLI dependency required.
Memory compression system for Claude Code - persist context across sessions
Streamline people operations — recruiting, onboarding, performance reviews, compensation analysis, and policy guidance. Maintain compliance and keep your team running smoothly.
Create content, plan campaigns, and analyze performance across marketing channels. Maintain brand voice consistency, track competitors, and report on what's working.
Write feature specs, plan roadmaps, and synthesize user research faster. Keep stakeholders updated and stay ahead of the competitive landscape.
Prospect, craft outreach, and build deal strategy faster. Prep for calls, manage your pipeline, and write personalized messaging that moves deals forward.