All Stories
2026-09-094 min read

Video · Moderation · UGC · Whisper · TableModel · Multimodal AI · Pixeltable Cloud

SafeStream: UGC Video Moderation as One Row, Two Signals

Extract audio, transcribe, flag the transcript, sample frames, then fold both into a risk level. Pixeltable is the video graph — not a fake NSFW API plus a queue.

Pierre Brunelle

Pierre Brunelle

Pixeltable Team

Summary: SafeStream is the UGC gate: an upload is one row. Audio comes off the file. Whisper writes a transcript. Gemini (or a small UDF) flags language. Frames at 1 fps get visual labels. A parent UDF folds both into risk_level. You do not buy a mystery NSFW API and a review queue as two vendors. You declare the graph. pip install pixeltable.

The Product#

  • Ingest a creator clip with upload_id
  • Speech path: extract audio → transcribe → flag the text
  • Vision path: 1 fps frames with a short visual label
  • One parent column: ok / review / high

The kitchen-sink tutorial is video intelligence — frames plus audio, not a risk rollup. If you need a real ordered aggregate across frames, that pattern is PixelGolf UDA aggregation. This post’s fold is a UDF on the parent, not a fake classifier name.

The Stitch You Delete#

Object store. A speech job. A vision job. A spreadsheet of scores you reconcile in ops. Pixeltable is the video, the transcript, the frame labels, and the fold. Insert the MP4. The gate follows.

The Receipt#

python

risk_level is the parent fold: transcript flags plus a video-level visual summary. Frames is the audit trail — one label per sampled second — not a second vendor. A UDF that greps high / review is honest about what it is. Ordered sport metrics across frames are PixelGolf. Same app.py on Cloud: db → schema → service.

What This Is Not#

Not a hosted trust-and-safety suite. Not a named NSFW model we do not ship. Not legal advice. Your policy text goes in the prompts; the catalog stores the evidence. Human review still exists — that is the review bucket.

People Also Ask#

Why not aggregate frame labels into the parent? Cross-table rollup is the PixelGolf post. SafeStream keeps the fold as a UDF on signals the parent already has, plus a view you can inspect.

Can I swap Gemini for a local UDF? Yes. Keep the column names. Change the function.

How do I go to Cloud? Same file. PIXELTABLE_API_KEY, pxt://org:db, then pxt db updatepxt schema updatepxt service update.

Two Signals, One Gate#

Declare the upload. Extract audio. Label frames. Fold the risk. Keep the evidence. Delete the mystery API.

Declarative. Multimodal. Incremental.

Focus on innovation, not infrastructure.

10-minute tutorial · Join community