cli_.
Triển khai · Trợ lý giọng nói TÔM
Bấm micro nói vào một nhóm Lark riêng — trợ lý nghe, hiểu, làm việc trên máy bạn rồi trả lời lại bằng giọng nói. Không thuê máy chủ, không fork repo.
Bạn tự tay 2 việc — cài 5 công cụ nền và tạo app Lark. Điền các ô bên dưới, trang tự ghép sẵn khối lệnh để bạn dán vào Claude Code làm nốt phần còn lại.
Khác hẳn các hệ thống tự động chạy trên mây mà bạn từng dựng. Ở đây máy tính của bạn chính là máy chủ — repo tải về máy, cấu hình nằm trong file scripts/.env trên máy, và khi bạn tắt máy thì TÔM ngủ theo. Không có ai chạy thay bạn.
| Chạy ở đâu | Ngay trên máy bạn. Không cần thuê máy chủ, không cần fork repo, không cần nạp Secrets lên GitHub. |
|---|---|
| Cấu hình nằm đâu | File scripts/.env trên máy — sửa trực tiếp, không phải vào web nào cả. |
| Tắt máy thì sao | TÔM ngừng, chờ bạn bật lại. Muốn chạy liên tục thì xem mục 08. |
| Ra lệnh bằng cách nào | Nói hoặc gõ chữ vào nhóm Lark điều khiển mà bạn tạo riêng. |
| Ai ra lệnh được | Chỉ mình bạn, và chỉ trong nhóm đó. Người lạ nhắn vào, TÔM không phản hồi. |
| Trả lời kiểu gì | Bạn nói bằng giọng → nghe trả lời bằng giọng. Bạn gõ chữ → đọc trả lời bằng chữ. |
Cấu hình mặc định là PERMISSION_MODE=bypassPermissions. Nghĩa là trong phạm vi thư mục BRAIN_ROOT bạn chỉ định, TÔM đọc — sửa — xoá file và gọi lệnh hệ thống mà không dừng lại xin phép. Đổi lại sự tiện lợi đó, bạn đang trao chìa khoá.
Vì vậy: chỉ cài trên máy riêng của bạn — đừng cài lên máy chung hay máy công ty. Và BRAIN_ROOT chỉ nên trỏ vào đúng thư mục bạn thật sự chấp nhận cho AI toàn quyền sửa, không trỏ vào cả ổ đĩa.
Mở PowerShell, gõ từng lệnh ở cột giữa để kiểm. Cái nào báo lỗi "không tìm thấy" thì cài theo cột phải.
| Cần có | Kiểm bằng | Chưa có thì cài |
|---|---|---|
| Node.js ≥ 18 | node -v | Tải bản LTS ở nodejs.org |
| Python 3.10–3.12 | uv --versionhoặc python --version | Gọn nhất là cài uv — nó tự lo luôn Python:powershell -c "irm https://astral.sh/uv/install.ps1 | iex" |
| ffmpeg | ffmpeg -version | winget install Gyan.FFmpegrồi mở cửa sổ PowerShell mới và kiểm lại |
| lark-cli | lark-cli --version | npm i -g @larksuite/cli |
| Claude Code | claude --version | Cài Claude Code CLI rồi đăng nhập trên máy này |
python? Rất hay gặp — cái python bạn gõ ra thường chỉ là bản rỗng của Microsoft Store, không dùng được. Đừng mất thời gian sửa nó: cứ cài uv ở trên, trình cài đặt của gói sẽ ưu tiên dùng uv và tự tạo môi trường Python riêng.
Khoảng 10 phút, làm một lần duy nhất. Phần này Claude Code không làm hộ được vì nó nằm trong tài khoản Lark của bạn.
Tạo xong, vào Add features → bật Bot. (Dùng bản Trung Quốc thì vào open.feishu.cn.)
im:message (nhận tin) · im:message:send_as_bot (gửi tin) · im:resource (tải và gửi file, ảnh, âm thanh).
Thiếu im:resource là hỏng phần giọng nói — nhắn chữ vẫn chạy bình thường nên rất dễ tưởng đã xong, nhưng nói thì không nghe được mà trả lời cũng không phát ra tiếng.
im.message.receive_v1Chọn Long Connection để khỏi phải có địa chỉ web công khai hay cài thêm ngrok.
Version Management & Release → Create version → Publish. Chưa publish thì mọi quyền và event bạn vừa bật chưa có hiệu lực — bạn nhắn vào nhóm mà máy im lặng hoàn toàn, không báo lỗi gì cả, gần như không thể tự đoán ra nguyên nhân.
App ID có dạng cli_… — lát nữa điền vào ô ở mục 04. App Secret chỉ dùng để đăng nhập lark-cli, không ghi vào repo, không ghi vào .env.
Một nhóm chỉ có mình bạn cũng được — đây là nhóm duy nhất TÔM lắng nghe. Vào Add members thêm Bot của app vừa tạo. Quên bước này là mọi thứ khác đúng hết mà vẫn không chạy.
lark-cli bằng chính app nàyChọn brand lark nếu dùng larksuite.com, feishu nếu dùng bản .cn. Kiểm lại bằng lark-cli profile list — phải thấy app của bạn với "active": true.
whoami.mjs để lấy mã mới — giá trị cũ trong .env thành vô dụng.
Điền tới đâu khối lệnh ở mục 05 tự cập nhật tới đó.
cli_.
lark-cli — tự tay dán khi được hỏi là an toàn nhất. Khối lệnh đã viết sẵn theo hướng đó.
VOICE_CODE trong .env.
.env, không phải cài lại gì.
Đã làm xong 2 việc tay ở mục 03 chưa?
Chưa tích ô nào thì khối lệnh sẽ tự yêu cầu Claude Code dẫn bạn làm nốt phần đó trước khi cài tiếp.
whoami.mjs rồi nhắn một tin bất kỳ là nó in ra sẵn), và chuyện máy có card NVIDIA hay không (Claude Code tự kiểm). Khối lệnh đã bao trọn cả ba.
Mở Claude Code ở thư mục bất kỳ rồi dán khối này vào — bước đầu tiên đã bảo nó tự tải repo về. Chỗ nào còn màu đỏ là bạn chưa điền.
im:resourceBRAIN_ROOT, làm việc rồi soạn câu trả lờiNhắn bằng chữ thì đi cùng đường này nhưng bỏ qua bước 3–4 và bước đọc — trả lời lại bằng chữ.
| Tệp trong repo | Nhiệm vụ |
|---|---|
scripts/lark-voice-bridge.mjs | Trái tim của hệ thống — nghe Lark, điều phối nghe/nghĩ/nói, nhớ được bối cảnh qua các lần khởi động lại |
scripts/whisper-server.py | Server nghe thường trú, có bước khởi động thử để nếu card đồ hoạ lỗi thì lùi về CPU thay vì chết hẳn |
scripts/text_to_mp3.py | Đọc câu trả lời thành tiếng (miễn phí) |
scripts/whoami.mjs | In ra mã định danh của bạn + mã nhóm điều khiển khi bạn nhắn thử |
scripts/check-setup.mjs | Cổng chốt môi trường — 10 mắt xích phải xanh hết |
scripts/start.ps1 | Nút bật. Nội dung thuần ASCII — thêm dấu tiếng Việt vào là cửa sổ tắt phụt |
scripts/watchdog.mjs | Tuỳ chọn chạy 24/7 — kiểm 3 phút một lần, thấy chết hoặc treo thì tự bật lại |
node check-itto.mjs # gói đã đủ mảnh chưa node scripts/check-setup.mjs # môi trường + Lark + .env đã sẵn sàng chưa
Lệnh thứ hai soát đúng 10 mắt xích — còn một dòng đỏ là chưa được bật:
1. Có file .env | 2. Đã điền mã định danh của bạn |
| 3. Đã điền mã nhóm điều khiển | 4. Node ≥ 18 |
| 5. Môi trường Python đúng đường dẫn | 6. Đủ các gói Python cần thiết |
7. ffmpeg có trên PATH | 8. lark-cli đã cài |
9. lark-cli có profile active: true | 10. claude đã cài |
node scripts/whoami.mjs rồi nhắn một tin vào nhóm — im lặng không in gì ra tức là một trong hai việc đó chưa xong, quay lại mục 03.
Chạy powershell -ExecutionPolicy Bypass -File scripts/start.ps1 rồi chờ cho tới khi cửa sổ hiện đủ cả hai dòng báo sẵn sàng (một cho phần điều phối, một cho phần nghe). Lần đầu máy phải tải mô hình nghe về — mất từ vài chục giây tới 1–2 phút. Đừng nói gì trước khi thấy dòng thứ hai.
Vào nhóm điều khiển, bấm micro nói — hoặc gõ chữ cũng được. Câu trả lời sẽ gắn thẳng vào tin nhắn của bạn. Vài lệnh nhanh gõ ngay trong nhóm: /ping (còn sống không) · /voice on|off · /reset (bắt đầu phiên mới) · /forget (xoá nhớ đệm) · /help.
Lối tắt trỏ vào đường mạng dạng \\máy\thư-mục\… sẽ bị Windows chặn ngầm: bấm đúp không mở gì, cũng không báo lỗi, rất dễ tưởng hỏng file. Hãy trỏ vào đường nội bộ trong ổ C:.
watchdog.mjs vào Scheduled Task để nó tự bật lại khi chết.Cứ 3 phút kiểm một lần; điền LARK_WEBHOOK vào .env để mỗi lần khởi động lại nó báo về Lark cho bạn biết.
Nhưng hãy hiểu rõ: 24/7 cộng với chế độ toàn quyền ở mục 01 nghĩa là có một AI được chạy lệnh tự do trên máy bạn không ai giám sát, kể cả lúc bạn đang ngủ. Chỉ bật khi bạn thật sự cần và chấp nhận đánh đổi đó.
DRY_RUN=true trong .env — hệ thống vẫn nhận tin, vẫn nghe, vẫn đọc trả lời, chỉ không gọi Claude thật. Dùng để dò luồng Lark và kiểm giọng nói.
| Hiện tượng | Nguyên nhân thật & cách sửa |
|---|---|
| Nhắn/nói xong không thấy trả lời gì | Ba khả năng, theo thứ tự hay gặp: (1) app chưa Publish phiên bản hoặc chưa bật event; (2) bot chưa được thêm vào nhóm; (3) sai mã nhóm / mã định danh trong .env. Nhìn cửa sổ đang chạy xem có dòng log nào không. |
whoami.mjs không in gì khi bạn nhắn |
Đúng nhóm nguyên nhân ở trên — app chưa Publish, chưa bật event, hoặc bot chưa vào nhóm. Quay lại mục 03. |
Bấm đúp start.ps1 → cửa sổ tắt phụt |
File .ps1 có ký tự tiếng Việt. PowerShell 5.1 đọc file .ps1 theo bảng mã cũ nên vỡ cú pháp. Bản trong gói đã thuần ASCII — nếu bạn tự sửa file thì giữ nguyên ASCII. |
| Lối tắt Desktop bấm không lên | Lối tắt trỏ vào đường mạng (\\…) — Windows chặn ngầm. Trỏ lại vào đường nội bộ ổ C:. |
| Nói câu nào cũng bị báo nghe không rõ | Máy có card NVIDIA nhưng thiếu 2 thư viện đi kèm — phần nghe nạp lên được nhưng chạy lỗi ngầm, không báo gì rõ ràng. Chạy lại install.ps1, hoặc cài thủ công nvidia-cublas-cu12 và nvidia-cudnn-cu12 vào môi trường Python của gói. Đây là sự cố tốn thời gian nhất. |
| Nghe sai chữ nhiều | Đang dùng mức nghe nhẹ, chưa chuẩn với tiếng Việt. Máy có card đồ hoạ thì nâng WHISPER_MODEL lên mức cao hơn trong .env. |
| Trả lời bằng chữ thay vì giọng | Phần đọc lỗi mạng tạm thời, hoặc thiếu ffmpeg — hệ thống tự rớt về chữ cho khỏi đứt mạch. Kiểm ffmpeg -version rồi thử lại. |
| Nghe được nhưng không gửi được tiếng | Gần như chắc chắn thiếu quyền im:resource. Bật thêm ở mục 03 rồi Publish lại. |
check-setup.mjs báo thiếu Python / thiếu gói |
Chưa chạy install.ps1, hoặc PYTHON_BIN trong .env trỏ sai chỗ. Chạy lại install.ps1. |
lark-cli báo lỗi đăng nhập |
Đăng nhập lại bằng đúng app của bạn. lark-cli profile list phải hiện active: true. |
| TÔM tự nhắn tin khi bạn không hỏi | Trong mã nguồn, chế độ chủ động nhắn mặc định là BẬT khi để trống. Muốn tắt phải ghi rõ CARE_MODE=false trong .env. |