Use case · Phone bots
Speech-to-text for phone bots
Phone audio is narrow, compressed and often noisy, and callers hang up on bots that pause too long. Wire-1, Saidwire's real-time English speech-to-text model, takes 8 kHz telephone audio as it arrives from your phone system, with no transcoding, and returns the final transcript fast. On phone-codec audio in Coval's STT benchmark, its mean time to final segment was 38 ms; overall 50 ms p95, 1st of 29 on mean time to final segment (30-day window to Nov 9, 2026). Source: Coval model page, 30-day window to Nov 9, 2026, 2,857 samples, US-hosted endpoint. Add your own network round trip. Method and how to reproduce.
Send phone audio as it is
Most phone systems and media streams deliver 8 kHz μ-law (North America, Japan) or A-law (most other countries). Tell the API which, and send the bytes unchanged:
wss://api.saidwire.com/v1/listen?encoding=mulaw&sample_rate=8000&interim_results=true&punctuate=true
wss://api.saidwire.com/v1/listen?encoding=alaw&sample_rate=8000&interim_results=true&punctuate=true
Each stream is one channel. For a two-party call, open one stream per side, usually just the caller.
Bridge a media stream
A minimal bridge: your phone system sends base64 μ-law frames over a WebSocket; you forward the raw bytes to Saidwire and read transcripts back.
# pip install websockets (Python 3.10+)
import asyncio, base64, json, os
from websockets.asyncio.client import connect
SAIDWIRE = ("wss://api.saidwire.com/v1/listen?encoding=mulaw&sample_rate=8000"
"&interim_results=true&punctuate=true&endpointing=500&redact=pci,ssn")
async def bridge(call_ws): # call_ws: the media WebSocket from your phone system
headers = {"Authorization": f"Token {os.environ['SAIDWIRE_API_KEY']}"}
async with connect(SAIDWIRE, additional_headers=headers) as stt:
async def transcripts():
async for raw in stt:
m = json.loads(raw)
if m.get("type") == "Results" and m["is_final"]:
await on_caller_said(m["channel"]["alternatives"][0]["transcript"],
end_of_turn=m.get("speech_final", False))
task = asyncio.create_task(transcripts())
async for msg in call_ws:
frame = json.loads(msg)
if frame.get("event") == "media":
await stt.send(base64.b64decode(frame["media"]["payload"]))
elif frame.get("event") == "stop":
break
await stt.send(json.dumps({"type": "CloseStream"}))
await task
The field names in frame depend on your phone system; the Saidwire side stays the same. Already on Vapi? Use the custom transcriber instead.
Options for phone bots
| parameter | what it does |
|---|---|
redact=pci,ssn,phone,email | masks card numbers, Social Security numbers, phone numbers and email addresses before they reach you (or redact=true for all four). A strong filter, not a compliance guarantee on its own |
numerals=true | writes numbers as digits in finals: "$25", "555-123-4567", account numbers |
keyterm= | your company, product and street names, spelled your way |
endpointing= | the pause, in ms, that ends a caller's turn (minimum 500), or send Finalize from your own detector |
Cost
120 free hours with no card and no deadline, up to 4 streams at once, then $0.25 per audio hour, billed per second. Usage is the seconds of audio you send. A free KeepAlive message holds a quiet stream open.
Questions
Do I have to convert μ-law to PCM?
No. Send 8 kHz μ-law or A-law bytes as they arrive with encoding=mulaw or encoding=alaw.
How fast is it on phone audio?
Mean time to final segment on phone-codec audio was 38 ms on Coval's STT benchmark (30-day window to Nov 9, 2026). Add your network round trip.
Can it hide card numbers?
Yes, with redact=pci (or redact=true). Treat it as a strong filter, not your only PCI control.
How many calls at once?
Trial keys allow 4 streams at once. Ask support for more.
Questions or stuck? Email support@saidwire.com with the request ID from the failed call.
Pipecat, LiveKit, Vapi, OpenAI and the other names on this page belong to their respective owners. They are named only to describe compatibility; no partnership or endorsement is implied. Coval benchmark figures are from Coval's public model page; Coval does not endorse Saidwire.