Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Maîtriser la reconnaissance et la synthèse vocale sur Arduino Due

Composants et fournitures

Composant Quantité
Arduino Due 1
Module microphone électret SparkFun 1
Amplificateur audio mono SparkFun 1
Haut-parleur : 0.25W, 8 ohms 1
Plaque d'essai (breadboard) 1
LED 5 mm rouge 3
Résistance 330 ohms 3
Fils de connexion (jumper wires) 1

Outils et machines nécessaires

Applications et services en ligne

À propos de ce projet

Dans mon projet précédent, j'ai montré comment contrôler quelques LEDs avec une carte Arduino et BitVoicer Server. Dans celui-ci, je complexifie un peu les choses. Je vais aussi synthétiser la parole en utilisant le convertisseur numérique-analogique (DAC) de l'Arduino DUE. Si vous n'avez pas d'Arduino DUE, vous pouvez utiliser d'autres cartes Arduino, mais vous aurez besoin d'un DAC externe et de code supplémentaire pour le piloter (la bibliothèque BVSSpeaker ne vous aidera pas pour cela).

Dans la vidéo ci-dessous, vous verrez que je fais aussi jouer une petite chanson à l'Arduino et clignoter les LEDs comme des touches de piano. Désolé pour mes compétences au piano, mais c'est le mieux que je puisse faire :) . Les LEDs clignotent en fait dans la même séquence et au même timing que de vraies touches C, D et E. Si vous avez un piano, vous pouvez suivre les LEDs et jouer la même chanson. C'est un jingle d'un ancien détaillant (Mappin) qui n'existe même plus.

Les procédures suivantes transforment les commandes vocales en activité des LEDs et parole synthétisée :

  1. Les ondes audio sont capturées et amplifiées par la carte Sparkfun Electret Breakout ;
  2. Le signal amplifié est numérisé et mis en tampon dans l'Arduino via son convertisseur analogique-numérique (ADC) ;
  3. Les échantillons audio sont transmis au serveur BitVoicer via le port série de l'Arduino ;
  4. Le serveur BitVoicer traite le flux audio et reconnaît la parole qu'il contient ;
  5. La parole reconnue est mappée à des commandes prédéfinies renvoyées à l'Arduino. Si une commande consiste à synthétiser la parole, le serveur prépare le flux audio et l'envoie à l'Arduino ;
  6. L'Arduino identifie les commandes et effectue l'action appropriée. Si un flux audio est reçu, il est mis en file d'attente dans la classe BVSSpeaker et lu via le DAC et DMA du DUE ;
  7. L'amplificateur audio mono SparkFun amplifie le signal du DAC pour piloter un haut-parleur 8 Ohms.

Liste du matériel

ÉTAPE 1 : Câblage

Première étape : câbler l'Arduino et la breadboard avec les composants comme montré dans les images ci-dessous. J'ai dû placer un petit caoutchouc sous le haut-parleur car il vibre beaucoup et sans le caoutchouc, la qualité audio est considérablement affectée.

Maîtriser la reconnaissance et la synthèse vocale sur Arduino Due
Maîtriser la reconnaissance et la synthèse vocale sur Arduino Due
Maîtriser la reconnaissance et la synthèse vocale sur Arduino Due
Maîtriser la reconnaissance et la synthèse vocale sur Arduino Due

Voici une différence petite mais importante par rapport à mon projet précédent. La plupart des cartes Arduino fonctionnent à 5V, mais le DUE fonctionne à 3.3V. Comme j'ai obtenu de meilleurs résultats en alimentant le Sparkfun Electret Breakout à 3.3V, je recommande d'ajouter un cavalier entre la broche 3.3V et la broche AREF SI vous utilisez des cartes Arduino 5V. Le DUE utilise déjà une référence analogique 3.3V donc vous n'avez pas besoin de cavalier vers AREF. En fait, la broche AREF sur le DUE est connectée au microcontrôleur via un pont de résistances. Pour utiliser la broche AREF, la résistance BR1 doit être dessoudée du PCB.

ÉTAPE 2 : Téléversement du code sur l'Arduino

Maintenant, téléversez le code ci-dessous sur votre Arduino. Pour plus de commodité, le sketch Arduino est aussi disponible dans la section Pièces jointes en bas de cette page. Avant de téléverser, vous devez installer correctement les bibliothèques BitVoicer Server dans l'IDE Arduino (Importation d'une bibliothèque .zip).

Sketch Arduino : BVS_Demo2.ino

Ce sketch comporte sept parties principales :

ÉTAPE 3 : Importation des objets solution BitVoicer Server

Maintenant, configurez BitVoicer Server pour qu'il fonctionne avec l'Arduino. BitVoicer Server a quatre objets solution majeurs : Locations, Devices, BinaryData et Voice Schemas.

Une des phrases de mon Voice Schema est « play a little song ». Cette phrase contient deux commandes. La première envoie un octet indiquant que la commande suivante sera un flux audio. L'Arduino commence alors à « jouer » les LEDs pendant que l'audio est transmis. L'audio est un petit jingle piano que j'ai enregistré moi-même et défini comme source audio de la seconde commande. BitVoicer Server ne supporte que l'audio PCM mono 8 bits (8000 échantillons/seconde). Si vous devez convertir un fichier audio dans ce format, je recommande cet outil en ligne : https://audio.online-convert.com/convert-to-wav.

Vous pouvez importer (Importation d'objets solution) tous les objets solution utilisés dans ce projet depuis les fichiers ci-dessous. L'un contient l'appareil DUE, l'autre le Voice Schema et ses commandes.

Fichiers d'objets solution :

ÉTAPE 4 : Conclusion

Voilà ! Vous pouvez tout activer et faire les mêmes choses montrées dans la vidéo.

Comme dans mon projet précédent, j'ai démarré la reconnaissance vocale en activant l'appareil Arduino dans le gestionnaire BitVoicer Server. Dès qu'il est activé, l'Arduino identifie un moteur de reconnaissance vocale disponible et commence à streamer l'audio vers BitVoicer Server. Cependant, maintenant vous voyez beaucoup plus d'activité sur la LED RX de l'Arduino pendant que l'audio est streamé depuis BitVoicer Server vers l'Arduino.

Dans mon prochain projet, je serai un peu plus ambitieux. J'ajouterai la communication WiFi à un Arduino et contrôlerai deux autres Arduinos ensemble par la voix. Je pense à un genre de jeu entre eux. Les suggestions sont les bienvenues !

Code

Sketch Arduino (Arduino)

#include  #include  #include  #include  // Broche Arduino pour capture audio #define BVSM_AUDIO_INPUT 7 // Broches LED #define RED_LED_PIN 6 #define YELLOW_LED_PIN 9 #define GREEN_LED_PIN 10 // Constantes pour BVSP.begin const unsigned long STATUS_REQUEST_TIMEOUT = 3000; const unsigned long STATUS_REQUEST_INTERVAL = 4000; // Taille tampon audio micro const int MIC_BUFFER_SIZE = 64; // Taille tampon audio haut-parleur const int SPEAKER_BUFFER_SIZE = 128; // Taille tampon réception const int RECEIVE_BUFFER_SIZE = 2; // Instance globale BVSP BVSP bvsp = BVSP(); // Instance globale BVSMic BVSMic bvsm = BVSMic(); // Instance globale BVSSpeaker BVSSpeaker bvss = BVSSpeaker(); // Tampon pour lire échantillons enregistrés depuis BVSMic byte micBuffer[MIC_BUFFER_SIZE]; // Tampon pour écrire échantillons audio dans BVSSpeaker byte speakerBuffer[SPEAKER_BUFFER_SIZE]; // Tampon pour lire commandes envoyées depuis BitVoicer Server // Octet 0 = numéro broche // Octet 1 = valeur broche byte receiveBuffer[RECEIVE_BUFFER_SIZE]; // Variables pour contrôler quand jouer les "LED Notes" bool playLEDNotes = false; unsigned int playStartTime = 0; void setup() { // Modes broches pinMode(RED_LED_PIN, OUTPUT); pinMode(YELLOW_LED_PIN, OUTPUT); pinMode(GREEN_LED_PIN, OUTPUT); // État initial LEDs digitalWrite(RED_LED_PIN, LOW); digitalWrite(YELLOW_LED_PIN, LOW); digitalWrite(GREEN_LED_PIN, LOW); // Communication série à 115200 bps Serial.begin(115200); // Port série Arduino, timeout requête statut, intervalle requêtes statut bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Gestionnaire événement frameReceived bvsp.frameReceived = BVSP_frameReceived; // Gestionnaire événement modeChanged bvsp.modeChanged = BVSP_modeChanged; // Gestionnaire événement streamReceived bvsp.streamReceived = BVSP_streamReceived; // Préparer timer classe BVSMic bvsm.begin(); // Définir DAC utilisé par BVSSpeaker bvss.begin(DAC); } void loop() { // Vérifier intervalle requête statut et envoyer si écoulé bvsp.keepAlive(); // Vérifier données disponibles port série et traiter selon protocole BitVoicer Server bvsp.receive(); // Vérifier si un SRE disponible. Si oui, commencer enregistrement. if (bvsp.isSREAvailable()) { // Si BVSMic n'enregistre pas, configurer entrée audio et commencer if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, DEFAULT); bvsm.startRecording(); } // Vérifier si BVSMic a échantillons disponibles if (bvsm.available) { // S'assurer que mode entrant est STREAM_MODE avant transmission if (bvsp.inboundMode == FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // Lire échantillons audio depuis BVSMic int bytesRead = bvsm.read(micBuffer, MIC_BUFFER_SIZE); // Envoyer flux audio vers BitVoicer Server bvsp.sendStream(micBuffer, bytesRead); } } else { // Aucun SRE disponible. Si BVSMic enregistre, l'arrêter. if (bvsm.isRecording) bvsm.stopRecording(); } // Lire tous échantillons audio disponibles dans tampon interne BVSSpeaker. // Écrits dans gestionnaire d'événement BVSP_streamReceived. // Si aucun échantillon disponible, rien n'est joué. bvss.play(); // Si playLEDNotes mis à true, jouer les "notes LED" avec la musique. if (playLEDNotes) playNextLEDNote(); } // Gestionnaire événement frameReceived void BVSP_frameReceived(byte dataType, int payloadSize) { // Vérifier si trame contient données binaires // 0x07 = Données binaires (tableau octets) if (dataType == DATA_TYPE_BINARY) { // Si 2 octets reçus, traiter commande. if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) == RECEIVE_BUFFER_SIZE) { analogWrite(receiveBuffer[0], receiveBuffer[1]); } } // Vérifier si trame contient données type octet // 0x01 = Type données octet else if (dataType == DATA_TYPE_BYTE) { // Si octet reçu vaut 255, activer playLEDNotes et marquer temps. if (bvsp.getReceivedByte() == 255) { playLEDNotes = true; playStartTime = millis(); } } } // Gestionnaire événement modeChanged void BVSP_modeChanged() { // Si outboundMode (Serveur -> Device) passe à FRAMED_MODE, aucun flux audio n'est censé être reçu. // Dire à BVSSpeaker de finir la lecture quand son tampon interne devient vide. if (bvsp.outboundMode == FRAMED_MODE) bvss.finishPlaying(); } // Gestionnaire événement streamReceived void BVSP_streamReceived(int size) { // Récupérer flux reçu depuis classe BVSP int bytesRead = bvsp.getReceivedStream(speakerBuffer, SPEAKER_BUFFER_SIZE); // Mettre en file pour lecture bvss.enqueue(speakerBuffer, bytesRead); } // Allumer LED appropriée selon temps depuis commande playLEDNotes. // Timings synchronisés avec la musique. void playNextLEDNote() { // Temps écoulé entre playStartTime et maintenant. unsigned long elapsed = millis() - playStartTime; // Éteindre toutes LEDs allLEDsOff(); // Dernière note jouée. Éteindre dernière LED et arrêter notes LED. if (elapsed >= 11500) { analogWrite(RED_LED_PIN, 0); playLEDNotes = false; } else if (elapsed >= 9900) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 9370) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 8900) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 8610) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 8230) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 7970) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 7470) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 6760) analogWrite(GREEN_LED_PIN, 255); // Note E else if (elapsed >= 6350) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 5880) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 5560) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 5180) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 4890) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 4420) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 3810) analogWrite(GREEN_LED_PIN, 255); // Note E else if (elapsed >= 3420) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 2930) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 2560) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 2200) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 1930) analogWrite(YELLOW_LED_PIN, 255); // Note D else if (elapsed >= 1470) analogWrite(RED_LED_PIN, 255); // Note C else if (elapsed >= 1000) analogWrite(GREEN_LED_PIN, 255); // Note E } // Éteindre toutes LEDs. void allLEDsOff() { analogWrite(RED_LED_PIN, 0); analogWrite(YELLOW_LED_PIN, 0); analogWrite(GREEN_LED_PIN, 0); }

Schéma de câblage

Maîtriser la reconnaissance et la synthèse vocale sur Arduino Due

Processus de fabrication

  1. Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
  2. Projet capteur DHT11 température/humidité avec indicateurs LED et buzzer piézo
  3. Affichage LED Interactif Gyroscopique avec Anneau NeoPixel et Arduino
  4. Moniteur de Température et Horloge Temps Réel Arduino avec Écran TFT 3.2"
  5. Contrôlez votre Roomba Create 2 avec Arduino et Android – Guide pas à pas
  6. Construire un voltmètre DIY avec Arduino et écran Nokia 5110
  7. Arduino et MPU6050 : Contrôle précis de servo-moteur avec SG90 et MG996R
  8. Module GPS u-blox LEA‑6H 02 : guide d'intégration Arduino et Python
  9. Lire température et humidité avec DHT11 sur Blynk – Tutoriel Arduino pas à pas