Integration · Pipecat
Saidwire speech-to-text for Pipecat
pipecat-saidwire is a Pipecat STT service for Wire-1, Saidwire's real-time English speech-to-text model. It streams your user's audio over a WebSocket, pushes interim transcripts while they speak and a final transcript when they stop. When your VAD decides the user has finished, the service sends Finalize and the final comes straight back, so turn-taking doesn't wait on a server-side pause.
On production Pipecat voice-agent audio in Coval's STT benchmark, Wire-1's mean time to final segment was 34 ms (30-day window to Nov 9, 2026). Overall: 50 ms p95, 1st of 29 on mean time to final segment. 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.
| you need | |
|---|---|
| Pipecat | Python 3.11+, Pipecat 1.x |
| Saidwire API key | sk_live_... from saidwire.com/dev (120 free hours, no card) |
1. Install
pip install pipecat-saidwire
export SAIDWIRE_API_KEY=sk_live_...
2. Add it to your pipeline
Already have a Pipecat bot? Replace your current STT service with the stt = ... line. Nothing else changes.
from pipecat.pipeline.pipeline import Pipeline
from pipecat_saidwire import SaidwireSTTService
stt = SaidwireSTTService() # reads SAIDWIRE_API_KEY
pipeline = Pipeline(
[
transport.input(),
stt,
user_aggregator,
llm,
tts,
transport.output(),
assistant_aggregator,
]
)
3. Options
stt = SaidwireSTTService(
api_key="...", # default: $SAIDWIRE_API_KEY
sample_rate=None, # default: the pipeline's input rate (8000-48000)
settings=SaidwireSTTService.Settings(
endpointing=None, # server default; False = finals only from Finalize / long pauses
interim_results=True,
punctuate=True,
),
vad_force_finalize=True, # VADUserStoppedSpeakingFrame -> Finalize (recommended)
warmup_timeout=300.0,
)
How it behaves in a pipeline
| Pipecat | Saidwire |
|---|---|
InputAudioRawFrame | streamed as 16-bit PCM at the pipeline's input rate (8-48 kHz) |
InterimTranscriptionFrame | interim results while the user is speaking |
TranscriptionFrame | final result for an utterance; its words won't change |
VADUserStoppedSpeakingFrame | sends Finalize; the final comes back right away |
EndFrame | sends CloseStream, then closes |
| muted or idle | a KeepAlive holds the stream open (silence would be billed as audio) |
Dropped connections reconnect with backoff. A bad or revoked key, or used-up credit, is reported once as a permanent error, with no retry loop. stt.request_id is the ID of the current stream; include it when you contact support.
Source and listing
- Package: pypi.org/project/pipecat-saidwire
- Source, examples and tests: github.com/SaidwireLLC/pipecat-saidwire (BSD 2-Clause, the same license as Pipecat)
- The package is built and maintained by Saidwire. A listing in Pipecat's own docs is in review.
Questions
Does it work with my existing Pipecat bot?
Yes. Swap your STT service for SaidwireSTTService(); transports, LLM and TTS stay the same.
How do I get the lowest latency?
Keep vad_force_finalize=True (the default). When your VAD says the user stopped, the service sends Finalize and the final transcript returns right away instead of waiting for a server-side pause.
What does it 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. Muted or idle time is held open with free KeepAlive messages.
Which languages?
English only.
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.