Spraakherkenning en -synthese met Arduino (2 / 4 stap)

Stap 2: De code uploaden naar de Arduino

Nu heb je de onderstaande code uploaden naar je Arduino. U kunt ook de Arduino schets downloaden via de link onderaan de pagina. Voordat u de code uploaden, moet u goed de BitVoicer Server bibliotheken installeren in de Arduino IDE (een .zip bibliotheek importeren).

 #include <BVSP.h>#include <BVSMic.h> #include <BVSSpeaker.h> #include <DAC.h>// Defines the Arduino pin that will be used to capture audio #define BVSM_AUDIO_INPUT 7// Defines the LED pins #define RED_LED_PIN 6 #define YELLOW_LED_PIN 9 #define GREEN_LED_PIN 10// Defines the constants that will be passed as parameters to // the BVSP.begin function const unsigned long STATUS_REQUEST_TIMEOUT = 3000; const unsigned long STATUS_REQUEST_INTERVAL = 4000;// Defines the size of the mic audio buffer const int MIC_BUFFER_SIZE = 64;// Defines the size of the speaker audio buffer const int SPEAKER_BUFFER_SIZE = 128;// Defines the size of the receive buffer const int RECEIVE_BUFFER_SIZE = 2;// Initializes a new global instance of the BVSP class BVSP bvsp = BVSP();// Initializes a new global instance of the BVSMic class BVSMic bvsm = BVSMic();// Initializes a new global instance of the BVSSpeaker class BVSSpeaker bvss = BVSSpeaker();// Creates a buffer that will be used to read recorded samples // from the BVSMic class byte micBuffer[MIC_BUFFER_SIZE];// Creates a buffer that will be used to write audio samples // into the BVSSpeaker class byte speakerBuffer[SPEAKER_BUFFER_SIZE];// Creates a buffer that will be used to read the commands sent // from BitVoicer Server. // Byte 0 = pin number // Byte 1 = pin value byte receiveBuffer[RECEIVE_BUFFER_SIZE];// These variables are used to control when to play // "LED Notes". These notes will be played along with // the song streamed from BitVoicer Server. bool playLEDNotes = false; unsigned int playStartTime = 0;void setup() { // Sets up the pin modes pinMode(RED_LED_PIN, OUTPUT); pinMode(YELLOW_LED_PIN, OUTPUT); pinMode(GREEN_LED_PIN, OUTPUT); // Sets the initial state of all LEDs digitalWrite(RED_LED_PIN, LOW); digitalWrite(YELLOW_LED_PIN, LOW); digitalWrite(GREEN_LED_PIN, LOW); // Starts serial communication at 115200 bps Serial.begin(115200); // Sets the Arduino serial port that will be used for // communication, how long it will take before a status request // times out and how often status requests should be sent to // BitVoicer Server. bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Defines the function that will handle the frameReceived // event bvsp.frameReceived = BVSP_frameReceived; // Sets the function that will handle the modeChanged // event bvsp.modeChanged = BVSP_modeChanged; // Sets the function that will handle the streamReceived // event bvsp.streamReceived = BVSP_streamReceived; // Prepares the BVSMic class timer bvsm.begin(); // Sets the DAC that will be used by the BVSSpeaker class bvss.begin(DAC); }void loop() { // Checks if the status request interval has elapsed and if it // has, sends a status request to BitVoicer Server bvsp.keepAlive(); // Checks if there is data available at the serial port buffer // and processes its content according to the specifications // of the BitVoicer Server Protocol bvsp.receive(); // Checks if there is one SRE available. If there is one, // starts recording. if (bvsp.isSREAvailable()) { // If the BVSMic class is not recording, sets up the audio // input and starts recording if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, DEFAULT); bvsm.startRecording(); } // Checks if the BVSMic class has available samples if (bvsm.available) { // Makes sure the inbound mode is STREAM_MODE before // transmitting the stream if (bvsp.inboundMode == FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // Reads the audio samples from the BVSMic class int bytesRead = bvsm.read(micBuffer, MIC_BUFFER_SIZE); // Sends the audio stream to BitVoicer Server bvsp.sendStream(micBuffer, bytesRead); } } else { // No SRE is available. If the BVSMic class is recording, // stops it. if (bvsm.isRecording) bvsm.stopRecording(); } // Plays all audio samples available in the BVSSpeaker class // internal buffer. These samples are written in the // BVSP_streamReceived event handler. If no samples are // available in the internal buffer, nothing is played. bvss.play(); // If playLEDNotes has been set to true, // plays the "LED notes" along with the music. if (playLEDNotes) playNextLEDNote(); }// Handles the frameReceived event void BVSP_frameReceived(byte dataType, int payloadSize) { // Checks if the received frame contains binary data // 0x07 = Binary data (byte array) if (dataType == DATA_TYPE_BINARY) { // If 2 bytes were received, process the command. if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) == RECEIVE_BUFFER_SIZE) { analogWrite(receiveBuffer[0], receiveBuffer[1]); } } // Checks if the received frame contains byte data type // 0x01 = Byte data type else if (dataType == DATA_TYPE_BYTE) { // If the received byte value is 255, sets playLEDNotes // and marks the current time. if (bvsp.getReceivedByte() == 255) { playLEDNotes = true; playStartTime = millis(); } } }// Handles the modeChanged event void BVSP_modeChanged() { // If the outboundMode (Server --> Device) has turned to // FRAMED_MODE, no audio stream is supposed to be received. // Tells the BVSSpeaker class to finish playing when its // internal buffer become empty. if (bvsp.outboundMode == FRAMED_MODE) bvss.finishPlaying(); } // Handles the streamReceived event void BVSP_streamReceived(int size) { // Gets the received stream from the BVSP class int bytesRead = bvsp.getReceivedStream(speakerBuffer, SPEAKER_BUFFER_SIZE); // Enqueues the received stream to play bvss.enqueue(speakerBuffer, bytesRead); }// Lights up the appropriate LED based on the time // the command to start playing LED notes was received. // The timings used here are syncronized with the music. void playNextLEDNote() { // Gets the elapsed time between playStartTime and the // current time. unsigned long elapsed = millis() - playStartTime; // Turns off all LEDs allLEDsOff(); // The last note has been played. // Turns off the last LED and stops playing LED notes. if (elapsed >= 11500) { analogWrite(RED_LED_PIN, 0); playLEDNotes = false; } else if (elapsed >= 9900) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 9370) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 8900) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 8610) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 8230) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 7970) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 7470) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 6760) analogWrite(GREEN_LED_PIN, 255); // E note else if (elapsed >= 6350) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 5880) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 5560) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 5180) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 4890) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 4420) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 3810) analogWrite(GREEN_LED_PIN, 255); // E note else if (elapsed >= 3420) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 2930) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 2560) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 2200) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 1930) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed >= 1470) analogWrite(RED_LED_PIN, 255); // C note else if (elapsed >= 1000) analogWrite(GREEN_LED_PIN, 255); // E note }// Turns off all LEDs. void allLEDsOff() { analogWrite(RED_LED_PIN, 0); analogWrite(YELLOW_LED_PIN, 0); analogWrite(GREEN_LED_PIN, 0); } 

Deze sketch heeft zeven grote delen:

  • Bibliotheek verwijzingen en variabele verklaring: de eerste vier regels bevatten verwijzingen naar de BVSP, BVSMic, BVSSpeaker en DAC bibliotheken. Deze bibliotheken worden geleverd door BitSophia en kunnen worden gevonden in de BitVoicer Server-installatiemap. De DAC-bibliotheek wordt opgenomen automatisch als u een verwijzing naar de BVSSpeaker-bibliotheek toevoegen. De andere lijnen verklaar constanten en variabelen in de sketch gebruikt. De klasse BVSP wordt gebruikt om te communiceren met de Server van de BitVoicer, de klasse BVSMic wordt gebruikt om te vangen en opslaan van audio-samples en de klasse BVSSpeaker wordt gebruikt voor het reproduceren van audio met behulp van de DUE- DAC.
  • Setup-functie: deze functie worden de volgende acties uitgevoerd: stelt de pin-modi en hun oorspronkelijke toestand; initialiseert de seriële communicatie; en de klassen BVSP, BVSMic en BVSSpeaker geïnitialiseerd. Ook daarin "gebeurtenis-handlers" (zij zijn eigenlijk functioneren pointers) voor de gebeurtenissen van het frameReceived, modeChanged en streamReceived van de BVSP klasse.
  • Lus functie: deze functie voert vijf belangrijke acties: verzoekt status info naar de server (keepAlive() functie); controleert of de server geen gegevens heeft verzonden en verwerkt de ontvangen gegevens (receive() functie); Hiermee bepaalt u de opname en het verzenden van audio-streams (isSREAvailable(), startRecording(), stopRecording() en sendStream() functies); speelt de audio-samples in de wachtrij in de BVSSpeaker-klasse (play() functie); en wenst dat het playNextLEDNote() functioneren die bepaalt hoe de LEDs moeten knipperen nadat de opdracht playLEDNotes wordt ontvangen.
  • BVSP_frameReceived functie: deze functie wordt aangeroepen telkens wanneer de receive() functie identificeert die een volledige frame is ontvangen. Hier voer ik de opdrachten uit vanaf BitVoicer Server verzonden. Opdrachten waarmee de LEDs 2 bytes bevat. De eerste byte geeft de pin en de tweede byte geeft de waarde van de pin. Ik gebruik de functie analogWrite() om de juiste waarde ingesteld op de pin. Ik controleer ook als de playLEDNotes-opdracht, die van Byte type is, heeft ontvangen. Wanneer het heeft ontvangen, troep mij playLEDNotes true en aangeven van de huidige tijd. Ditmaal worden door de functie playNextLEDNote gebruikt voor het synchroniseren van de LED's met het nummer.
  • BVSP_modeChanged functie: deze functie wordt aangeroepen telkens wanneer de receive() functie een moduswijziging in de uitgaande richting identificeert (Server--> Arduino). WOW!!! Wat is dat?! BitVoicer Server kunt verzenden de Arduino ingelijste gegevens of audiostreams . Voordat de mededeling van de ene modus naar de andere gaat, stuurt BitVoicer Server een signaal. De klasse BVSP identificeert dit signaal en verhoogt de modeChanged-gebeurtenis. In de BVSP_modeChanged functie, als ik bemerk dat de mededeling gaat van streaming modus naar ingelijste modus, weet ik dat de audio is afgelopen, zodat ik kan vertellen de BVSSpeaker klasse om te stoppen met afspelen van audio-samples.
  • BVSP_streamReceived functie: deze functie wordt aangeroepen telkens wanneer de receive() functie identificeert dat audio-samples zijn ontvangen. Ik gewoon ophalen van de monsters en hen in de klasse BVSSpeaker wachtrij zodat de play() functie kan reproduceren.
  • playNextLEDNote functie: deze functie kan alleen worden uitgevoerd als de BVSP_frameReceived-functie de playLEDNotes-opdracht identificeert. Het controleert en de LEDs synchroniseert met de audio vanaf BitVoicer Server verzonden. Ik gebruikte om de LED's worden gesynchroniseerd met de audio en weet de juiste timing, Sonic Visualizer. Deze gratis software stond me toe om te zien dat de audio golven zodat ik kon gemakkelijk vertellen wanneer een piano-toets is ingedrukt. Het toont ook een tijdlijn en dat is hoe ik de milliseconden die wordt gebruikt in deze functie. Klinkt als een dwaze truc en het is. Ik denk dat het mogelijk is om te analyseren de audio stream en de bijbehorende LED inschakelen, maar dat is buiten mijn bereik.

Gerelateerde Artikelen

Ongebonden van spraakherkenning en spraaksynthese met Arduino

Ongebonden van spraakherkenning en spraaksynthese met Arduino

MOVI staat voor 'Mijn eigen Interface van de stem' en is een kickstarter-backed Arduino schild dat maakt het zeer eenvoudig om te bouwen van uw eigen toespraak dialogen aan controle-apparaten binnen de Arduino IDE. Dit instructable snel ziet u hoe aa
Mok muziek: Water omzetten in een Instrument met Arduino en ChucK

Mok muziek: Water omzetten in een Instrument met Arduino en ChucK

Wat als u kon veranderen elk geleidende oppervlak tot een instrument? Zoals, zeggen... een mok water? Het beste van allen, is het goedkoop; u moet slechts 1 dollar waard van extra elektrische componenten (niet met inbegrip van de Arduino).Voor dit pr
2WD stem gecontroleerde Robot met Arduino en BitVoicer Server

2WD stem gecontroleerde Robot met Arduino en BitVoicer Server

In dit Instructable ga ik tonen hoe te om een 2WD spraakgestuurde robot te bouwen. Hoewel ik ben alleen gelijkstroommotoren als wilt verplaatsen de robot controle, dezelfde aanpak kan worden gebruikt voor de controle van de stem stappenmotoren en ser
Voice Activated LED-verlichting met Arduino

Voice Activated LED-verlichting met Arduino

Dit project is een uitbreiding van de mogelijkheden van spraakherkenning met Arduino met leandro4b (). Echter, in plaats van met 3 afzonderlijke gekleurde LED's, gebruikte ik een multicolor 4-kanaals RGBW LED Emitter. Ik had de kans van het werken bi
LED kubus met Arduino en aangepaste PCB

LED kubus met Arduino en aangepaste PCB

dit instructable details over het ontwerp en bouwproces voor een 5 x 5 x 5 LED-kubus, instelbaar met behulp van een Arduino, die zich op een aangepaste printplaat bevindt.Extra informatie, foto's en video's vindt u op mijn website.Het afgewerkt produ
Een Levitating bol draait gloed en knippert met Arduino

Een Levitating bol draait gloed en knippert met Arduino

Een levitating little Death Star in Instructables nodigde me aan het nieuwe project met Arduino. Drie beleidsterreinen werden besloten en bewaard als onderscheid met de voorloper.Doe het zelf met geen (of minder) ready-made.Draaiende houden.Maak gloe
PHloat2 DIY zuur water testen sculptuur & kit met arduino

PHloat2 DIY zuur water testen sculptuur & kit met arduino

pHloatpHloat is een DIY kit die is gemaakt voor gebruik in combinatie met een pre-owned / reeds bestaande arduino microcontroller. Het doel is het testen van de pH-niveaus in de lokale rivieren, meren en stromen als gevolg van de toestroom van lucht-
Kamertemperatuur in Dot-Matrix beeldscherm met Arduino en LM35

Kamertemperatuur in Dot-Matrix beeldscherm met Arduino en LM35

Hey daar!Dit is mijn eerste instructable, en ik zal je laten zien hoe u een temperatuursensor en een Dot-Matrix beeldscherm met arduino in real-time kunt interface.Ik heb bijgevoegd de arduino schets, die nogal groot in één oogopslag is, maar als u o
Aan de slag met Arduino - twee speler Arduino Pong

Aan de slag met Arduino - twee speler Arduino Pong

In deze tutorial gaan we een arduino gebaseerde controller die we gebruiken kunnen om te bepalen van een spel voor 2 spelers van pong bouwen.We gaan een paar van dial potentiometers (het draaien van knoppen) gebruiken om te controleren de pong vleerm
Mood Lamp met Arduino

Mood Lamp met Arduino

Hallo! In deze tutorial leert u om een mood lamp met arduino.Ik weet dat je hebt misschien een heleboel mood lamp projecten met arduino gezien, maar ik was zeer tevreden met hen niet, omdat ze allemaal heel abrupt de kleur wijzigen. Dus, heb ik beslo
AtoZ van RC hobby + DIY radio met ARDUINO

AtoZ van RC hobby + DIY radio met ARDUINO

Wikipedia omschrijft RC-voertuig alsEen afstandsbediening voertuig is een voertuig dat op afstand wordt bestuurd door een betekent dat de beweging met een externe oorsprong niet tot het apparaat beperkt. Dit is vaak een bedieningsorgaan radio, kabel
Decoderen en verzenden van 433MHz RF codes met Arduino en rc-switch

Decoderen en verzenden van 433MHz RF codes met Arduino en rc-switch

In deze tutorial zal ik u tonen hoe te een Arduino gebruiken voor het decoderen van de signalen van RF afstandsbedieningen, en hen op afstand bedienen van sommige schakelopties lichtnet en een garagedeur opnieuw te sturen.Opmerking: Deze handleiding
Hoe maak je een "kameleon" met Arduino

Hoe maak je een "kameleon" met Arduino

U moet gezien hebben kameleons verkleuren en mengen in de omgeving, in een geweldige manier. De manier waarop dat kameleons eigenlijk dit doen is echt moleculaire. Als je kijkt naar de huid van een kameleon, vindt u dat er verscheidene lagen van gesp
Programmering ESP8266 ESP-12E NodeMCU v1.0 met Arduino IDE in draadloze temperatuur logger

Programmering ESP8266 ESP-12E NodeMCU v1.0 met Arduino IDE in draadloze temperatuur logger

Terug in eind 2014 en begin 2015, uw echt kwamdeze handige WiFi Chip ESP8266 (de ESP-01) en moeten vechten onder de inconsistente documentatie uit verschillende bronnen. Vooralsnog uitloper gedocumenteerd hij zijn frustraties (bevindingen) als een in