Friday, May 22, 2026

Part 7: “Hey Robot, Move!” — Teaching Our Robot to Listen

By this point, the picture is getting clearer. We’re not just “vaguely understanding” how robots work anymore — we actually understand it:

πŸ‘‰ Robots need senses. Based on what they see, hear, and feel through their sensors, the Python brain decides how to respond.

We’ve been steadily making our robot smarter:

  • First, we controlled it with a keyboard
  • Then we cut the cord and gave it wireless freedom
  • Then we gave it eyes — object detection, distance awareness, obstacle avoidance

Among all a robot’s senses, we’ve spent most of our time on vision. The robot can now recognize people, furniture, vehicles, and pets. It can estimate distance. It can decide when to stop.

Time to work on the ears.

Fair warning: this part cost us nearly 5 hours of debugging. We’re sharing every painful step so you don’t have to repeat it.


How Voice Control Works

The core principle is simple: convert sound waves into text, then map that text to code commands.

Step 1 — Audio capture: The laptop microphone picks up sound (analog signal) and converts it to digital data.

Step 2 — Audio processing: The SpeechRecognition library filters out background noise and identifies the boundaries of each spoken phrase.

Step 3 — Speech-to-Text (STT): The audio is sent to a recognition engine — either a cloud API (Google Speech, Wit.ai, IBM) or a local AI model (Whisper, Vosk). The engine matches the audio to words and returns a text string.

Step 4 — Execute the command: The Python code checks the text with if/else statements. If it matches a keyword, the corresponding action runs.

Two libraries make this happen:

  • SpeechRecognition — handles the speech-to-text pipeline
  • PyAudio — gives Python direct access to the laptop’s microphone hardware

The Code

Create a new Python file called VoiceCommand.py and paste this in:

import speech_recognition as sr

def listen_for_commands():
    recognizer = sr.Recognizer()
    
    with sr.Microphone() as source:
        print("Adjusting for ambient noise... please wait.")
        recognizer.adjust_for_ambient_noise(source, duration=1)
        print("Robot is listening for commands (e.g., 'forward', 'stop')...")
        
        while True:
            try:
                audio = recognizer.listen(source)
                command = recognizer.recognize_google(audio).lower()
                print(f"You said: {command}")

                if "forward" in command:
                    print("Action: Moving Robot Forward")
                    # Placeholder: replace with motor forward command later
                elif "backward" in command:
                    print("Action: Moving Robot Backward")
                    # Placeholder: replace with motor backward command later
                elif "stop" in command:
                    print("Action: Stopping Robot")
                    # Placeholder: replace with motor stop command later
                elif "left" in command:
                    print("Action: Turning Left")
                    # Placeholder: replace with motor turn-left command later
                elif "right" in command:
                    print("Action: Turning Right")
                    # Placeholder: replace with motor turn-right command later
                elif "exit" in command:
                    print("Shutting down. Goodbye.")
                    break
                    
            except sr.UnknownValueError:
                print("Could not understand audio")
            except sr.RequestError:
                print("Could not request results; check your internet connection")

if __name__ == "__main__":
    listen_for_commands()

If everything works, hitting Run will show:

Robot is listening for commands (e.g., 'forward', 'stop')...

Say “forward” — you’ll see: Action: Moving Robot Forward
Say “stop” — you’ll see: Action: Stopping Robot

Starting to feel like Siri or Alexa? That’s because the underlying principle is exactly the same.

And when we’re ready to connect real motors, we replace those print() placeholder lines with actual motor control commands. The entire voice recognition logic stays untouched. Zero rewriting.


The Installation Nightmare (And How to Survive It)

Here’s where the 5-hour adventure begins.

Attempt 1: The Normal Way

pip install SpeechRecognition pyaudio

SpeechRecognition installs perfectly. PyAudio explodes:

Failed building wheel for pyaudio

PyAudio needs a C++ compiler to build from source. Most Windows machines don’t have one.


Attempt 2: pipwin

pip install pipwin
pipwin install pyaudio

pipwin is supposed to find a pre-built .whl file for Windows automatically. Instead:

RuntimeError: your python version made changes to the bytecode

pipwin relies on some internal Python components that were removed in Python 3.12 and later. Since PyCharm auto-installs the latest Python (currently 3.14), pipwin simply doesn’t work anymore.


Attempt 3: Manual .whl Install

The logic: find the exact pre-built .whl file for our Python version and Windows architecture, download it, install it manually.

First, check your Python version:

python --version

And your Windows architecture: 64-bit (almost certainly) or 32-bit.

For Python 3.14, 64-bit Windows, the file name would be:

PyAudio-0.2.14-cp314-cp314-win_amd64.whl

Download it, then run:

pip install C:\path\to\PyAudio-0.2.14-cp314-cp314-win_amd64.whl

Promising. But:

could not import pyaudio C module '_portaudio'

The .whl installs but the underlying C library it depends on (portaudio) isn’t present on the system. Still broken.


The Actual Solution: Downgrade Python to 3.11

PyAudio has reliable pre-built support for Python 3.11. Everything above that version is a compatibility minefield.

Here’s the cleanest way to fix it — yes, it involves reinstalling things, but it’s a one-time fix:

Step 1: Uninstall PyCharm completely.

Step 2: Uninstall Python 3.14 completely. (Don’t just install 3.11 alongside it — PATH conflicts will make your life miserable.)

Step 3: Download and install Python 3.11 from python.org. During installation, check “Add Python to PATH”.

Step 4: Reinstall PyCharm. It will detect Python 3.11 automatically.

Step 5: Open PyCharm Terminal and run:

pip install SpeechRecognition pyaudio

Both install cleanly. No errors. No compiler needed. No .whl hunting.

Step 6: Run VoiceCommand.py. Say “forward.” Watch it work.

Smooth as silk.


Why This Matters

The voice control system we just built follows the exact same perception → decision → action loop as everything else in this blog:

LayerComponent
SensorLaptop microphone
PerceptionSpeechRecognition + Google STT
Decisionif/else keyword matching
Actionprint() for now — motor commands later

One more sense added to our robot’s toolkit. Next, we give it a sharper pair of eyes — face detection, no AI model required.


Next up: Part 8 — The robot learns to recognize faces. Simpler than you’d expect.