ws (and only for the optional WebSocket variant).
Architecture: the browser never talks to Rime directly. Your API key stays server-side, and the browser calls your own /api/tts route:
Prerequisites
- A Rime API key from the API Tokens page — put it in
.env.localasRIME_API_KEY=... - A Next.js 14+ project using the App Router (
npx create-next-app@latestdefaults work)
1. Server: the TTS proxy route
Createapp/api/tts/route.ts (or src/app/api/tts/route.ts if your project uses src/):
app/api/tts/route.ts
test.mp3 should be playable audio. If you get a 401, check that RIME_API_KEY is set in .env.local and the dev server was restarted after adding it.
2. Client: mic in, Rime audio out
Createapp/voice-agent/page.tsx. It uses the browser’s built-in SpeechRecognition for input (Chrome/Edge/Safari), a stub respond() function as the agent brain, and your /api/tts route for the voice:
app/voice-agent/page.tsx
http://localhost:3000/voice-agent, click Speak, say something, and the agent answers in Rime’s astra voice.
3. Optional: stream over WebSockets
The HTTP route above is the right default for most apps. Switch to WebSockets when you want incremental synthesis — audio starts playing while the rest of the sentence is still being generated — or barge-in handling with word-level timestamps. Two things make the WebSocket setup different:- Rime’s WebSocket endpoints authenticate with an
Authorizationheader, which browser WebSockets cannot send — so the bridge must live on your server. (This is also what keeps your key off the client.) - Next.js route handlers can’t hold WebSocket connections, so you need a small custom server.
ws, then create server.mjs in the project root:
server.mjs
dev/start scripts at it:
package.json
/ws3 message schema — chunk, timestamps, done, error events and the flush/clear/eos operations — is in the Coda WebSocket reference, and the WebSocket overview explains segmentation and interruption patterns.
Next steps
WebSocket API overview
Endpoints, word-level timestamps, context IDs, and interruption handling.
Voices
Swap
astra for any Coda voice across six languages.Streaming formats
Choose between Opus, MP3, WAV, PCM, and μ-law for your latency budget.
LiveKit & Pipecat
Building on an agent framework? Use the ready-made Rime plugins instead.

