All Stories
2026-09-093 min read

Audio · Whisper · Sales Intelligence · LLM · TableModel · Multimodal AI · Pixeltable Cloud

CallSense: Sales-Call Intelligence Without a Transcription Fleet

Ingest MP3s, transcribe on insert, extract objections and competitors, search past calls. Whisper and the LLM are columns. The index follows the transcript.

Pierre Brunelle

Pierre Brunelle

Pixeltable Team

Summary: CallSense is what a revenue-intelligence lead asks for: every uploaded call becomes a transcript, a summary, objections, competitor names, and a sentiment score — then managers search “pricing” or competitor X across the library. Whisper is not a fleet. The LLM is not a second DAG. Both are columns. Insert the audio. The rest follows. pip install pixeltable.

The Product#

  • Store the recording with call_id, rep, account
  • Transcribe on insert
  • Extract summary, pain points, competitors, sentiment (1–10)
  • Search past calls by what was said

The Whisper-only tutorial is OpenAI Whisper integration. Parallel batching at scale is a different post. This one is the call object: audio plus structured judgment.

The Stitch You Delete#

S3 for the WAV. A worker that calls Whisper. Another worker that calls GPT. A CRM field you paste into. Postgres plus pgvector for “find the pricing objection.” Pixeltable is one table. The Whisper post already argued transcription as a column. CallSense is that column plus the extract and the index.

The Receipt#

python

“Find calls where they brought up pricing or competitor X” is search_calls('pricing concerns') or search_calls('Acme'). The embedding is on the transcript; the JSON is for the manager’s card. Same file on Cloud: pxt db updatepxt schema updatepxt service update.

What This Is Not#

Not Gong. Not diarization as a product. Not a CRM. Auth and deal TPV stay where they are. The recording graph — bytes, transcript, extract, search — is the table.

People Also Ask#

Which Whisper? model='base' matches the homepage. Swap the model string; the column stays.

Why JSON in a UDF? Gemini returns text. parse_insights is the typed object you query. If the model emits garbage, you still have the raw column.

How do I go to Cloud? Same app.py. PIXELTABLE_API_KEY, pxt://org:db, then db → schema → service.

Listen Once, Query Forever#

Insert the MP3. Read the transcript. Search the library. Do not stand up a transcription fleet to get there.

Declarative. Multimodal. Incremental.

Focus on innovation, not infrastructure.

10-minute tutorial · Join community