← Work|LiveSelf-Hosted · 2026

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.

Frigate TTS main page

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

Interested?

Get in Touch →