Go Down

Topic: Speech Recognition with BitVoicer, Arduino and a Microphone (Read 7536 times) previous topic - next topic

msb4180

Dec 19, 2012, 07:27 pm Last Edit: Dec 27, 2012, 01:51 pm by msb4180 Reason: 1
In this project I use BitVoicer's speech recognition features (http://www.bitsophia.com/BitVoicer.aspx), one Arduino board and one electret microphone (https://www.sparkfun.com/products/9964) to control a few LEDs.

This project is similar to the one in my first post (http://arduino.cc/forum/index.php/topic,133051.0.html), but now I use audio streaming to send audio to BitVoicer.

The following fritzing schematic shows how I wired my Arduino board:



I'm also adding a few pictures and a YouTube video of the project running.

http://www.youtube.com/watch?v=d8ZtQ21MDL0





Unfortunately, the sketch I wrote for my first post is no longer supported by the new version of BitVoicer. Here is the new sketch:

Code: [Select]

#include <BitVoicer11.h>

//Instantiates the BitVoicerSerial class
BitVoicerSerial bvSerial = BitVoicerSerial();

//Stores true if the Audio Streaming Calibration tool
//is running
boolean sampleTest = false;
//Stores the data type retrieved by getData()
byte dataType = 0;
//Sets up the pins and default variables
int pinR = 3;
int pinY = 5;
int pinG = 6;
int lightLevel = 0;

void setup()
{
 //Sets the analog reference to external (AREF pin)
 //WARNING!!! If anything is conected to the AREF pin,
 //this function MUST be called first. Otherwise, it will
 //damage the board.
 bvSerial.setAnalogReference(BV_EXTERNAL);
 //Sets up the microcontroller to perform faster analog reads
 //on the specified pin
 bvSerial.setAudioInput(0);
 //Starts serial communication at 115200 bps
 Serial.begin(115200);
 //Sets up the pinModes
 pinMode(pinR, OUTPUT);
 pinMode(pinY, OUTPUT);
 pinMode(pinG, OUTPUT);
}

void loop()
{
 //Captures audio and sends it to BitVoicer if the Audio
 //Streaming Calibration Tool is running
 if (sampleTest == true)
 {
   //The value passed to the function is the time
   //(in microseconds) that the function has to wait before
   //performing the reading. It is used to achieve about
   //8000 readings per second.
   bvSerial.processAudio(46);
 }
 
 //Captures audio and sends it to BitVoicer if the Speech
 //Recognition Engine is running
 if (bvSerial.engineRunning)
 {
   //The value passed to the function is the time
   //(in microseconds) that the function has to wait before
   //performing the reading. It is used to achieve about
   //8000 readings per second.
   bvSerial.processAudio(46);
 }
}

//This function runs every time serial data is available
//in the serial buffer after a loop
void serialEvent()
{
 //Reads the serial buffer and stores the received data type
 dataType = bvSerial.getData();
 
 //Changes the value of sampleTest if the received data was
 //the start/stop sampling command
 if (dataType == BV_COMMAND)
     sampleTest = bvSerial.cmdData;
 
 //Signals BitVoicer's Speech Recognition Engine to start
 //listening to audio streams after the engineRunning status
 //was received
 if (dataType == BV_STATUS && bvSerial.engineRunning == true)
   bvSerial.startStopListening();
 
 //Checks if the data type is the same as the one in the
 //Voice Schema
 if (dataType == BV_STR)
   setLEDs();
}

//Performs the LED changes according to the value in
//bvSerial.strData
void setLEDs()
{
 if (bvSerial.strData == "wake")
 {
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   digitalWrite(pinR, HIGH);
   digitalWrite(pinY, HIGH);
   digitalWrite(pinG, HIGH);
   delay(200);
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   delay(200);
   digitalWrite(pinR, HIGH);
   digitalWrite(pinY, HIGH);
   digitalWrite(pinG, HIGH);
   delay(200);
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   delay(200);
   digitalWrite(pinR, HIGH);
   digitalWrite(pinY, HIGH);
   digitalWrite(pinG, HIGH);
   delay(200);
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   lightLevel = 0;
 }
 else if (bvSerial.strData == "sleep")
 {
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   digitalWrite(pinR, HIGH);
   digitalWrite(pinY, HIGH);
   digitalWrite(pinG, HIGH);
   delay(200);
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   delay(200);
   digitalWrite(pinR, HIGH);
   digitalWrite(pinY, HIGH);
   digitalWrite(pinG, HIGH);
   delay(200);
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   lightLevel = 0;
 }
 else if (bvSerial.strData == "RH")
 {
   digitalWrite(pinR, HIGH);
   lightLevel = 255;
 }
 else if (bvSerial.strData == "RL")
 {
   digitalWrite(pinR, LOW);
   lightLevel = 0;
 }
 else if (bvSerial.strData == "YH")
 {
   digitalWrite(pinY, HIGH);
   lightLevel = 255;
 }
 else if (bvSerial.strData == "YL")
 {
   digitalWrite(pinY, LOW);
   lightLevel = 0;
 }
 else if (bvSerial.strData == "GH")
 {
   digitalWrite(pinG, HIGH);
   lightLevel = 255;
 }
 else if (bvSerial.strData == "GL")
 {
   digitalWrite(pinG, LOW);
   lightLevel = 0;
 }
 else if (bvSerial.strData == "ALLON")
 {
   digitalWrite(pinR, HIGH);
   digitalWrite(pinY, HIGH);
   digitalWrite(pinG, HIGH);
   lightLevel = 255;
 }
 else if (bvSerial.strData == "ALLOFF")
 {
   digitalWrite(pinR, LOW);
   digitalWrite(pinY, LOW);
   digitalWrite(pinG, LOW);
   lightLevel = 0;
 }
 else if (bvSerial.strData == "brighter")
 {
   if (lightLevel < 255)
   {
     lightLevel += 85;
     analogWrite(pinR, lightLevel);
     analogWrite(pinY, lightLevel);
     analogWrite(pinG, lightLevel);
   }
 }
 else if (bvSerial.strData == "darker")
 {
   if (lightLevel > 0)
   {
     lightLevel -= 85;
     analogWrite(pinR, lightLevel);
     analogWrite(pinY, lightLevel);
     analogWrite(pinG, lightLevel);
   }
 }
 else
 {
   bvSerial.startStopListening();
   bvSerial.sendToBV("ERROR:" + bvSerial.strData);
   bvSerial.startStopListening();
 }
}


The BitVoicer Voice Schema I used can be downloaded from: http://www.justbuss.xpg.com.br/BitVoicerTest2.zip (you need to have BitVoicer installed to be able open it).

Now I want to control a few things (lights and ceiling fan) at home. Suggestions on how to connect them to the Arduino are very welcome.

msb4180

I added wireless communication to this project so that the Arduino does not have to be physically connected to the computer. Here is the link to the new project: http://arduino.cc/forum/index.php/topic,140765.0.html

the Brain

what if i didnt want to use an electret microphone. Would this code work with my computers built in microphone?

msb4180

brainaly, most of the code will work. You just have to disable some parts of the loop() structure.

the Brain


Maty

Great job
I'm looking something like this to control cervos, but I need to do it without a computer, there's possible to control them with a code into arduino? or maybe with a phone?
Any ideas are welcome!
Thanks! :)

ajayo2

Can i do the same with Arduino Duemilanove? i mean there is a difference in baud rate you used here.
Will that be okay if i use 9600 as baud rate?

msb4180

ajayo2, BitVoicer requires at least 8000 samples per second to work properly. Considering each sample as an 8-bit sample, you need to stream 64000 bits/sec to BitVoicer. This will require a baud rate greater than 9600 bps.

I think the duemilanove board is able to achieve the baud rate I used.

Go Up