Meeting Notes Agent

Turn a meeting recording into structured notes and a Q&A agent

Turn a meeting recording into a concise summary, action items, and a follow-up Q&A agent using three stock primitives.

Diagram

🎙️ Audio

📝 Transcript

🧠 Summary + Actions

💬 Q&A

Quick Start

  1. Simple Usage

    Transcribe a recording, then produce notes.

    python
    from praisonaiagents import Agent, AudioAgent
    
    transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")
    
    notes = Agent(
        name="Meeting Notetaker",
        instructions="Produce a concise summary, key decisions, and action items with owners.",
    ).start(f"Transcript:\n\n{transcript}")
    
    print(notes)
  2. Add Q&A

    Save the transcript to disk and index it so an agent can answer follow-up questions.

    python
    with open("meeting_transcript.txt", "w") as f:
        f.write(transcript)
    
    qa = Agent(
        name="Meeting Q&A",
        instructions="Answer using only the indexed meeting transcript. Cite what was said.",
        knowledge=["meeting_transcript.txt"],
    )
    print(qa.start("What were the action items and who owns them?"))

How It Works

Three primitives run in sequence: transcribe, summarise, then answer questions.

Diagram
Agent (Q&A)Agent (Notetaker)AudioAgentUserAgent (Q&A)Agent (Notetaker)AudioAgentUsertranscribe(“meeting.mp3”)transcript textstart(transcript)summary + action itemsstart(“Who owns each action?”)grounded answer
StagePrimitivePurpose
TranscribeAudioAgent.transcribe()Convert audio to text (Whisper / any LiteLLM STT provider)
SummariseAgent(...).start()Extract summary, decisions, action items
Q&AAgent(knowledge=[...])RAG over the transcript for follow-up questions

User Interaction Flow

Drop a recording into the folder, run the script, read the notes, then keep asking questions.

python
from praisonaiagents import Agent, AudioAgent

transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")

with open("meeting_transcript.txt", "w") as f:
    f.write(transcript)

qa = Agent(
    name="Meeting Q&A",
    instructions="Answer using only the indexed meeting transcript.",
    knowledge=["meeting_transcript.txt"],
)

while True:
    question = input("\nAsk about the meeting (or 'quit'): ")
    if question.strip().lower() in {"quit", "exit"}:
        break
    print(qa.start(question))

Full Example

The complete script composes all three primitives end to end.

Full script

python
from praisonaiagents import Agent, AudioAgent

TRANSCRIPT_PATH = "meeting_transcript.txt"


def transcribe_meeting(audio_path: str) -> str:
    """Convert a meeting recording to text with Whisper."""
    audio = AudioAgent(llm="openai/whisper-1")
    return audio.transcribe(audio_path)


def write_notes(transcript: str) -> str:
    """Summarise the transcript into notes and action items."""
    notetaker = Agent(
        name="Meeting Notetaker",
        instructions=(
            "Produce a concise summary, key decisions, and action items with "
            "owners and due dates. Only use what is in the transcript."
        ),
    )
    return notetaker.start(f"Transcript:\n\n{transcript}")


def build_qa_agent(transcript: str) -> Agent:
    """Index the transcript so an agent can answer follow-up questions."""
    with open(TRANSCRIPT_PATH, "w") as f:
        f.write(transcript)

    return Agent(
        name="Meeting Q&A",
        instructions="Answer using only the indexed meeting transcript. Cite what was said.",
        knowledge=[TRANSCRIPT_PATH],
    )


def main():
    transcript = transcribe_meeting("meeting.mp3")

    print("=== Notes ===")
    print(write_notes(transcript))

    qa = build_qa_agent(transcript)
    print("\n=== Q&A ===")
    print(qa.start("What were the action items and who owns them?"))


if __name__ == "__main__":
    main()

Shortened

python
from praisonaiagents import Agent, AudioAgent

transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")

print(Agent(
    name="Meeting Notetaker",
    instructions="Summarise decisions and action items with owners.",
).start(f"Transcript:\n\n{transcript}"))

with open("meeting_transcript.txt", "w") as f:
    f.write(transcript)

qa = Agent(name="Meeting Q&A", knowledge=["meeting_transcript.txt"])
print(qa.start("What were the action items and who owns them?"))

Choosing an STT Provider

Pass the provider string to AudioAgent(llm=...). Start with Whisper, switch for speed or accuracy.

Diagram

Default, accurate

Fastest

Real-time / diarization

Need?

openai/whisper-1

groq/whisper-large-v3

deepgram/nova-2

See Audio Overview, Groq, and Deepgram for setup and exact model strings.


Common Patterns

Save notes, batch a folder, or persist memory across meetings.

Save to Markdown

python
from praisonaiagents import Agent, AudioAgent

transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")
notes = Agent(
    name="Meeting Notetaker",
    instructions="Summarise decisions and action items with owners.",
).start(f"Transcript:\n\n{transcript}")

with open("notes.md", "w") as f:
    f.write(notes)

Batch a directory

python
import glob
from praisonaiagents import Agent, AudioAgent

audio = AudioAgent(llm="openai/whisper-1")

for path in glob.glob("recordings/*.mp3"):
    transcript = audio.transcribe(path)
    transcript_file = path.replace(".mp3", ".txt")
    with open(transcript_file, "w") as f:
        f.write(transcript)

    qa = Agent(name="Meeting Q&A", knowledge=[transcript_file])
    print(path, "->", qa.start("Summarise the action items."))

Persist with Memory

python
from praisonaiagents import Agent, AudioAgent

transcript = AudioAgent(llm="openai/whisper-1").transcribe("meeting.mp3")

with open("meeting_transcript.txt", "w") as f:
    f.write(transcript)

qa = Agent(
    name="Meeting Q&A",
    instructions="Answer from the transcript and remember past meetings.",
    knowledge=["meeting_transcript.txt"],
    memory=True,
)
print(qa.start("How does this meeting compare to last week's?"))

See Memory to persist context across meetings.


Best Practices

Keep the transcript on disk

knowledge=[...] indexes files by path, so write the transcript to disk before passing it.

Match the model to the task

Use a cheaper LLM for summarising long transcripts and a stronger one for Q&A accuracy.

Redact PII before persisting

Meeting audio often contains personal data — strip sensitive details before saving transcripts.

Instruct the notetaker clearly

Tell the notetaker to use only the transcript so it does not invent action items.


Related