mmo.vn
AI & sáng tạo nội dung5 phút đọc

Case study: Tự viết app biến podcast YouTube thành ghi chú Obsidian bằng Gemini

Một app desktop Python nhỏ: dán link podcast YouTube, Gemini đọc thẳng video và trả về ghi chú có mốc thời gian, lưu vào Obsidian. Kèm code, prompt và các giới hạn cần biết.

Thumbnail case study app biến podcast YouTube thành ghi chú bằng Gemini

Podcast trên YouTube thường dài một đến ba tiếng. Nghe hết thì mất thời gian, còn tua nhanh thì dễ bỏ sót ý hay. Case study này trình bày một app desktop nhỏ viết bằng Python: dán link podcast YouTube, Gemini “xem” video và trả về một trang ghi chú có cấu trúc, lưu thẳng vào kho ghi chú Obsidian. Điểm đáng chú ý: không cần tải video về máy.

Tóm tắt case study

Đầu raMột file ghi chú Markdown cho mỗi podcast, lưu trong vault Obsidian
Công cụPython, PySide6 (giao diện), Gemini API (đọc video YouTube), Obsidian (lưu và tra cứu ghi chú), một AI hỗ trợ viết code
Đầu vàoLink video YouTube công khai
Hợp vớiNgười học qua podcast, người làm nội dung cần lưu ý tưởng, người đã quen Obsidian hoặc ghi chú Markdown
Không hợp vớiVideo riêng tư hoặc không công khai, người không muốn tự cài Python

Tóm tắt nhanh

Gemini API nhận trực tiếp link YouTube công khai làm đầu vào, nên app không phải tải video, tách âm thanh hay chạy chuyển giọng nói thành chữ. Phần việc còn lại là viết một prompt tốt để ghi chú ra đúng khuôn, và một giao diện đủ đơn giản để dán link rồi bấm chạy. Với AI hỗ trợ viết code, một người không chuyên lập trình vẫn có thể dựng được app này.

Luồng xử lý của app

BướcApp làm gì
1. Nhận linkNgười dùng dán một hoặc nhiều link YouTube vào hàng đợi
2. Gửi cho GeminiGửi link dưới dạng file_data kèm prompt tạo ghi chú
3. Nhận ghi chúGemini trả về Markdown theo khuôn cố định
4. Lưu vào ObsidianĐặt tên file theo tiêu đề và ngày, ghi vào thư mục trong vault

Bước 1: Gửi link YouTube thẳng cho Gemini

Theo tài liệu Gemini API, link YouTube được truyền trong một phần nội dung kiểu file_data, trường file_uri, đặt cạnh phần prompt. Đoạn code tối thiểu với thư viện google-genai:

from google import genai
from google.genai import types

client = genai.Client()  # đọc khoá API từ biến môi trường GEMINI_API_KEY

def podcast_to_note(url: str, prompt: str) -> str:
    resp = client.models.generate_content(
        model="gemini-2.5-flash",
        contents=types.Content(parts=[
            types.Part(file_data=types.FileData(file_uri=url)),
            types.Part(text=prompt),
        ]),
    )
    return resp.text

Tên model có thể thay bằng phiên bản mới hơn tuỳ thời điểm. Model từ Gemini 2.5 trở đi nhận tối đa 10 video trong một yêu cầu, nhưng mỗi podcast nên gửi riêng để ghi chú không bị trộn.

Bước 2: Viết prompt để ghi chú ra đúng khuôn

Ghi chú chỉ hữu ích khi mọi file có cùng cấu trúc, để sau này tìm lại và liên kết được. Prompt nên quy định rõ từng phần:

You are a note-taker. Watch this podcast and write ONE Markdown note in Vietnamese.
Start with YAML front matter: title, channel, url, date_watched, tags (3-6, lowercase).
Then these sections, in order:
## Tóm tắt — 5 sentences max.
## Ý chính — bullet points, each starting with the timestamp in [MM:SS].
## Trích dẫn đáng nhớ — up to 3 short quotes, translated, with [MM:SS].
## Việc có thể làm — concrete actions a listener could take.
## Liên kết — key people, books, tools mentioned, written as [[wikilinks]].
Do not invent facts. If something is unclear in the audio, say so.

Ba chi tiết đáng giá nhất:

  • Mốc thời gian [MM:SS] cho từng ý chính. Khi cần nghe lại một đoạn, mở đúng phút đó thay vì tua.
  • [[wikilinks]] cho người, sách, công cụ được nhắc tới. Obsidian tự nối các podcast nhắc cùng một tên, dần dần thành một mạng ghi chú.
  • Câu “không bịa” ở cuối prompt. Với nội dung dài, mô hình có thể lấp chỗ trống bằng suy đoán, nên cần yêu cầu nó nói rõ chỗ nào nghe không rõ.

Bước 3: Lưu vào vault Obsidian

Obsidian lưu mỗi ghi chú là một file .md bình thường trong một thư mục, nên app chỉ cần ghi file vào đúng chỗ, không cần plugin hay API riêng. Một quy ước đặt tên dễ dùng: Podcast/2026-11-08 Tên tập podcast.md. Phần YAML ở đầu file giúp lọc ghi chú theo kênh, thẻ hoặc ngày ngay trong Obsidian.

Bước 4: Giao diện PySide6 không bị treo

Một podcast dài có thể mất vài phút để xử lý. Nếu gọi API ngay trên luồng giao diện, cửa sổ sẽ đứng hình. Cách làm đúng là chạy mỗi yêu cầu trong một luồng nền (QThread hoặc QThreadPool) và gửi kết quả về giao diện qua signal. Giao diện tối thiểu chỉ cần:

  • Ô dán link và nút thêm vào hàng đợi.
  • Danh sách hàng đợi kèm trạng thái: đang chờ, đang xử lý, xong, lỗi.
  • Ô chọn thư mục vault Obsidian, lưu lại cho lần sau.
  • Nút mở ghi chú vừa tạo.

Giới hạn cần biết trước

  • Chỉ video công khai. Video riêng tư hoặc không công khai (unlisted) không dùng được theo cách này.
  • Gói miễn phí giới hạn 8 giờ video YouTube mỗi ngày. Gói trả phí không giới hạn theo độ dài video.
  • Tính năng đang ở giai đoạn preview. Google ghi rõ giá và giới hạn có thể thay đổi.
  • Video dài tốn nhiều token. Ở độ phân giải mặc định, mỗi giây video vào khoảng 100 token, nên một podcast 1 giờ vào khoảng 360.000 token. Với podcast chủ yếu là người ngồi nói, hình ảnh không quan trọng, đây là lý do nên giữ độ phân giải thấp.
  • Podcast quá dài có thể cắt thành từng đoạn bằng videoMetadata (thời điểm bắt đầu và kết thúc), tạo ghi chú từng phần rồi gộp lại.

Thông tin giới hạn lấy từ trang tài liệu Video understanding của Gemini API, kiểm tra ngày 8/11/2026.

Điểm cộng

  • Không tải video, không cần chạy chuyển giọng nói thành chữ trên máy.
  • Ghi chú có mốc thời gian, dễ quay lại đúng đoạn cần nghe.
  • File Markdown thuần, không phụ thuộc vào app: mở được bằng Obsidian hay bất kỳ trình soạn thảo nào.
  • Prompt là phần “trí tuệ” của app, sửa prompt là đổi được kiểu ghi chú mà không cần sửa code.

Điểm trừ

  • Chỉ dùng được với video công khai trên YouTube.
  • Tóm tắt của AI vẫn có thể sai hoặc bỏ sót ý. Ghi chú nên được xem là bản đọc nhanh, không thay hoàn toàn việc nghe.
  • Cần tự cài Python, thư viện và tạo khoá API. Người chưa từng làm sẽ mất thời gian lúc đầu.
  • Phụ thuộc vào chính sách của Google: tính năng preview có thể đổi giá hoặc giới hạn.

Kết luận

Nếu bạn nghe nhiều podcast để học và đã dùng Obsidian, một app nhỏ như thế này biến mỗi tập nghe thành một trang ghi chú có mốc thời gian và liên kết, thay vì những ý tưởng trôi đi sau vài ngày. Phần khó nhất không phải code mà là prompt: quy định khuôn ghi chú thật rõ, và bắt AI nói thật khi nó không chắc.

Nguồn: Gemini API: Video understanding.