Go Down

Topic: Speech Recognition with BitVoicer and Arduino (Read 27 times) previous topic - next topic

msb4180

The main goal of this project was to test the speech recognition performance of BitVoicer (http://www.bitsophia.com/BitVoicer.aspx). For this purpose, I designed a simple led control sketch which I integrated with BitVoicer. Of course you can do anything you want once you have received the commands from Bitvoicer, but to keep things simple, I thought a led test would do just fine.

This is the YouTube video with the result:

http://www.youtube.com/watch?v=gs-3fJCa5P0

This is the code I created to control the leds and retrieve data from BitVoicer:

Code: [Select]

//Includes the BitVoicer library to the sketch
#include <BitVoicer.h>

//Sets up the pins and default variables
int pinR = 3;
int pinY = 5;
int pinG = 6;
int blinkDelay = 250;
int sequenceDir = 0;
int lightLevel = 0;

//Creates a new instance of the BitVoicerSerial class and
//sets up serial port to 0
BitVoicerSerial bitVoicer = BitVoicerSerial(0);

void setup()
{
    //Starts serial communication and sets up the pinModes
    Serial.begin(9600);
    pinMode(pinR, OUTPUT);
    pinMode(pinY, OUTPUT);
    pinMode(pinG, OUTPUT);
}

void loop()
{
    //Retrieves data from serial buffer
    bitVoicer.getData();

    //Quits the loop if no string data was returned from getData
    if (bitVoicer.strData == "")
    {
        return;
    }

    //Each of the next 'if' statements performs a different
    //task based on the data received from BitVoicer
    if (bitVoicer.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);
        bitVoicer.strData = "";
        lightLevel = 0;
    }
    else if (bitVoicer.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);
        bitVoicer.strData = "";
        lightLevel = 0;
    }
    else if (bitVoicer.strData == "RH")
    {
        digitalWrite(pinR, HIGH);
        bitVoicer.strData = "";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "RL")
    {
        digitalWrite(pinR, LOW);
        bitVoicer.strData = "";
        lightLevel = 0;
    }
    else if (bitVoicer.strData == "YH")
    {
        digitalWrite(pinY, HIGH);
        bitVoicer.strData = "";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "YL")
    {
        digitalWrite(pinY, LOW);
        bitVoicer.strData = "";
        lightLevel = 0;
    }
    else if (bitVoicer.strData == "GH")
    {
        digitalWrite(pinG, HIGH);
        bitVoicer.strData = "";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "GL")
    {
        digitalWrite(pinG, LOW);
        bitVoicer.strData = "";
        lightLevel = 0;
    }
    else if (bitVoicer.strData == "blink")
    {
        digitalWrite(pinR, HIGH);
        digitalWrite(pinY, HIGH);
        digitalWrite(pinG, HIGH);
        delay(blinkDelay);
        digitalWrite(pinR, LOW);
        digitalWrite(pinY, LOW);
        digitalWrite(pinG, LOW);
        delay(blinkDelay);
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "BF")
    {
        blinkDelay = 100;
        bitVoicer.strData = "blink";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "BFF")
    {
        switch (blinkDelay)
        {
            case 500:
                blinkDelay = 250;
                break;
            case 250:
                blinkDelay = 100;
                break;
            default:
                break;
        }
        bitVoicer.strData = "blink";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "BS")
    {
        blinkDelay = 500;
        bitVoicer.strData = "blink";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "BSS")
    {
        switch (blinkDelay)
        {
            case 100:
                blinkDelay = 250;
                break;
            case 250:
                blinkDelay = 500;
                break;
            default:
                break;
        }
        bitVoicer.strData = "blink";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "sequence")
    {
        if (sequenceDir == 0)
        {
            digitalWrite(pinR, HIGH);
            delay(250);
            digitalWrite(pinR, LOW);
            digitalWrite(pinY, HIGH);
            delay(250);
            digitalWrite(pinY, LOW);
            digitalWrite(pinG, HIGH);
            delay(250);
            digitalWrite(pinG, LOW);
        }
        else
        {
            digitalWrite(pinG, HIGH);
            delay(250);
            digitalWrite(pinG, LOW);
            digitalWrite(pinY, HIGH);
            delay(250);
            digitalWrite(pinY, LOW);
            digitalWrite(pinR, HIGH);
            delay(250);
            digitalWrite(pinR, LOW);
        }
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "revert")
    {
        if (sequenceDir == 0)
        {
            sequenceDir = 1;
        }
        else
        {
            sequenceDir = 0;
        }
        bitVoicer.strData = "sequence";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "ALLON")
    {
        digitalWrite(pinR, HIGH);
        digitalWrite(pinY, HIGH);
        digitalWrite(pinG, HIGH);
        bitVoicer.strData = "";
        lightLevel = 255;
    }
    else if (bitVoicer.strData == "ALLOFF")
    {
        digitalWrite(pinR, LOW);
        digitalWrite(pinY, LOW);
        digitalWrite(pinG, LOW);
        bitVoicer.strData = "";
        lightLevel = 0;
    }
    else if (bitVoicer.strData == "brighter")
    {
        if (lightLevel < 255)
        {
            lightLevel += 85;
            analogWrite(pinR, lightLevel);
            analogWrite(pinY, lightLevel);
            analogWrite(pinG, lightLevel);
        }
        bitVoicer.strData = "";
    }
    else if (bitVoicer.strData == "darker")
    {
        if (lightLevel > 0)
        {
            lightLevel -= 85;
            analogWrite(pinR, lightLevel);
            analogWrite(pinY, lightLevel);
            analogWrite(pinG, lightLevel);
        }
        bitVoicer.strData = "";
    }
    else
    {
        Serial.println("ERROR:" + bitVoicer.strData);
        bitVoicer.strData = "";
    }
}


It uses the BitVoicer Arduino library that can be downloaded from BitSophia's website (http://www.bitsophia.com).

This is the basic layout of this project. I also added a couple of pictures of the connected wires bellow the layout.







The Voice Schema used in this project can be downloaded from http://www.justbuss.xpg.com.br/BitVoicerTest.zip (you need to have BitVoicer installed in order to open it).

codlink

How is the Arduino wired to hear your voice?  I do not see a MIC in your Arduino schematics.  I am assuming that the Arduino has to be hooked to a computer to get the info from BitVoicer.
//LiNK

michael shiloh

I have sent your question to the company behind BitVoicer, but from the description on the web and the contents of their Arduino library it appears to be as you say:

BitVoicer is a Windows executable which can recognize speech and send  results to a serial port. In this since there is nothing very Arduino specific about it; however, the website provides an Arduino library, very prominently included in the main download section, and someone (perhaps the same person) has also written this nice tutorial.

Good documentation and a well written tutorial are certainly to be appreciated. This might be useful to newcomers to Arduino who need to get voice recognition integrated into an Arduino project with very little time to spend, and have access to a Windows PC.

Mind you, I have not tested this software (nor can I, I'm exclusively Linux), so I'm just responding to what I see in this thread and on the BitVoicer website.

codlink

Yea I didn't thoroughly read the website.  I am in need of a voice recognition system that is Arduino compatible.  I currently designing around the EasyVR.  The only downfall is that it's Speaker dependent.  If I program my voice then it only responds to my voice..  I want it to recognize anyone. 

I am trying to keep this project independent from a PC, but it may will not be able since there will be face recognition also.  So it may not matter that it's PC dependent.

PS: I am designing a humanoid robot.  So far there are 3 Arduinos (actually custom PCB with Atmel MCUs) connected through Serial for the control.
//LiNK

msb4180

I just looked at BitSophia's website and they released a new version of BitVoicer. Now it can recognize speech captured by a microphone hooked to the Arduino. I'm going to try this new version and order a wireless module (https://www.sparkfun.com/products/10822) from Sparkfun.

I want to voice control some things at home. Any suggestions on how to connect them to Arduino?

Go Up