AI-Powered Meeting Minutes Automation
Manual meeting minutes consume 15–25% of participants' time. Companies lose up to 15% of their budget on ineffective meetings and manual note-taking. In a typical organization with 50 meetings per week, manual minutes take up to 20 person-hours, and up to 30% of tasks are lost or duplicated. Critical decisions get buried, deadlines slip, and accountability blurs. We solve this with a pipeline: audio recording → diarization → transcription → NLP extraction → structured minutes. It works in real time or post‑factum, integrates with Zoom, Google Meet, MS Teams, Slack, Jira, and Notion. Our solution achieves 2–3× better task extraction accuracy than off‑the‑shelf services thanks to custom NLP.
Problems Teams Face
- No single source of truth. Participants remember meetings differently. Decisions get re‑debated, tasks duplicated.
- Transcription without diarization. Simple services like Otter.ai don't separate speaker turns — the transcript is unreadable.
- Integration with task trackers. Even with a transcript, tasks must be entered into Jira/Notion by hand.
We close all three gaps. Our pipeline uses Whisper large‑v3 (Russian WER ~4.5% on clean recordings), pyannote.audio 3.1 for diarization (DER ~8% on multichannel conferences), and GPT‑4o for structure extraction. In sensitive scenarios we can deploy a local LLaMA 3 70B — confidential data never leaves the perimeter.
How We Customise AI Minutes for Your Infrastructure
A typical project takes 4–6 weeks and includes:
- Audit current meetings – collect sample recordings, identify patterns (stand‑ups, code reviews, one‑on‑ones).
- Choose the model – for short meetings (<1h) Whisper + GPT‑4o is enough; for long ones (3h+) we use VAD‑based chunking and parallel processing.
- Set up integrations – via Zoom Recording API, Google Workspace Events, Microsoft Graph. Output is a webhook that triggers the pipeline.
- Define the minutes format – Markdown for Confluence, custom templates for Notion, automatic task creation in Jira with deadlines from the transcript.
Real‑World Case
A fintech company with 200+ employees, weekly all‑hands for 150 people. Manual minutes took 8 person‑hours per week. We deployed the pipeline on their Kubernetes cluster with GPU T4. Results:
- Processing time for 1‑hour recording: 12 minutes (including diarization and NLP).
- Name recognition accuracy: 97% after fine‑tuning Whisper on corporate terms.
- Savings: 7 hours per week on minutes preparation alone.
Why Off‑the‑Shelf Solutions Fall Short
| Parameter | Off‑the‑shelf (Otter, Fireflies) | Our Solution |
|---|---|---|
| Diarization | DER 15–25% | DER <10% (pyannote 3.1) |
| Language support | Russian – basic, WER >15% | WER <5% on Russian |
| Jira integration | Only via Zapier | Native API, custom fields |
| Data residency | Cloud only | On‑premise or VPC |
| Fine‑tuning | None | LoRA for your vocabulary |
For startups with 5–10 meetings per week, off‑the‑shelf works. But for enterprises with confidential data, specialized terminology, and compliance requirements, our solution gives control and accuracy.
| Deployment Option | Performance | Security | Cost |
|---|---|---|---|
| Cloud (VPC) | High (GPU T4) | Data in isolated cloud | Predictable |
| On‑premise | Maximum (any GPU) | Full control | Investment + support |
| Hybrid | Balanced | Flexible | Custom |
What's Included in the Delivery
- Transcription + diarization pipeline – Python code with CUDA support, unit‑tested.
- NLP module for extracting decisions and tasks – prompts tested on 500+ transcripts.
- Integrations – input: Zoom/Teams/Google Meet; output: Notion/Confluence/Jira/Slack.
- Documentation – README, architecture diagram, operations manual.
- Team training – 2‑hour workshop.
- 3‑month warranty – bug fixes, adaptation to API updates.
Technical pipeline details
We use Whisper large‑v3 for transcription, pyannote.audio 3.1 for diarization, and GPT‑4o for NLP. The code is optimised for GPU T4/V100 and supports parallel processing of long recordings. All components are containerised and deployed via Docker Compose or Kubernetes.
Get a free project assessment. Contact us — we'll show you how to cut minutes time by 5–10×. Consult with our AI engineer.
Implementation Details
Transcription with Diarization
import whisper
from pyannote.audio import Pipeline
import torch
class MeetingTranscriber:
def __init__(self):
self.whisper = whisper.load_model("large-v3", device="cuda")
self.diarizer = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.1",
use_auth_token="HF_TOKEN"
)
def transcribe_with_speakers(self, audio_path: str) -> list[dict]:
diarization = self.diarizer(audio_path)
segments_by_speaker = [
{"speaker": turn.speaker, "start": turn.start, "end": turn.end}
for turn, _, _ in diarization.itertracks(yield_label=True)
]
result = self.whisper.transcribe(audio_path, language="ru", word_timestamps=True)
transcript = []
for seg in result["segments"]:
speaker = self._find_speaker(seg["start"], segments_by_speaker)
transcript.append({
"speaker": speaker,
"start": seg["start"],
"end": seg["end"],
"text": seg["text"].strip()
})
return transcript
def _find_speaker(self, timestamp: float, diar_segments: list) -> str:
for s in diar_segments:
if s["start"] <= timestamp <= s["end"]:
return s["speaker"]
return "UNKNOWN"
NLP Processing and Structure Extraction
from openai import AsyncOpenAI
import json
client = AsyncOpenAI()
async def extract_meeting_structure(transcript: list[dict]) -> dict:
formatted = "\n".join([
f"[{seg['speaker']} | {int(seg['start']//60):02d}:{int(seg['start']%60):02d}] {seg['text']}"
for seg in transcript
])
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": """Ты — ассистент для протоколирования встреч.
Проанализируй транскрипт и верни JSON:
{
"summary": "краткое резюме 2-3 предложения",
"participants": ["SPEAKER_00 = Иван Петров", ...],
"agenda_items": [{"topic": "...", "discussion": "..."}],
"decisions": [{"decision": "...", "context": "..."}],
"action_items": [{"task": "...", "owner": "...", "deadline": "..."}],
"next_meeting": "дата/условие следующей встречи если обсуждалась"
}"""
}, {
"role": "user",
"content": f"Транскрипт встречи:\n\n{formatted[:8000]}"
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
Minutes Formatting and Export
def format_meeting_minutes(structure: dict, transcript: list[dict]) -> str:
date = datetime.now().strftime("%d.%m.%Y")
duration_min = int(transcript[-1]["end"] / 60) if transcript else 0
md = f"""## Протокол встречи от {date}
**Продолжительность:** {duration_min} минут
**Участники:** {", ".join(structure.get("participants", []))}
### Краткое резюме
{structure.get("summary", "")}
### Принятые решения
"""
for d in structure.get("decisions", []):
md += f"- **{d['decision']}**\n _{d.get('context', '')}_\n\n"
md += "### Задачи\n\n"
md += "| Задача | Ответственный | Срок |\n|--------|--------------|------|\n"
for item in structure.get("action_items", []):
md += f"| {item['task']} | {item.get('owner', '—')} | {item.get('deadline', '—')} |\n"
return md
class MinutesExporter:
async def to_notion(self, minutes: str, database_id: str): ...
async def to_confluence(self, minutes: str, space_key: str): ...
async def to_jira_tasks(self, action_items: list, project_key: str): ...
async def to_slack(self, summary: str, channel_id: str): ...
async def to_email(self, minutes: str, recipients: list[str]): ...
Webhook Integration (Zoom Example)
@app.post("/webhook/zoom/recording")
async def zoom_recording_webhook(payload: dict):
if payload["event"] == "recording.completed":
recording_url = payload["payload"]["object"]["recording_files"][0]["download_url"]
meeting_id = payload["payload"]["object"]["uuid"]
asyncio.create_task(process_meeting_recording(meeting_id, recording_url))
return {"status": "ok"}
Timeline
Basic pipeline (transcription + NLP + Markdown) – 1–2 weeks. Full system with Zoom/Teams/Notion/Jira integrations – 4–6 weeks. Exact timeline depends on the number of recording sources and customisation requirements.
We have been in AI automation for over 5 years, delivering 30+ projects for finance, retail, and IT. We provide a warranty on pipeline functionality.
For a consultation and project assessment, contact us. Request a free audit of your meetings — we'll show you how much time you can save.







