Điều khiển giọng nói của Arduino bằng cách sử dụng API xử lý và Google Speech. Nhận dạng chữ số trên vi điều khiển

Bằng cách nào đó tôi đã nảy ra một ý tưởng để làm điều khiển giọng nói Arduino, nhưng chỉ Arduino thôi là chưa đủ, bởi vì... cho hệ thống nhà thông minh Bạn cũng cần liên lạc với máy tính và hệ thống của nó.

Tìm giải pháp:

BitVoicer
Tôi đã xem qua nhiều bài viết khác nhau sử dụng BitVoicer kết hợp với Arduino, nhưng vấn đề là BitVoicer chỉ hoạt động trên Windows và điều này không cho phép sử dụng hệ thống trên thiết bị đơn giản giống như Rasberry Pi chạy Unix.
Nhận dạng giọng nói Arduino
Arduino cũng có thể được điều khiển bằng giọng nói nhờ mô-đun nhận dạng giọng nói, nhưng cho đến nay tôi không có hứng thú mua nó và có một số bất tiện khi sử dụng mô-đun này: số lượng lệnh hạn chế, đào tạo tẻ nhạt, yêu cầu các lệnh mới việc flash mô-đun, đây đã là một điểm trừ nếu hệ thống được gỡ lỗi và cài đặt.

Giải pháp

Tôi bắt đầu tìm kiếm giải pháp đa nền tảng cho phép hệ thống hoạt động trên nhiều nền tảng các hệ điều hành. Tìm thấy cái này: Thư viện lời nói thành văn bản cho Java/Đang xử lý. Sự phức tạp được thực hiện dựa trên ngôn ngữ Xử lý (Java)API bài giảng của Google Con mèo đã được viết về trước đó. Quyết định này Cho phép theo dõi giọng nói theo thời gian thực kích hoạtAutoRecord(), cho biết giới hạn âm lượng kích hoạtAutoThreshold(), kết nối micro bên ngoài getLineIn(), chỉ định ngôn ngữ nhận dạng setLanguage(Chuỗi). Danh sách đầy đủ các tính năng và thông tin cụ thể có sẵn trên trang web của nhà phát triển: http://stt.getflourish.com. Đối với công việc chúng tôi cần Google Bài phát biểu Mã API. Làm thế nào để có được nó được mô tả ở đây: www.chromium.org/developers/how-tos/api-keys. Thứ duy nhất điểm tiêu cực Vấn đề là Google Speech cho phép bạn chỉ xử lý 50 yêu cầu mỗi ngày nhưng trên thực tế có hơn 500 yêu cầu được xử lý.

Để giúp điều hướng qua văn bản trong tương lai dễ dàng hơn, tôi đính kèm tất cả các nguồn đã chứa khẩu lệnh, kết nối với bo mạch Arduino, bản phác thảo cho bo mạch Arduino, xác nhận bằng giọng nói của các cụm từ và mọi thứ khác đã có sẵn và đang hoạt động: nguồn. Sau khi tải xuống, chúng tôi đặt thư mục GoogleTTS trong thư viện Đang xử lý. Bản phác thảo cho Arduino nằm trong thư mục GoogleTTS/ArduinoSerial. Mọi thứ đều được viết trong Xử lý 3.0a4, có sẵn ở bản phát hành trước trên trang web chính thức.

Thực hiện(“Hãy nghe lệnh của tôi!”):
Chúng tôi đã quyết định công nhận. Bây giờ chúng ta cần nắm bắt các lệnh chúng ta cần và đưa ra quyết định về chúng. Phần này chịu trách nhiệm về việc này:
void command() ( if (result.equals("arduino")) ( // Tìm kiếm kết quả khớp // Thực thi lệnh khi nhận được kết quả khớp ) else if (result.equals("mấy giờ rồi")) ( / / Thực thi lệnh khi nhận được kết quả khớp ) )
Phản hồi bằng giọng nói
Bây giờ chúng tôi cần một công cụ sẽ phản hồi chúng tôi bằng giọng nói của con người nếu tìm thấy kết quả phù hợp. Công cụ thực hiện được chọn là Google dịch, hay đúng hơn là một mô-đun chuyển đổi văn bản thành giọng nói. Văn bản được gửi theo yêu cầu tới máy chủ Google và được chuyển đổi thành tập tin âm thanh và gửi lại cho chúng tôi ở định dạng mp3. Phần này chịu trách nhiệm về việc này:
void googleTTS(Chuỗi txt, Ngôn ngữ chuỗi) ( // văn bản được chuyển đổi thành âm thanh bằng lệnh googleTTS("text", "ngôn ngữ") Chuỗi u = "http://translate.google.com/translate_tts?tl="; u = u + ngôn ngữ + "&q=" + txt; u = u.replace(" ", "%20"); địa chỉ URL= URL mới(u); thử ( URLConnection Connection = url.openConnection(); Connection.setRequestProperty("User-Agent", "Mozilla/4.0 (tương thích; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; . NET CLR 1.2.30703)"); Connection.connect(); inputStream là = Connection.getInputStream(); File f = new File(sketchPath + "/" + txt + ".mp3"); OutputStream out = new FileOutputStream( f); byte buf = byte mới; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close(); : " + txt + ".mp3" ) bắt (IOException e) ( e.printStackTrace(); ) ) bắt (MalformedURLException e) ( e.printStackTrace(); ) )

Phần này có nhiệm vụ xử lý trực tiếp các cụm văn bản:
void voicer(String s) ( // Được thực thi bằng lệnh voicer("text") println(s); // dùng để giám sát văn bản File f = new File(sketchPath + "/" + s + ".mp3"); // Kiểm tra tệp // Nếu tệp đã tồn tại, hãy phát tệp if(f.exists())( println("Tệp đã tồn tại! Tôi đang phát Tệp!"); player = minim.loadFile(s + ".mp3"); player.play (); ) // Nếu tệp chưa tồn tại, hãy tạo nó khác ( println("Tệp chưa tồn tại! Tôi đang tạo!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3");

Ví dụ triển khai nhận dạng và xác nhận giọng nói:
void command() ( if (result.equals("computer")) ( // Tìm kiếm người lồng tiếng trùng khớp("Listen"); // Nhận xác nhận bằng giọng nói // Thực thi lệnh khi nhận được kết quả khớp) )
Anh ấy còn sống!

Xử lý + Arduino

Chà, có vẻ như nó đã có tác dụng, nhưng vẫn thiếu một cái gì đó. Bây giờ hãy “kết bạn” với Arduino nhé.
Chúng ta khởi tạo kết nối nối tiếp trong phần Xử lý để gửi dữ liệu tới Arduino (đối với Người dùng Mac và Unix):
Chuỗi portName = Serial.list(); myPort = Serial mới (cái này, portName, 9600); myPort.bufferUntil("\n");

Người dùng Windows:
Chuỗi myPort = new Serial(this, "Cổng COM của bạn", 9600); myPort.bufferUntil("\n");

Và chúng tôi sẽ gửi lệnh tới đó nếu tìm thấy kết quả khớp bằng giọng nói:
void command() ( if (result.equals("bật đèn")) ( // If cụm từ bằng giọng nóiđược nhận dạng là “bật đèn”, sau đó chúng tôi thực hiện yêu cầu myPort.write("High"); // Gửi lệnh Cao tới bộ lồng tiếng kết nối nối tiếp("Bật đèn"); // Giọng nói xác nhận thực hiện lệnh ) else if (result.equals("tắt đèn")) ( myPort.write("Low"); // Gửi lệnh Thấp đến bộ phát âm kết nối nối tiếp("Tắt đèn "); // Xác nhận // Thực thi lệnh khi nhận được kết quả khớp ) )

Bây giờ, hãy bắt đâù bo mạch Arduino. Chúng ta cần lắng nghe cổng Serial và khi tìm thấy lệnh từ danh sách, hãy thực hiện hành động được yêu cầu theo lệnh. Bản phác thảo rất đơn giản:
int led = 13; // Chân LED trên bo mạch void setup() ( Serial.begin(9600); // Khởi tạo kết nối nối tiếp pinMode(led, OUTPUT); // Chân LED truyền dữ liệu ) void loop() ( int i=0; / / biến để đặt một chuỗi vào bộ đệm char đệm; // một mảng đệm để đặt một chuỗi vào đó if(Serial.available())( // Kiểm tra cổng nối tiếp xem có sự hiện diện của độ trễ dữ liệu hay không (100); // đặt những gì đã đọc vào bộ đệm while(Serial.available() && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
Tất cả. Hãy kiểm tra.

Vấn đề và kế hoạch:

Bởi vì Tôi chưa lập trình trước thời điểm này, tôi không hiểu hết một số điều trong quá trình gỡ lỗi. Tôi sẽ biết ơn nếu có ai có thể cho tôi biết cách giải quyết các vấn đề được liệt kê dưới đây:

Vấn đề cơ bản nhất là toàn bộ cụm từ giọng nói không được nói ra. Những chữ cái cuối cùng biến mất. Mặc dù tập tin âm thanh đi kèm máy chủ Google V. dạng bình thường. Theo tôi hiểu tình hình: có vấn đề với trình phát âm thanh, nhưng vẫn chưa rõ chính xác là ở đâu.
- Tôi đã viết rồi Google API giọng nói Có giới hạn 50 yêu cầu mỗi ngày, nhưng trên thực tế, con số này còn nhiều hơn thế. Trong mọi trường hợp, điều này là không đủ. Tôi dự định đăng ký nhận dạng cục bộ của lệnh chính và chỉ sau khi nó được nhận dạng, hãy gửi phần còn lại của văn bản để Google xử lý. Tôi đang tìm giải pháp.
- Tôi nghĩ sẽ không có hại gì khi gửi lệnh đến tấm chắn Arduino Ethernet, bởi vì... Một số hệ thống có thể được đặt ở một khoảng cách đáng kể so với máy tính chủ và kết nối Nối tiếp sẽ không còn hoạt động ở đây nữa. Tôi sẽ đưa ra quyết định này vào một ngày nào đó, bởi vì... Tôi không có bộ định tuyến để kết nối Arduino với tấm chắn Ethernet với nó.

Đó là tất cả! Xin đừng phán xét nghiêm ngặt dựa trên dòng mã! Tôi mới bắt đầu nghiên cứu bàn đạp này và tôi sẽ vô cùng biết ơn nếu bạn dụi mũi tôi vào những việc không nên làm và chỉ cho tôi cách thực hiện. Tôi cũng sẽ rất vui nếu các bên quan tâm khác tham gia dự án này - tôi luôn sẵn sàng giao tiếp!

Bạn có nhớ cách đây vài năm (và thậm chí có thể là bây giờ) ý tưởng kiểm soát ánh sáng trong phòng bằng cách vỗ tay đã phổ biến như thế nào không? Nhưng, rất tiện, bạn đang nằm trên giường, lười đứng dậy và vỗ tay tắt đèn, hoặc chúng ta về nhà, trời tối, tìm công tắc rất lâu, rồi ngay từ ngưỡng cửa có một hai tiếng vỗ tay và đèn đã bật sáng. Đối với tôi, có vẻ như khái niệm này vẫn còn phù hợp nhưng nó có thể được áp dụng cho nhiều lĩnh vực hơn nữa. công nghệ cao so với 5 năm, 10 năm trước. Giờ đây, với số tiền tương đối nhỏ, bạn có thể mua một số bộ phận và lập trình thiết kế cho các chức năng tương tự, điều này sẽ được thảo luận dưới đây.

Hôm nay chúng ta sẽ xem xét một mô-đun được thiết kế để nhận dạng lệnh thoại (chỉ bao gồm các giọng nói trong lệnh thoại được ghi âm) – Mô-đun nhận dạng giọng nói V3.1 (V3) hoặc tên mã hóa thường gặp FZ0475.

Gói phân phối bao gồm chính mô-đun ( bảng mạch in Rất chất lượng tốt), micrô trên chân linh hoạt có đầu nối giắc cắm 3,5 mm và các tiếp điểm PLS góc có khoảng cách 2,56 mm cho bảng mô-đun (không thể sử dụng chúng nếu được kết nối với các tiếp điểm mô-đun theo cách khác).

Ngày nay có một số loại mô-đun có chức năng tương tự. nhà sản xuất khác nhau và các nhà phát triển hoặc thực thi. mô-đun này Theo tôi, nhận dạng giọng nói có sự cân bằng nhất định giữa chi phí, chức năng và sự tiện lợi. Mô-đun EasyVR sẽ mạnh hơn và đắt hơn đáng kể. Các mô-đun dựa trên LD3320 sẽ rẻ hơn và bất tiện hơn (ít nhất là bất tiện vì không dễ tìm được mô tả thông thường cho chúng, nhưng phần còn lại chỉ mang tính chủ quan).

Đặc điểm của mô-đun nhận dạng giọng nói V3.1 (V3):

  • Điện áp cung cấp – 5 volt
  • Mức tiêu thụ hiện tại – lên tới 40 mA
  • Giao diện – UART, GPIO
  • Độ chính xác nhận dạng – 99% (trong điều kiện lý tưởng)
  • Phạm vi - tùy thuộc vào micrô được sử dụng, đối với micrô tiêu chuẩn đi kèm trong bộ sản phẩm, khoảng cách tối đa là 0,5 - 1 mét với giọng nói đủ lớn, nhưng nếu giọng nói nhỏ, bạn sẽ phải đưa micrô lại gần miệng hơn

Mô-đun này là một bảng nhỏ gọn, trên đó có bộ vi điều khiển chính (vết đen), đầu nối giắc 3,5 mm để kết nối micrô và một vi mạch. bộ nhớ flash, GPIO, UART và các tiếp điểm nguồn, một cặp đèn LED và phần còn lại của các thiết bị cần thiết cần thiết cho hoạt động của mạch - điện trở, tụ điện, thạch anh. Kích thước nhỏ gọn của bo mạch sẽ cho phép bạn dễ dàng tích hợp mô-đun vào sự phát triển riêng. Để tăng phạm vi ra lệnh bằng giọng nói, có lẽ cần phải sử dụng micrô được khuếch đại. Sau khi đạt được phạm vi chấp nhận được, mô-đun này sẽ phù hợp để sử dụng trong hệ thống nhà thông minh. Không cần sửa đổi để cải thiện phạm vi hoạt động, mô-đun này có thể được sử dụng trong các hệ thống điều khiển trên máy tính để bàn cũng như trong các hệ thống bảo mật (kiểm soát và hạn chế truy cập). Với micrô tiêu chuẩn, do phạm vi hoạt động ngắn nên sử dụng mô-đun nhận dạng giọng nói làm tai nghe và không dây truyền lệnh đến bộ điều khiển điều khiển thứ gì đó bằng pin và mô-đun không dây (ví dụ: HC-05 hoặc HC-12 hoặc bất kỳ mô-đun phù hợp nào khác). Mô-đun này có thể hoạt động mà không cần bộ vi điều khiển bên ngoài vì nhà sản xuất cung cấp chức năng độc lập; bạn chỉ cần ghi lại lệnh thoại một lần và đặt cài đặt cho nó; làm việc độc lập với sự giúp đỡ thiết bị bên ngoài(PC hoặc MK).

Vì vậy, để bắt đầu làm việc với mô-đun nhận dạng giọng nói, chúng ta cần kết nối nó với máy tính (bạn cần bộ chuyển đổi USB-UART) hoặc với bộ vi điều khiển (bạn cần phát triển Mã chương trìnhđể điều khiển mô-đun).

Không có sự khác biệt cơ bản trong việc quản lý và định cấu hình mô-đun giữa việc kết nối với máy tính hoặc vi điều khiển, vì vậy để rõ ràng, chúng tôi sẽ sử dụng PC để cấu hình. Các hướng dẫn mô tả các lệnh cho mô-đun ở dạng thập lục phân, vì vậy để thuận tiện, bạn cũng sẽ cần một thiết bị đầu cuối truyền byte ở dạng thập lục phân, ví dụ: AccessPort (có thể tải xuống ở cuối bài viết). Ngoài ra, nhà sản xuất tập trung vào người dùng nền tảng Arduino và cung cấp thư viện để sử dụng mô-đun này cũng như hướng dẫn sử dụng thư viện này. Tuy nhiên, nhiều người trong chúng ta quan tâm đến việc làm việc trực tiếp với mô-đun hơn là thông qua trình bao bọc Arduino.

Trước khi bắt đầu công việc, chúng ta hãy nhìn vào bảng. Ở hai đầu bảng bên phải có ổ cắm để kết nối micro, mặt còn lại có bốn tiếp điểm Giao diện UART. Ở phía dưới có tám điểm tiếp xúc được sử dụng để xuất tín hiệu do nhận dạng lệnh thoại. Ở trên cùng, bốn chân được định cấu hình làm đầu vào tín hiệu được sử dụng để chuyển đổi giữa các nhóm (mỗi nhóm có bảy lệnh thoại) của lệnh, nếu tính năng như vậy được sử dụng. Và sáu chân còn lại ở trên cùng có thể được sử dụng để kết nối với bộ nhớ của mô-đun.

Một hệ thống lệnh được sử dụng để vận hành và cấu hình mô-đun. Hình thức chung khung trông như thế này:

Bốn lệnh đầu tiên 00, 01, 02, 03 được sử dụng để kiểm tra trạng thái mô-đun và các cài đặt của nó. Sáu lệnh tiếp theo 10, 11, 12, 13, 14, 15 được sử dụng để thay đổi cài đặt mô-đun, bao gồm điều khiển cổng đầu ra và cài đặt tải tự động. Tiếp theo, ba lệnh 20,21, 22 dùng để ghi âm khẩu lệnh. Ba lệnh tiếp theo 30,31,32 được sử dụng để điều khiển việc nhận dạng lệnh thoại. Các lệnh 0A, 0D, FF chỉ được sử dụng khi dữ liệu được chính mô-đun trả về. Thực tế không có nhiều lệnh và tất cả điều này không đáng sợ như thoạt nhìn trong tài liệu dành cho mô-đun. Hãy xem các lệnh cần thiết để làm việc với mô-đun nhận dạng giọng nói. Không phải tất cả các lệnh hiện có đều có tính thực tế.

Đáng chú ý là mô-đun này có thể hoạt động mà không cần bộ vi điều khiển điều khiển bên ngoài và cũng có thể điều khiển độc lập một thứ gì đó bằng các cổng đầu ra của nó. Để làm điều này, bạn cần cấu hình chúng (lệnh 12, 13, 14).

Đội 12 – cấu hình các cổng đầu ra. Lệnh này cấu hình chế độ hoạt động của các cổng đầu ra mô-đun nhận dạng giọng nói.

Định dạng: | AA | 03 | 12 | CHẾ ĐỘ | 0A |

Trong đó MODE có thể nhận bốn giá trị: 0 – chế độ xung (khi lệnh thoại được kích hoạt, đầu ra tương ứng với lệnh sẽ thay đổi trạng thái trong khoảng thời gian được đặt bởi lệnh 13), 1 – chế độ chuyển đổi (chuyển đổi hoặc lật) (mỗi lần lệnh thoại được kích hoạt, đầu ra tương ứng với lệnh thoại bị đảo ngược), chế độ 2 – bật (khi lệnh thoại được kích hoạt, đầu ra sẽ chuyển sang trạng thái logic một và sẽ không còn chuyển sang trạng thái logic 0 nữa, reset là được thực hiện bằng lệnh 14), chế độ 3 – tắt (tương tự như chế độ bật, chỉ ngược lại, khi lệnh thoại được kích hoạt, đầu ra sẽ chuyển sang trạng thái logic 0).

Thiết thực nhất là chế độ chuyển đổi, không yêu cầu lệnh bổ sung. Chế độ xung sẽ tốt, nhưng logic của chế độ này là khi lệnh thoại được kích hoạt, nó sẽ phát ra lệnh logic một lần, trong khoảng thời gian từ 10 mili giây đến 1 giây. Nó không đủ. Mặc dù, tùy thuộc vào yêu cầu của chế độ này, nó có thể hữu ích. Các chế độ bật và tắt được thực hiện một cách bất tiện vì chúng yêu cầu thực hiện các lệnh bổ sung.

Đội 13 – cài đặt thời lượng xung của chế độ tương ứng.

Định dạng: | AA | 03 | 13 | CẤP ĐỘ | 0A |

Trong đó LEVEL nhận giá trị từ 00 đến 0F (tương ứng với khoảng thời gian từ 10 ms đến 1 s).

MỨC ĐỘ khoảng thời gian
0x00 10 mili giây
0x01 15 mili giây
0x02 20 mili giây
0x03 25 mili giây
0x04 30 mili giây
0x05 35 mili giây
0x06 40 mili giây
0x07 45 mili giây
0x08 50 mili giây
0x09 75 mili giây
0x0A 100 mili giây
0x0B 200 mili giây
0x0C 300 mili giây
0x0D 400 mili giây
0x0E 500 mili giây
0x0F 1 giây

Đội 14 – đặt lại các cổng đầu ra về trạng thái được chỉ định bởi chế độ bật hoặc tắt.

Định dạng: | AA| 03 | 14 | FF | 0A | - đặt lại tất cả các cổng đầu ra

| AA| 03+n | 14 | IO0 | ... | Ion | 0A | - đặt lại các cổng đầu ra đã chọn

Trong đó n là số lượng chân được đặt lại có chọn lọc, IO0...IOn là danh sách các chân này trong khung gửi dữ liệu.

Tiếp theo, để thực thi lệnh thoại, chúng phải được ghi lại trong mô-đun (huấn luyện mô-đun). Có một hạn chế ở đây. Chỉ có thể nhận ra bảy lệnh cùng một lúc, mặc dù có thể ghi lại nhiều lệnh khác. Để mở rộng phạm vi lệnh thoại sẽ được nhận dạng, hệ thống nhóm (lệnh 32) được sử dụng, hệ thống này được điều khiển bởi các cổng đầu vào mô-đun. Bằng cách thiết lập cấu hình tín hiệu trên các chân này, bạn chọn nhóm lệnh sẽ được nhận dạng. Điều này là do hiệu suất hạn chế của bộ điều khiển giọng nói của mô-đun.

Đội 20 - ghi lại một hoặc nhiều lệnh thoại.

Định dạng: | AA| 03+n | 20 | R0 | ... | Rn | 0A |

Trong đó n là số lượng lệnh thoại được ghi (nếu ghi một lệnh n=0 thì ghi hai lệnh n=1, v.v. theo định dạng chung để truyền lệnh Chiều dài - độ dài), R0...Rn số lệnh thoại (AA 03 20 03 0A - lệnh ghi âm lệnh thoại thứ ba).

Đội 21 - ghi lại một lệnh thoại và đặt chữ ký cho nó.

Định dạng: | AA| 03+SIGLEN | 21 | GHI LẠI | SIG | 0A |

Trong đó RECORD là số lệnh thoại, SIG là chữ ký (có thể bao gồm nhiều byte để mỗi byte có thể tương ứng với một mã hóa ký tự bảng chữ cái nếu cần), SIGLEN là số byte tạo nên chữ ký.

Đội 22 - thêm hoặc xóa chữ ký cho lệnh thoại đã chọn.

Định dạng: | AA | 03+SIGLEN | 22 | GHI LẠI | SIG | 0A | - thêm chữ ký

| AA | 03 | 22 | GHI LẠI | 0A | - xóa chữ ký

Khi ghi âm lệnh thoại, bạn phải được hướng dẫn bằng tín hiệu đèn LED. Sau khi nhập lệnh bắt đầu quá trình ghi, đèn LED màu vàng (cam) bắt đầu nhấp nháy nhanh. Ngay khi đèn LED màu đỏ sáng lên, bạn phải nói lệnh thoại vào micrô. Nếu thành công, đèn LED màu vàng (cam) sẽ sáng lên rồi lại đỏ - bạn cần xác nhận lệnh thoại và nói lại. Nếu thành công, cả hai đèn LED sẽ sáng lên - lệnh thoại đã được lưu.

Sau khi lệnh thoại được ghi vào mô-đun, sẽ không có gì xảy ra cho đến khi các lệnh này được đặt trong “Bộ nhận dạng” của mô-đun. Để thực hiện việc này, bạn cần sử dụng lệnh 30. Sau khi thực hiện lệnh này, mô-đun sẽ bắt đầu chờ lệnh thoại khớp với các mẫu đã lưu. Chỉ có bảy lệnh có thể được nhận dạng cùng một lúc. Trong trường hợp này, đèn LED màu vàng (cam) trên bo mạch mô-đun sẽ nhấp nháy chậm.

Đội 30 - tải các bản ghi vào Bộ nhận dạng của mô-đun.

Định dạng: | AA| 2+n | 30 | R0 | ... | Rn | 0A |

Định dạng phản hồi như sau: | AA | 07 | 0D | 00 | GRPM | R | RI | SIGLE | SIG | 0A |

Trong đó GRPM là thông tin về nhóm chứa lệnh (nếu được sử dụng), R là lệnh thoại được nhận dạng (sử dụng dữ liệu này, bạn có thể phân biệt các lệnh với nhau nếu không sử dụng chữ ký), RI là chỉ mục lệnh trong bộ nhận dạng , SIGLEN là độ dài của chữ ký tính bằng byte, SIG - chữ ký (nếu được sử dụng).

Và cuối cùng, nếu module phải hoạt động độc lập thì bạn cần sử dụng lệnh 15 để khởi động tự động theo cài đặt trước của bộ nhận dạng. Trong trường hợp này, mô-đun nhận dạng giọng nói sẽ hoạt động độc lập mà không cần khởi tạo sau khi bật.

Đội 15 - cài đặt bộ nhận dạng để tự khởi động khi bật.

Định dạng: | AA| 03 | 15 | 00 | 0A | - tắt chức năng tự động chạy

| AA| 03+n | 15 | BITMAP | R0 | ... | Rn | 0A | - cài đặt chức năng tự động chạy

Để kiểm soát việc thực hiện chính xác các lệnh, mỗi lệnh có phản hồi riêng. Nếu cần, tất cả dữ liệu có thể được tìm thấy trong tài liệu về mô-đun nhận dạng giọng nói được đính kèm ở cuối bài viết. Đừng quên rằng mọi thứ giá trị số trình bày ở thập lục phân hình thức.

Như vậy, bằng cách sử dụng hệ thống lệnh, bạn có thể cấu hình linh hoạt mô-đun nhận dạng giọng nói để sử dụng cho nhiều mục đích khác nhau. Nếu như điều khiển đơn giản Do các cổng đầu ra của mô-đun không đủ nên mô-đun nhận dạng giọng nói có thể được kết nối với các thiết bị khác thông qua UART hoặc GPIO. Vì kết nối không dây Bạn có thể sử dụng các mô-đun đã thảo luận trước đó.

Sử dụng mô-đun không dây, bạn có thể kết nối mô-đun nhận dạng giọng nói với bất kỳ thiết bị nào khi cần thiết. Ví dụ: hãy kết nối nó với một bộ vi điều khiển, bộ vi điều khiển này sẽ điều khiển các đèn LED dựa trên dữ liệu nhận được về khả năng nhận dạng lệnh thoại. Mô-đun không dây cho phép dữ liệu được truyền theo hai hướng nên nếu cần, bạn có thể viết mã cho vi điều khiển để khởi tạo mô-đun giọng nói và ghi lại lệnh thoại. Trong trường hợp của chúng tôi, dưới sự điều khiển của PC, một số lệnh thoại đã được ghi lại trong mô-đun và tính năng nhận dạng được định cấu hình để tự động khởi động khi bật nguồn, vì vậy đối với bộ vi điều khiển, chúng tôi sẽ chỉ đăng ký nhận dữ liệu và điều khiển đèn LED đối với dữ liệu này. Bộ vi điều khiển STM32F103C8T6 sử dụng USART1 để nhận dữ liệu và ghim PB10...PB15 được định cấu hình làm đầu ra, điều khiển đèn LED. Nguồn nằm trong phần phụ lục ở cuối bài viết.

Một chút về kết quả

Nhận dạng giọng nói không hoàn toàn chính xác. Nó phụ thuộc vào các lệnh đã chọn và giọng nói của người dùng. Trong quá trình thử nghiệm tôi tìm thấy một số điểm tiêu cực. Khi dạy các lệnh mô-đun, lệnh thoại “một” và “hai” đã được chọn. Lệnh “hai” luôn được thông qua rõ ràng, nhưng lệnh “một” thường được xác định là lệnh “hai” và mã của lệnh thứ hai được thực thi tương ứng. Hơn nữa, khi cố gắng ra lệnh bằng giọng nói bằng tiếng Anh (và chúng không được ghi lại trong mô-đun giọng nói), lệnh “một” hầu như luôn được định nghĩa là “hai”. Có lẽ đó là tất cả về cách phát âm, ngữ điệu và các khía cạnh khác của giọng nói con người được nhúng trong thuật toán mã hóa mô-đun giọng nói của các lệnh nói. Tuy nhiên, những nhà sản xuất bí mật này truy cập mởĐừng cho. Ngoài ra, chất lượng nhận dạng còn bị ảnh hưởng bởi các điều kiện tiếng ồn bên ngoài - tiếng ồn từ đường phố, tiếng ồn của quạt, âm thanh ngẫu nhiên, v.v. Nhà sản xuất thu hút sự chú ý đến thực tế là cấp độ caođộ chính xác nhận dạng diễn ra trong điều kiện lý tưởng. Ý tưởng sử dụng micrô kèm bộ khuếch đại tất nhiên sẽ làm tăng phạm vi hoạt động của thiết bị nhưng cũng sẽ làm tăng khả năng xảy ra lỗi vì việc khuếch đại giọng nói cũng sẽ làm tăng tiếng ồn.

Sau cùng, nếu bạn có yêu cầu thấp về nhận dạng giọng nói và thực hiện lệnh thoại, thì mô-đun này sẽ tính toán số tiền chi cho nó một cách trung thực.

Danh sách các nguyên tố phóng xạ

chỉ định Kiểu Mệnh giá Số lượng Ghi chúCửa hàngsổ ghi chú của tôi
IC1 MK STM32

STM32F103C8

1 Vào sổ ghi chú
VR1 Bộ điều chỉnh tuyến tính

AMS1117-3.3

1 Vào sổ ghi chú
MOD1, MOD3 Mô-đun không dâyHC-122 Vào sổ ghi chú
MOD2 Mô-đun nhận dạng giọng nóiVR3.11 Vào sổ ghi chú
Z1 Thạch anh8 MHz1

Trong hướng dẫn Arduino này, chúng tôi sẽ chỉ cho bạn cách sử dụng ứng dụng di động dành cho Android và mô-đun bluetooth HC-05 để điều khiển bằng giọng nói của đèn LED.

Đối với hướng dẫn này, chúng ta sẽ cần tối thiểu các thành phần. Sau khi hoàn thành bài học, bạn có thể phức tạp hóa mạch điện và thêm các thiết bị theo ý thích của mình.

  • Arduino UNO
  • Mô-đun Bluetooth HC-05
  • bảng bánh mì
  • Dây điện
  • điện trở 330 ohm
  • Điốt phát sáng (LED)

Bước 2: Kết nối Mô-đun Bluetooth HC-05

Mô-đun Bluetooth tiêu chuẩn HC-05 có sáu chân. Tuy nhiên, trong dự án này chúng tôi sẽ chỉ sử dụng 4.

Chúng ta sẽ sử dụng chân VCC, chân GND, chân TXD và chân RXD. Chân VCC của mô-đun bluetooth được kết nối với +3,3V từ Arduino. Chân GND của mô-đun được kết nối với Arduino GND (mặt đất). Chân TX của mô-đun bluetooth được kết nối với chân kỹ thuật số 0 (RXD) và chân RXD được kết nối với đầu ra kỹ thuật số 1 (TXD).

Bước 3: Kết nối đèn LED

Bước tiếp theo trong việc tạo ra đèn LED là điều khiển bằng giọng nói, là kết nối đèn LED với Arduino thông qua bảng mạch bánh mì.

Đầu tiên kết nối đầu ngắn của đèn LED với mặt đất. Sau đó kết nối đầu dài của mỗi đèn LED với điện trở 330 ohm. Cuối cùng, kết nối điện trở hiện tại từ đèn LED với các chân kỹ thuật số trên Arduino.

Trong dự án này, chúng tôi sẽ kết nối một đèn LED với chân kỹ thuật số 2, một đèn LED khác với chân kỹ thuật số 3 và đèn LED cuối cùng với chân kỹ thuật số 4.

Bước 4: Cấp nguồn

Đối với dự án này, chúng tôi có thể cấp nguồn cho Arduino thông qua bất kỳ nguồn điện +5V nào. Bạn có thể sử dụng cổng USB từ máy tính của mình để cấp nguồn cho Arduino, nhưng trong dự án này, chúng tôi sẽ sử dụng. pin di động 5V. Trước khi kết nối nguồn điện với Arduino của bạn, hãy đảm bảo rằng GND của Arduino được kết nối với mặt đất của bảng mạch.

Bước 5: Mã

Mã cho dự án của chúng tôi ở bên dưới.

Bước 6: Sử dụng ứng dụng di động

Bạn có thể bắt đầu thử nghiệm dự án của mình bằng cách tải xuống ứng dụng Android - BT Điều khiển giọng nói cho Arduino (BT Voice Control cho Arduino) được tạo bởi SimpleLabsIN.

Sau khi bạn đã tải xuống và cài đặt ứng dụng trên điện thoại của mình trên Dựa trên Android bấm vào thanh menu bên phải góc trên cùng và chọn "Robot kết nối". Trong cửa sổ mới xuất hiện, chọn mô-đun Bluetooth HC-05 và kết nối nó.

Bây giờ khi bạn nói chuyện với một số lệnh nhất định từ mã đến thiết bị của bạn thông qua ứng dụng, một số đèn LED nhất định sẽ bật và tắt. Hãy xem xét kỹ hơn mã nơi các lệnh được chỉ định và thêm mã của riêng bạn. Ví dụ: thay vì "*bật màu đỏ", bạn có thể chỉ định "đỏ". Bằng cách này, các lệnh sẽ nhanh hơn, ngắn hơn và rõ ràng hơn.

Bước 7: Kết quả cuối cùng

Kết quả cuối cùng có thể được nhìn thấy trong video dưới đây.

Chúng tôi chúc bạn dự án thành công! Đừng quên để lại nhận xét về dự án trong trang của chúng tôi

  • Xử lý
  • Phát triển trang web
  • Ý tưởng:

    Không hiểu sao tôi nảy ra ý tưởng làm Arduino điều khiển bằng giọng nói, nhưng chỉ Arduino thôi thì chưa đủ, bởi vì... Đối với hệ thống nhà thông minh, bạn cũng cần giao tiếp với máy tính và các hệ thống của nó.

    Tìm giải pháp:

    BitVoicer
    Tôi đã xem qua nhiều bài viết khác nhau sử dụng BitVoicer kết hợp với Arduino, nhưng vấn đề là BitVoicer chỉ hoạt động trên Windows và điều này không cho phép sử dụng hệ thống trên các thiết bị đơn giản như Rasberry Pi chạy Unix.
    Nhận dạng giọng nói Arduino
    Arduino cũng có thể được điều khiển bằng giọng nói nhờ mô-đun nhận dạng giọng nói, nhưng cho đến nay tôi không có hứng thú mua nó và có một số bất tiện khi sử dụng mô-đun này: số lượng lệnh hạn chế, đào tạo tẻ nhạt, yêu cầu các lệnh mới việc flash mô-đun, đây đã là một điểm trừ nếu hệ thống được gỡ lỗi và cài đặt.

    Giải pháp

    Tôi bắt đầu tìm kiếm một giải pháp đa nền tảng cho phép hệ thống hoạt động trên nhiều hệ điều hành. Tìm thấy cái này: Thư viện lời nói thành văn bản cho Java/Đang xử lý. Sự phức tạp được thực hiện dựa trên ngôn ngữ Xử lý (Java)API bài giảng của Google Con mèo đã được viết về trước đó. Giải pháp này cho phép bạn theo dõi giọng nói theo thời gian thực kích hoạtAutoRecord(), cho biết giới hạn âm lượng kích hoạtAutoThreshold(), kết nối micrô bên ngoài getLineIn(), chỉ định ngôn ngữ nhận dạng setLanguage(Chuỗi). Danh sách đầy đủ các tính năng và thông tin cụ thể có sẵn trên trang web của nhà phát triển: http://stt.getflourish.com. Để hoạt động, chúng tôi cần Khóa API Google Speech. Làm thế nào để có được nó được mô tả ở đây: www.chromium.org/developers/how-tos/api-keys. Điểm tiêu cực duy nhất là Google Speech cho phép bạn chỉ xử lý 50 yêu cầu mỗi ngày, nhưng trên thực tế, hơn 500 yêu cầu được xử lý.

    Để giúp điều hướng qua văn bản trong tương lai dễ dàng hơn, tôi đính kèm tất cả các nguồn đã chứa lệnh thoại, kết nối với bảng Arduino, bản phác thảo cho bảng Arduino, xác nhận giọng nói của các cụm từ và mọi thứ khác đã ở đó và đang hoạt động: nguồn. Sau khi tải xuống, chúng tôi đặt thư mục GoogleTTS trong thư viện Đang xử lý. Bản phác thảo cho Arduino nằm trong thư mục GoogleTTS/ArduinoSerial. Mọi thứ đều được viết trong Xử lý 3.0a4, có sẵn ở bản phát hành trước trên trang web chính thức.

    Thực hiện(“Hãy nghe lệnh của tôi!”):
    Chúng tôi đã quyết định công nhận. Bây giờ chúng ta cần nắm bắt các lệnh chúng ta cần và đưa ra quyết định về chúng. Phần này chịu trách nhiệm về việc này:
    void command() ( if (result.equals("arduino")) ( // Tìm kiếm kết quả khớp // Thực thi lệnh khi nhận được kết quả khớp ) else if (result.equals("mấy giờ rồi")) ( / / Thực thi lệnh khi nhận được kết quả khớp ) )
    Phản hồi bằng giọng nói
    Bây giờ chúng tôi cần một công cụ sẽ phản hồi chúng tôi bằng giọng nói của con người nếu tìm thấy kết quả phù hợp. Google Translate được chọn làm công cụ triển khai, hay đúng hơn là module chuyển văn bản thành giọng nói. Văn bản được gửi theo yêu cầu đến máy chủ Google, được chuyển đổi thành tệp âm thanh và gửi lại cho chúng tôi ở định dạng mp3. Phần này chịu trách nhiệm về việc này:
    void googleTTS(Chuỗi txt, Ngôn ngữ chuỗi) ( // văn bản được chuyển đổi thành âm thanh bằng lệnh googleTTS("text", "ngôn ngữ") Chuỗi u = "http://translate.google.com/translate_tts?tl="; u = u + ngôn ngữ + "&q=" + txt; u = u.replace(" ", "%20"); thử ( URL url = URL mới(u); thử ( URLConnection Connection = url.openConnection(); Connection. setRequestProperty("User-Agent", "Mozilla/4.0 (tương thích; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.2.30703)"); connect( ); inputStream là = connect.getInputStream(); Tệp mới(sketchPath + "/" + ".mp3"); OutputStream out = new FileOutputStream(f); ) ( out.write(buf, 0, len); ) out.close(); println("Tệp đã tạo: " + txt + " .mp3" ) bắt (IOException e) ( e.printStackTrace(); ) ) bắt (MalformedURLException e) ( e.printStackTrace(); ) )

    Phần này có nhiệm vụ xử lý trực tiếp các cụm văn bản:
    void voicer(String s) ( // Được thực thi bằng lệnh voicer("text") println(s); // dùng để giám sát văn bản File f = new File(sketchPath + "/" + s + ".mp3"); // Kiểm tra tệp // Nếu tệp đã tồn tại, hãy phát tệp if(f.exists())( println("Tệp đã tồn tại! Tôi đang phát Tệp!"); player = minim.loadFile(s + ".mp3"); player.play (); ) // Nếu tệp chưa tồn tại, hãy tạo nó khác ( println("Tệp chưa tồn tại! Tôi đang tạo!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3");

    Ví dụ triển khai nhận dạng và xác nhận giọng nói:
    void command() ( if (result.equals("computer")) ( // Tìm kiếm người lồng tiếng trùng khớp("Listen"); // Nhận xác nhận bằng giọng nói // Thực thi lệnh khi nhận được kết quả khớp) )
    Anh ấy còn sống!

    Xử lý + Arduino

    Chà, có vẻ như nó đã có tác dụng, nhưng vẫn thiếu một cái gì đó. Bây giờ hãy “kết bạn” với Arduino nhé.
    Chúng ta khởi tạo kết nối nối tiếp trong phần Xử lý để gửi dữ liệu tới Arduino (dành cho người dùng Mac và Unix):
    Chuỗi portName = Serial.list(); myPort = Serial mới (cái này, portName, 9600); myPort.bufferUntil("\n");

    Đối với người dùng Windows:
    Chuỗi myPort = new Serial(this, "Cổng COM của bạn", 9600); myPort.bufferUntil("\n");

    Và chúng tôi sẽ gửi lệnh tới đó nếu tìm thấy kết quả khớp bằng giọng nói:
    void command() ( if (result.equals("bật đèn")) ( // Nếu cụm từ giọng nói được nhận dạng là "bật đèn", thì thực hiện yêu cầu myPort.write("High"); / / Gửi lệnh Cao đến trình phát âm kết nối nối tiếp("Bật đèn"); // Giọng nói xác nhận thực hiện lệnh ) else if (result.equals("Tắt đèn")) ( myPort.write("Thấp "); // Gửi lệnh Thấp đến giọng nói kết nối nối tiếp(" Tắt đèn"); // Xác nhận // Thực thi lệnh khi nhận được kết quả khớp) )

    Bây giờ chúng ta hãy chuyển sang bảng Arduino. Chúng ta cần lắng nghe cổng Serial và khi tìm thấy lệnh từ danh sách, hãy thực hiện hành động được yêu cầu theo lệnh. Bản phác thảo rất đơn giản:
    int led = 13; // Chân LED trên bo mạch void setup() ( Serial.begin(9600); // Khởi tạo kết nối nối tiếp pinMode(led, OUTPUT); // Chân LED truyền dữ liệu ) void loop() ( int i=0; / / biến để đặt một chuỗi vào bộ đệm char đệm; // một mảng đệm để đặt một chuỗi vào đó if(Serial.available())( // Kiểm tra cổng nối tiếp xem có sự hiện diện của độ trễ dữ liệu hay không (100); // đặt những gì đã đọc vào bộ đệm while(Serial.available() && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    Tất cả. Hãy kiểm tra.

    Vấn đề và kế hoạch:

    Bởi vì Tôi chưa lập trình trước thời điểm này, tôi không hiểu hết một số điều trong quá trình gỡ lỗi. Tôi sẽ biết ơn nếu có ai có thể cho tôi biết cách giải quyết các vấn đề được liệt kê dưới đây:

    Vấn đề cơ bản nhất là toàn bộ cụm từ giọng nói không được nói ra. Những chữ cái cuối cùng biến mất. Mặc dù tệp âm thanh đến từ máy chủ Google ở ​​dạng bình thường. Theo tôi hiểu tình hình: có vấn đề với trình phát âm thanh, nhưng vẫn chưa rõ chính xác là ở đâu.
    - Tôi đã viết rằng API Google Speech có giới hạn 50 yêu cầu mỗi ngày, nhưng trên thực tế, nó còn nhiều hơn thế. Trong mọi trường hợp, điều này là không đủ. Tôi dự định đăng ký nhận dạng cục bộ của lệnh chính và chỉ sau khi nó được nhận dạng, hãy gửi phần còn lại của văn bản để Google xử lý. Tôi đang tìm giải pháp.
    - Tôi nghĩ sẽ không có hại gì khi gửi lệnh đến tấm chắn Arduino Ethernet, bởi vì... Một số hệ thống có thể được đặt ở một khoảng cách đáng kể so với máy tính chủ và kết nối Nối tiếp sẽ không còn hoạt động ở đây nữa. Tôi sẽ đưa ra quyết định này vào một ngày nào đó, bởi vì... Tôi không có bộ định tuyến để kết nối Arduino với tấm chắn Ethernet với nó.

    Đó là tất cả! Xin đừng phán xét nghiêm ngặt dựa trên dòng mã! Tôi mới bắt đầu nghiên cứu bàn đạp này và tôi sẽ vô cùng biết ơn nếu bạn dụi mũi tôi vào những việc không nên làm và chỉ cho tôi cách thực hiện. Tôi cũng sẽ rất vui nếu các bên quan tâm khác tham gia dự án này - tôi luôn sẵn sàng giao tiếp!