- Pi-C.A.R.D là một trợ lý giọng nói AI chạy hoàn toàn cục bộ trên Raspberry Pi, là dự án hiện thực hóa khả năng LLM hội thoại trên phần cứng Raspberry Pi
- Có hai cách tương tác:
main.py dựa trên wake word và main_button.py dựa trên nút GPIO; trong lúc hội thoại không cần lặp lại wake word
- Lịch sử hội thoại có thể điều chỉnh trong
config.py, và nếu giảm kích thước bộ nhớ thì có thể nhận phản hồi nhanh hơn
- Để nhanh và gọn nhẹ, dự án dùng các bản triển khai C++ như whisper.cpp và llama.cpp; để quyết định khi nào cần truy cập thông tin bên ngoài thì dùng
tool-bert2, một BERT đã được fine-tune
- Chức năng dùng camera được hướng dẫn cấu hình ở nhiều chỗ trong README, nhưng hiện có lưu ý rằng nó đã tạm thời bị gỡ bỏ do thay đổi trong hỗ trợ vision model của llama.cpp
Pi-C.A.R.D làm gì
- Pi-C.A.R.D là một trợ lý dựa trên AI chạy trên Raspberry Pi, hướng tới việc xử lý cục bộ những tác vụ mà các LLM tiêu chuẩn như ChatGPT thực hiện trong môi trường hội thoại
- Tên gọi là viết tắt của Raspberry Pi - Camera Audio Recognition Device
- Dự án vẫn đang tiếp tục được phát triển và có thông báo rằng sẵn sàng nhận issue hoặc pull request
- Tác giả cho biết hy vọng hỗ trợ Docker mới được thêm vào sẽ giúp việc thiết lập và chỉnh sửa dễ dàng hơn
- Hiện chưa có video giới thiệu, nhưng dự kiến sẽ được cung cấp sau
Cách hoạt động
-
Chế độ wake word
- Chạy
main.py thì hệ thống sẽ lắng nghe wake word để bắt đầu hội thoại
- Wake word mặc định là
"raspberry", "barry", "razbear"
- Sau khi cuộc trò chuyện bắt đầu, không cần lặp lại wake word mỗi lần
- Nói các từ như
"stop", "exit", "goodbye" để kết thúc hội thoại
- Wake word và các hành vi liên quan có thể thay đổi trong
config.py
-
Chế độ nút bấm
- Nếu dùng breadboard, dây nối và nút bấm thì có thể bắt đầu hội thoại bằng nút GPIO
- Cách dùng là nhấn nút rồi nói lệnh, và theo README đây là cách tương tác mượt hơn
- Cấu hình nút bấm làm theo hướng dẫn trong
main_button.py
- Ở phiên bản nút bấm, có thể dùng nút để bắt đầu hội thoại hoặc dừng assistant bất cứ lúc nào
-
Bộ nhớ hội thoại
- Chatbot có bộ nhớ hội thoại có thể cấu hình
- Có thể khiến nó lặp lại phát biểu trước đó hoặc đào sâu hơn vào chủ đề trước đó
- Nếu muốn phản hồi nhanh hơn, có thể đặt giá trị bộ nhớ nhỏ hơn trong
config.py
Mục tiêu và giới hạn của việc chạy cục bộ
- Mục tiêu của dự án là kiểm tra xem có thể tạo ra một trợ lý giọng nói hoàn toàn offline hiệu quả đến mức nào trên phần cứng tương đối rẻ như Raspberry Pi
- Vì mọi xử lý đều diễn ra cục bộ nên nó không mạnh hoặc nhanh bằng các hệ thống dựa trên đám mây
- README cho rằng trong năm qua đã có nhiều tiến bộ lớn ở các mô hình LLM nhỏ, và dự án này cũng có thể được cải thiện theo
- Lý do không làm thành ứng dụng là vì phần khó nhất được xem là chạy một trợ lý giọng nói hoàn toàn offline thật nhanh trên Raspberry Pi
- Tài liệu giải thích rằng nếu cách này hoạt động thì trên phần cứng mạnh hơn, hệ thống tương tự có thể chạy nhanh hơn
Chạy và cấu hình
- Tải repository về, hoàn tất yêu cầu và cấu hình rồi chạy bằng lệnh sau
python main.py
- Phiên bản nút bấm chạy bằng lệnh sau
python main_button.py
- Chạy bằng Docker được giới thiệu là cách khuyến nghị, dùng các lệnh sau
sudo docker-compose build
sudo docker-compose up
- Hỗ trợ Docker là tính năng mới được thêm gần đây nên có thể chưa hoạt động hoàn hảo
- Cách dùng Docker hiện chỉ chạy được phiên bản wake-word, và việc chuyển quyền truy cập GPIO vào container vẫn chưa rõ ràng
Phần mềm và công cụ được sử dụng
- Để tạo ra một hệ thống nhanh và nhẹ, dự án dùng các bản triển khai C++ ở những nơi có thể
- Chuyển lời nói thành văn bản dùng whisper.cpp, và cần cấu hình theo hướng dẫn quick-start
- README giải thích rằng tính năng vision dùng llama.cpp, nhưng lưu ý ở đầu trang nói rằng do llama.cpp không còn tích cực hỗ trợ vision model nên chức năng camera đã bị gỡ tạm thời
- Để assistant hoạt động gần với một trợ lý thực thụ hơn, dự án cung cấp một số khả năng truy cập công cụ
- Việc quyết định truy cập công cụ được thực hiện qua tool-bert
tool-bert2 là một BERT đã được fine-tune để quyết định thời điểm truy cập thông tin bên ngoài
- Cách tạo mô hình này được hướng dẫn trong repository tool-bert
- Để bật truy cập công cụ, cần kiểm tra các key và secret cần thiết trong
.env.example
Trạng thái camera và tính năng vision
- Trong phần nội dung README có giới thiệu rằng nếu kết nối camera với Raspberry Pi, có thể chụp ảnh, mô tả những gì nhìn thấy và đặt câu hỏi về hình ảnh đó
- Cấu hình tính năng vision là đổi
vision_model thành vlm trong config.py
- Mô hình được nhắc đến để sử dụng là Qwen2-VL-2B-Instruct
- Tài liệu giải thích rằng do kích thước token của ảnh đầu vào là động nên nếu giảm kích thước ảnh chụp sẽ rút ngắn thời gian suy luận
- Tuy nhiên, theo lưu ý ở đầu dự án thì hiện tại chức năng camera đang ở trạng thái tạm thời bị gỡ bỏ
Phần cứng cần thiết
- Cấu hình phần cứng cơ bản là Raspberry Pi 5 Model B, micro USB và loa
- Micro USB và loa được kết nối vào các cổng USB của Raspberry Pi
- Camera được kết nối vào cổng camera của Raspberry Pi
- Các linh kiện được dùng trong README như sau
- Raspberry Pi 5 dùng cổng camera mới nên cần đầu nối camera mới
- Đầu nối camera là tùy chọn, nhưng nếu muốn dùng tính năng camera thì cần mua
- Với cấu hình nút GPIO, README cho biết phần đầu của tutorial đã hỗ trợ hữu ích
- Dự án tập trung vào việc tinh chỉnh để chạy trên Raspberry Pi 5, nhưng giải thích rằng nó cũng có thể chạy trên thiết bị khác
Lộ trình và tiến độ
- Các mục được đánh dấu đã hoàn thành gồm tính năng hội thoại cơ bản, tính năng camera, benchmark thời gian phản hồi, thử nghiệm overclocking và tìm cách rút ngắn thời gian whisper
- Tính năng dừng assistant rồi đặt câu hỏi mới, dùng custom tuned model và cải thiện
tool-bert như mô hình hàm cho dịch vụ bên ngoài cũng được đánh dấu hoàn thành
- Việc thử nghiệm kết nối nguồn di động và Docker hóa để kiểm thử trên nhiều thiết bị hơn cũng đã hoàn tất
- Các mục còn lại gồm tutorial và video được cải thiện, tạo mô hình tùy chọn bằng entropix, thử nghiệm ngôn ngữ khác và bổ sung thêm nhiều dịch vụ bên ngoài
- Bảng Notion để theo dõi tiến độ hiện vẫn chưa hoàn thiện, và có cung cấp liên kết
1 bình luận
Ý kiến trên Hacker News
Tôi muốn tạo một trợ lý giọng nói hoàn toàn ngoại tuyến, không cần kết nối Internet, để bảo vệ quyền riêng tư của người dùng và không để dữ liệu đi tới máy chủ của bên thứ ba
Đây là một nỗ lực tốt, cảm ơn
Tôi tò mò liệu nó chỉ chạy trên Pi5, hay cũng chạy được trên các board khác không phải Raspberry Pi
Nói nghiêm túc thì cái tên đã khiến tôi chú ý, và sau khi đọc phần giới thiệu, tôi nghĩ “nếu đây là Alexa không upload mọi thứ mình nói lên Amazon thì mình cũng dùng được”
Nếu wake word mặc định là “hey assistant” thì tôi đề xuất “Computer” :) Tất nhiên giọng nói phải nghe như https://en.wikipedia.org/wiki/Majel_Barrett
Thứ tôi cần là một trợ lý giọng nói chạy nổi trên RPi 4, tích hợp với HomeAssistant, và chỉ ngoại tuyến nên không gửi dữ liệu của tôi đi đâu cả
So với những thứ tôi từng thấy đến nay, dự án này dường như đáp ứng gần như mọi điều kiện, nên có vẻ được làm rất tốt
Nhân tiện, nếu có gợi ý micro tương thích RPi phù hợp để dùng kiểu như Alexa thì tôi cũng muốn biết
Khó mà chạy thực tế mô hình ngôn ngữ lớn trên 4B, nhưng cũng không nhất thiết phải dựa trên mô hình ngôn ngữ lớn
Trong cộng đồng Rhasspy, một mô hình phổ biến là thực hiện nhận diện wake word rẻ và nhẹ ngay trên các thiết bị vệ tinh có gắn micro (4B là đủ cho việc này), còn phần ghi âm thực sự thì stream qua mạng nội bộ về hub trung tâm để có kết quả tốt hơn
Có thể mua trên eBay khoảng 15–20 USD
NabuCasa đã thuê nhà phát triển chính của Rhasspy để làm tính năng này, và nó tiếp tục tốt hơn qua từng bản cập nhật
Nếu “Tại sao là Pi-card? Raspberry Pi - Camera Audio Recognition Device”, thì có vẻ đã bỏ lỡ cơ hội dùng LCARS
Lẽ ra có thể đặt là LLM Camera Audio Recognition Service, và tất nhiên phản hồi với từ khóa “computer”. Nếu chạy được cả trên nơi không phải Pi thì có thể thành LCARS
Đọc lên 100% là Picard, và dễ nhận ra hơn LCARS
Tôi rất mong được thử cái này
Theo tôi biết, các trợ lý giọng nói mở, ổn định, linh hoạt và đặt quyền riêng tư làm trọng tâm vẫn còn rất thiếu, nên tôi hy vọng dự án này sẽ có thêm động lực
Khoảng 1 năm trước, gia đình tôi rất muốn mua Alexa, nhưng tôi không muốn đặt một thiết bị giám sát của Bezos trong nhà nên đã thuyết phục họ để tôi tự làm thử. Tôi chọn Mycroft trên Pi 4 nhưng không suôn sẻ; nhận diện wake word lúc được lúc không, khả năng tích hợp cũng thiếu, và ở thời điểm đó nó trông gần như là một dự án bị bỏ mặc. Tôi đã định đóng góp cho dự án và các tích hợp đang bị kẹt, nhưng cuộc sống cuốn đi nên không quay lại được, và may là gia đình tôi cũng quên mất Alexa
Không rõ là nano hay pico, dù sao cũng là một board cỡ khoảng SO-DIMM. Không có wake word; khi nhấn nút đang sáng trắng thì màu đổi hai lần: một lần để xác nhận đã nhấn, một lần để báo đang nghe. Khi nói xong, màu lại đổi và nó đọc câu trả lời
Backend dùng thứ gì đó của Google, và việc thiết lập rồi giữ cho nó chạy thật sự rất khó chịu, nhưng nó có hoạt động. Tôi có hai thiết bị như vậy, nên đã chờ một thứ gì đó cho phép tự host thứ tương tự
Tôi dự định sẽ làm thêm nhiều việc ở đây. Có vài demo ngắn trên YouTube để đánh giá chất lượng hiện tại: https://www.youtube.com/watch?v=OryGVbh5JZE
Tôi tò mò liệu có thể chạy cái này trên máy Linux thông thường không
Hoặc liệu có ai biết một dự án tương tự làm được như vậy không
Trước đây tôi từng tìm kiếm, nhưng lĩnh vực này phức tạp và các ràng buộc khá tinh tế
Nhìn chung Pi-C.A.R.D có vẻ dùng Python và C++, nên tôi nghĩ không có vấn đề lớn khi chạy nó ở bất cứ đâu có thể chạy/biên dịch Python và C++
Khoảng 3 năm trước tôi từng thử làm thứ như thế này trên thế hệ RPI 4 đầu, nhưng vấp phải giới hạn phần cứng và giới hạn kiến thức của mình
Thấy giờ nó thực sự chạy được thì thật sự rất tuyệt
Sẽ rất hay nếu có một raspi hat có thể cắm GPU, nhưng không rõ liệu có thực tế hay khả thi không
Card đồ họa của hôm nay là rác điện tử của ngày mai, nên chúng có thể có được đời sống thứ hai trong việc tăng cường cho các dự án raspi DIY như thế này
Nếu gắn GPU/adapter/bộ nguồn chỉ để tận dụng các CUDA core giá rẻ, rất có thể xét về điện năng, giá cả và kích thước thì lại kém hơn các giải pháp SoC hoặc x86 NUC phù hợp hơn
Tôi không biết trong PCIe có phép màu gì, nhưng ít nhất một bo mạch bán sẵn là Atomic Pi từng có giao diện PCIe “lộ ra”
Dù sao thì GPU nằm trên một PCB nhỏ, và PCB đó được nối qua cáp USB3 tới một PCB nhỏ hơn ở khe PCIe của bo mạch chủ. Ý chính là dù PCIe là gì đi nữa, vẫn có thể truyền nó qua cáp USB3 đến GPU để GPU hoạt động
Tôi thấy có loa trong danh sách phần cứng, không biết nó có phản hồi bằng giọng nói không
Hiện tại đang dùng https://espeak.sourceforge.net/ nên nghe không thật sự dễ chịu lắm
Ngoài ra, vì phản hồi của mô hình ngôn ngữ lớn được stream nên không phải chờ lâu mới có câu trả lời. Do xử lý theo từng chunk, đôi khi nó cũng phát ra một phần của từ trong chốc lát. Tất nhiên thời gian chờ cũng phụ thuộc vào việc dùng mô hình nào và kích thước ngữ cảnh là bao nhiêu
Tại sao Picard lúc nào cũng phải chỉ định cả sở thích về nhiệt độ của trà Earl Grey vậy?
Nếu AI thông minh đến mức đó thì đáng lẽ nó đã phải học được sở thích của ông ấy rồi chứ?
Trong phim, nhiều nhân vật ra lệnh cho máy tái tạo theo cách linh hoạt hơn. “Tea, Earl Grey, Hot” có vẻ là thói quen của Picard, và có thể là thói quen hình thành từ một thiết bị đồ ăn/thức uống nguyên thủy hơn máy tái tạo của Enterprise-D
Liệu trong thế giới hậu khan hiếm vẫn còn kiện tụng không? Có lẽ là có
Hầu hết người trong Starfleet có vẻ không biết dùng máy tái tạo cho đúng. Dù có một thiết bị thông minh đến vậy, họ vẫn dùng nó như một món đồ gia dụng bình thường chưa từng đọc hướng dẫn, bỏ lỡ 90% tính năng rồi than phiền rằng đồ ăn tái tạo dở
https://i.redd.it/hluqexh3oqc91.jpg
Tôi thắc mắc wake word hoạt động như thế nào
Có phải nó liên tục lắng nghe rồi bỏ qua nếu trong vài giây cuối không có wake word hoặc cụm từ đánh thức không?
Chính xác hơn thì nó lưu nhiều chunk âm thanh rồi bỏ chunk cũ nhất, tức là một cửa sổ trượt (rolling window)