Ghi chú cuộc họp & đọc-chép giọng nói — chạy cục bộ trên máy bạn.
100% Local (nghe · chữ · dịch · tách người · tóm tắt Qwen)RTX 4070 · WindowsCloud chỉ khi bạn tự đổi provider
1Giới thiệu
AI Record là ứng dụng desktop cục bộ: khi bạn họp online (Teams/Zoom/Meet…) hoặc chỉ muốn tự nói,
nó thu âm thanh của máy, chuyển thành văn bản thời gian thực, dịch câu tiếng nước ngoài sang tiếng Việt,
tách người nói, và (khi bạn muốn) Tóm tắt / Phân tích bằng AI — mặc định chạy trên
model Qwen 2.5-7B local (qua Ollama), riêng tư và offline.
Hai nút thu:Record (ghi & lưu như thường) và Listening — chế độ tạm thời, KHÔNG lưu: bấm MỘT lần là bắt đầu nghe, bấm lần nữa là dừng. Vẫn nghe → chữ → dịch → Tóm tắt/Phân tích được, nhưng không ghi gì xuống đĩa, dùng để biến giọng nói thành chữ rồi copy đi nơi khác. Chế độ này cắt câu nhanh hơn (im lặng 350 ms, cắt cưỡng bức 6 s thay vì 15 s) nên chữ hiện gần như tức thì, vẫn đúng như Record vì dùng y hệt model nhận dạng.
Hai chế độ nguồn:Meeting (thu cả loa + mic) và Dictation (chỉ mic — đọc-chép ý tưởng dài).
Ba tab AI:Transcript (luôn chạy realtime), Summary (gom nhóm ý, giữ nguyên cách diễn đạt ~ định dạng lại), Analyze (phân tích tổng quan + câu hỏi/rủi ro cốt lõi). Summary/Analyze chạy khi bạn bấm vào tab — lần đầu nạp model (~10–20 s), sau đó nhanh; transcript vẫn cập nhật ngầm.
Chọn & sao chép: chữ trong transcript bôi đen được (highlight rồi Ctrl+C), có nút Copy (chỉ chữ / kèm tên người); nút “Văn bản ⇄ Hội thoại” đổi giữa dạng hội thoại (dòng theo người nói) và dạng văn bản liền một khối.
Riêng tư: âm thanh không bao giờ rời khỏi máy. Nghe/chữ/dịch/tách người = local; với Qwen mặc định thì cả Tóm tắt/Phân tích cũng local.
Đầu ra: mặc định chỉ lưu bản .md dễ đọc; tuỳ chọn kèm .txt, .mp3 (audio) và bản tóm tắt AI — chọn qua nút lưu (biểu tượng save) trên thanh công cụ hoặc trong Settings.
2Cài đặt & Khởi chạy
Cài một lần
git clone https://github.com/ducnguyen221/ai-record
cd ai-record
powershell -ExecutionPolicy Bypass -File setup.ps1 # venv + torch CUDA + thư viện
powershell -ExecutionPolicy Bypass -File scripts\setup-ollama.ps1 # tuỳ chọn: Qwen local cho tab Summary/Analyze
python -m ai_record # hoặc double-click shortcut trên Desktop
setup.ps1 tạo môi trường .venv + cài torch CUDA + toàn bộ thư viện. Lần đầu tải ~4–6 GB model.
Bước setup-ollama.ps1 là tuỳ chọn nhưng cần cho tab Summary/Analyze ở provider mặc định (Qwen local): nó cài Ollama (winget) nếu thiếu + pull qwen2.5:7b. Bỏ qua nếu bạn chỉ dùng provider cloud (Claude/Codex/Gemini) trong Settings.
Mỗi lần dùng
Double-click nút “AI Record” trên Desktop (chạy im lặng, không cửa sổ terminal), hoặc
Chạy run.ps1 (bản có console để xem log khi cần).
Đóng cửa sổ hoặc bấm ✕ Thoát = dừng sạch, phiên đang ghi được lưu lại.
3Hướng dẫn sử dụng
Thanh nhỏ (compact) Hàng nút biểu tượng: Record + toggle Listening (không lưu), 🎙 dropdown mic + 🔊 dropdown loa (chọn đúng thiết bị vào/ra — chấm xanh khi đang hoạt động), AUTO/VI/EN…ngôn ngữ nghe (ghim một ngôn ngữ nếu bị nhận nhầm), 🌐 Dịch, 📋 Copy, 💾 định dạng đầu ra, 📁 mở thư mục, ⚙ Settings, ⤢ phóng to, nút thu nhỏ xuống thanh taskbar (phiên vẫn chạy tiếp), ✕ đóng. Cửa sổ mở ra rộng 900 px (đủ chỗ cho mọi icon kể cả khi đang hiện chip “Đang tải model…”, khỏi phải kéo dãn); kéo hẹp được tới 770 px. Hàng nút không bao giờ bị cuộn hay cắt mất — khi cửa sổ hẹp thì phần chữ trạng thái co lại trước, nút (nhất là nút đóng) luôn còn nguyên. Thanh cuộn chỉ có ở ô transcript. Phía dưới: transcript gần nhất, full chiều ngang — có thanh cuộn, kéo lên xem lại phần trước (đang kéo lên thì chữ mới KHÔNG giật xuống; cuộn xuống đáy là bám theo chữ mới trở lại). Chữ chạy liền mạch theo lượt nói, chỉ tự xuống dòng khi hết bề ngang khung; sang khối mới chỉ khi đổi người nói hoặc nghỉ từ 60 giây trở lên — nhờ vậy tiết kiệm được nhiều diện tích so với kiểu mỗi câu một dòng. Có từ 2 người trở lên thì mới hiện tên người nói ở đầu khối.
Record vs Listening (không lưu) Record = ghi & lưu như thường. Listening = bấm một nút là nghe ngay, bấm lại là dừng — chế độ tạm thời: vẫn nghe/chữ/dịch và chạy được Summary/Analyze, nhưng không tạo thư mục trong records\, không lưu transcript/audio/summary — dùng để biến giọng nói thành chữ rồi copy đi. Khi bật, app ẩn nút mở thư mục + chọn định dạng lưu, không quay video, bỏ qua việc tách người theo thời gian thực (nhanh & nhẹ hơn) và hiện chỉ báo “Listening — không lưu”; Summary chạy trên transcript trong bộ nhớ.
Ngôn ngữ nghe: tự nhận diện hay ghim? Whisper đoán ngôn ngữ cho TỪNG câu riêng lẻ, nên một mẩu ngắn có thể bị đoán nhầm (đo trên máy này: một mẩu 0,99 s tiếng Việt bị nhận là tiếng Đan Mạch với xác suất 0,22 — và chữ trả về đúng là tiếng Đan Mạch). Nút AUTO trên thanh công cụ cho ghim hẳn một ngôn ngữ: khi đã ghim, whisper bỏ qua bước đoán nên không còn nhảy ngôn ngữ. Ghim có hiệu lực ngay với phiên đang chạy, không cần dừng và bắt đầu lại. Muốn cố định lâu dài: vào Settings → Ngôn ngữ nghe (STT) → Ngôn ngữ mặc định. Ngôn ngữ mặc định áp dụng cho mọi phiên, đóng và mở lại app vẫn giữ nguyên; trong danh sách của nút trên thanh công cụ nó nằm trên cùng, Tự nhận diện đứng thứ hai. Nút trên thanh công cụ chỉ đổi cho phiên hiện tại, không ghi đè mặc định.
Cửa sổ không viền, kéo & co giãn Cửa sổ frameless: kéo bất kỳ đâu trên thanh header trên cùng để di chuyển (chạm vào một nút thì vẫn bấm được); kéo cạnh/góc bất kỳ để đổi kích thước — càng cao càng hiện nhiều dòng transcript. Bấm vào logo để mở website.
Chọn nguồn khi Start Both (họp) · Mic only (đọc-chép) · System only (chỉ tiếng loa). Nút camera (mờ) là chỗ dành sẵn cho quay màn hình/camera sau này.
Dịch (From→To) Bấm biểu tượng 🌐 mở popover chọn ngôn ngữ nguồn → đích (mặc định English→Vietnamese) → câu tiếng nước ngoài hiện thêm bản dịch ngay dưới.
Tách người nói Mic = “You”; phía loa tự gán “Speaker 1/2…”, sửa tên được. Nút Re-diarize chạy chính xác hơn sau họp (cần HF token).
Ba tab: Transcript · Summary · Analyze Phóng to (⤢) để mở khung đầy đủ. Transcript luôn realtime. Summary = AI gom nhóm ý, giữ nguyên cách diễn đạt (định dạng lại). Analyze = phân tích tổng quan + câu hỏi/rủi ro. Bấm tab để chạy on-demand: lần đầu nạp model (~10–20 s), sau đó nhanh.
Đọc, chọn & sao chép Chữ trong transcript bôi đen được — highlight vài dòng rồi Ctrl+C để copy đi nơi khác. Toggle “Văn bản ⇄ Hội thoại” đổi giữa dạng hội thoại (dòng theo người nói) và dạng văn bản liền một khối. Nút Copy (ở thanh công cụ của cả bản compact lẫn header phóng to) có menu chỉ chữ / kèm tên người; ngoài ra vẫn tải .md/.txt/combined về máy.
Summary gom nhóm ý và giữ nguyên cách diễn đạt (định dạng lại — có kiểm tra tự động, sai thì tự dùng bản định dạng máy để không đổi nội dung). Analyze đưa ra phân tích tổng quan cùng các câu hỏi/rủi ro cốt lõi. Cả hai mặc định chạy trên Qwen local; đổi provider (và chỉnh prompt) trong Settings.
Settings đáng chú ý
Kết nối AI (đăng nhập theo máy) Hiện trạng thái kết nối từng provider — Claude CLI / Codex CLI / Gemini / Ollama — kèm nút Đăng nhập (mở luồng đăng nhập riêng của CLI trên chính máy này) và Kiểm tra. App không nhúng, không lưu, không đọc, không chia sẻ thông tin đăng nhập: mỗi máy tự kết nối bằng tài khoản của nó (app chỉ gọi CLI claude/codex cục bộ vốn đã giữ đăng nhập riêng; Gemini dùng key trong keychain của OS; Ollama offline). Cài app sang máy khác không rò rỉ gì từ máy này.
Prompt AI (Summary / Analyze) Hai ô văn bản chỉnh được — chỉ dẫn định dạng lại (Summary) và phân tích (Analyze) — đã điền sẵn mặc định mạnh, mỗi ô có nút Khôi phục mặc định. Tự tinh chỉnh cách AI tóm tắt/phân tích cho hợp việc của bạn.
Whisper model / Compute type Để nguyên mặc định, hai dropdown hiện “Auto — theo preset (large-v3 / int8_float16)” — app dùng preset theo GPU (không phải model “tiny”). Chỉ đổi khi bạn thật sự muốn ép model/compute khác.
4Cơ chế hoạt động
Một tiến trình Python chạy pipeline sản-xuất-tiêu-thụ; STT được ưu tiên tuyệt đối, phần dịch/tách người chạy sau và “vá” vào câu đã hiện.
1 · Thu
WASAPI loopback (tiếng loa = người khác) + micro (bạn) → chuyển 16 kHz mono. Không dùng API ghi của Teams/Zoom nên nền tảng không hiện “đang ghi”.
2 · VAD
Silero VAD cắt luồng thành từng câu theo khoảng lặng, bỏ im lặng.
3 · STT
faster-whisper large-v3 (GPU) chuyển mỗi câu thành chữ + tự nhận ngôn ngữ. Hiện lên UI & lưu ngay.
4 · Vá
Chạy nền, ưu tiên thấp: NLLB dịch (nếu bật) + Resemblyzer gán người nói → gửi “patch” cập nhật câu đã hiện.
5 · Lưu
Ghi transcript.jsonl + transcript.md + WAV (chống mất khi treo máy), autosave từng câu. Ở chế độ Listening thì bỏ qua toàn bộ bước này — mọi thứ chỉ nằm trong bộ nhớ, không chạm đĩa.
Sau họp
Tuỳ chọn: pyannote tách người chính xác · tab Summary/Analyze (mặc định Qwen local) · Export · dọn audio theo cấu hình.
5Model & độ nặng khi chạy
Chức năng
Model
Chạy ở
Đĩa
RAM/VRAM
Nghe→chữ (STT)
faster-whisper large-v3 (int8_float16)
GPU
~1.5 GB
~2–3 GB VRAM
Phát hiện tiếng nói
Silero VAD
CPU
vài MB
không đáng kể
Dịch
NLLB-200 distilled-600M (int8)
CPU
~1.2 GB
~1–2 GB RAM
Tách người (realtime)
Resemblyzer
CPU
~15 MB
nhẹ
Tách người (chính xác)
pyannote 3.1
GPU (khi bấm)
~100 MB
chạy sau họp
Tóm tắt / Phân tích AI
Qwen2.5-7B local qua Ollama (mặc định) / Claude CLI / Codex / Gemini
local/☁️
—
xem mục 8
Tiêu thụ khi họp thực tế:
GPU: ~2–3 GB VRAM cố định (còn dư ~9 GB); tải bùng lên mỗi khi kết thúc 1 câu rồi hạ.
CPU: trung bình (dịch + embedding + VAD), nhích theo từng câu.
RAM: ~2–4 GB. Đĩa: WAV ~2 MB/phút/nguồn khi thu (mặc định xoá khi xong, chỉ giữ .md).
Lúc im lặng: gần như 0 — VAD chặn, không transcribe khoảng lặng.
6Chi phí: Local vs Cloud
Thu · STT · Dịch · Tách người = 100% LOCAL, MIỄN PHÍ, offline được. Âm thanh KHÔNG rời máy.
Tab Summary/Analyze mặc định cũng là local; chỉ khi bạn tự đổi sang provider cloud thì văn bản mới rời máy:
Provider
Gửi gì ra ngoài
Chi phí
Qwen local qua Ollama (mặc định)
Không gì cả
100% local, miễn phí, offline
Claude CLI
Văn bản transcript (không phải audio) → Anthropic
Dùng gói Claude Code sẵn có (tốn quota, không phí lẻ)
Codex CLI
Văn bản → OpenAI
Theo gói Codex
Gemini
Văn bản → Google
Cần API key, có thể tính phí
→ Giữ mặc định Qwen local (hoặc không bấm Summary/Analyze), toàn bộ ứng dụng là local tuyệt đối.
7Rủi ro & an toàn
⚖️ Pháp lý (quan trọng nhất): ghi người khác khi họ không biết có thể vi phạm luật (nhiều nơi cần sự đồng ý của tất cả). App không hiện “đang ghi” cho nền tảng → bạn tự chịu trách nhiệm xin phép/khai báo khi luật yêu cầu.
🔓 Dữ liệu lưu chưa mã hoá: transcript (và audio nếu giữ) nằm plaintext trong thư mục lưu — ai truy cập được máy là đọc được. Dùng nút Xoá / cấu hình retention để dọn.
☁️ Rò rỉ khi dùng provider cloud: mặc định là Qwen local nên không gửi gì. Chỉ khi bạn tự đổi Summary/Analyze sang Claude/Codex/Gemini thì transcript mới được gửi tới Anthropic/OpenAI/Google. Transcript được xử lý như “dữ liệu không tin cậy” (chống việc ai đó nói câu-lệnh trong họp), nhưng vẫn là dữ liệu rời máy — cân nhắc với họp nhạy cảm.
🔑 Secret an toàn: HF token / Gemini key lưu trong Windows Credential Manager (không plaintext).
🔐 Đăng nhập AI theo máy: app không nhúng thông tin đăng nhập nào và không lưu/đọc/chia sẻ chúng. Claude/Codex chạy qua CLI cục bộ (mỗi CLI tự giữ đăng nhập của nó qua Settings → Kết nối AI), Gemini dùng key trong keychain OS, Ollama offline — cài app sang máy khác không rò rỉ gì từ máy này.
🚫 Không lưu khi cần: chế độ Listening không ghi bất cứ gì xuống đĩa — không có gì “ở lại” để lo rò rỉ.
🌐 Server nội bộ: chỉ 127.0.0.1, có token per-launch + kiểm Origin → tiến trình lạ khó chạm.
✅ Không có: driver kernel, quyền admin, telemetry, “gọi về nhà”. Là app Python userland thuần.
8So sánh model tóm tắt local & tư vấn
Lưu ýOllama là “trình chạy”, không phải model. Chất lượng do model quyết định. Bảng dưới cho RTX 4070 12 GB, transcript tiếng Việt xen Nhật/Anh:
Model
VRAM (Q4)
Đa ngữ VN/Nhật
Tốc độ 4070
Nhận xét
Qwen2.5-7B-Instruct ⭐
~5 GB
Tốt nhất
Nhanh (~40–60 tok/s)
KHUYẾN NGHỊ — cân bằng nhất
Qwen2.5-14B-Instruct
~9 GB
Xuất sắc
Vừa (~20–30)
Chất lượng cao, chạy sau họp
SeaLLMs-v3-7B / Vistral-7B
~5 GB
Chuyên tiếng Việt
Nhanh
Nếu gần như chỉ tiếng Việt
Llama 3.1/3.3-8B
~5 GB
Khá (VN yếu hơn)
Nhanh
Phổ biến nhưng không hợp VN bằng Qwen
Gemma 2-9B
~6 GB
Khá
Vừa
Ổn
Phi-4-14B
~9 GB
VN yếu
Vừa
Lý luận mạnh nhưng không hợp nội dung Việt
Tư vấn: dùng Qwen2.5-7B-Instruct — đa ngữ tốt nhất cho VN+Nhật, chỉ ~5 GB VRAM (chạy chung Whisper vẫn dư), nhanh, 100% local miễn phí.
Muốn chất lượng cao nhất offline: Qwen2.5-14B (chạy sau họp). So với Claude/Gemini cloud: cloud mượt hơn chút nhưng gửi text ra ngoài + tốn quota; Qwen local đủ tốt cho biên bản họp và riêng tư tuyệt đối.
Cài Qwen local (provider mặc định)
Qwen là provider mặc định — chỉ cần cài Ollama + model một lần:
powershell -ExecutionPolicy Bypass -File scripts\setup-ollama.ps1 # cài Ollama + pull qwen2.5:7b
# đã là mặc định; muốn đổi model: AI Record → Settings → Summarization → Ollama model
# muốn dùng cloud: Settings → provider = Claude CLI / Codex CLI / Gemini
Mở rộng model & cài trên máy khác
App có sẵn catalog model (ai_record/summarizer_models.json, mặc định qwen2.5:7b) + công cụ để chọn/mở rộng/cập nhật:
Chọn trong app: Settings → Summarization → dropdown Ollama model (hiện ✓ model đã tải, đánh dấu mặc định) + ô Custom… cho tag bất kỳ. Máy khác chỉ cần chọn cỡ hợp GPU của nó, default vẫn Qwen.
Cài / mở rộng (máy bất kỳ):
.\scripts\setup-ollama.ps1 # cài Ollama (winget) nếu thiếu + pull qwen2.5:7b
.\scripts\setup-ollama.ps1 -Model qwen2.5:14b # hoặc tag khác
Research cập nhật model:python scripts\research-models.py — liệt kê model đã cài, dò registry Ollama tìm tag mới theo từng dòng, gợi ý lệnh ollama pull (chạy được cả khi offline). Hoặc nhờ AI Record agent research bằng web để cập nhật catalog theo nhu cầu.
Nút 📁 trong app mở thẳng thư mục này. Log chạy: %LOCALAPPDATA%\ai-record\ai-record.log. Ở chế độ Listening không có thư mục phiên nào được tạo — không transcript, không audio, không summary.
10Lưu ý & sự cố đã biết
Cần nhớ khi dùng
Cập nhật mã nguồn xong phải khởi động lại app. Giao diện (HTML/JS/CSS) được nạp lúc mở app; từ nay app gửi kèm chỉ thị no-store nên mở lại là chắc chắn lấy bản mới — trước đây trình duyệt nhúng có thể giữ bản cũ khiến “sửa rồi mà không thấy đổi”.
Nút ngôn ngữ trên thanh công cụ chỉ đổi cho phiên đang chạy. Đóng app mở lại là quay về Ngôn ngữ mặc định trong Settings. Muốn cố định lâu dài thì đặt ở Settings, đừng đặt ở nút.
Listening không lưu bất cứ thứ gì. Dừng nghe thì chữ vẫn còn trên màn hình để copy, nhưng đóng app là mất — không có thư mục phiên nào để mở lại.
Ghim ngôn ngữ khi bị nhận nhầm. Whisper đoán ngôn ngữ cho từng câu, nên câu ngắn dễ bị nhảy sang tiếng khác. Ghim một ngôn ngữ là whisper bỏ hẳn bước đoán.
Listening không quay màn hình / camera. Cần quay video thì dùng Record.
Đã sửa: cửa sổ nhảy lung tung trên màn hình phụ
Triệu chứng: ở màn hình phụ, bấm vào thanh tiêu đề là cửa sổ dịch đi một khoảng
(trái, phải hoặc xuống dưới) tuỳ chỗ bấm; màn hình chính thì không sao.
Nguyên nhân: màn phụ của máy đang để tỉ lệ 125%, còn thư viện cửa sổ
(pywebview) tự tính vị trí trong trang web rồi áp một hệ số phóng lấy từ màn hình
chính lúc khởi động. Đo được: kéo 4 px thì cửa sổ dịch 483 px trên
màn phụ, trong khi màn chính dịch đúng 4 px; ra lệnh đưa cửa sổ tới (2600, 300)
thì nó nằm ở (3250, 375) — mọi toạ độ bị nhân 1,25.
Đã sửa: app không dùng cơ chế kéo của thư viện nữa mà tự bám theo con trỏ
chuột thật bằng API hệ điều hành (toạ độ pixel vật lý, không dính tỉ lệ màn hình).
Kiểm chứng bằng chuột thật: kéo 60×30 thì cửa sổ dịch đúng 60×30 trên cả hai
màn hình.
Đổi nhẹ cách dùng: giờ kéo cửa sổ bằng khoảng trống trên thanh tiêu đề
(chỗ không có nút). Trước đây nhấn lên cả nút cũng kéo được — và chính điều đó làm
một cú bấm nút trở thành một cú kéo, khiến cửa sổ nhảy. Bấm nút giờ chỉ là bấm nút.
Lưu ý còn lại: trên màn 125% cửa sổ trông to hơn so với màn 100% —
đó là hành vi đúng của Windows (chữ và nút cũng to lên tương ứng), không phải lỗi.