Specialized12 min read

Meeting Intelligence: Transcripts, Attendees & Topics

Extract insights from meetings and calls. Learn transcription, speaker identification, entity extraction from transcripts, and meeting search patterns.

Meeting recordings contain critical decisions, action items, and context. Graphlit transcribes audio/video, extracts entities (attendees, topics), and makes meetings searchable.

What You'll Learn

  • Audio/video transcription
  • Speaker identification
  • Entity extraction (attendees, action items)
  • Meeting search patterns
  • Building meeting summaries

Part 1: Transcription Workflow

import { Graphlit } from 'graphlit-client';
import {
  FilePreparationServiceTypes,
  EntityExtractionServiceTypes,
  ObservableTypes,
  EnrichmentServiceTypes
} from 'graphlit-client/dist/generated/graphlit-types';

const graphlit = new Graphlit();

// Meeting transcription + entity extraction + summary
const meetingWorkflow = await graphlit.createWorkflow({
  name: "Meeting Intelligence",
  preparation: {
    jobs: [{
      connector: {
        type: FilePreparationServiceTypes.ModelAudio  // Transcribe
      }
    }]
  },
  extraction: {
    jobs: [{
      connector: {
        type: EntityExtractionServiceTypes.ModelText,
        extractedTypes: [
          ObservableTypes.Person,   // Attendees
          ObservableTypes.Event,    // Mentioned meetings
          ObservableTypes.Product,  // Products discussed
          ObservableTypes.Organization
        ]
      }
    }]
  },
  enrichment: {
    jobs: [{
      connector: {
        type: EnrichmentServiceTypes.ModelSummarization,
        prompt: "Summarize: meeting topic, key decisions, action items, attendees."
      }
    }]
  }
});

Part 2: Ingest Meeting Recording

// Ingest Zoom/Teams recording
const meeting = await graphlit.ingestUri(
  'https://example.com/meeting-recording.mp4',
  'Q4 Planning Meeting',
  undefined,
  undefined,
  undefined,
  { id: meetingWorkflow.createWorkflow.id }
);

// Wait for transcription
let isDone = false;
while (!isDone) {
  const status = await graphlit.isContentDone(meeting.ingestUri.id);
  isDone = status.isContentDone.result;
  await new Promise(r => setTimeout(r, 5000));
}

console.log('✓ Meeting transcribed and analyzed');

Part 3: Extract Meeting Insights

// Get meeting content
const content = await graphlit.getContent(meeting.ingestUri.id);

// Transcript
const transcript = content.content.pages?.[0]?.chunks?.map(c => c.text).join('\n');
console.log('Transcript:', transcript);

// Summary
console.log('Summary:', content.content.summary);

// Extracted entities
const attendees = content.content.observations?.filter(
  obs => obs.type === ObservableTypes.Person
);
console.log('Attendees:', attendees?.map(a => a.observable.name));

const topics = content.content.observations?.filter(
  obs => obs.type === ObservableTypes.Product
);
console.log('Topics discussed:', topics?.map(t => t.observable.name));

Part 4: Search Meetings

import { ContentTypes, FileTypes } from 'graphlit-client/dist/generated/graphql-types';

// Search meeting transcripts
const results = await graphlit.queryContents({
  search: 'budget allocation',
  filter: {
    types: [ContentTypes.File],
    fileTypes: [FileTypes.Audio, FileTypes.Video]
  }
});

results.contents.results.forEach(meeting => {
  console.log(meeting.name);
  console.log('Duration:', meeting.audio?.duration || meeting.video?.duration);
});

Part 5: Meeting RAG

// Chat with meeting history
const conversation = await graphlit.createConversation('Meeting Assistant');

const response = await graphlit.promptConversation(
  'What were the key decisions in the Q4 planning meeting?',
  conversation.createConversation.id
);

console.log(response.promptConversation?.message?.message);

Production Patterns

Auto-Generate Meeting Notes

// After meeting transcription
const content = await graphlit.getContent(meetingId);

const notes = `
# ${content.content.name}

**Summary:**
${content.content.summary}

**Attendees:**
${content.content.observations
  ?.filter(o => o.type === ObservableTypes.Person)
  .map(p => `- ${p.observable.name}`)
  .join('\n')}

**Topics Discussed:**
${content.content.observations
  ?.filter(o => o.type === ObservableTypes.Product)
  .map(p => `- ${p.observable.name}`)
  .join('\n')}
`;

console.log(notes);

Related Guides

Ready to Build with Graphlit?

Start building AI-powered applications with our API-first platform. Free tier includes 100 credits/month — no credit card required.

No credit card required • 5 minutes to first API call

Meeting Intelligence: Transcripts, Attendees & Topics | Graphlit Developer Guides