Voice controller for a quadraplegic

The “production” version in place for testing
IMG_0001

A Uno running IRrecord to get the IR codes from remotes and test what my unit emits in case of problems.
IMG_0007

The lab :-).
IMG_0008

Development version on the lab bench.
IMG_0011

Another mic that doesn’t work any better than any of the rest :-/.
.IMG_0005

Works fairly well all in all. Now let’s see if the pix come through!

Not shown are the set top box and monitor which I use for testing.

Just in case anyone is interested, here are the commands involved:
(no we can’t remember all of them either, cheat sheet involved :slight_smile: :slight_smile: :-))

//
// MOVI Commands
//
recognizer.addSentence(“Exit”); // Add sentence 1
recognizer.addSentence(“Mute TV”); // Add sentence 2
recognizer.addSentence(“Unmute TV”); // Add sentence 3
recognizer.addSentence(“Show Guide”); // Add sentence 4
recognizer.addSentence(“Left”); // Add sentence 5
recognizer.addSentence(“Right”); // Add sentence 6
recognizer.addSentence(“Up”); // Add sentence 7
recognizer.addSentence(“Down”); // Add sentence 8
recognizer.addSentence(“TV List”); // Add sentence 9
recognizer.addSentence(“Toggle DVR”); // Add sentence 10
recognizer.addSentence(“Vikki”); // Add sentence 11

recognizer.addSentence(“OK”); // Add sentence 12
recognizer.addSentence(“Enter”); // Add sentence 13

recognizer.addSentence(“Recall”); // Add sentence 14

recognizer.addSentence(“4.1”); // (ABC -4.1) Add sentence 15
recognizer.addSentence(“Comet”); // (4.2) Add sentence 16
recognizer.addSentence(“Charge”); // (4.3) Add sentence 17

recognizer.addSentence(“channel 5.1”); // (NBC -5.1) Add sentence 18
recognizer.addSentence(“Justnet”); // (5.2) Add sentence 19

recognizer.addSentence(“channel 7”); // (CBS -7.1) Add sentence 20
recognizer.addSentence(“Gettv”); // (7.2) Add sentence 21
recognizer.addSentence(“Laugh”); // (7.3) Add sentence 22

recognizer.addSentence(“Channel 9”); // (9.1) Add sentence 23
recognizer.addSentence(“Seattle Kids”); // (9.2) Add sentence 24
recognizer.addSentence(“Seattle Create”); // (9.3) Add sentence 25

recognizer.addSentence(“channel 11”); // (11.1) Add sentence 26
recognizer.addSentence(“Decades”); // (11.2) Add sentence 27
recognizer.addSentence(“Grit”); // (11.3) Add sentence 28

recognizer.addSentence(“Tacoma”); // (28.1) Add sentence 29
recognizer.addSentence(“Tacoma 2”); // (28.2) Add sentence 30
recognizer.addSentence(“Tacoma 3”); // (28.3) Add sentence 31

recognizer.addSentence(“METV”); // (44.1) Add sentence 32

recognizer.addSentence(“Channel up”); // Same as up Add sentence 33
recognizer.addSentence(“Channel down”); // Same as down Add sentence 34
recognizer.addSentence(“Volume up”); // Same as right Add sentence 35
recognizer.addSentence(“Volume down”); // Same as left Add sentence 36

recognizer.addSentence(“Turn TV on”); // Same as Toggle DVR Add sentence 37
recognizer.addSentence(“Turn TV off”); // Same as Toggle DVR Add sentence 38

recognizer.addSentence(“Turn airconditioner on”); // Toggle AC Add sentence 39
recognizer.addSentence(“Turn airconditioner off”); // Toggle AC Add sentence 40

recognizer.addSentence(“Never mind”); // Nevermind :slight_smile: Add sentence 41

recognizer.addSentence(“Ion”); // (13.1) Add sentence 42
recognizer.addSentence(“This”); // (13.2) Add sentence 43
recognizer.addSentence(“Escape”); // (13.3) Add sentence 44

recognizer.addSentence(“Available Channels”); // Tell Jean what channel names are for available channels. Add sentence 45

recognizer.addSentence(“Movies”); // (44.2) Add sentence 46

recognizer.addSentence(“Volume up two”); // Same as right Add sentence 47
recognizer.addSentence(“Volume down two”); // Same as left Add sentence 48
recognizer.addSentence(“Turn Visio on”); // Turn vizio on Add sentence 49
recognizer.addSentence(“Turn tuner on”); // Turn STB on Add sentence 50

recognizer.addSentence(“Available Commands”); // Tell Jean what commands are for available. Add sentence 51

recognizer.addSentence(“Heros”); // (44.3) Add sentence 52

recognizer.addSentence(“QuestTV”); // (5.3) Add sentence 53

recognizer.addSentence(“Thank you”); // Thank you Add sentence 54

recognizer.addSentence(“Good Night”); // Good night Add sentence 55

recognizer.addSentence(“Hello”); // Hello Add sentence 56

recognizer.addSentence(“What is today”); // Date Add sentence 57

recognizer.addSentence(“What time is it”); // Time Add sentence 58

recognizer.addSentence(“Start Guide Scan”); // Time Add sentence 59

recognizer.addSentence(“Stop scan”); // Time Add sentence 60

recognizer.addSentence(“Start Channel Scan”); // Time Add sentence 61

// recognizer.addSentence(“Stop Channel scan”); // Time Add sentence 62

//===========================================================
recognizer.train(); // Train (may take 20seconds)
//===========================================================

recognizer.say("Version " VERSION); // Speak a sentence

//************************* and so on :slight_smile: **********************************

For about 1300 lines or so :-).

1 Like

I’ve added the ability to control a linear servo if you are interested.

Interested :-)! Thanks!

Currently fighting microphone blues.

Putzed some with the lowlevel MICDEBUG stuff tonight and I guess I need to play with some of the different mics to see what they do.

I seem to start loosing the ability for MOVI to recognize the callsign once I get much above THRESHOLD 3.

Interestingly, that shotgun mic does actually work, I guess I had THRESHOLD set too high for it.

My brain hurts, calling it a night , frustrating :-).

I settled on threshold of 3 for my project as well, seemed best in my noise polluted environment. Engine and wind noise frustrate MOVI terribly - it was so bad in my case that I had to build a voice bandwidth filter.

I found using an external mic that a low threshold setting like 5, if there was any noise in the room, MOVI had a hard time recognizing sentences or a word. Changing the threshold to 14-16 worked well for most environments. Had to get into the 20’s for very noisy environments. Background noises were people speaking in a room, slight fan noise but not outdoor noise (wind, etc.) Setting threshold to a low value gave me the most problems for the recognizer.

I probably need something like that too. She generally has a TV running at a reasonable volume which doesn’t help. Got a link to what you use? Would be appreciated, thanks!

With threshold set much above 3 nothing gets through :-/.

Playing some with the MICDEBUG results seemed kind of odd. Sometimes it would get the callsign (but not necessarily respond to it) , other times (more often) it would get the start of the word and others it just wouldn’t get anything for an extended period, the repeat process. Same mics or different mic and same physical setup… Everything seems to work equally poorly :-).

I’m starting to wonder if the code is just too big and runs too slow for MOVI to work with some time. I ran into problems with running out of memory in the MEGA 2560 and went to the Due figuring that would solve the memory problem (seems to have) and the extra speed would help (not sure…).

Stating to look like no matter which mic I use I get pretty much the same results.

Kind of lost and the end user for this has reached the point where she isn’t real enthralled with trying to use it for the repeats to wake it up (once awakened, it seems to do fairly well) since speech is difficult for her.

I’m starting to consider seeing if there is some way to accomplish this with Alexa, it always wakes up even if it doesn’t always get the gist of what we want :)_ Yeah, a bit frustrated :-).

Going to blow another ~$60 on a couple ?serious ( well reviewed anyway)? shotgun mics which being positioned no more than 18-20 inches should work (clamped to bed rail, pointed at her face , clamping the lapel mics to her bedclothes or pillow is contraindicated because of the wire issues and doesn’t seem to help anyway).

Plodding on, discouraged, but not giving up yet :-). I might go ahead and strip down the size / capabilities of the software that is running it to see if that helps. Currently compiles down 77176 bytes, 70 sentences defined, 5 libraries and for date/time/temp / channel / guide scans some rather involved functions :-). Sure been fun :-).

Onward!

Just wondering what you are using for the filter. I’ve got a DJ equalizer sort of thing, but it is too massive to get where it would need to be. Not to mention lots of fun with adapters :slight_smile:
Thanks!