WEBVTT

00:00:00.000 --> 00:00:02.752
Most company blogs are a C M S bolted

00:00:02.786 --> 00:00:05.468
to a theme. This one is a product demo

00:00:05.526 --> 00:00:08.800
you can read. Every post is narrated by WAVE

00:00:08.847 --> 00:00:11.773
Voice , served from the edge, kept fresh by

00:00:11.831 --> 00:00:14.918
a pipeline, and wired so that everything connects to

00:00:15.011 --> 00:00:18.750
everything else. If a primitive works here, it works

00:00:18.808 --> 00:00:21.037
for a customer — that's the whole point of

00:00:21.107 --> 00:00:24.334
dogfooding. The blog runs on the same platform we

00:00:24.392 --> 00:00:28.084
sell: WAVE Voice for narration, Cloudflare Workers at the

00:00:28.165 --> 00:00:31.428
edge, and an agent-payable A P I behind it.

00:00:31.939 --> 00:00:36.397
Nothing here is a special case. The voice. Press

00:00:36.455 --> 00:00:38.707
play on any post and a real voice reads

00:00:38.754 --> 00:00:41.865
it — four narrators to choose from, at 192

00:00:41.912 --> 00:00:47.426
kbps. That's WAVE Voice , the same synthesis engine

00:00:47.461 --> 00:00:50.468
we expose as a product. The player is custom:

00:00:50.712 --> 00:00:54.206
a scrubber, speed control, a live waveform that dances

00:00:54.241 --> 00:00:56.552
with the audio, and a ring on the active

00:00:56.586 --> 00:01:00.452
narrator that pulses with their actual loudness. Hit play

00:01:00.568 --> 00:01:03.517
and try the speed control — the in-article highlight

00:01:03.587 --> 00:01:08.091
keeps pace, frame-accurate, at any rate. The pipeline that

00:01:08.138 --> 00:01:11.133
keeps it honest. Here's the part that matters for

00:01:11.191 --> 00:01:14.500
a real product: when the words change, the audio

00:01:14.570 --> 00:01:18.041
has to change too — but only then. Every

00:01:18.111 --> 00:01:21.362
post's spoken text is hashed. A change to the

00:01:21.408 --> 00:01:24.810
text changes the hash, which marks exactly that post

00:01:24.880 --> 00:01:29.117
stale, which re-synthesizes exactly that post — and nothing

00:01:29.175 --> 00:01:32.240
else. So we never re-spend a token on audio

00:01:32.298 --> 00:01:35.932
that didn't change. The same hash drives the cache-busting

00:01:35.979 --> 00:01:39.392
version on every media U R L and the

00:01:39.438 --> 00:01:42.712
that search and answer engines read — one signal,

00:01:42.828 --> 00:01:46.904
propagated everywhere. A customer narrating a knowledge base has

00:01:46.962 --> 00:01:49.899
the same problem: keep the audio in sync with

00:01:49.934 --> 00:01:53.022
the text without re-rendering the world on every edit.

00:01:53.626 --> 00:01:56.366
This freshness gate is the answer — and it's

00:01:56.389 --> 00:02:00.244
a few hundred lines, not a service. Read along,

00:02:00.313 --> 00:02:05.073
two ways. The narration ships with word-level timestamps, so

00:02:05.143 --> 00:02:08.858
captions and a karaoke highlight track the voice exactly.

00:02:09.555 --> 00:02:12.260
Scroll past the player while it's talking and the

00:02:12.295 --> 00:02:14.582
captions follow you to a dock at the bottom

00:02:14.628 --> 00:02:16.962
of the screen — with the waveform and a

00:02:16.997 --> 00:02:19.748
speed control — so you never lose your place.

00:02:21.351 --> 00:02:25.147
It's all connected. Mentions of WAVE products and protocols

00:02:25.217 --> 00:02:28.108
auto-link to where you read more. N D I

00:02:28.375 --> 00:02:31.974
, Web R T C , x four-oh-two —

00:02:32.334 --> 00:02:34.807
the first time each appears, it becomes a link

00:02:34.865 --> 00:02:38.150
to the post or spoke that explains it. Tags

00:02:38.208 --> 00:02:42.191
filter the index. Nothing is an island. Every post

00:02:42.237 --> 00:02:45.430
embeds Jason L D with an (the narration) and

00:02:45.476 --> 00:02:49.040
the full transcript, plus an and a machine-readable feed.

00:02:49.644 --> 00:02:51.711
A crawler or an answer engine can read the

00:02:51.745 --> 00:02:55.228
post, hear it, or quote the transcript — without

00:02:55.275 --> 00:03:00.348
scraping. The edge. The whole thing is one Cloudflare

00:03:00.383 --> 00:03:04.586
Worker. Pages render at the edge; the multi-voice audio

00:03:04.656 --> 00:03:10.054
lives in R2; the anonymous view/listen/download counts live in

00:03:10.101 --> 00:03:14.094
a single strongly-consistent Durable Object — no cookies, no

00:03:14.153 --> 00:03:19.052
accounts, just counts. WAVE Dispatch even summarized each post

00:03:19.145 --> 00:03:22.059
on WAVE's own local inference to produce the "key

00:03:22.129 --> 00:03:27.528
moments" in the sidebar. Build the same thing. Everything

00:03:27.586 --> 00:03:30.302
here is a primitive you can call. Narrate your

00:03:30.360 --> 00:03:33.449
own content with WAVE Voice; move video over any

00:03:33.507 --> 00:03:36.386
transport through one A P I; let an agent

00:03:36.444 --> 00:03:40.380
pay per call. Narrate your own content Move video

00:03:40.449 --> 00:03:44.165
over any transport The blog is the proof. psst

00:03:44.339 --> 00:03:45.976
— try the Konami code

