All Stories
2026-09-09•4 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

View as Markdown

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 update → pxt schema update → pxt service update.

Is this an AI automation workflow? Yes. Insert the upload; transcript and frame labels run as columns. The category is AI automation workflow.

Two Signals, One Gate#

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

Declarative. Multimodal. Incremental.

One Python file for tables, indexes, and HTTP. Start locally, or sign up for Cloud.

Get started

Docs quickstart · 10-minute tutorial · GitHub · Discord