Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Spracherkennung mit Arduino und BitVoicer Server

Komponenten und Verbrauchsmaterialien

Arduino Micro
× 1
Sparkfun Elektret-Mikrofon Breakout
× 1
BitVoicer-Server
× 1
BitVoicer Server 1.0
× 1
LED (generisch)
× 3
Widerstand 330 Ohm
× 3

Über dieses Projekt

In diesem Beitrag werde ich zeigen, wie man ein Arduino-Board und einen BitVoicer-Server verwendet, um einige LEDs mit Sprachbefehlen zu steuern. Ich werde in diesem Beitrag das Arduino Micro verwenden, aber Sie können jedes Arduino-Board verwenden, das Sie zur Hand haben.

Die folgenden Verfahren werden ausgeführt, um Sprachbefehle in LED-Aktivität umzuwandeln:


  • Audiowellen werden vom Sparkfun Electret Breakout Board erfasst und verstärkt;
  • Das verstärkte Signal wird im Arduino mit seinem Analog-Digital-Wandler (ADC) digitalisiert und gepuffert;
  • Die Audio-Samples werden über den seriellen Arduino-Port an den BitVoicer-Server gestreamt;
  • BitVoicerServer verarbeitet den Audiostream und erkennt die darin enthaltene Sprache;
  • Die erkannte Sprache wird vordefinierten Befehlen zugeordnet, die an das Arduino zurückgesendet werden;
  • TheArduino identifiziert die Befehle und führt die entsprechende Aktion aus.

Das obige Video zeigt das Endergebnis dieses Beitrags. Beachten Sie im Video, dass BitVoicer Server auch synthetisiertes Sprachfeedback bietet. Dieses Sprachfeedback wird im Server definiert und vom Server-Audioadapter reproduziert, aber das synthetisierte Audio könnte auch an den Arduino gesendet und mit einem Digital-Analog-Wandler (DAC) reproduziert werden. In meinem nächsten Beitrag werde ich zeigen, wie man den Arduino DUE verwendet, einen verstärkten und einen Lautsprecher, um die synthetisierte Sprache mit dem Arduino selbst zu reproduzieren.

Materialliste:


  • Arduino Micro (oder jedes andere Arduino-Board):~ 20,00 US-Dollar
  • Sparkfun Elektret-Mikrofon Breakout:7,95 US-Dollar
  • BitVoicer Server 1.0 :9,90 US-Dollar
  • Steckbrett:~ 10,00 US-Dollar
  • 3 xLEDs:~1,00 USD
  • 3 x330 Ohm Widerstände:~U$ 0,75
  • Überbrückungsdrähte:~U$ 0.30


SCHRITT 1:Verkabelung


Der erste Schritt besteht darin, das Arduino und das Steckbrett mit den Komponenten zu verdrahten, wie in den Bildern unten gezeigt.

Das wichtigste Detail bezieht sich hier auf die analoge Referenz, die dem Arduino ADC zur Verfügung gestellt wird. In meinen Tests habe ich mit dem Sparkfun Electret Breakout mit 3,3 V bessere Ergebnisse erzielt. Deshalb habe ich einen Jumper zwischen dem 3.3V-Pin und dem AREF-Pin hinzugefügt. Wenn Sie sich entscheiden, die analogRead-Funktion (aus irgendeinem Grund) zu verwenden, während 3,3 V an den AREF-Pin angelegt werden, MÜSSEN Sie analogReference (EXTERNAL) aufrufen, bevor Sie die analogRead-Funktion verwenden. Andernfalls schließen Sie die aktive Referenzspannung (intern erzeugt) und den AREF-Pin kurz, wodurch möglicherweise der Mikrocontroller auf Ihrem Arduino-Board beschädigt wird.


SCHRITT 2: Code auf den Arduino hochladen


Jetzt müssen Sie den folgenden Code auf Ihr Arduino hochladen. Der Einfachheit halber ist die Arduino-Skizze auch im Abschnitt "Anhänge" am Ende dieses Beitrags verfügbar. Bevor Sie den Code hochladen, müssen Sie die BitVoicer Server-Bibliotheken ordnungsgemäß in der Arduino IDE installieren (Importieren einer .zip-Bibliothek).

BVS_Demo1.ino

Diese Skizze besteht aus vier Hauptteilen:


  • Bibliotheksverweise und Variablendeklaration:Die ersten beiden Zeilen enthalten Verweise auf die BVSP- und BVSMic-Bibliotheken. Diese Bibliotheken werden von BitSophia bereitgestellt und befinden sich im BitVoicer Server-Installationsordner. Die anderen Zeilen deklarieren Konstanten und Variablen, die in der gesamten Skizze verwendet werden. Die BVSP-Klasse wird verwendet, um mit BitVoicer Server zu kommunizieren, und die BVSMic-Klasse wird verwendet, um Audiosamples aufzunehmen und zu speichern.
  • Setupfunktion:Diese Funktion initialisiert die serielle Kommunikation, die BVSP-Klasse, die BVSMic-Klasse und setzt den „Ereignishandler“ (eigentlich ein Funktionszeiger) für das FrameReceived-Ereignis.
  • Loopfunktion:Diese Funktion führt drei wichtige Aktionen aus:Fordert Statusinformationen des Servers an (keepAlive()-Funktion), prüft, ob der Server Daten gesendet hat und verarbeitet die empfangenen Daten (receive()-Funktion) und steuert die Aufnahme und das Senden von Audio streams (isSREAvailable(), startRecording(),stopRecording() und sendStream() Funktionen).
  • BVSP_frameReceivedfunction:Diese Funktion wird jedes Mal aufgerufen, wenn die Funktion receive() erkennt, dass ein vollständiger Frame empfangen wurde. Hier führe ich den vom BitVoicer Server gesendeten Befehl aus. Der Befehl enthält 2 Byte. Das erste Byte gibt den Pin an und das zweite Byte gibt den Pinwert an. Ich verwende die Funktion analogWrite(), um den entsprechenden Wert für den Pin zu setzen.


SCHRITT 3:Importieren von BitVoicer Server-Lösungsobjekten


Jetzt müssen Sie BitVoicer Server einrichten, um mit dem Arduino zu arbeiten. BitVoicer Server hat vier Hauptlösungsobjekte:Standorte, Geräte, Binärdaten und Sprachschemas.

Standorte stellen den physischen Standort dar, an dem ein Gerät installiert ist. In meinem Fall habe ich einen Standort namens Home erstellt.

Geräte sind die BitVoicer Server-Clients. Ich habe ein gemischtes Gerät erstellt, es ArduinoMicro genannt und die Kommunikationseinstellungen eingegeben. HINWEIS ZU ARDUINO MICRO :Es verwendet RTS und DTR, daher müssen Sie diese Einstellungen auf der Registerkarte Kommunikation aktivieren. Ich habe auch ein SystemSpeaker-Gerät erstellt, um Sprache mithilfe des Server-Audioadapters zu synthetisieren.

BinaryData ist ein Befehlstyp, den BitVoicer Server an Clientgeräte senden kann. Sie sind eigentlich Byte-Arrays, die Sie mit Befehlen verknüpfen können. Wenn BitVoicer Server Sprache im Zusammenhang mit diesem Befehl erkennt, sendet er das Byte-Array an das Zielgerät. Ich habe für jeden Pin-Wert ein BinaryData-Objekt erstellt und sie ArduinoMicroGreenLedOn, ArduinoMicroGreenLedOff usw. genannt. Am Ende hatte ich 18 BinaryData-Objekte in meiner Lösung, daher schlage ich vor, dass Sie die Objekte aus der VoiceSchema.sof . herunterladen und importieren Datei unten.

Bei Voice-Schemas kommt alles zusammen. Sie definieren, welche Sätze erkannt und welche Befehle ausgeführt werden sollen. Für jeden Satz können Sie beliebig viele Befehle und deren Ausführungsreihenfolge definieren. Sie können auch Verzögerungen zwischen Befehlen definieren. So habe ich es geschafft, die im Video gezeigte Abfolge von Aktionen auszuführen.

Sie können alle Lösungsobjekte, die ich in diesem Beitrag verwendet habe, aus den folgenden Dateien importieren (Importieren von Lösungsobjekten). Einer enthält die Geräte und der andere enthält das Sprachschema und seine Befehle.

Geräte.sof


VoiceSchema.sof

SCHRITT 4:Fazit


Das ist es! Ich hoffe, es hat euch gefallen.

Sie haben alles, was Sie brauchen, um die im Video gezeigte Demo auszuführen. Beachten Sie, dass ich in dem Video begonnen habe, indem ich das ArduinoMicro-Gerät im BitVoicer Server Manager aktiviert habe. Sobald es aktiviert wird, identifiziert das Arduino eine verfügbare Spracherkennungs-Engine und beginnt mit dem Streaming von Audio an den BitVoicer-Server.

Sie können die Erkennungsergebnisse im Server Monitor-Tool verfolgen, das im BitVoicer Server Manager verfügbar ist.

In meinem nächsten Beitrag werde ich zeigen, wie man synthetisierte Sprache mit einem Arduino DUE reproduzieren kann.


Code

  • BVS_Demo1.ino
BVS_Demo1.inoArduino
#include #include // Definiert den Arduino-Pin, der zum Aufnehmen von Audio verwendet wird #define BVSM_AUDIO_INPUT 5// Definiert die LED-Pins#define RED_LED_PIN 6#define YELLOW_LED_PIN 9#define GREEN_LED_PIN 10// Definiert die Konstanten die als Parameter an // die BVSP.begin Funktion übergeben werdenconst unsigned long STATUS_REQUEST_TIMEOUT =1000;const unsigned long STATUS_REQUEST_INTERVAL =2000;// Definiert die Größe des Audiopuffers const int AUDIO_BUFFER_SIZE =64;/ / Definiert die Größe des Empfangspufferconst int RECEIVE_BUFFER_SIZE =2;// Initialisiert eine neue globale Instanz der BVSP-Klasse BVSP bvsp =BVSP();// Initialisiert eine neue globale Instanz der BVSMic-Klasse BVSMic bvsm =BVSMic();/ / Erstellt einen Puffer, der verwendet wird, um aufgenommene Samples zu lesen // aus der BVSMic-Klasse byte audioBuffer[AUDIO_BUFFER_SIZE];// Erstellt einen Puffer, der verwendet wird, um die gesendeten Befehle // vom BitVoicer-Server zu lesen.// Byte 0 =pin Nummer// Byte 1 =Pin Wertbyte ReceiveBuffer[RECEIVE_BUFFER _SIZE];void setup () {// Richtet die Pin-Modi ein pinMode (RED_LED_PIN, OUTPUT); pinMode (GELB_LED_PIN, AUSGANG); pinMode (GREEN_LED_PIN, AUSGANG); // Startet die serielle Kommunikation mit 115200 bps Serial.begin(115200); // Legt den seriellen Arduino-Port fest, der für die // Kommunikation verwendet wird, wie lange es dauert, bis eine // Statusanfrage abläuft und wie oft Statusanfragen an // BitVoicer Server gesendet werden sollen. bvsp.begin(Seriell, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Definiert die Funktion, die das Ereignis frameReceived // behandelt bvsp.frameReceived =BVSP_frameReceived; // Bereitet den BVSMic-Klassen-Timer vor bvsm.begin();}void loop() { // Prüft, ob das Statusanfrageintervall abgelaufen ist und // falls ja, sendet eine Statusanfrage an BitVoicer Server bvsp.keepAlive(); // Prüft, ob Daten am seriellen Port-Puffer verfügbar sind // und verarbeitet deren Inhalt gemäß den Spezifikationen // des BitVoicer Server Protocol bvsp.receive(); // Prüft, ob eine SRE verfügbar ist. Falls vorhanden, // startet die Aufnahme. if (bvsp.isSREAvailable()) { // Wenn die BVSMic-Klasse nicht aufzeichnet, richtet // den Audioeingang ein und startet die Aufzeichnung if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording(); } // Prüft, ob die BVSMic-Klasse verfügbare Samples hat if (bvsm.available) { // Stellt sicher, dass der eingehende Modus STREAM_MODE ist, bevor // der Stream übertragen wird if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // Liest die Audio-Samples aus der BVSMic-Klasse int bytesRead =bvsm.read(audioBuffer, AUDIO_BUFFER_SIZE); // Sendet den Audiostream an den BitVoicer Server bvsp.sendStream(audioBuffer, bytesRead); } } else { // Es ist kein SRE verfügbar. Wenn die BVSMic-Klasse aufzeichnet, // stoppt sie. if (bvsm.isRecording) bvsm.stopRecording(); }} // Behandelt das Ereignis frameReceived void BVSP_frameReceived(byte dataType, int payloadSize) { // Prüft, ob der empfangene Frame Binärdaten enthält // 0x07 =Binärdaten (Byte-Array) if (dataType ==DATA_TYPE_BINARY) { // Wenn 2 Bytes empfangen wurden, verarbeiten Sie den Befehl. if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) ==RECEIVE_BUFFER_SIZE) { analogWrite(receiveBuffer[0], receiveBuffer[1]); } }}

Schaltpläne


Herstellungsprozess

  1. Anwesenheitssystem mit Arduino und RFID mit Python
  2. DHT11-Sensor mit LEDs und einem Piezo-Lautsprecher
  3. Arduino-Temp. Monitor und Echtzeituhr mit 3.2 Display
  4. Steuerung eines Roomba-Roboters mit Arduino und Android-Gerät
  5. DIY Voltmeter mit Arduino und einem Nokia 5110 Display
  6. Steuerung des Servomotors mit Arduino und MPU6050
  7. u-blox LEA-6H 02 GPS-Modul mit Arduino und Python
  8. So liest man Temperatur und Luftfeuchtigkeit auf Blynk mit DHT11
  9. Spracherkennung und -synthese mit Arduino
  10. 4x4x4 LED-Würfel mit Arduino Uno und 1sheeld