Mục lục:

Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator: 3 bước
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator: 3 bước

Video: Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator: 3 bước

Video: Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator: 3 bước
Video: Six Key elements MLOps 2024, Tháng bảy
Anonim
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator
Một tôi lắng nghe, thúc đẩy Google Coral TPU Accelerator

Sau đây, tôi muốn mô tả một phiên bản điều khiển bằng giọng nói của MeArm, một cánh tay rô bốt xyz nhỏ có tay cầm. Tôi đã sử dụng MeArm Pi từ các ngành công nghiệp MIME, nhưng hệ thống phải có thể áp dụng cho bất kỳ phiên bản nào của MeArm này hoặc các thiết bị điều khiển bằng servo tương tự.

Việc sử dụng Google Coral TPU Accelerator cho phép chạy các tập lệnh nhận dạng giọng nói TensorFlow ngoại tuyến nhanh chóng trên Raspberry Pi và theo đó điều khiển các thiết bị vật lý theo lệnh bằng giọng nói, với độ trễ dưới một giây.

Thiết bị được mô tả ở đây là sự kết hợp và phần mở rộng của các khái niệm được mô tả trong hai phần hướng dẫn trước. Đây là phần mở rộng của việc triển khai trước đó của điều khiển bằng giọng nói Google Coral, Jumping Jack, được mô tả ở đây và một cải tiến lớn của MeArm được điều khiển bằng giọng nói của Google AIY được mô tả ở đây.

MeArm được điều khiển bằng giọng nói sử dụng hệ thống AIY của Google Voice yêu cầu quyền truy cập trực tuyến, không dễ triển khai, bắt buộc phải nhấn nút để kích hoạt nghe lệnh thoại và có thời gian chờ lâu. Google Coral TPU Accelerator được sử dụng hiện cho phép chạy các mô hình TensorFlowLite ngoại tuyến với tốc độ cao trên Raspberry Pi hoặc các thiết bị Linux khác. Trong số các ví dụ trên trang Google Coral Github, có một ví dụ được gọi là "con rắn thính" cho hệ thống nhận dạng giọng nói có thể hiểu 140 cụm từ khóa (tháng 9 năm 2019), sau đó được ánh xạ tới các tổ hợp phím ảo. Việc kết hợp các "tổ hợp phím" này với việc thực thi một số chức năng được lập trình bằng Python giúp bạn có thể xây dựng một thiết bị được điều khiển bằng lệnh thoại. Gần đây tôi đã mô tả cách triển khai đầu tiên, một giắc nhảy cơ điện được điều khiển bằng giọng nói. Việc triển khai ở đây phức tạp hơn một chút và cho phép điều khiển tất cả bốn Servos của MeArm để di chuyển MeArm liên tục hoặc để nó di chuyển đến một số lượng được xác định trước vị trí, hoặc để thực hiện một số nhiệm vụ phức tạp hơn.

Sử dụng tập lệnh được cung cấp ở đây làm ví dụ, nó sẽ tương đối đơn giản để tạo các thiết bị điều khiển bằng giọng nói khác, ví dụ: ô tô rô bốt hoặc đơn vị công nghệ hỗ trợ.

Quân nhu

  • MeArm. Được sử dụng ở đây: MeArm Pi từ MIME Industries
  • Raspberry Pi 4
  • Google Coral TPU Accelerator
  • Nắp capô servo Adafruit 16 kênh
  • một số cáp jumper
  • tùy chọn: tụ điện cho nắp ca-pô servo, khoảng 400 µF cho 4 servo (được Adafruit khuyến nghị)
  • Nguồn điện 5-6 V cho nắp ca-pô servo. Tôi ở đây đã sử dụng bộ sạc 6V cũ, bộ pin 4x AA cũng hoạt động tốt
  • Cái mic cờ rô. Tôi đã sử dụng một webcam HD3000 cũ của Microsoft làm micrô.

Bước 1: Thiết lập hệ thống

Thiết lập hệ thống
Thiết lập hệ thống
Thiết lập hệ thống
Thiết lập hệ thống

Tải xuống hình ảnh Raspian được định cấu hình trước cho Google Coral TPU Accelerator từ trang Google Coral Github và cài đặt nó trên thẻ µSD. Hình ảnh cũng chứa một số đoạn mã ví dụ. Thiết lập số Pi như được chỉ ra.

Cài đặt công cụ dò từ khóa mẫu từ trang web Google Coral GitHub, nếu không có trong hình ảnh và tất cả các chương trình bắt buộc. Gắn micrô vào Pi. Tôi khuyên bạn nên chơi với ví dụ "Rắn thính" để đảm bảo mọi thứ đang hoạt động.

Tải xuống và cài đặt phần mềm ca-pô 16 kênh Adafruit, như được mô tả tại đây. Cài đặt nắp ca-pô và chơi với các ví dụ Adafruit để đảm bảo mọi thứ hoạt động bình thường.

Tải xuống các tệp được đính kèm với hướng dẫn này và sao chép chúng vào thư mục "Project Keyword Spotter". Tệp "command_v1_MeArm.txt" phải được sao chép vào thư mục con "config".

Kết nối các Servo của MeArm của bạn với nắp ca-pô servo như được chỉ ra. Tôi đã sử dụng cổng 15 để lên / xuống, cổng 11 để chuyển tiếp / lùi, cổng 7 cho lượt và cổng 3 cho serpper Gripper.

Trong tập lệnh, bạn có thể phải điều chỉnh các giá trị min / center / max cho từng servo theo cấu hình của bạn, Các cài đặt này giúp tránh hư hỏng cho servo. Bạn cũng có thể phải sửa đổi danh sách "vị trí", "vận tải1" và "vận tải2" được bao gồm.

Chạy tập lệnh. Cho đến nay tôi đã chạy nó từ IDE.

Trong trường hợp bạn muốn sửa đổi các cụm từ khóa gợi lên một chức năng nhất định theo nhu cầu của bạn.

Hệ thống có thời gian chờ khoảng 1 giây, nhưng phụ thuộc nhiều vào việc thực hiện các thao tác nào. Trong một số trường hợp, giai đoạn quan trọng phải được lặp lại, độ chính xác của nhận dạng không phải lúc nào cũng là 100%.

Bước 2: Sử dụng thiết bị

Nếu mọi thứ đã được thiết lập và kiểm tra, bạn có thể chạy thiết bị.

Một hạn chế hiện tại là một lệnh nhất định được thực hiện lặp đi lặp lại miễn là nó không bị dừng lại (sử dụng "trò chơi dừng") hoặc một lệnh khác được đưa ra. Các nhiệm vụ nhiều bước phức tạp, ví dụ: "transport1" (được gợi lên bởi cụm từ "khởi chạy trò chơi") luôn được thực hiện đến bước cuối cùng.

Vì vậy, bằng cách "rẽ phải", thiết bị sẽ di chuyển theo từng bước nhỏ sang phải cho đến khi dừng lại hoặc đạt đến giá trị tối đa đặt trước. "khởi chạy trò chơi", "trò chơi tiếp theo" hoặc "start_video" sẽ bắt đầu một loạt các bước di chuyển được xác định bởi danh sách chứa cài đặt cho mỗi servo ở một bước nhất định. "trò chơi ngẫu nhiên" sẽ thiết bị để nhảy từ bước này sang bước khác, được chọn ngẫu nhiên từ một danh sách các cài đặt.

Như bạn có thể thấy trong video kèm theo, tôi đã xây dựng một vật thể hình diabolo từ LEGO có thể được MeArm nhặt và được vận chuyển từ vị trí này đến vị trí khác bằng một bộ chuyển động được xác định trước. Bạn có thể xác định các chức năng của riêng mình bằng cách sửa đổi danh sách 'transport1' hoặc 'transport2'.

Bước 3: Tập lệnh

Tập lệnh được liệt kê ở đây là bản sửa đổi của ví dụ "Rắn thính" từ "Project Keyword Spotter". Ví dụ đã được lược bỏ đến mức tối thiểu, sau đó phần để điều khiển các servo được thêm vào, dựa trên phần mềm và các ví dụ được cung cấp cho nắp ca-pô của Adafruit servo.

Hiện tại kịch bản vẫn chưa được tối ưu hóa. Sử dụng theo rủi ro của riêng bạn, thoải mái sửa đổi và tối ưu hóa.

Ngoài tập lệnh python còn có tệp lệnh và tệp nhãn đã sử dụng. Đặt nó vào thư mục con cấu hình.

Như đã đề cập trước đây, một số điều chỉnh các thông số có thể được yêu cầu để điều chỉnh tập lệnh cho MeArm đặc biệt của bạn hoặc một số thiết bị khác.

# Bản quyền 2019 Google LLC #

# Được cấp phép theo Giấy phép Apache, Phiên bản 2.0 ("Giấy phép"); # bạn không thể sử dụng tệp này trừ khi tuân thủ Giấy phép. # Bạn có thể nhận được bản sao của Giấy phép tại # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" https://www.apache.org/licenses/LICENSE-2.0 # # Trừ khi luật hiện hành yêu cầu hoặc được đồng ý bằng văn bản, phần mềm # được phân phối theo Giấy phép sẽ được phân phối trên CƠ SỞ "NGUYÊN TRẠNG", # KHÔNG CÓ BẢO ĐẢM HOẶC ĐIỀU KIỆN CỦA BẤT KỲ HÌNH THỨC NÀO, rõ ràng hay ngụ ý. # Xem Giấy phép để biết các quyền điều chỉnh ngôn ngữ cụ thể và # giới hạn theo Giấy phép. # mã "hear_snake" ban đầu đã được Tiến sĩ H. sửa đổi để triển khai MeArm '' '. Các Servos của MeArm (các ngành MIME) được gắn vào các cổng 3, 7, 11 và 15 của nắp ca-pô. Để biết thông tin chi tiết, vui lòng xem phần Hướng dẫn về "Listening MeArm". Các lệnh: "position x", x = 0 đến 9, di chuyển thiết bị đến một vị trí xác định trước nhất định. "di chuyển / đi lên", "di chuyển / đi xuống", "đi / quay về phía trước", "đi / quay ngược lại", "rẽ / đi trái" và "rẽ / đi phải" gợi lên chuyển động chậm, từng bước trong các hướng, "dừng trò chơi" dừng các chuyển động. "tab mở" và "tab đóng" mở hoặc đóng bộ kẹp. "bắt đầu video" gợi ý thiết bị đi theo một thứ tự vị trí đặt trước, được xác định bởi 'vị trí' trong danh sách. "trò chơi ngẫu nhiên" dẫn đến một mô hình chuyển động ngẫu nhiên, "trò chơi dừng" kết thúc nó. "khởi động trò chơi" bắt đầu một loạt các bước di chuyển khác được xác định trước bởi danh sách 'transport1', "trò chơi tiếp theo" hoạt động ngược lại được xác định trước bởi 'transport2' Sử dụng theo rủi ro của riêng bạn. '' từ _future_ nhập tuyệt đối_import từ _future_ nhập bộ phận từ _future_ nhập print_ Chức năng nhập khẩu Argparse nhập hệ điều hành từ nhập ngẫu nhiên Randint từ nhập luồng Thời gian nhập luồng từ edgetpu.basic.basic_engine nhập Mô hình nhập BasicEngine nhập pygame từ pygame.locals nhập * hàng đợi nhập từ nhập ngẫu nhiên randrange từ adafruit_servokit nhập bảng nhập ServoKit nhập busio nhập adafruit_pca9685 thời gian nhập i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (channel = 16) # bộ số kênh # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # cài đặt tối thiểu, trung tâm và tối đa up_l = 145 # tăng / giảm servo: up md_l = 95 dn_l = 45 up_r = 135 # servo tiến / lùi md_r = 90 dn_r = 50 ri_t = 30 # quay tay phải hoặc trái: vị trí bên phải md_t = 90 # quay tay phải hoặc trái: vị trí trung tâm le_t = 150 op_g = 65 # mở kẹp md_g = 90 # kẹp tâm ở giữa cl _g = 130 # tay nắm đóng vert = 15 # số cổng servo, lên / xuống servo forw = 11 # số cổng servo, lượt servo di chuyển tiến / lùi = 7 # cổng servo để xoay tay cầm servo = 3 # cổng servo để kẹp servo # danh sách cài đặt cánh tay cho chín vị trí vị trí = [(md_l, md_r, md_t, op_g), (up_l, md_r, ri_t, op_g), (up_l, md_r, md_t, cl_g), (up_l, md_r, le_t, cl_g), (md_l, md_r, md_t, op_g), (md_l, md_r, md_t, md_g), (md_l, md_r, md_t, cl_g), (dn_l, dn_r, ri_t, op_r, md_t, md_g), (dn_l, dn), (dn_l, dn_r, le_t, md_g)] # xác định 10 vị trí cơ bản, được biểu thị bằng số nguyên 0-9 # quy trình vận chuyển [vert / forward / turn / grip] transport1 = [(140, 70, 65, op_g), (110, 50, 65, op_g), (65, 50, 65, op_g), (65, 70, 65, cl_g), (120, 70, 65, cl_g), #get đối tượng (100, 70, 135, cl_g), (100, 80, 135, cl_g), (100, 80, 135, md_g), (100, 80, 135, op_g), (140, 70, 135, op_g), (140, 70, 90, op_g), (140, 70, 65, op_g)]

Transport2 = [(140, 70, 65, op_g), (140, 70, 135, op_g), (95, 70, 135, op_g), (95, 80, 135, op_g), (95, 80, 135, cl_g), (110, 70, 135, cl_g), (110, 70, 65, cl_g), (70, 70, 65, cl_g), (70, 70, 65, op_g), (80, 50, 65, op_g)]

dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dance"

#moving MeArm to Zero position status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. angle = status [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #Callback function def _init _ (self, q): self._q = q def callback (self, command): self._q.put (command) class Ứng dụng: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (self, event): if event.type == pygame. QUIT: self._running = False def MeArmPos (self, key): # điều khiển MeArm đến các vị trí đặt trước, từ khóa: "position x" key = int (key) p = position [key] a = p [0] b = p [1] c = p [2] d = p [3] print ("Positions:", key, "vert / forw / turn / grip:", a, "/", b, "/", c, "/", d, "độ") trạng thái = [a, b, c, d] # tài liệu trạng thái hiện tại print (trạng thái) # sys.stdout.write ("Vị trí: ", key," left / right: ", a," / ", b," Degree ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # điều khiển điệu nhảy MeArm, từ khóa: "start_video" dnce = dance1 sp = (len (dnce)) cho r trong khoảng (sp): # thứ tự thăng tiến của các vị trí, bước sp dc = dnce [r] p = position [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # đặt vận tốc của chuyển động theo thời gian. # tính số bước cho r trong phạm vi (sp): # đến bước bất kỳ p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # bộ vận tốc của chuyển động theo thời gian.): # thứ tự thăng tiến của các vị trí, bước sp p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # đặt vận tốc của chuyển động time.sleep (0,5) def RandomMoves (self): # nhảy ngẫu nhiên giữa các vị trí được xác định trước, từ khóa: "trò chơi ngẫu nhiên" dr = randrange (9) # tự chọn vị trí p = position [dr] # đọc thông số vị trí a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # đặt vận tốc của chuyển động def MoveUp (self): # nâng tay cầm theo từng bước nhỏ u0 = status [0] # đọc trạng thái hiện tại u1 = u0 + 5 # cộng với x độ nếu (u1 > up_l): # kiểm tra nếu không vượt quá tham số tối thiểu / tối đa u1 = up_l # nếu không được đặt thành giá trị tối thiểu / tối đa kit.servo [vert].angle = u1 # move trạng thái servo [0] = u1 # điều chỉnh giá trị trạng thái print (" up ", status) time.sleep (1) # đặt vận tốc def MoveDown (tự): d 0 = status [0] d1 = d0 - 5 #phút x độ if (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # move trạng thái servo [1] = f1 print ("tiến", trạng thái) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #phút x độ if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo status [2] = l1 print ("left", status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 # phút x độ if (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move trạng thái servo [2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # đặt tay cầm ở vị trí "mở": "open_tab" time.sleep (0,5) trạng thái [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # đặt tay nắm thành vị trí "đóng": " close_tab "time.sleep (0,5) status [3] = cl_g def StopMove (self): # không làm gì cả, nhưng dừng chuyển động print (" stop ", status) time.sleep (0,25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic nếu args.mic là Không khác int (args.mic) model.classify_audio (mic, engine, label_file = "config / label_gc2.raw.txt", command_file = "config / domains_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_hzhop), num_frames_hop = num_frames_hop = int (args.num_frames_hop)) def on_execute (self, args): if not self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) if not args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 while self._running: pygame.event.pump () if args.debug_keyboard: key = pygame.key.get_pressed () else: try: new_item = q.get (True, 0.1) ngoại trừ hàng đợi. Empty: new_item = Không nếu new_item không Không có: item = new_item if (args.debug_keyboard and key [pygame. K_ESCAPE]) hoặc item == "stop": self._running = False # if (args.debug_keyboard và các phím [pygame. K_SPACE]) hoặc item == "go": # self. MeArmPos (7) # if (args.debug_keyboard và các phím [pygame. K_RIGHT]) hoặc item == "right": # tự rẽ phải. MoveRight () if (args.debug_ke yboard và các phím [pygame. K_LEFT]) hoặc vật phẩm == "left": # quay trái tự. MoveLeft () nếu (args.debug_keyboard và các phím [pygame. K_UP]) hoặc vật phẩm == "up": self. MoveUp () if (args.debug_keyboard and key [pygame. K_DOWN]) hoặc item == "down": self. MoveDown () if (args.debug_keyboard and key [pygame. K_B]) hoặc item == "b": # ngược self. MoveBack () if (args.debug_keyboard và các phím [pygame. K_F]) hoặc item == "f": # chuyển tiếp self. MoveForw () if (args.debug_keyboard và các phím [pygame. K_O]) hoặc item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard và các phím [pygame. K_C]) hoặc item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard và các phím [pygame. K_S]) hoặc item == "s": # stop chuyển động: "start_game" self. StopMove () if (args.debug_keyboard and key [pygame. K_0]) hoặc item == "0": self. MeArmPos (0) if (args.debug_keyboard and key [pygame. K_1]) hoặc item == "1": self. MeArmPos (1) if (args.debug_keyboard and key [pygame. K_2]) hoặc item == "2": self. MeArmPos (2) nếu (args.debug_keyboard và các phím [pygame. K_3]) hoặc nó em == "3": self. MeArmPos (3) if (args.debug_keyboard and key [pygame. K_4]) hoặc item == "4": self. MeArmPos (4) if (args.debug_keyboard and key [pygame. K_5]) hoặc item == "5": self. MeArmPos (5) if (args.debug_keyboard and key [pygame. K_6]) hoặc item == "6": self. MeArmPos (6) if (args.debug_keyboard and key [pygame. K_7]) hoặc item == "7": self. MeArmPos (7) if (args.debug_keyboard and key [pygame. K_8]) hoặc item == "8": self. MeArmPos (8) if (args.debug_keyboard và các phím [pygame. K_9]) hoặc item == "9": self. MeArmPos (9) nếu (args.debug_keyboard và các phím [pygame. K_a]) hoặc item == "d": self. DancingMeArm () #dancing MeArm, trên "next_game" nếu (args.debug_keyboard và các phím [pygame. K_r]) hoặc item == "r": self. RandomMoves () #random nhảy "trò chơi ngẫu nhiên" nếu (args.debug_keyboard và các phím [pygame. K_j]) hoặc item == "j": self. TransMeArm1 () # đối tượng vận chuyển: "Lunch_game" nếu (args.debug_keyboard và các phím [pygame. K_k]) hoặc item == "k": self. TransMeArm2 () # chuyển đối tượng ngược hướng: "next_game" '' 'if (args.debug_keyboard and key [pygame. K_l]) hoặc item == "l": self. JumpingJack2 (1) #LED nhấp nháy "target" '' 'time.sleep (0,05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Sử dụng bàn phím để điều khiển MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Đề xuất: