Frigate TTS
Source: github.com/iangabrielsanchez/frigate-tts
Frigate watches my kids while I work. This is the small web app that speaks through my cameras - type a message, or hold a button and talk. Built on Node.js and TypeScript with no framework, from a Friday idea to working by Monday.

Problem
My cameras - two Tapo C200s and a C210 - already had two-way talk in Tapo’s own app, but reaching for my phone to say something when I was already looking at them on my computer was the whole hassle. Frigate’s built-in two-way talk wasn’t any better: it clips the start or end of messages, and it isn’t push-to-talk - you click to start, talk, then click to stop.
Solution
- Push-to-talk - the app slices the mic into ~0.7s chunks but go2rtc wants a continuous stream, so I bridge the two with a named pipe whose WAV header declares an oversized length, making ffmpeg treat it as open-ended. Each decoded chunk is written in and go2rtc plays it as it arrives - audio reaches the camera about a second after the button goes down. A record-then-send mode trades that latency for cleaner audio.
- Typed messages take a simpler route: text -> Piper (offline TTS) -> ffmpeg (leading/trailing silence) -> PCMA -> go2rtc. Piper runs offline on purpose - if there’s downtime, I’m the one who has to fix it.
- Mic over HTTPS - browsers block the microphone on plain HTTP, so a Caddy sidecar serves HTTPS with a self-signed cert, and the app installs as a PWA so it opens full-screen from a home screen icon.
- A shared LAN - anyone who can reach the port can talk through the cameras, so it’s built with basic auth, a per-minute leaky-bucket rate limit, and a soundboard that only plays files already on disk - no uploads, no path traversal.
Features
- Type-to-speak with Piper, plus an in-app browser that downloads voices on demand.
- Hold-to-talk in two modes: live (starts within about a second) and record-then-send (cleaner audio).
- Quick replies and a soundboard for audio files already in the sounds folder.
- Broadcast to every camera at once.
- Settings for the go2rtc URL, cameras, voice, padding, history, and push-to-talk mode.
- Installable PWA with basic auth and a rate limit.
Tech Stack
- TypeScript
- Node.js (built-in http module, no framework)
- Frigate / go2rtc
- Piper (offline TTS)
- Docker
- PWA
Status
Live
Category
Self-Hosted · 2026
Tech Stack
TypeScriptNode.jsFrigatePiperDockerPWA
Source
Star on GitHub →Interested?
Get in Touch →