meeting
회의 녹음 파일을 chunked Whisper STT로 처리하고, 선택적 화자분리를 적용한 뒤 Claude가 교정+요약한다. "/meeting <오디오파일> [회의제목] [화자수 N명] [컨텍스트] [참고문서.pdf ...]" 형식으로 호출. "/meeting record"로 녹음 시작. "/meeting setup"으로 초기 설정.
Meeting 스킬
오디오 파일을 받아 전체 파이프라인을 실행한다: 오디오 보정 → chunked STT → (선택적) 화자분리 → Claude 교정+요약 → (선택적) Dooray 위키 업로드
소스 추적
- 실행 코드 저장소:
https://github.com/GeonheeYe/meeting-tools - 로컬 실행 경로:
~/meeting_tools - 환경 변수:
~/meeting_tools/.env(setup.sh가~/dotfiles/meeting_tools/.env존재 시 symlink로 연결)
사용법
/meeting setup # 초기 설정 (처음 사용 시)
/meeting record # 녹음 시작 (새 터미널 창)
/meeting ~/meetings/audio.wav # 기본 처리
/meeting ~/meetings/audio.wav 스프린트 회의 4명 RAG, 파이프라인 # 화자분리 포함
/meeting ~/meetings/audio.wav XQBot 리뷰 2명 project:내프로젝트 # 프로젝트 용어 활용
/meeting ~/meetings/audio.wav XQBot 리뷰 2명 BIRD,GRPO agenda.txt # 참고 문서 포함
- 기본 실행은 오디오 보정 + chunked STT다.
- 화자 수(
N명)를 주면 pyannote 화자 분리 실행. 없으면 생략(빠름). - 참고 문서(
.pdf,.txt,.md,.docx)를 주면 STT 정확도 향상 + Claude 교정에 활용.
/meeting setup — 초기 설정
처음 사용하거나 새 환경에서 설치할 때 실행한다.
Step 1: meeting-tools 클론
if [ -d ~/meeting_tools ]; then
cd ~/meeting_tools && git pull
else
git clone https://github.com/GeonheeYe/meeting-tools.git ~/meeting_tools
fi
Step 2: setup.sh 실행 + 하드웨어 감지 메시지 출력
cd ~/meeting_tools && bash setup.sh
setup.sh 완료 후 터미널 출력에서 하드웨어 감지 결과를 확인하고 사용자에게 다음 형식으로 안내한다:
✅ 환경 감지 완료
하드웨어: {감지된 환경}
사용 모델: {백엔드 + 모델}
하드웨어별 메시지:
- Apple Silicon:
Apple Silicon M시리즈 (N GB RAM) → mlx-whisper large-v3 - NVIDIA ≥8GB VRAM:
NVIDIA {GPU명} ({N}GB VRAM) → faster-whisper large-v3 float16 - NVIDIA 4-8GB:
NVIDIA {GPU명} ({N}GB VRAM) → faster-whisper large-v3 int8 - CPU:
CPU ({N}GB RAM) → faster-whisper large-v3 int8
Step 3: .env 파일 생성
~/meeting_tools/.env 파일이 없으면 생성한다 (setup.sh가 이미 생성했으면 확인만):
# Hugging Face 토큰 (화자 분리 사용 시 필요)
# 발급: https://huggingface.co/settings/tokens
HF_TOKEN=
# Dooray (아래 Step 4에서 연결하면 자동 입력됨)
# DOORAY_API_TOKEN=
# DOORAY_TENANT_URL=
파일 위치(~/meeting_tools/.env)와 편집 방법을 안내한다.
Step 3.5: 주요 프로젝트 설정 (선택)
AskUserQuestion 도구로 묻는다:
- 질문: "주로 다루는 프로젝트가 있나요? 프로젝트 이름을 알려주시면 회의마다 고유명사·교정 패턴을 누적 저장해 STT 정확도가 높아집니다. 없으면 공통 환경으로 저장됩니다."
- 옵션 1: "네, 프로젝트 이름을 입력합니다"
- 옵션 2: "아니오, 공통 환경으로 사용합니다"
"네"인 경우:
프로젝트 이름을 입력받는다 (여러 개면 쉼표로 구분).
각 프로젝트마다 ~/dotfiles/skills/meeting/projects/{name}/terms.md 파일을 생성한다:
mkdir -p ~/dotfiles/skills/meeting/projects/{name}
terms.md 초기 내용:
---
name: {name} 프로젝트 용어
description: STT 교정 및 요약에 활용되는 고유명사, 기술 용어, 오인식 패턴
type: project
---
## 프로젝트명
## 기술 용어
## STT 오인식 교정 패턴
| STT 오인식 | 올바른 표기 | 비고 |
|------------|------------|------|
---
*마지막 업데이트: {오늘 날짜}*
생성 완료 후 안내:
📁 프로젝트 용어 파일 생성됨:
~/dotfiles/skills/meeting/projects/{name}/terms.md
사용법:
/meeting audio.wav 회의제목 project:{name}
/meeting audio.wav 회의제목 @{name}
"아니오"인 경우:
ℹ️ 프로젝트 미지정 시 회의록은 공통 환경으로 처리됩니다.
나중에 프로젝트를 추가하려면:
mkdir -p ~/dotfiles/skills/meeting/projects/프로젝트명
# terms.md 파일 생성 후 /meeting에서 project:프로젝트명 으로 사용
Step 4: Dooray MCP 설치 (선택)
AskUserQuestion 도구로 묻는다:
- 질문: "Dooray 위키에 회의록을 자동으로 올리겠습니까? (회의 후 위키 업로드가 자동화됩니다)"
- 옵션 1: "네, Dooray에 연결합니다"
- 옵션 2: "아니오, 나중에 설정합니다"
"네"인 경우:
AI 에이전트 종류 감지:
HAS_CLAUDE=$(command -v claude && echo yes || echo no)
HAS_CODEX=$(command -v codex && echo yes || echo no)
Claude Code가 있으면:
claude mcp add -s user dooray-mcp npx @geonheeye/dooray-mcp@latest
Codex가 있으면 ~/.codex/config.json에 MCP 서버 추가:
{
"mcpServers": {
"dooray-mcp": {
"command": "npx",
"args": ["@geonheeye/dooray-mcp@latest"]
}
}
}
그 다음 .env의 Dooray 항목 언커멘트 후 값 입력 방법 안내:
DOORAY_API_TOKEN 발급 방법:
두레이 접속 → 우상단 프로필 → 개인설정 → API → 개인 인증 토큰 생성
DOORAY_TENANT_URL 예시:
https://your-company.dooray.com
사용자에게 .env 파일을 직접 편집하도록 안내하고, 완료했으면 알려달라고 한다.
편집 완료 확인 후 AskUserQuestion 도구로 위키를 묻는다:
- 질문: "회의록을 올릴 Dooray 위키 이름 또는 URL을 알려주세요."
입력값을 받아 mcp__dooray__get-wiki-list 도구로 위키 목록을 조회하고 wiki_id를 찾는다.
찾은 wiki_id를 이 SKILL.md 파일의 ## Dooray 설정 섹션에 저장한다.
"아니오"인 경우: Step 5로 넘어간다.
Step 5: 완료 안내
🎉 설정 완료!
필수 입력 (~/meeting_tools/.env):
HF_TOKEN — 화자 분리(pyannote) 사용 시 필요
발급: https://huggingface.co/settings/tokens
사용법:
/meeting ~/meetings/audio.wav # 기본 처리
/meeting ~/meetings/audio.wav 회의제목 2명 # 화자 분리 포함
/meeting record # 녹음 시작
/meeting — 회의 처리 모드
Step 1: ARGUMENTS 파싱
ARGUMENTS에서 다음 정보를 추출한다:
- 오디오 파일 경로: 첫 번째 인자 (또는
record또는setup) - 회의 제목: 숫자, 파일 경로, 키워드처럼 보이지 않는 텍스트 부분
- 회의 타입: 제목이나 컨텍스트에서 "세미나" 키워드 감지. 있으면
meeting_type="seminar", 없으면 None - 화자 수: "N명", "N people", "speakers N" 패턴에서 숫자 추출. 없으면 None
- 컨텍스트: 기술 용어나 회의 주제 설명 문자열 (파일 경로 아닌 것). 없으면 None
- 참고 문서:
.pdf,.txt,.md,.docx확장자를 가진 경로들. 없으면 None - 프로젝트 이름:
project:프로젝트명또는@프로젝트명형식. 없으면 None- 있으면
~/dotfiles/skills/meeting/projects/{project}/terms.md를 읽어 교정/요약에 활용
- 있으면
예시: audio.wav XQBot 리뷰 2명 BIRD,GRPO agenda.txt
→ title=XQBot 리뷰, speakers=2, context=BIRD,GRPO, docs=[agenda.txt]
예시: audio.wav 스프린트 회의 4명 project:팀회의
→ title=스프린트 회의, speakers=4, project=팀회의
setup인 경우 — 위의 /meeting setup 플로우로 이동한다.
record인 경우 — 녹음 모드:
osascript -e 'tell application "Terminal" to do script "cd ~/meeting_tools && .venv/bin/python3 record.py"'
사용자에게 안내:
새 터미널 창에서 녹음이 시작됩니다.
Enter로 녹음 종료 후, 저장된 파일 경로로 다시 호출하세요:
/meeting ~/meetings/audio_YYYYMMDD_HHMM.wav [회의 제목] [화자수 N명] [키워드] [문서.pdf ...]
오디오 파일 경로인 경우 — Step 2로 진행한다.
Step 2: 파이프라인 실행
다음 명령을 실행하기 전에 사용자에게 알린다:
⏳ STT 파이프라인을 시작합니다. 오디오 길이에 따라 수 분 소요될 수 있습니다...
cd ~/meeting_tools && .venv/bin/python3 pipeline.py <오디오파일경로> [회의제목] [--speakers N] [--context "컨텍스트"] [--docs 문서1 문서2]
예시 (화자분리 없음):
cd ~/meeting_tools && .venv/bin/python3 pipeline.py ~/meetings/audio.wav "스프린트 회의"
예시 (화자분리 + 참고 문서):
cd ~/meeting_tools && .venv/bin/python3 pipeline.py ~/meetings/audio.wav "XQBot 리뷰" --speakers 2 --context "BIRD,GRPO" --docs ~/docs/agenda.txt
명령이 완료되면 {오디오파일디렉토리}/{오디오파일명}.json 파일 경로가 출력된다.
완료 후 안내:
✅ 파이프라인 완료
Step 3: JSON 결과 읽기
출력된 JSON 파일을 읽는다. 구조:
{
"title": "[2026-03-13] 회의",
"date": "2026-03-13",
"speaker_count": 4,
"transcript": "[Speaker A]\n안녕하세요...",
"doc_content": "참고 문서 본문 (없으면 빈 문자열)",
"agenda_items": ["안건1", "안건2"],
"vad_applied": false,
"chunking_applied": true,
"source_audio_path": "/path/to/audio.wav",
"stt_audio_path": "/path/to/audio_enhanced.wav",
"term_metadata_applied": true,
"audio_enhanced": true
}
Step 4: Claude 교정 + 요약
프로젝트 용어 로드 (project가 있을 때):
~/dotfiles/skills/meeting/projects/{project}/terms.md 파일을 읽는다.
- 파일이 없으면 무시하고 진행한다.
- STT 오인식 교정 패턴으로 transcript를 수정하고, 기술 용어를 교정·요약에 반영한다.
교정 (doc_content 또는 project terms가 있을 때):
transcript에서 STT 오류를 교정한다.
- doc_content 또는 terms.md에 등장하는 고유명사/기술 용어가 다르게 표기된 경우만 교정
- 근거 없는 추측 교정 금지 — 문서에 명시된 것만
요약:
교정된 transcript를 바탕으로 다음 3가지를 작성한다:
-
회의 요약: 핵심 내용 3-5줄
-
액션 아이템: agenda_items가 있으면 항목별 그룹화, 없으면 단순 목록
agenda_items가 있을 때:
**1. {agenda_items[0]}** - [ ] 내용 (기한) **기타** - [ ] 안건 외 명확히 도출된 액션agenda_items가 없을 때:
- [ ] 내용 (기한) -
주요 결정사항: 대화록에 명확히 언급된 것만
추측하지 말고 대화록에 명시된 내용만 포함한다.
Insight 생성 (meeting_type == "seminar"인 경우):
세미나인 경우, 추가로 다음 항목들을 생성한다:
- 주요 학습 포인트: 세미나에서 배운 핵심 개념 또는 지식 (3-5개)
- 실행 가능한 개선사항: 직장이나 프로젝트에 바로 적용할 수 있는 실무 팁
- 업계 트렌드/인사이트: 세미나 주제와 관련된 현재 업계 동향
- 개인적 성장 포인트: 경력 발전에 도움이 될 수 있는 관찰사항
각 항목은 대화록에 명확히 언급된 내용과 그 의미를 바탕으로만 작성한다. 추측은 금지.
Step 4.5: 사용자 확인 + 업로드 선택
터미널에 출력 (meeting_type != "seminar"인 경우):
---
📋 회의 요약
(요약 내용)
✅ 액션 아이템
(액션 아이템 목록)
🔑 주요 결정사항
(결정사항 목록)
---
터미널에 출력 (meeting_type == "seminar"인 경우):
---
📋 회의 요약
(요약 내용)
✅ 액션 아이템
(액션 아이템 목록)
🔑 주요 결정사항
(결정사항 목록)
💡 주요 Insight
(Insight 항목들)
---
AskUserQuestion 도구로 묻는다:
- 질문: "위 내용을 어디에 업로드할까요?"
- 옵션 1: "Notion에 업로드"
- 옵션 2: "Dooray 위키에 업로드"
- 옵션 3: "업로드 없이 완료"
"Notion"인 경우:
대상 DB: Notion > Company > 회의록 (database_id: f04252be-cb89-4cf0-88b1-0351a7a8f98c)
MCP 우선순위: notion-work 먼저 시도 → 실패 시 claude_ai_Notion fallback
notion-work MCP 사용 시 (우선)
1단계: 페이지 생성 — API-post-page 도구 사용
parent: {"type": "database_id", "database_id": "f04252be-cb89-4cf0-88b1-0351a7a8f98c"}
properties:
제목: {"title": [{"type": "text", "text": {"content": "[YYYY-MM-DD] 회의제목"}}]}
날짜: {"date": {"start": "YYYY-MM-DD"}}
참석자수: {"number": N}
2단계: 본문 추가 — API-patch-block-children 도구 사용 (생성된 page_id에 append)
블록 구성 (meeting_type != "seminar"인 경우):
paragraph(bold, blue): "📋 회의 요약"bulleted_list_item× N: 요약 항목paragraph(bold, green): "✅ 액션 아이템"bulleted_list_item× N: 액션 아이템 (- [ ] 내용형식)paragraph(bold, orange): "🔑 주요 결정사항"bulleted_list_item× N: 결정 항목paragraph(bold, gray): "💬 전체 대화록"paragraph× N: Speaker별 대화 내용
블록 구성 (meeting_type == "seminar"인 경우):
paragraph(bold, blue): "📋 회의 요약"bulleted_list_item× N: 요약 항목paragraph(bold, green): "✅ 액션 아이템"bulleted_list_item× N: 액션 아이템 (- [ ] 내용형식)paragraph(bold, orange): "🔑 주요 결정사항"bulleted_list_item× N: 결정 항목paragraph(bold, purple): "💡 주요 Insight"bulleted_list_item× N: Insight 항목들paragraph(bold, gray): "💬 전체 대화록"paragraph× N: Speaker별 대화 내용
claude_ai_Notion MCP 사용 시 (fallback)
notion-create-pages 도구로 data_source_id에 직접 생성.
페이지 properties:
제목: JSON의 title 값date:날짜:start: JSON의 date 값 (YYYY-MM-DD)date:날짜:is_datetime: 0참석자수: JSON의 speaker_count 값
페이지 content 구성 (본문):
- 섹션 순서: 회의 요약 → 액션 아이템 → 주요 결정사항 → 전체 대화록(토글)
- 전체 대화록은
<details><summary>전체 대화록</summary>...</details>토글로 표시
생성된 Notion 페이지 URL을 안내한다.
"Dooray 위키"인 경우:
이 SKILL.md의 ## Dooray 설정 섹션에서 wiki_id를 읽어 mcp__dooray__create-wiki-page 도구로 생성:
subject: "[YYYY-MM-DD] 회의제목"
content: (마크다운 — 회의 요약 + 액션 아이템 + 주요 결정사항)
content 구성:
## 회의 요약
- 요약 항목 1
## 액션 아이템
- [ ] 액션 1
## 주요 결정사항
- 결정 1
생성된 위키 페이지 URL을 안내한다.
"업로드 없이 완료"인 경우:
JSON 결과 파일 경로를 안내하고 종료한다.
Step 5: 완료 안내 + 프로젝트 용어 저장
JSON 결과 파일은 원본 오디오와 같은 디렉토리에 보존한다 (재처리·디버깅용).
프로젝트 용어 저장 (project가 있을 때):
회의 중 새로 등장한 고유명사나 사용자가 교정한 내용이 있으면
~/dotfiles/skills/meeting/projects/{project}/terms.md에 추가한다:
- 새 용어 → 기술 용어 섹션에 추가
- 교정 패턴 → STT 오인식 교정 패턴 테이블에 추가
- 마지막 업데이트 날짜 갱신
새로 저장한 용어가 있으면 안내한다:
📝 [{project}] 용어 업데이트: [새로 추가된 용어 목록]
Dooray 설정
/meeting setup에서 Dooray 연결 시 자동으로 채워집니다.
DOORAY_WIKI_ID=3682781558863996885
DOORAY_WIKI_NAME=AI개발팀-주간업무보고
DOORAY_WIKI_HOME_PAGE_ID=3682781559607351814
DOORAY_WIKI_PARENT_PAGE_ID=4295872682126525499
DOORAY_WIKI_PARENT_PAGE_NAME=meeting
회의록은 DOORAY_WIKI_PARENT_PAGE_ID(meeting 페이지) 하위에 생성합니다. create-wiki-page 호출 시 parentPageId로 이 값을 사용하세요.
오디오 파일이 없는 경우
녹음 방법을 안내한다:
osascript -e 'tell application "Terminal" to do script "cd ~/meeting_tools && .venv/bin/python3 record.py"'