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.

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 ra | Mộ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ào | Link video YouTube công khai |
| Hợp với | Ngườ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ới | Video 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ước | App làm gì |
|---|---|
| 1. Nhận link | Người dùng dán một hoặc nhiều link YouTube vào hàng đợi |
| 2. Gửi cho Gemini | Gử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.


