MỤC LỤC
Sau khi nhận được câu trả lời, thông qua phần mềm văn bản sẽ được robot phát lại dưới dạng lời nói từ đó hoàn thành yêu cầu của người dùng. Kết hợp cùng mệnh lệnh và khả năng điều khiển bằng tay, với màn hình cảm ứng được tích hợp các chế độ khác nhau ứng với mỗi giai đoạn thực hiện, robot sẽ đem lại trải nghiệm hoàn hảo nhất cho người dùng.
Ban đầu, ta sẽ đặt 1 biến là imgFace với giá trị mặc định là rỗng và biến có thể nhận các giá trị khác nhau ứng với mỗi giai đoạn. Khi người dùng bắt đầu hỏi thì biến imgFace sẽ được gán giá trị là hear, lúc này giao diện sẽ được chuyển sang trạng thái nghe. Cuối cùng, khi người dùng kết thúc câu hỏi và robot bắt đầu trả lời thì biến imgFace sẽ được gán giá trị answer, khi đó giao diện sẽ chuyển sang trạng thái trả lời.
Nút bấm sẽ có tác dụng trong trường hợp người dùng muốn robot trực tiếp lắng nghe yêu cầu của người dùng mà không cần thông qua mệnh lệnh. Ở đây ta sử dụng floatingActionButton trong Flutter giúp tạo ra một nút bấm mà khi người dùng nhấn vào thì chương trình sẽ chạy hàm _floatingActionButtonOnPressed, nội dung của hàm này sẽ được giải thích ở phần sau. Khi nút bấm được nhấn thì trên màn hình sẽ chuyển từ biểu tượng mic qua biểu tượng stop, đây là hai biểu tượng được tích hợp sẵn trong flutter.
Đây sẽ là phần trọng tâm của robot, có khả năng phân tích và xử lý cũng như trả lời những yêu cầu mà người dùng đưa ra. Ở đây ta sử dụng 2 API đã được OpenAI cho phép các lập trình viên sử dụng miễn phí, từ đó ta có thể liên kết được với ChatGPT và Dall-E để nhận về những câu tra lời dưới dạng văn bản hoặc hình ảnh. Nếu chương trình hoạt động thì ta sẽ nhận được dưới dạng văn bản đối với câu trả lời là văn bản hoặc là một đường liên kết nếu câu trả lời là hình ảnh.
Nếu chương trình không trả ra bất cứ gì thì ta sẽ để mặc định trả về đoạn văn bản “ Đã có lỗi xảy ra với server”. Phần này được thiết kế để tiếp nhận yêu cầu của người dùng sau đó chuyển câu hỏi về dưới dạng văn bản để chatGPT xử lý. Sau khi nhận được câu trả lời như đã nói ở phần 2.1.2.1 nội dung sẽ được chuyển từ dạng văn bản thành lời nói để trả lời người dùng.
Ở đây ta sử dụng 2 thư viện là flutter_tts để chuyển từ văn bản thành lời nói và speech_to_text để chuyển lời nói thành văn bản. Hàm này có nhiệm vụ là nếu robot đang không ở trong trạng thái lắng nghe thì sẽ chuyển qua trạng thái lắng nghe. Ở đây ta có biến command sẽ ghi lại lời người dùng nói, nếu lời người dùng nói trùng khớp với giá trị mặc định thì hàm _floatingActionButtonOnPressed sẽ được chạy.
Hàm _ floatingActionButtonOnPressed sẽ được chạy khi người dùng nói đúng mệnh lệnh mặc định hoặc nhấn nút trên màn hình. Khi chạy biến speech sẽ được gán bằng với giá trị trả về của hàm isArtPromptAPI trong class openAIService đã được viết từ trước, với đầu vào là giá trị của biến lastword.
Nếu câu trả lời nhận được là văn bản thì robot sẽ phát lại thành lời thông qua hàm systemSpeak. Nếu câu trả lời là hình ảnh thì hình ảnh sẽ được hiển thị ra màn hình. Sau khi thực hiện xong nhiệm vụ thì chương trình sẽ được setState để lặp lại quy trình.
Với thư viện này, thông qua camera ta có thể xác định được số người có mặt trước camera. Với biến faces là số người nhận diện được, ta sẽ gửi tín hiệu tới Arduino để xử lý. Khi faces nhận về giá trị lớn hơn 0 ta sẽ gửi về giá trị là 0 và với các giá trị còn lại ta sẽ gửi về giá trị là 1.
Máy tính nhúng raspberry Pi 4b sẽ có nhiệm vụ xử lý và thực hiện chương trình xử lý ảnh. Ứng dụng này cho phép camera điện thoại có thể kết nối với máy tính nhúng thông qua mạng wifi và từ đó truyền hình ảnh nhận được về máy tính nhúng. Như đã nói ở phần 2.2.1, sau khi nhận diện được số người có mặt thì máy tính nhúng sẽ gửi tín hiệu cho Arduino.
Thông qua cổng Serial, arduino sẽ nhận được các giá trị trả về từ máy tính nhúng. Nếu biến command nhận giá trị là 1, tức là không có người phía trước camera. Khi đó Arduino sẽ điều khiển để động cơ tiếp tục quay từ đó điều chỉnh hướng của camera và xác định vị trí mặt người.
Khi command nhận giá trị là 0, tức là camera đã nhận diện ra vị trí của người dùng. Từ đó Arduino sẽ điều khiển để động cơ dừng lại qua đó vị trí màn hình sẽ luôn hướng về phía người sử dụng.