Skip to content

Transcription: turn meetings into searchable knowledge

Transcription records spoken audio — captured live in the browser or uploaded as a file — runs it through OpenAI Whisper, and turns it into searchable, domain-tagged text that becomes part of your organisation's institutional memory.

It's the bridge between what was said and what was decided: once tagged with a domain, a transcript is searchable by HERC, queryable across the platform, and (over time) linkable to the decisions and events that came out of it.

EngineOpenAI Whisper
CaptureLive browser · File upload
File cap25 MB
Completion gateName + ≥1 domain tag

When to choose this

  • Capture a meeting in real time


    Open the recording session, hit Record; the browser uploads audio chunks every ~10 seconds and the platform transcribes them as you go.

  • Process a pre-recorded file


    Upload an mp3, mp4, m4a, wav, webm, or ogg (≤25 MB) — one Whisper call, one transcript.

  • Make spoken decisions discoverable


    A planning call, a customer interview, a steering committee — once tagged with a domain, HERC can answer "what decisions were made in Finance last quarter?".

  • Convert a transcript into events


    Tagged transcripts can seed Events rows automatically — capturing the what / when / why of a decision in a structured way.

When not to reach for Transcription

  • Compliance recordings → use a regulated recording vendor.
  • Voice-to-action automation → this is capture, not command.
  • Audio outside the supported formats → convert first and keep below 25 MB per file.

How it works

A capture flow feeds audio to Whisper, Whisper returns text, you tag it with a domain, and the stored transcript becomes searchable everywhere the platform reaches.

flowchart LR
    B["Record in browser<br/>WebM · ~10s chunks"] --> W
    U["Upload a file<br/>mp3 · mp4 · m4a · wav · webm · ogg (≤25 MB)"] --> W
    W(["OpenAI Whisper<br/>speech to text"]) --> T["Tag with a domain<br/>Finance · HR · Sales · …"]
    T --> S[("Searchable transcript<br/>stored in your tenant")]
    S --> H["HERC<br/>'what was decided in Finance?'"]
    S --> P["Platform search<br/>+ Organisation DNA"]
    classDef accent fill:#ff8400,stroke:#e67700,color:#ffffff,font-weight:600;
    class W accent

Figure 1 — The transcription pipeline. Either capture mode hands audio to Whisper; the returned text is tagged with a domain, stored in your tenant's database, and becomes searchable by HERC and across the platform.

The platform supports two capture flows — pick per source:

Live recording (chunked). The browser records WebM audio in ~10 s chunks and POSTs each chunk to the API. Each chunk is transcribed by Whisper independently, with the previous chunk's tail passed as a context prompt so word boundaries stay consistent. The transcript appears in real time as chunks complete. The session stays in recording state until you stop, then moves to draft. Requires microphone permission.

File upload. A single audio file (≤25 MB) is sent to Whisper in one call — no chunking, one transcript returned at the end. The session lands directly in draft state with the full transcript populated — no recording step. Pass the optional language field to force a specific transcription language. No microphone needed.

Both flows leave you with a draft session whose full transcript is populated and ready to finish. You then:

  • Name the session (mandatory).
  • Add ≥1 domain tag from the catalog tags (mandatory — this is what makes the transcript discoverable across the org).
  • Optionally edit the transcript — fix proper nouns, jargon, names. The word-confidence heatmap highlights where Whisper was uncertain so editing is targeted.
  • Click Complete. The session moves from draft to completed and the transcript is searchable.

Why teams reach for this

Spoken decisions usually evaporate the moment the call ends. Transcription keeps them as text, and the mandatory domain tag drops each one into a discoverable bucket — so a call from last quarter is a search away, not a lost memory.

What Transcription looks like

Surface Where What you see
Sessions list /ai/transcription Tabs: Active, Archived. Each row: name, created, duration, last word count, tags. Search box across name + transcript text.
Session detail — Recording /ai/transcription/{id} (during recording) Live transcript building, audio level indicator, Stop recording.
Session detail — Editor /ai/transcription/{id} (draft state) Full transcript with word-level confidence heatmap — hover any word to see Whisper's confidence; inline edit. Required: name + ≥1 domain tag before completing.
File upload view /ai/transcription → Upload file Pick an audio file, optional language, drop into Whisper for one-shot transcription.

Setup — what an admin needs to do once

Prereq Where Why
AI provider with Whisper-compatible model /admin/integrations → AI Provider Keys OpenAI key required for Whisper. The same key powers HERC.
Domain tags seeded /admin/system-tables → Tags (or /glossary Domains) Sessions must be tagged with at least one domain. The platform seeds Finance, HR, Sales, Marketing, Legal, Engineering, Operations, Product.
Roles /rolegroups aimodule.transcription.run to create sessions and upload audio.
Browser permissions Per-user The user must grant microphone access to use live recording (file upload doesn't need it).

Session lifecycle

A session is captured — recorded live or uploaded — lands in draft, and is completed once it has a name and at least one domain tag. Completed sessions can be archived (soft-delete) and restored — there is no permanent delete from the UI.

flowchart LR
    B["Record in browser<br/>live capture"] --> R["Recording<br/>transcript building"]
    U["Upload a file<br/>one Whisper call"] --> DR["Draft<br/>awaiting name + tag"]
    R -- "Stop recording" --> DR
    DR --> G{"Name + ≥1 domain tag?"}
    G -- "not yet" --> DR
    G -- "Complete" --> D["Completed<br/>searchable"]
    D --> A["Archived<br/>hidden, data kept"]
    A -- "Restore" --> D
    classDef accent fill:#ff8400,stroke:#e67700,color:#ffffff,font-weight:600;
    class G accent

Figure 2 — A session's lifecycle. Browser capture records first, then drops to draft when you stop; an upload lands in draft straight away. The completion gate (name + at least one domain tag) is the one hard stop; archiving hides a completed session without deleting its data, and *Restore* brings it back.

What archiving does — and doesn't

Archiving is a soft-delete: the row is hidden from default lists but the data stays. Archived sessions appear in the Archived tab with a Restore action. Reasons to archive: the conversation was casual / off-topic, the session was a duplicate, or you're cleaning up but want a 90-day undo window. There is no permanent delete from the UI — sensitive transcripts must be deleted at the database level by an admin via the audit-supervised process.

Tagging matters

The completion gate (must have name + ≥1 domain tag) is intentional. Untagged transcripts are noise — they exist but no one can find them. The domain tag puts each transcript into a discoverable bucket, so HERC can answer:

  • "What decisions were made in Finance last quarter?"
  • "Find recent transcripts mentioning churn."
  • "Show me the Strategy call from May."

Pick the domain (or domains) that match the call's subject. You can update tags later if you mis-tag.

Tag for the question you'll ask later

Tag by the subject people will search on, not by who was in the room. A tag is what turns a private recording into an answer HERC can surface across the org.

Word-confidence heatmap

Whisper returns per-word confidence values (in verbose_json mode). The editor renders these as underline shading so you can edit exactly where the model was unsure:

Underline Meaning What to do
Solid High confidence Leave it.
Dashed / faded Whisper was uncertain Edit if the word is wrong.
None Confidence wasn't returned (legacy chunk) —

Once you edit a word, the underline clears for that word and the surrounding context is marked as user-corrected. Editing doesn't re-run Whisper; it stores your text alongside the original.

Teach Whisper your vocabulary

The heatmap shows you where Whisper was unsure. Glossary linking fixes why: link a mis-heard phrase to a Business Glossary term once, and every future recording in the session biases toward your domain vocabulary. The full walkthrough lives on Teach transcription your domain vocabulary.

How transcripts become events

This is the killer cross-module workflow: a completed transcript can seed structured, governed Events rows.

flowchart LR
    T["Completed transcript"] --> X["Extract events"]
    X --> AI(["AI agent reads transcript<br/>proposes Events"])
    AI --> RV{"Review each<br/>accept · edit · skip"}
    RV -- "accept" --> EV[("Events module rows<br/>governed · searchable · taggable")]
    RV -- "skip" --> DR["Left out"]
    classDef accent fill:#ff8400,stroke:#e67700,color:#ffffff,font-weight:600;
    class AI accent

Figure 3 — From a completed transcript, the AI agent proposes Events (title, type, impact level, and the relevant excerpt); you accept, edit, or skip each one, and accepted suggestions become first-class Events rows.

  1. Open the session → Extract events.
  2. The platform's AI agent reads the transcript and proposes one or more Events (decisions, milestones, market observations) with title, type, impact level, and the relevant excerpt.
  3. Review each suggestion → accept, edit, or skip.
  4. Accepted suggestions become rows in the Events module — first-class, governed, searchable, taggable.

Result: spoken decisions become structured organisational memory automatically.

Limitations

Limit Why Workaround
Per-file upload cap is 25 MB. Whisper's API limit. Split long recordings, or use the live recording flow which chunks for you.
Only OpenAI Whisper is supported as the speech-to-text engine. Quality + cost. Other engines may be added; for now, OpenAI is required.
Live recording uses WebM and requires a modern browser. The chunked flow needs the MediaRecorder API. Chrome / Edge / Firefox supported. Safari has partial support.
Word-confidence heatmap is for the original chunk. Edits override but the original confidence is what shows. Edits clear the highlight for those words.
No speaker diarisation. Whisper doesn't return speakers natively. Edit speaker labels manually if needed.
No real-time translation. The model transcribes in the spoken language. Pass the optional language field on file upload to force a specific transcription language; translate afterwards.
Transcripts are user-scoped — only the creator sees them in the list. Privacy default. Tag and complete a session, then promote to events for org-wide visibility.

Audit & compliance

Question a CISO might ask Where to look
"Where does the audio physically go?" The audio is sent to OpenAI's Whisper endpoint for transcription, then discarded. The transcript text + word confidences are stored in your tenant's PostgreSQL. Audio is not retained by Datahub.
"Are transcripts searchable across users?" Only by their creator in the UI, but tagged transcripts feed HERC and the DNA graph (which respect role gates). Promote to events for explicit cross-org visibility.
"Can the AI access transcripts of meetings I wasn't part of?" No — agent calls are scoped to the user's JWT; transcripts are user-scoped. The DNA graph indexes transcripts but answers are filtered by viewer role.
"How do we delete a transcript permanently?" Archive then admin-delete via the audit-supervised flow. Sensitive transcripts can also be deleted by an admin running a row-level deletion against aimodule.transcriptions.
"Did the AI process this audio anywhere we don't expect?" OpenAI Whisper, calling the endpoint configured in /admin/integrations. No other vendor.

Troubleshooting

Symptom Likely cause Fix
Microphone permission denied Browser blocked the request. Grant in browser settings; reload.
Live transcript is delayed Slow upload bandwidth. Wait — chunks are async.
File upload says "File too large" >25 MB. Split or compress.
Transcript is in the wrong language Whisper auto-detect failed. Re-upload with the explicit language form field.
Complete button is greyed Missing name or no domain tag. Add a name; pick at least one tag.
Many words show as low confidence Background noise, accent, or domain-specific jargon. Edit; consider a quieter recording environment, or link the terms via glossary linking.
Domain tag picker is empty Tags system table not seeded. Admin → /admin/system-tables → Tags → confirm domain tags exist.

See also

  • Teach your domain vocabulary


    Link phrases to glossary terms so Whisper gets your names, acronyms, and jargon right.

  • Events


    Promote a transcript's decisions into governed, searchable events.

  • HERC


    Ask "find decisions about churn in Finance" to navigate transcripts conversationally.

  • Business Glossary


    Terms, domains, synonyms — the vocabulary glossary linking draws from.

  • Organisation DNA


    The knowledge graph that indexes tagged transcripts, filtered by viewer role.

  • AI platform


    Provider keys, model settings, and observability for Whisper calls.