From 2a0093987d6780dc297940dd6992e28517c98278 Mon Sep 17 00:00:00 2001 From: James Walker Date: Tue, 28 Jul 2026 17:01:56 +0100 Subject: [PATCH 1/8] initial commit, add twilio integration docs page and basic rundown --- docs/integrations-and-sdks/index.mdx | 11 ++ docs/integrations-and-sdks/sidebar.ts | 5 + docs/integrations-and-sdks/twilio.mdx | 189 ++++++++++++++++++++++++++ 3 files changed, 205 insertions(+) create mode 100644 docs/integrations-and-sdks/twilio.mdx diff --git a/docs/integrations-and-sdks/index.mdx b/docs/integrations-and-sdks/index.mdx index 4dbabda5..e182c162 100644 --- a/docs/integrations-and-sdks/index.mdx +++ b/docs/integrations-and-sdks/index.mdx @@ -44,7 +44,18 @@ Choose an integration to build accurate, low-latency voice agents rapidly with t +## Telephony integrations +Bridge phone calls into Speechmatics for real-time transcription. + + + } + href="/integrations-and-sdks/twilio" + /> + ## SDKs diff --git a/docs/integrations-and-sdks/sidebar.ts b/docs/integrations-and-sdks/sidebar.ts index bdfb9c26..68496997 100644 --- a/docs/integrations-and-sdks/sidebar.ts +++ b/docs/integrations-and-sdks/sidebar.ts @@ -19,6 +19,11 @@ export default { id: "integrations-and-sdks/vapi", label: "Vapi", }, + { + type: "doc", + id: "integrations-and-sdks/twilio", + label: "Twilio", + }, { type: "doc", id: "integrations-and-sdks/sdks", diff --git a/docs/integrations-and-sdks/twilio.mdx b/docs/integrations-and-sdks/twilio.mdx new file mode 100644 index 00000000..1f8ff7aa --- /dev/null +++ b/docs/integrations-and-sdks/twilio.mdx @@ -0,0 +1,189 @@ +--- +title: Twilio integration +description: Learn how to transcribe live Twilio Voice calls with Speechmatics Realtime using a small, forkable proxy server. +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Twilio integration + +:::info +This is a **reference implementation** — you clone it, run it, and adapt it. It's not a hosted service or a Twilio Marketplace add-on. +::: + +[Twilio](https://www.twilio.com) lets you make and receive phone calls from your code. Its [Media Streams](https://www.twilio.com/docs/voice/media-streams) feature sends a live copy of any call's audio to a URL you control — perfect for real-time transcription, without touching the call itself. + +This guide walks you through a small proxy that takes that audio stream and feeds it into Speechmatics Realtime, printing per-speaker transcripts to your console as the call unfolds. The [reference repo](https://github.com/speechmatics/speechmatics-twilio-integration) ships the same proxy in two languages — [Python](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/python) and [Node.js](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/js) — so pick whichever fits your team. + +## How it works + +Here's what runs where before we get to the commands: + +```mermaid +flowchart LR + A["📞 Caller A"] <-->|voice| T["Twilio"] + T <-->|voice| B["📞 Caller B"] + T -.->|copy of audio
μ-law 8 kHz| P["Proxy
proxy.py / proxy.ts"] + P -->|Realtime WebSocket| S["Speechmatics
Realtime API"] + S -->|per-speaker transcripts| C["Your console"] +``` + +- **Caller A** dials your Twilio number which forwards to **Caller B** — the two talk like a direct call. +- Twilio sends a **live copy of the audio** to your proxy over a WebSocket. +- The proxy hands that audio to Speechmatics with [channel diarization](/speech-to-text/features/diarization) turned on. +- Each speaker (`inbound` from Caller A, `outbound` from Caller B) gets its own transcript stream. +- Speechmatics returns transcripts, and the proxy prints them under per-channel labels. + +Everything runs on your machine. [ngrok](https://ngrok.com) gives Twilio a public URL to reach you. + +## Before you begin + +Tick these off as you gather them: + + + +## Clone the reference repo + +Both implementations live in one repo. Clone it and change into the folder: + +```bash +git clone https://github.com/speechmatics/speechmatics-twilio-integration.git +cd speechmatics-twilio-integration +``` + +Inside, you'll find a [`python/`](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/python) folder and a [`js/`](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/js) folder alongside a shared [`.env.example`](https://github.com/speechmatics/speechmatics-twilio-integration/blob/main/.env.example) at the root. Both implementations read from the same `.env`, so you set your credentials once and can flip between languages freely. + +## Set your credentials + +Copy the template: + +```bash +cp .env.example .env +``` + +Open `.env` in your editor and the environment variables. The proxy won't run if any are missing. + +| Variable | What to put here | +|---|---| +| `SPEECHMATICS_API_KEY` | Your Speechmatics Realtime API key. | +| `NGROK_AUTHTOKEN` | Your ngrok auth token from the ngrok dashboard. | +| `TWILIO_ACCOUNT_SID` | Your Twilio Account SID — it starts with `AC`. | +| `TWILIO_AUTH_TOKEN` | Your Twilio Auth Token. | +| `TWILIO_PHONE_NUMBER` | Your Twilio number in E.164 form, e.g. `+442475429721`. | +| `FORWARD_TO_NUMBER` | The E.164 number the call bridges to — the second speaker. | + +## Install and run + + + + +Move into `python/` and set up a virtualenv: + +```bash +cd python +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +``` + +Start the proxy: + +```bash +python proxy.py +``` + + + + +Move into `js/` and install dependencies: + +```bash +cd js +npm install +``` + +Start the proxy: + +```bash +npm start +``` + + + + +You'll see a banner like this: + +``` +Listening on ws://localhost:5000/twilio +Twilio number +XX... pointed at wss://abc123.../twilio. Call it now. +``` + +## Make your first call + +With the proxy running, dial your Twilio number from any phone. + +1. Twilio answers the incoming call, plays the short greeting, then dials `FORWARD_TO_NUMBER`. +2. Answer the second phone. You're now on a normal two-way call. +3. Speak into either handset. Transcripts appear in the console within seconds: + +``` +[twilio] incoming Media Streams connection +[twilio] call started - stream=MZxxx... call=CAxxx... tracks=['inbound', 'outbound'] +[inbound ] Hello there. How are you doing today? +[outbound] I'm doing pretty well thanks. +[twilio] call stopped (stream=MZxxx...) +``` + +- **inbound** — whoever dialed your Twilio number. +- **outbound** — whoever answered `FORWARD_TO_NUMBER`. + +When you're done, press `Ctrl-C` in the terminal to stop the proxy. Your Twilio number's Voice URL stays pointed at the last ngrok tunnel — the next run overwrites it, so you never have to touch the Twilio Console after the first time. + +## What the proxy does under the hood + +Once a call arrives, the proxy has three jobs: + +1. **Receive Twilio's audio.** Twilio sends 20 ms of mulaw-encoded 8 kHz mono audio at a time — 160 bytes per frame. Each frame arrives on the WebSocket as a JSON `media` event with a base64 `payload` and a `track` label (`inbound` or `outbound`). The proxy uses that label to keep the two speakers apart. +2. **Forward the audio to Speechmatics as-is.** Speechmatics Realtime accepts mulaw 8 kHz directly, so the proxy passes bytes straight through without re-encoding. That keeps latency down and avoids audio-quality loss. +3. **Ask Speechmatics for per-channel transcripts.** The session is configured with `diarization: "channel"` and channel labels `["inbound", "outbound"]`. Every transcript that comes back carries a `channel` field, and the proxy prints it under the matching label. + +## Troubleshooting + +| Problem | What to try | +|---|---| +| **`Missing required env vars in .env: ...`** | Copy `.env.example` to `.env` at the repo root and fill in every listed value. Both languages read the same file. | +| **`Twilio number ... not found on this account`** | Check `TWILIO_PHONE_NUMBER` is in E.164 form (leading `+`, country code, no spaces) and belongs to the account whose SID and token you're using. | +| **Twilio Debugger shows `21219 - 'To' phone number not verified`** | Your Twilio account is in trial mode. Add `FORWARD_TO_NUMBER` at [Verified Caller IDs](https://console.twilio.com/us1/develop/phone-numbers/manage/verified), or upgrade the account. | +| **The caller hears "an application error has occurred"** | Open the [Twilio Debugger](https://console.twilio.com/us1/monitor/logs/debugger) for the specific error code. Confirm ngrok is still running and the URL in the startup banner matches your number's Voice URL in the Twilio Console. | +| **No transcripts appear** | Confirm you heard the "This call is being transcribed" greeting — that proves Twilio reached `/twiml`. If not, the proxy isn't reachable. If yes but transcripts still don't come through, double-check `SPEECHMATICS_API_KEY`. | + +Still stuck? See [Twilio support](https://support.twilio.com) or [contact Speechmatics](https://www.speechmatics.com/company/contact). + +## Next steps + +- [Learn about channel diarization](/speech-to-text/features/diarization) +- [Explore all supported languages](/speech-to-text/languages) +- [Read the Realtime API reference](/speech-to-text/realtime/quickstart) +- [Browse more integrations in the Speechmatics Academy](https://github.com/speechmatics/speechmatics-academy) From f1dca686088dd2f72751146bba51b7fa66b9ec25 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 3 Aug 2026 15:37:28 +0100 Subject: [PATCH 2/8] swap HTML checkbox for plain barkdown bullets --- docs/integrations-and-sdks/twilio.mdx | 31 ++++++--------------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/docs/integrations-and-sdks/twilio.mdx b/docs/integrations-and-sdks/twilio.mdx index 1f8ff7aa..e6a07f2e 100644 --- a/docs/integrations-and-sdks/twilio.mdx +++ b/docs/integrations-and-sdks/twilio.mdx @@ -39,30 +39,13 @@ Everything runs on your machine. [ngrok](https://ngrok.com) gives Twilio a publi ## Before you begin -Tick these off as you gather them: - - +You'll need: + +- A Speechmatics API key from the [Speechmatics portal](https://portal.speechmatics.com). +- A [Twilio account](https://www.twilio.com), a voice-capable Twilio phone number, your Account SID, and your Auth Token. +- A **second** phone number you own or have verified with Twilio to call. +- An [ngrok](https://ngrok.com) account and auth token. +- Python 3.9+ or Node.js 20+, depending on which implementation you pick. ## Clone the reference repo From bce9d4454f0d5bfbdf858ea7035095fb40742f11 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 3 Aug 2026 15:39:26 +0100 Subject: [PATCH 3/8] =?UTF-8?q?fix=20prose=20to=20use=20=CE=BC-law=20over?= =?UTF-8?q?=20mulaw?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/integrations-and-sdks/twilio.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/integrations-and-sdks/twilio.mdx b/docs/integrations-and-sdks/twilio.mdx index e6a07f2e..849c36ed 100644 --- a/docs/integrations-and-sdks/twilio.mdx +++ b/docs/integrations-and-sdks/twilio.mdx @@ -148,8 +148,8 @@ When you're done, press `Ctrl-C` in the terminal to stop the proxy. Your Twilio Once a call arrives, the proxy has three jobs: -1. **Receive Twilio's audio.** Twilio sends 20 ms of mulaw-encoded 8 kHz mono audio at a time — 160 bytes per frame. Each frame arrives on the WebSocket as a JSON `media` event with a base64 `payload` and a `track` label (`inbound` or `outbound`). The proxy uses that label to keep the two speakers apart. -2. **Forward the audio to Speechmatics as-is.** Speechmatics Realtime accepts mulaw 8 kHz directly, so the proxy passes bytes straight through without re-encoding. That keeps latency down and avoids audio-quality loss. +1. **Receive Twilio's audio.** Twilio sends 20 ms of μ-law-encoded 8 kHz mono audio at a time — 160 bytes per frame. Each frame arrives on the WebSocket as a JSON `media` event with a base64 `payload` and a `track` label (`inbound` or `outbound`). The proxy uses that label to keep the two speakers apart. +2. **Forward the audio to Speechmatics as-is.** Speechmatics Realtime accepts μ-law 8 kHz directly, so the proxy passes bytes straight through without re-encoding. That keeps latency down and avoids audio-quality loss. 3. **Ask Speechmatics for per-channel transcripts.** The session is configured with `diarization: "channel"` and channel labels `["inbound", "outbound"]`. Every transcript that comes back carries a `channel` field, and the proxy prints it under the matching label. ## Troubleshooting From 4400f848ab9a62379a218c59ceafbd158b52b66d Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 3 Aug 2026 15:40:51 +0100 Subject: [PATCH 4/8] change description to precisely mention per-caller transcripts --- docs/integrations-and-sdks/twilio.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations-and-sdks/twilio.mdx b/docs/integrations-and-sdks/twilio.mdx index 849c36ed..c81759d3 100644 --- a/docs/integrations-and-sdks/twilio.mdx +++ b/docs/integrations-and-sdks/twilio.mdx @@ -14,7 +14,7 @@ This is a **reference implementation** — you clone it, run it, and adapt it. I [Twilio](https://www.twilio.com) lets you make and receive phone calls from your code. Its [Media Streams](https://www.twilio.com/docs/voice/media-streams) feature sends a live copy of any call's audio to a URL you control — perfect for real-time transcription, without touching the call itself. -This guide walks you through a small proxy that takes that audio stream and feeds it into Speechmatics Realtime, printing per-speaker transcripts to your console as the call unfolds. The [reference repo](https://github.com/speechmatics/speechmatics-twilio-integration) ships the same proxy in two languages — [Python](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/python) and [Node.js](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/js) — so pick whichever fits your team. +This guide walks you through a small proxy that takes that audio stream and feeds it into Speechmatics Realtime, printing per-caller transcripts to your console as the call unfolds. The [reference repo](https://github.com/speechmatics/speechmatics-twilio-integration) ships the same proxy in two languages — [Python](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/python) and [Node.js](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/js) — so pick whichever fits your team. ## How it works From 7e48e8c0ff4d158b1ab68006a596b2448b8db7fa Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 3 Aug 2026 15:46:30 +0100 Subject: [PATCH 5/8] address trivi and minor points --- docs/integrations-and-sdks/twilio.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/integrations-and-sdks/twilio.mdx b/docs/integrations-and-sdks/twilio.mdx index c81759d3..c98468c7 100644 --- a/docs/integrations-and-sdks/twilio.mdx +++ b/docs/integrations-and-sdks/twilio.mdx @@ -1,6 +1,6 @@ --- title: Twilio integration -description: Learn how to transcribe live Twilio Voice calls with Speechmatics Realtime using a small, forkable proxy server. +description: Transcribe live Twilio Voice calls with Speechmatics Realtime using a small, forkable proxy server. --- import Tabs from '@theme/Tabs'; @@ -31,7 +31,7 @@ flowchart LR - **Caller A** dials your Twilio number which forwards to **Caller B** — the two talk like a direct call. - Twilio sends a **live copy of the audio** to your proxy over a WebSocket. -- The proxy hands that audio to Speechmatics with [channel diarization](/speech-to-text/features/diarization) turned on. +- The proxy hands that audio to Speechmatics with [channel diarization](/speech-to-text/features/diarization) turned on. - Each speaker (`inbound` from Caller A, `outbound` from Caller B) gets its own transcript stream. - Speechmatics returns transcripts, and the proxy prints them under per-channel labels. @@ -118,7 +118,7 @@ npm start You'll see a banner like this: -``` +```text Listening on ws://localhost:5000/twilio Twilio number +XX... pointed at wss://abc123.../twilio. Call it now. ``` @@ -131,7 +131,7 @@ With the proxy running, dial your Twilio number from any phone. 2. Answer the second phone. You're now on a normal two-way call. 3. Speak into either handset. Transcripts appear in the console within seconds: -``` +```text [twilio] incoming Media Streams connection [twilio] call started - stream=MZxxx... call=CAxxx... tracks=['inbound', 'outbound'] [inbound ] Hello there. How are you doing today? From bf9967175f1b81c44faf21b46999fdae941f799d Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 3 Aug 2026 16:06:08 +0100 Subject: [PATCH 6/8] fix broken image link --- static/img/integration-logos/twilio.png | Bin 0 -> 5773 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/integration-logos/twilio.png diff --git a/static/img/integration-logos/twilio.png b/static/img/integration-logos/twilio.png new file mode 100644 index 0000000000000000000000000000000000000000..6e98cb6bf1a458148348f43b44f6a35b97a74544 GIT binary patch literal 5773 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 LNkvXXu0mjfBjPfo literal 0 HcmV?d00001 From d341fa38597bc047702c0e83a97c9a181b2d732f Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 3 Aug 2026 16:11:00 +0100 Subject: [PATCH 7/8] change header to match how proxy works --- docs/integrations-and-sdks/twilio.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/integrations-and-sdks/twilio.mdx b/docs/integrations-and-sdks/twilio.mdx index c98468c7..b55197b9 100644 --- a/docs/integrations-and-sdks/twilio.mdx +++ b/docs/integrations-and-sdks/twilio.mdx @@ -16,7 +16,7 @@ This is a **reference implementation** — you clone it, run it, and adapt it. I This guide walks you through a small proxy that takes that audio stream and feeds it into Speechmatics Realtime, printing per-caller transcripts to your console as the call unfolds. The [reference repo](https://github.com/speechmatics/speechmatics-twilio-integration) ships the same proxy in two languages — [Python](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/python) and [Node.js](https://github.com/speechmatics/speechmatics-twilio-integration/tree/main/js) — so pick whichever fits your team. -## How it works +## How the proxy works Here's what runs where before we get to the commands: @@ -66,7 +66,7 @@ Copy the template: cp .env.example .env ``` -Open `.env` in your editor and the environment variables. The proxy won't run if any are missing. +Open `.env` in your editor and set the environment variables. The proxy won't run if any are missing. | Variable | What to put here | |---|---| From dac06a1594b92ab3bc37e94e4a71e6e2d9cf4d84 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 3 Aug 2026 16:11:53 +0100 Subject: [PATCH 8/8] point link to realtime api reference --- docs/integrations-and-sdks/twilio.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations-and-sdks/twilio.mdx b/docs/integrations-and-sdks/twilio.mdx index b55197b9..bd1805cb 100644 --- a/docs/integrations-and-sdks/twilio.mdx +++ b/docs/integrations-and-sdks/twilio.mdx @@ -168,5 +168,5 @@ Still stuck? See [Twilio support](https://support.twilio.com) or [contact Speech - [Learn about channel diarization](/speech-to-text/features/diarization) - [Explore all supported languages](/speech-to-text/languages) -- [Read the Realtime API reference](/speech-to-text/realtime/quickstart) +- [Read the Realtime API reference](/api-ref/realtime-transcription-websocket) - [Browse more integrations in the Speechmatics Academy](https://github.com/speechmatics/speechmatics-academy)