Điều khiển giọng nói của Arduino bằng cách sử dụng API xử lý và Google Speech. Hệ thống nhận dạng và theo dõi khuôn mặt trên Arduino

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

    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. Để làm việc chúng tôi cần Google API lời nói Chìa khóa. 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đó có phải là Google Bài phát biểu 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 văn bản dễ dàng hơn trong tương lai, 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 Bo mạch Arduino, xác nhận các cụm từ bằng giọng nói và mọi thứ khác hiện có sẵn và đang hoạt động: mã 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"); thử ( đị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; int len; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close(); is.close( ); println("Tệp đã tạo: " + txt + ".mp3"); ) Catch (IOException e) ( e.printStackTrace(); ) ) Catch (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 file chưa tồn tại, hãy tạo nó bằng cách khác ( println("Tệp chưa tồn tại! Tôi đang tạo!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3"); player.play(); ) )

    Ví dụ thực hiện 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à gửi lệnh tới đó nếu tìm thấy giọng nói phù hợp:
    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ờ 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ự xuất hiệ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ằ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 tới 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 chỉ cho tôi cách không làm và chỉ cho tôi cách làm. 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!

  • Tự làm hoặc tự làm
  • Xin chào Giktimes!

    Như tiêu đề gợi ý, bài viết này sẽ tập trung vào việc nhận dạng số trên vi điều khiển. Mình xin khẳng định ngay rằng bài viết này sẽ không cung cấp mã nguồn, bàn về công nghệ hay thuật toán nhận dạng mà chỉ nói là ý tưởng được sử dụng cách tiếp cận có hệ thống. Một số trong số chúng được nêu trong bài viết của chúng tôi (và ở đây). Điều này là do cách tiếp cận của chúng tôi hướng tới sự độc đáo nhưng đòi hỏi phải làm rõ một số vấn đề. Ai đó có thể nói: “một bài viết khác về lập trình vi điều khiển”. Hoàn toàn không, việc tìm kiếm các dự án tương tự không mang lại kết quả rõ ràng nào, ngoại trừ điều này băng hình. Từ các cuộc thảo luận trên các diễn đàn, có một điều rõ ràng: ý tưởng về việc thiết bị tương tự(máy ảnh + vi điều khiển = kết quả nhận dạng đầu ra, không chỉ là ảnh được chụp) đã đến với nhiều người nhưng vẫn chưa thực hiện được. Và xét về mọi mặt, việc nhận dạng đòi hỏi nhiều tài nguyên máy tính và bộ vi điều khiển không phù hợp cho việc này, đặc biệt là về Arduino, đã có những tuyên bố rằng điều này nói chung là không thể. Nếu bạn quan tâm, vui lòng xem mèo.

    Để tránh bất kỳ câu hỏi rõ ràng nào, hãy trả lời chúng:

    • Không, đây không phải là dịch vụ nhận dạng hình ảnh.
    • Không, đây không phải là OpenCV
    • Không, đây không phải là mạng lưới thần kinh
    • Phân tích hình thái của các đối tượng tạo nên số được sử dụng
    • Có, việc nhận dạng được thực hiện bởi bộ vi điều khiển!

    Ý tưởng

    Nói tóm lại, tất cả bắt đầu với mong muốn được thử sức mình và kiểm tra ý tưởng của tôi trong lĩnh vực nhận dạng hình ảnh. Trong quá trình thảo luận, chúng tôi đã đi đến kết luận rằng chúng tôi có thể giải quyết được chỉ với số tiền nhỏ. khả năng tính toánđể giải quyết vấn đề này. Vì những lý do hiển nhiên, chúng tôi sẽ không mô tả chi tiết về các cuộc thảo luận này.

    Cài đặt

    Như vậy, nhiệm vụ đã được đặt ra, việc thực hiện là cần thiết. Không rời khỏi cái đã được thiết lập
    chúng tôi lấy những gì chúng tôi có trong tay. Và có một cặp đôi trên tay Arduino Uno, chuột quang và ổ đĩa CD cũ. Nhân tiện, bạn sẽ sử dụng cảm biến để làm gì? chuột quang Với tư cách là một chiếc máy ảnh để thu được hình ảnh, chúng tôi đã được nhắc nhở bởi một thứ mà chúng tôi đã đọc từ lâu và trên thực tế, tất cả những thứ còn lại của tài liệu “chuột”. Điều duy nhất chúng tôi phải làm là hàn lại cảm biến và toàn bộ dây nịt của nó để dễ sử dụng, đồng thời dán một ống kính vào nó mà chúng tôi cẩn thận “xé ra” khỏi ổ đĩa CD. Điều này là cần thiết để tăng khoảng cách từ đối tượng đến máy ảnh, nếu không, các con số có kích thước của chúng tôi sẽ không vừa và chỉ phần nhỏ. Nhân tiện, chúng tôi đã cố gắng gắn ống kính quang học của máy ảnh web vào phía trước ống kính từ ổ đĩa CD, nhưng không hiểu sao nó lại không thành công.

    Hơn


    Sau đó, câu hỏi đặt ra là làm thế nào để đặt máy ảnh này lên trên đối tượng. Ở đây chúng tôi đã được giúp đỡ rất nhiều bởi một chiếc kính hiển vi cũ bị hỏng nằm im lìm. Chúng tôi trân trọng loại bỏ cơ chế kiểm soát sân khấu khỏi nó. Cơ chế này cho phép chúng tôi di chuyển máy ảnh chỉ dọc theo hai trục; ngay lập tức nảy sinh ý tưởng sử dụng một thanh dẫn hướng. đầu laze từ ổ đĩa CD. Tất cả điều này đã được bảo đảm cho trường hợp ổ đĩa CD đã tồn tại lâu dài. Kết quả là chúng ta đã có được một cơ chế định vị camera tuyệt vời.

    Hơn


    Tổng cộng: chúng ta có cái gọi là camera, có cơ chế định vị, tất cả những gì còn lại là đặt một mảnh giấy có ghi số và lấy hình ảnh từ camera. Đây là nơi “các vấn đề” bắt đầu. Vì đặc điểm của cảm biến quang “chuột” rất kém để sử dụng làm máy ảnh nên họ bắt đầu ứng biến với đèn nền.

    Hơn


    Rõ ràng là không thể chỉ làm nổi bật cường độ; hướng của ánh sáng bên ngoài cũng có thể điều chỉnh. Tôi phải bật một Arduino khác để kiểm soát cường độ đèn nền ( Đương nhiên, có thể điều khiển nó theo cách khác, nhưng sau đó không chỉ bằng đèn nền mà còn bằng cách chuyển số trên đèn báo). Cuối cùng, hóa ra chụp trong điều kiện ánh sáng tốt hơn nhiều. Và ví dụ: nếu bạn sử dụng chỉ báo bảy đoạn phát sáng làm mục tiêu, thì cảm biến sẽ nhìn thấy nó một cách hoàn hảo. Vì vậy, bây giờ chúng ta có một chỉ báo và một dải có các số màu trắng trên nền đen làm đối tượng chụp.

    bên trái là hình ảnh thang độ xám thu được từ chỉ báo (chúng tôi nhận được hình ảnh như vậy từ cảm biến), bên phải là hình ảnh nhị phân.

    Hơn


    Tổng quan về lắp đặt lắp ráp


    tùy chọn cài đặt sớm


    Khối nhận dạng


    Một vai trò quan trọng trong quá trình cài đặt của chúng tôi được thực hiện bởi cái gọi là đơn vị nhận dạng (trong hình trên). Như bạn có thể thấy, nó bao gồm Arduino Uno và phần mềm nổi tiếng máy phát wifi MỘT ESP8266. Hãy để tôi giải thích, chúng ta cần một bộ phát wifi để xem kết quả nhận dạng trên máy tính bảng. Ứng dụng trên máy tính bảng sẽ gửi một yêu cầu, Arduino khi nhận được yêu cầu sẽ “chụp” hình ảnh từ cảm biến của chuột, sau đó nhị phân hóa nó. Sau khi nhị phân hóa, quá trình nhận dạng diễn ra và sau khi hoàn thành, phản hồi sẽ được tạo ra. Để phản hồi, chúng tôi gửi kết quả nhận dạng và 41 byte để tạo hình ảnh nhị phân trên màn hình máy tính bảng, có thể nói, cho rõ ràng.

    Nếu bạn nhìn lại, Arduino có một số chức năng tốt: làm việc với máy ảnh, nhận dạng và làm việc với Esp8266. Điều không thể không ảnh hưởng đến công việc là chúng tôi phải đối mặt với tình trạng thiếu trí nhớ. Tôi chưa bao giờ nghĩ rằng mình sẽ phải lấy lại từng byte bộ nhớ.

    Minh họa quá trình công nhận

    Thay vì một kết luận

    Đó là tất cả. Vẫn còn rất nhiều công việc phía trước. Và nhiệm vụ đầu tiên: nhận dạng các số (chuỗi số) được ghi lại bởi camera “con người” (chứ không phải “cảm biến chuột”) và chuyển công nghệ đã phát triển sang ESP8266 và giảm cường độ tranh giành từng byte bộ nhớ.

    Rất hân hạnh được trả lời câu hỏi của bạn.

    Trong dự án này, tôi đã kết hợp máy dò tìm khuôn mặt và hệ thống theo dõi.

    Tóm tắt bản chất của dự án: một webcam được cài đặt trên cơ chế xoay được kết nối với máy tính do phòng mổ điều khiển Hệ thống Windows và với cài đặt phần mềm OpenCV. Nếu chương trình phát hiện một khuôn mặt trong trường nhìn của webcam thì tâm của khuôn mặt sẽ được tính toán. Tọa độ X và Y được gửi đến bộ điều khiển Arduino, được kết nối với máy tính qua USB. Đổi lại, bộ điều khiển Arduino, dựa trên các lệnh nhận được, điều khiển hai động cơ servo: dọc theo tọa độ X và dọc theo tọa độ Y, tức là. một hệ thống theo dõi được cung cấp.

    Thư viện OpenCV ( Mã nguồn mở Thư viện Thị giác Máy tính) có thể được tải xuống. Thư viện đa nền tảng và hiện tồn tại cho các hệ điều hành sau: Windows, Linux, Android, Mac OS và thậm chí cả iOS. Thư viện cung cấp khả năng xử lý hình ảnh theo thời gian thực. Được viết bằng C/C++.

    Cái đó. dự án này là hỗn hợp của dung dịch mềm và cứng. Quá trình xử lý hình ảnh được thực hiện trên máy tính và điều khiển servo được thực hiện bằng bộ điều khiển.

    Vì vậy, những gì tôi đã sử dụng cho dự án:

    Phần mềm:

    Sắt:

    máy tính chạy Windows 7 SP1

    Arduino Uno hoặc tương thích + PSU

    2 servo

    webcam USB

    Vì vậy, chúng ta hãy đi.

    Bước 1: Cài đặt phần mềm

    1) Nếu bạn dùng hệ điều hành Windows thì tải file OpenCV-2.3.1-win-superpack.exe (hoặc hơn phiên bản sau) và cài đặt thư viện.

    2) Tải xuống và cài đặt Microsoft Visual C++ 2010 Express. Nếu bạn có 64-bit Phiên bản Windows, thì bạn cũng sẽ cần tải xuống Windows SDK (nhưng có thể có vấn đề với phiên bản 64; tôi không thể làm cho OpenCV hoạt động trong Windows 7 x64).

    Đọc quy trình thiết lập OpenCV cho Visual C++ trên trang web chính thức.

    Bước 2. Gắn camera và servo

    Tôi không làm cho thiết kế trở nên “bền”, vì sau khi đạt được mục tiêu cuối cùng, tôi tháo rời mọi thứ cho dự án tiếp theo.

    Tôi đã gắn webcam vào động cơ servo trục X và lần lượt nó gắn nó vào động cơ servo trục Y. Và tôi đã cố định toàn bộ cấu trúc này bằng một chiếc kẹp “tay thứ ba”.

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

    Kết nối động cơ servo:

    Chân màu vàng của servo trục X được kết nối với chân 9 của bộ điều khiển Arduino

    Chân màu vàng của servo trục Y được kết nối với chân 10 của bộ điều khiển Arduino

    Chân Vcc màu đỏ từ servo kết nối với chân 5V

    Chân GND màu đen của servo được kết nối với chân GND của bộ điều khiển Arduino

    Kết nối webcam:

    Webcam kết nối với máy tính thông qua Giao diện USB. Chương trình C++ xác định webcam bằng số cổng USB của nó. Bạn có thể cần chỉ định cổng trong chương trình.

    Kết nối bộ điều khiển Arduino UNO:

    Bộ điều khiển cũng kết nối với máy tính thông qua giao diện USB. Một cổng COM ảo xuất hiện trong hệ thống, cổng này phải được thêm vào mã chương trình trong C++.

    Tải xuống tập tin dự án

    Bài viết gốc trên tiếng anh(bản dịch của A.V. Koltykov cho website cxem.net)

    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. Để làm việc, chúng tôi cần Google Speech Mã API. 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)"); kết nối. connect( );InputStream là = connect.getInputStream(); File f = new File(sketchPath + "/" + txt + ".mp3"); OutputStream out = new FileOutputStream(f); byte buf = byte mới; int len ; while ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close(); is.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 file chưa tồn tại, hãy tạo nó bằng cách khác ( println("Tệp chưa tồn tại! Tôi đang tạo!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3"); player.play(); ) )

    Ví dụ thực hiện 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à gửi lệnh tới đó nếu tìm thấy giọng nói phù hợp:
    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 giọng nói kết nối nối tiếp("Bật đèn"); // Giọng nói xác nhận rằng lệnh đã được thực thi ) else if (result.equals("Tắt đèn")) ( myPort.write( "Thấp"); // 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ờ 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ự xuất hiệ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 tới 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 chỉ cho tôi cách không làm và chỉ cho tôi cách làm. 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, nó 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, phải rất lâu mới tìm được công tắc, rồi ngay từ ngưỡng cửa có một hai tiếng vỗ tay và đèn đã bật sáng. 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 truy cập và hạn chế). 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 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 nhiều đế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 để hoạt động 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 định 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).

    Thực tế 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ượng 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 | KÍN | 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 trình 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 mô-đun 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ẽ tất cả là 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 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