สร้าง AI Agent ถอดความและสรุปการประชุมออฟไลน์: เปลี่ยนเสียงบันทึกเป็น Action Item ด้วย Whisper และ Ollama

เบื่อไหมกับการจดบันทึกการประชุมสุดน่าเบื่อ? มาสร้าง AI Agent ในเครื่องตัวเองด้วย Whisper และ Ollama เพื่อแปลงไฟล์เสียงบันทึกเป็นสรุปย่อและ Action Item แบบออฟไลน์และเป็นส่วนตัว 100%

Share
สร้าง AI Agent ถอดความและสรุปการประชุมออฟไลน์: เปลี่ยนเสียงบันทึกเป็น Action Item ด้วย Whisper และ Ollama

เคยสังเกตไหมครับว่า ในแต่ละสัปดาห์เราต้องสูญเสียเวลาและพลังงานสมอง (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 ขั้นตอนหลัก ดังนี้:

  1. แปลงเสียงเป็นข้อความ (Speech-to-Text): ใช้ Whisper เวอร์ชั่นประมวลผลเร็วพิเศษ (faster-whisper) ทำงานในเครื่องคอมพิวเตอร์ของเราเพื่อถอดรหัสเสียงพูดภาษาไทย/อังกฤษ ให้กลายเป็นตัวอักษร
  2. สรุปเนื้อหาและหา Action Item (Summarize & Extract): นำข้อความที่ถอดเสร็จแล้วส่งต่อให้ Ollama (รันโมเดลอย่าง Llama 3 หรือ Gemma 2) จัดระเบียบเนื้อหา หาข้อสรุป และสร้างลิสต์งานที่ต้องทำต่อ
  3. จัดเก็บลง Obsidian Vault (Store): บันทึกเป็นไฟล์ Markdown (.md) ที่มีระบบจัดหมวดหมู่สวยงาม พร้อมสำหรับนำไปจัดระเบียบต่อใน Second Brain

สิ่งที่ต้องเตรียมและติดตั้ง

ระบบนี้รันบนสถาปัตยกรรม Local-first ดังนั้นเราจำเป็นต้องเตรียมโปรแกรมและไลบรารีดังต่อไปนี้:

  1. Python 3.9 ขึ้นไป
  2. FFmpeg สำหรับจัดการและแปลงไฟล์เสียงในระบบ (ดาวน์โหลดและติดตั้งให้เรียบร้อยตามระบบปฏิบัติการที่คุณใช้)
  3. Ollama รันโมเดลภาษาไทย (แนะนำ llama3 หรือ gemma2)
  4. 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 ประการ:

  1. ความเป็นส่วนตัวสมบูรณ์แบบ (100% Privacy): ความลับการประชุมและเนื้อหาทั้งหมดจะไม่มีวันรั่วไหลไปสู่คลาวด์ภายนอก
  2. ประหยัดค่าใช้จ่ายระยะยาว (Zero Operating Cost): ไม่ต้องสมัครแพ็กเกจถอดความรายเดือน หรือจ่ายค่า API ให้กับผู้ให้บริการคลาวด์
  3. จัดเก็บเป็นระบบถาวร: ไฟล์สรุปจะถูกเก็บในรูปแบบ Markdown ซึ่งเป็นไฟล์ข้อความธรรมดา (.md) ทำให้เราค้นหาคำสำคัญ หรือดึงลิงก์เชื่อมโยงไปยังแผนงานอื่นๆ ใน Obsidian Second Brain ของเราได้ในอนาคต

ลองนำโค้ดและแนวคิดนี้ไปปรับแต่งให้เข้ากับเวิร์กโฟลว์ของคุณ เพื่อก้าวสู่อีกขั้นของการใช้งาน Cognitive Automation ด้วยตัวคุณเองครับ!

Read more

สร้าง AI Agent สกัด Knowledge Graph จากโน้ตส่วนตัว: เปลี่ยนข้อความกระจัดกระจายให้เป็นเครือข่ายความรู้ออฟไลน์ 100% ด้วย Python

สร้าง AI Agent สกัด Knowledge Graph จากโน้ตส่วนตัว: เปลี่ยนข้อความกระจัดกระจายให้เป็นเครือข่ายความรู้ออฟไลน์ 100% ด้วย Python + Ollama

เปลี่ยนเอกสารและโน้ตข้อความร้อยแก้วให้เป็น Knowledge Graph แบบโครงสร้าง (Subject-Predicate-Object) โดยอัตโนมัติ ด้วยสคริปต์ Python ร่วมกับ Local LLM ในเครื่อง ช่วยสกัดความสัมพันธ์ระหว่างความคิด เทคโนโลยี และบุคคลอย่างเป็นระบบออฟไลน์ 100%

By Linn
บอกลา Audible: คู่มือติดตั้ง Audiobookshelf เซิร์ฟเวอร์หนังสือเสียงและ eBook ส่วนตัวบน Home Server ด้วย Docker

บอกลา Audible: คู่มือติดตั้ง Audiobookshelf เซิร์ฟเวอร์หนังสือเสียงและ eBook ส่วนตัวบน Home Server ด้วย Docker

เปลี่ยนคลังหนังสือเสียงและดิจิทัลไฟล์ของคุณให้กลายเป็นเซิร์ฟเวอร์สตรีมมิ่งส่วนตัว ด้วย Audiobookshelf บน Home Server ผ่าน Docker พร้อมวิธีซิงค์ความคืบหน้าการฟังข้ามอุปกรณ์แบบเรียลไทม์

By Linn
สร้าง AI Agent สกัดและสังเคราะห์ Book Highlights: เปลี่ยนโน้ตอ่านหนังสือเป็น Book Summary อัจฉริยะใน Obsidian ด้วย Python + O

สร้าง AI Agent สกัดและสังเคราะห์ Book Highlights: เปลี่ยนโน้ตอ่านหนังสือเป็น Book Summary อัจฉริยะใน Obsidian ด้วย Python + Ollama

เปลี่ยนไฮไลต์และโน้ตย่อยจากการอ่านหนังสือให้กลายเป็น Book Summary ที่ทรงคุณค่าด้วย AI Agent ออฟไลน์ส่วนตัวที่จะสกัด Core Key Takeaways, Actionable Insights และเชื่อมโยงเข้ากับระบบ Second Brain แบบ Local 100%

By Linn
สร้าง Private AI Router ในเครื่องตัวเอง: คู่มือตั้งค่า LiteLLM สลับโมเดลอัจฉริยะตามประเภทงานแบบออฟไลน์ 100%

สร้าง Private AI Router ในเครื่องตัวเอง: คู่มือตั้งค่า LiteLLM สลับโมเดลอัจฉริยะตามประเภทงานแบบออฟไลน์ 100%

เรียนรู้วิธีตั้งค่า LiteLLM เป็น AI Gateway และ Router ในเครื่องตัวเอง เพื่อสลับรันโมเดล Ollama อัตโนมัติ ทั้งโมเดลเน้นความเร็ว โมเดลคิดวิเคราะห์เชิงลึก และโมเดลวิเคราะห์ภาพ ปลอดภัย 100% ไม่ต้องพึ่งคลาวด์

By Linn