สร้าง AI Agent ถอดความและสรุปการประชุมออฟไลน์: เปลี่ยนเสียงบันทึกเป็น Action Item ด้วย Whisper และ Ollama
เบื่อไหมกับการจดบันทึกการประชุมสุดน่าเบื่อ? มาสร้าง AI Agent ในเครื่องตัวเองด้วย Whisper และ Ollama เพื่อแปลงไฟล์เสียงบันทึกเป็นสรุปย่อและ Action Item แบบออฟไลน์และเป็นส่วนตัว 100%
เคยสังเกตไหมครับว่า ในแต่ละสัปดาห์เราต้องสูญเสียเวลาและพลังงานสมอง (Cognitive Load) ไปกับการนั่งฟังไฟล์บันทึกการประชุม หรือเสียงพูดย้อนหลังเพื่อเขียนสรุปรายงานการประชุม (Minutes of Meeting) มากขนาดไหน? สำหรับคนที่ทำงานในด้านการจัดการความรู้ หรือการบริหารโปรเจกต์ งานจำพวกนี้ไม่เพียงแต่ใช้เวลานาน แต่ยังบั่นทอนสมาธิที่เราควรจะเอาไปใช้กับงานที่มีมูลค่ามากกว่า
ในยุคปัจจุบัน เรามีบริการ AI ถอดเสียงบนคลาวด์มากมาย แต่ปัญหาร้ายแรงคือ ความเป็นส่วนตัวของข้อมูล (Data Privacy) ข้อมูลการประชุมภายในบริษัท หรือไอเดียลับเฉพาะทางธุรกิจ ไม่ควรถูกส่งผ่านอินเทอร์เน็ตไปยังเซิร์ฟเวอร์ของบุคคลที่สามเพื่อแลกกับการถอดความ
นี่คือที่มาของ Cognitive Automation แบบ Local-first ในบทความนี้เราจะมาสร้าง AI Agent ส่วนตัวที่ทำงานออฟไลน์ 100% บนเครื่องคอมพิวเตอร์ของคุณเอง โดยใช้ Whisper (โมเดล Speech-to-Text ระดับโลกจาก OpenAI) ร่วมกับ Ollama (Local LLM) เพื่อทำหน้าที่แปลงไฟล์เสียงบันทึกการประชุมให้กลายเป็นข้อความถอดความ จากนั้นประมวลผลสรุปประเด็นหลักและจุดที่ต้องจัดการต่อ (Action Items) ส่งตรงเข้าระบบ Second Brain ใน Obsidian ทันที
โครงสร้างการทำงานของ Local Voice Agent
กระบวนการทำระบบอัตโนมัติเพื่อผ่อนแรงสมองชิ้นนี้มี 3 ขั้นตอนหลัก ดังนี้:
- แปลงเสียงเป็นข้อความ (Speech-to-Text): ใช้ Whisper เวอร์ชั่นประมวลผลเร็วพิเศษ (
faster-whisper) ทำงานในเครื่องคอมพิวเตอร์ของเราเพื่อถอดรหัสเสียงพูดภาษาไทย/อังกฤษ ให้กลายเป็นตัวอักษร - สรุปเนื้อหาและหา Action Item (Summarize & Extract): นำข้อความที่ถอดเสร็จแล้วส่งต่อให้ Ollama (รันโมเดลอย่าง Llama 3 หรือ Gemma 2) จัดระเบียบเนื้อหา หาข้อสรุป และสร้างลิสต์งานที่ต้องทำต่อ
- จัดเก็บลง Obsidian Vault (Store): บันทึกเป็นไฟล์ Markdown (.md) ที่มีระบบจัดหมวดหมู่สวยงาม พร้อมสำหรับนำไปจัดระเบียบต่อใน Second Brain
สิ่งที่ต้องเตรียมและติดตั้ง
ระบบนี้รันบนสถาปัตยกรรม Local-first ดังนั้นเราจำเป็นต้องเตรียมโปรแกรมและไลบรารีดังต่อไปนี้:
- Python 3.9 ขึ้นไป
- FFmpeg สำหรับจัดการและแปลงไฟล์เสียงในระบบ (ดาวน์โหลดและติดตั้งให้เรียบร้อยตามระบบปฏิบัติการที่คุณใช้)
- Ollama รันโมเดลภาษาไทย (แนะนำ
llama3หรือgemma2) - Python packages สำหรับรันโมเดล โดยเปิด Terminal แล้วรันคำสั่ง:
pip install faster-whisper requests
หลังจากติดตั้ง Ollama แล้ว อย่าลืมดาวน์โหลดโมเดลมาพร้อมใช้งาน:
ollama pull gemma2
เขียนสคริปต์ Python ควบคุมระบบถอดเสียงออฟไลน์
สร้างไฟล์ชื่อ voice_agent.py ขึ้นมาในเครื่องของคุณ จากนั้นเขียนโค้ดตามตัวอย่างด้านล่างนี้:
import os
import json
import requests
from datetime import datetime
from faster_whisper import WhisperModel
# --- ตั้งค่าการทำงาน ---
AUDIO_FILE = "meeting.mp3" # ไฟล์เสียงที่ต้องการนำมาประมวลผล
OBSIDIAN_VAULT_PATH = "/home/linn/notes/Meetings" # โฟลเดอร์ปลายทางใน Obsidian
OLLAMA_URL = "http://localhost:11434/api/generate"
OLLAMA_MODEL = "gemma2" # หรือ "llama3" ตามที่ดึงไว้
WHISPER_SIZE = "base" # เลือกระหว่าง tiny, base, small, medium (ยิ่งใหญ่ยิ่งแม่นยำแต่กินทรัพยากร)
def transcribe_audio(audio_path):
print("กำลังเริ่มถอดความไฟล์เสียงด้วย Local Whisper...")
# โหลดโมเดล Whisper แบบออฟไลน์ (จะดาวน์โหลดเฉพาะการรันครั้งแรกเท่านั้น)
model = WhisperModel(WHISPER_SIZE, device="cpu", compute_type="int8")
segments, info = model.transcribe(audio_path, beam_size=5, language="th")
print(f"ตรวจพบภาษาหลัก: {info.language} (ความมั่นใจ: {info.language_probability:.2f})")
full_text = ""
for segment in segments:
print(f"[{segment.start:.1f}s -> {segment.end:.1f}s] {segment.text}")
full_text += segment.text + " "
return full_text
def summarize_with_llm(transcribed_text):
print("\nกำลังส่งข้อความให้ Local AI สรุปและวิเคราะห์...")
prompt = f"""
คุณเป็นเลขานุการ AI มืออาชีพ หน้าที่ของคุณคืออ่านข้อความถอดเสียงจากการประชุมต่อไปนี้
และสรุปข้อมูลออกมาเป็นภาษาไทยที่สุภาพและเป็นทางการ โดยมีโครงสร้างดังนี้:
1. หัวข้อการประชุมและประเด็นสำคัญโดยสรุป (สรุปกระชับ 3-4 ประโยค)
2. มติที่ประชุมหรือข้อตกลงที่เห็นชอบร่วมกัน
3. Action Items (ลิสต์งานที่ต้องทำต่อ ใครรับผิดชอบ และเส้นตายถ้ามี)
นี่คือข้อความจากการประชุม:
\"\"\"{transcribed_text}\"\"\"
"""
payload = {
"model": OLLAMA_MODEL,
"prompt": prompt,
"stream": False
}
response = requests.post(OLLAMA_URL, json=payload)
if response.status_code == 200:
return response.json().get("response", "")
else:
raise Exception("ไม่สามารถติดต่อ Ollama ได้ กรุณาตรวจสอบว่า Service ทำงานอยู่")
def save_to_obsidian(summary_content, raw_text):
today = datetime.now().strftime("%Y-%m-%d")
timestamp = datetime.now().strftime("%H%M%S")
filename = f"Meeting_Summary_{today}_{timestamp}.md"
file_path = os.path.join(OBSIDIAN_VAULT_PATH, filename)
# สร้างโครงสร้างไฟล์ Markdown สำหรับ Obsidian
markdown_content = f"""---
title: "สรุปการประชุมประจำวันที่ {today}"
date: {today}
tags: ["meeting", "automation", "whisper"]
---
# 📝 สรุปการประชุมประจำวันที่ {today}
### 🤖 สรุปผลและวิเคราะห์โดย AI
{summary_content}
---
### 🎙️ บันทึกคำถอดเสียงดิบ (Raw Transcript)
{raw_text}
"""
os.makedirs(OBSIDIAN_VAULT_PATH, exist_ok=True)
with open(file_path, "w", encoding="utf-8") as f:
f.write(markdown_content)
print(f"\nบันทึกไฟล์สรุปการประชุมเรียบร้อยแล้วที่: {file_path}")
if __name__ == "__main__":
if not os.path.exists(AUDIO_FILE):
print(f"ไม่พบไฟล์เสียง: {AUDIO_FILE} กรุณาตรวจสอบตำแหน่งไฟล์")
else:
try:
raw_text = transcribe_audio(AUDIO_FILE)
if raw_text.strip():
summary = summarize_with_llm(raw_text)
save_to_obsidian(summary, raw_text)
else:
print("ไม่สามารถดึงข้อความใดๆ จากไฟล์เสียงได้")
except Exception as e:
print(f"เกิดข้อผิดพลาดในการทำงาน: {e}")
ยกระดับไปอีกขั้น: ทำ Hot Folder Automation
เราสามารถเปลี่ยนสคริปต์ด้านบนนี้ให้เป็น Cognitive Automation ที่สมบูรณ์แบบได้ยิ่งขึ้น โดยตั้งค่าให้สคริปต์นี้ทำงานเบื้องหลังอยู่ตลอดเวลา (Daemon Process) และคอยเฝ้าจับตามองโฟลเดอร์เก็บไฟล์เสียง (เช่น โฟลเดอร์ Voice Memos หรือโฟลเดอร์ดาวน์โหลด)
เมื่อใดก็ตามที่เราบันทึกไฟล์เสียงการประชุม หรือวางไฟล์เสียงใหม่ลงไป สคริปต์จะตรวจพบโดยอัตโนมัติ (โดยใช้ไลบรารีอย่าง watchdog ใน Python) จากนั้นทำการรันสคริปต์ถอดเสียงและสรุปผลส่งตรงเข้า Obsidian ปลายทางทันที โดยที่เราไม่ต้องเปิดรันคำสั่งด้วยตนเองใน Terminal อีกต่อไป ช่วยลดภาระการทำงานซ้ำๆ (Busywork) และช่วยประหยัดเวลาได้อย่างมหาศาล
สรุปข้อดีของการรันแบบ Local-first
การลงทุนเวลาเขียนระบบสรุปความส่วนตัวนี้ มอบสิทธิประโยชน์สำคัญ 3 ประการ:
- ความเป็นส่วนตัวสมบูรณ์แบบ (100% Privacy): ความลับการประชุมและเนื้อหาทั้งหมดจะไม่มีวันรั่วไหลไปสู่คลาวด์ภายนอก
- ประหยัดค่าใช้จ่ายระยะยาว (Zero Operating Cost): ไม่ต้องสมัครแพ็กเกจถอดความรายเดือน หรือจ่ายค่า API ให้กับผู้ให้บริการคลาวด์
- จัดเก็บเป็นระบบถาวร: ไฟล์สรุปจะถูกเก็บในรูปแบบ Markdown ซึ่งเป็นไฟล์ข้อความธรรมดา (.md) ทำให้เราค้นหาคำสำคัญ หรือดึงลิงก์เชื่อมโยงไปยังแผนงานอื่นๆ ใน Obsidian Second Brain ของเราได้ในอนาคต
ลองนำโค้ดและแนวคิดนี้ไปปรับแต่งให้เข้ากับเวิร์กโฟลว์ของคุณ เพื่อก้าวสู่อีกขั้นของการใช้งาน Cognitive Automation ด้วยตัวคุณเองครับ!