Saltar al contenido principal

Canal de voz ROS2 en reSpeaker

Introducción

pir

Este proyecto convierte tu voz en control de TurtleSim usando una matriz de micrófonos reSpeaker y ROS2. Di “Hey Jarvis” seguido de un comando, y Jarvis graba el audio, lo transcribe con Groq Whisper, interpreta la intención con Groq LLaMA y responde con Groq Orpheus TTS. Es compatible con movimiento hacia adelante/atrás, giros angulares, orientación basada en DoA y comandos de parada instantánea. El sistema integra detección de palabra de activación, captura de audio, tópicos de ROS2 y publicación de comandos al simulador en una única canalización fluida. Está diseñado para una configuración rápida con Ubuntu y ROS2 Humble, lo que facilita la ejecución de experimentos de robots controlados por voz.

reSpeaker Flex XVF3800 CircularreSpeaker XVF3800

O

Parte 1 — Instalar ROS2 Humble

Omite esta parte si ROS2 Humble ya está instalado en tu máquina. Comprueba ejecutando: ros2 --version

1.1 Configurar el repositorio apt de ROS2

# Make sure your system is up to date
sudo apt update && sudo apt upgrade -y

# Install required tools
sudo apt install -y software-properties-common curl

# Add the ROS2 GPG key
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
-o /usr/share/keyrings/ros-archive-keyring.gpg

# Add the ROS2 repository to your sources
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" \
| sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

1.2 Instalar ROS2 Humble Desktop

sudo apt update
sudo apt install -y ros-humble-desktop

La variante desktop incluye TurtleSim, RViz y todas las herramientas que necesitas. Esta descarga es de alrededor de 1 GB — puede tardar unos minutos.

1.3 Instalar herramientas de compilación

sudo apt install -y python3-colcon-common-extensions python3-rosdep

1.4 Cargar ROS2 automáticamente en cada terminal

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

1.5 Verificar la instalación

ros2 --version
# Expected output: ros2 cli version 0.18.x (or similar)

Luego prueba TurtleSim para confirmar que todo funciona:

# Terminal 1
ros2 run turtlesim turtlesim_node

# Terminal 2
ros2 run turtlesim turtle_teleop_key

Deberías ver una ventana con una tortuga que puedes manejar con las teclas de flecha. Pulsa Ctrl+C en ambos terminales cuando termines.

Parte 2 — Crear una regla udev para el dispositivo

Crea una nueva regla udev para asegurar los permisos adecuados para la reSpeaker USB Mic Array:

sudo nano /etc/udev/rules.d/50-respeaker.rules

Añade las siguientes líneas al archivo:

# ReSpeaker USB Mic Array
SUBSYSTEM=="usb", ATTR{idVendor}=="2886", ATTR{idProduct}=="0018", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="2886", ATTR{idProduct}=="001a", MODE="0666", GROUP="plugdev"

Recargar las reglas de udev y reiniciar el servicio

Recarga las reglas de udev y reinicia el servicio para que los cambios surtan efecto:

sudo udevadm control --reload-rules
sudo udevadm trigger
sudo service udev restart

Desconecta y vuelve a conectar tu reSpeaker USB Mic Array para aplicar las nuevas reglas.


Parte 3 — Obtener una clave de API de Groq

Este proyecto utiliza la API en la nube gratuita de Groq para:

  • Whisper — conversión de voz a texto
  • LLaMA 3 — comprensión de tus comandos
  • Orpheus — respuesta de voz de Jarvis
  1. Ve a console.groq.com y crea una cuenta gratuita
  2. Haz clic en API Keys en la barra lateral izquierda
  3. Haz clic en Create API Key, ponle un nombre (por ejemplo, "jarvis") y cópiala
  4. Guárdala en un lugar seguro — la pegarás en config.env en breve

El nivel gratuito de Groq es lo suficientemente generoso para desarrollo y pruebas. No se requiere tarjeta de crédito para comenzar.


Parte 4 — Instalar dependencias de Python (a nivel del sistema)

Importante: NO uses un entorno virtual para este proyecto. ROS2 utiliza el Python del sistema y no puede ver los paquetes instalados dentro de un venv. Instalamos todo con --break-system-packages para ponerlos a disposición de los nodos de ROS2.

pip install \
groq \
openwakeword \
pyaudio \
numpy<2 \
python-dotenv \
pyusb \

Descargar el modelo de palabra de activación "Hey Jarvis"

python3 -c "import openwakeword; openwakeword.utils.download_models()"

Esto descarga modelos preentrenados en ~/.openwakeword/. Tarda unos 30 segundos.

Instalar PortAudio (requerido por PyAudio)

sudo apt install -y portaudio19-dev python3-pyaudio

Parte 5 — Crear tu espacio de trabajo de ROS2

Sáltate a la Parte 6 si ya tienes un espacio de trabajo ~/ros2_ws.

# Create the workspace directory
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws

# Build the empty workspace to set it up
colcon build

# Source it and add to .bashrc so it loads automatically
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

Parte 6 — Clonar y configurar el proyecto

6.1 Clonar el repositorio

Si estás usando Flex

cd ~/ros2_ws/src
git clone https://github.com/KasunThushara/ros_voice_controller_flex.git my_robot_controller

Si estás usando XVF3800

cd ~/ros2_ws/src
git clone https://github.com/KasunThushara/ros_voice_controller.git my_robot_controller

Tu espacio de trabajo ahora debería verse así:

~/ros2_ws/
└── src/
└── my_robot_controller/
├── my_robot_controller/
│ ├── voice_node.py
│ ├── rotate_doa.py
│ ├── wakeword.py
│ └── ...
├── launch/
│ └── jarvis.launch.py
└── config.env.example

6.2 Crear tu archivo de configuración

cd ~/ros2_ws/src/my_robot_controller
cp config.env.example config.env
nano config.env

Abre el archivo y rellena tus valores:

# ── Groq API (required) ────────────────────────────────
GROQ_API_KEY=gsk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ← paste your key here

# ── Microphone ─────────────────────────────────────────
MIC_INDEX=1 ← find the correct number in Step 6.3 below
WAKEWORD_THRESHOLD=0.5
WAKEWORD_COOLDOWN=2

# ── Recording ──────────────────────────────────────────
RECORDING_SECONDS=4
SAMPLE_RATE=16000

# ── Models ─────────────────────────────────────────────
WAKEWORD_MODEL=hey jarvis
LLM_MODEL=llama-3.1-8b-instant
STT_MODEL=whisper-large-v3-turbo
TTS_MODEL=canopylabs/orpheus-v1-english
TTS_VOICE=autumn

Guarda con Ctrl+O, Enter, Ctrl+X.

6.3 Encontrar tu MIC_INDEX correcto

Ejecuta este asistente para listar todos los dispositivos de entrada de audio:

python3 -c "
import pyaudio
p = pyaudio.PyAudio()
print('\nAvailable INPUT devices:\n')
for i in range(p.get_device_count()):
d = p.get_device_info_by_index(i)
if d['maxInputChannels'] > 0:
print(f' [{i}] {d[\"name\"]}')
print(f' channels={int(d[\"maxInputChannels\"])} rate={int(d[\"defaultSampleRate\"])}Hz')
p.terminate()
"

Salida de ejemplo:

Available INPUT devices:

[0] HDA Intel PCH: ALC897 Analog
channels=2 rate=44100Hz

[1] reSpeaker Flex XVF3800
channels=6 rate=16000Hz ← this is the one you want

[2] USB PnP Sound Device
channels=2 rate=16000Hz

Encuentra la línea que dice reSpeaker Flex o reSpeaker Flex XVF3800. Anota el número entre corchetes — ese es tu MIC_INDEX. Actualiza config.env con ese número.


Parte 7 — Compilar el paquete

cd ~/ros2_ws
colcon build --packages-select my_robot_controller
source ~/.bashrc

Salida esperada:

Starting >>> my_robot_controller
Finished <<< my_robot_controller [3.2s]

Summary: 1 package finished [3.5s]

Debes ejecutar colcon build y source ~/.bashrc cada vez que cambies cualquier archivo de Python.


Parte 8 — Ejecutar el proyecto

ros2 launch my_robot_controller jarvis.launch.py

Deberías ver que se inician tres procesos:

[turtlesim_node-1]   [INFO] Spawning turtle [turtle1] at x=[5.54], y=[5.54]
[angle_controller-2] [INFO] AngleController ready — listening on /target_angle
[voice_command-3] [INFO] reSpeaker Flex XVF3800 found — DoA ready
[voice_command-3] [WakeWord] Listening on device 1 (6ch → mono) for 'hey jarvis' ...
[voice_command-3] [INFO] Jarvis is listening ...

Se abrirá una ventana que muestra la tortuga. Ahora habla:

"Hey Jarvis, move forward"

Jarvis responderá "Moving forward!" y la tortuga se moverá.


pir

Referencia de comandos de voz

Di estoQué sucede
"Hey Jarvis, move forward"La tortuga se mueve 1 paso hacia adelante
"Hey Jarvis, move backward"La tortuga se mueve 1 paso hacia atrás
"Hey Jarvis, turn left"La tortuga gira 90° a la izquierda
"Hey Jarvis, turn left 45"La tortuga gira 45° a la izquierda
"Hey Jarvis, turn right"La tortuga gira 90° a la derecha
"Hey Jarvis, turn right 30 degrees"La tortuga gira 30° a la derecha
"Hey Jarvis, turn to my direction"La tortuga se orienta hacia tu voz (DoA)
"Hey Jarvis, face me"Igual que arriba
"Hey Jarvis, turn to 90"La tortuga gira al ángulo absoluto de 90°
"Hey Jarvis, face 180 degrees"La tortuga gira al ángulo absoluto de 180°
"Hey Jarvis, spin around"La tortuga hace un giro completo de 360°
"Hey Jarvis, do a 360"Igual que arriba
"Hey Jarvis, stop"La tortuga se detiene inmediatamente

Estructura de archivos del proyecto

my_robot_controller/

├── my_robot_controller/ # Python package (ROS2 nodes)
│ ├── __init__.py
│ ├── voice_node.py # Main voice pipeline node
│ ├── rotate_doa.py # PID angle controller node
│ ├── wakeword.py # Wake word detection (openwakeword)
│ ├── audio_recorder.py # Mic recording after wake word
│ ├── stt.py # Speech-to-text (Groq Whisper)
│ ├── llm.py # Intent parsing (Groq LLaMA)
│ ├── tts.py # Text-to-speech (Groq Orpheus)
│ └── config.py # Loads settings from config.env

├── launch/
│ └── jarvis.launch.py # Starts all 3 nodes together

├── config.env # Your secrets (not in git)
├── config.env.example # Template — copy to config.env
├── package.xml
└── setup.py

Cómo se conectan los nodos

reSpeaker Flex (USB)

├── [voice_command node]
│ openwakeword → Groq Whisper → Groq LLaMA → Groq Orpheus
│ │ │
│ │ publishes /target_angle (Float32) │ speaks reply
│ │ publishes /turtle1/cmd_vel (Twist) │
│ │ ▼
│ ▼ Speaker output
└── [angle_controller node]
subscribes /target_angle
subscribes /turtle1/pose
PID control → publishes /turtle1/cmd_vel


[turtlesim_node]

Referencia de configuración

Todos los ajustes se encuentran en config.env. Edítalo y recompila para aplicar los cambios.

VariablePredeterminadoDescripción
GROQ_API_KEY(required)Tu clave de API de Groq
MIC_INDEX1Índice de dispositivo PyAudio del reSpeaker
WAKEWORD_MODELhey jarvisFrase de palabra de activación
WAKEWORD_THRESHOLD0.5Sensibilidad de detección (0.0–1.0, menor = más sensible)
WAKEWORD_COOLDOWN2Segundos antes de que la palabra de activación pueda volver a dispararse
RECORDING_SECONDS4Tiempo de grabación después de que se active la palabra de activación
SAMPLE_RATE16000Frecuencia de muestreo de audio en Hz
LLM_MODELllama-3.1-8b-instantModelo Groq LLM para el análisis de intención
STT_MODELwhisper-large-v3-turboModelo Groq Whisper para transcripción
TTS_MODELcanopylabs/orpheus-v1-englishModelo Groq TTS
TTS_VOICEautumnVoz para la salida de voz (tara, leah, leo, dan, mia)

Recursos

Creado con:

Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.

Loading Comments...