Saltar al contenido principal

Añade interacción por voz a tu SO-ARM10x con reSpeaker

Descripción general​

pir

El controlador de voz LeRobot SO-ARM te permite controlar un brazo robótico SO-ARM100 usando comandos de voz naturales impulsados por IA. El sistema combina detección de palabra de activación, conversión de voz a texto Groq Whisper, comprensión del lenguaje con LLaMA 3 y conversión de texto a voz Orpheus para crear una experiencia robótica totalmente interactiva y manos libres. Construido sobre el framework LeRobot, se ejecuta en sistemas Ubuntu x86 y dispositivos NVIDIA Jetson usando una matriz de micrófonos USB ReSpeaker para la entrada de voz. Los usuarios pueden crear poses personalizadas del brazo, gestos y disparadores conversacionales para construir interacciones robóticas inteligentes para investigación, educación y desarrollo en robótica.

Hardware necesario​

SO-ARM101reComputer Super J4012
reSpeaker Flex XVF3800 CircularreSpeaker XVF3800

O

Cómo funciona​

You speak → Wake word detected → Audio recorded → Whisper STT → LLaMA LLM → Orpheus TTS speaks back → SO-ARM100 moves

Servicios necesarios​

ServicioPropósitoCosto
GroqWhisper STT, LLaMA LLM, Orpheus TTSEl nivel gratuito es suficiente

Parte 1 — Instalar LeRobot​

Instalar Miniforge​

Para Jetson (ARM64):

wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
chmod +x Miniforge3-Linux-aarch64.sh
./Miniforge3-Linux-aarch64.sh
source ~/.bashrc

Para x86 Ubuntu 22.04:

wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
source ~/.bashrc
conda init --all

Crear el entorno Conda​

conda create -y -n lerobot python=3.12
conda activate lerobot

Clonar e instalar LeRobot​

git clone https://github.com/KasunThushara/lerobot
conda install ffmpeg -c conda-forge
cd lerobot
pip install -e ".[feetech]"

Parte 2 — Configurar los brazos​

Configurar los ID de los motores​

Cada servo necesita un ID único asignado antes del montaje. Sigue la guía oficial: Configurar los motores

Ensamblar los brazos​

Sigue el tutorial de ensamblaje para el SO-ARM100: Guía de ensamblaje

Encontrar los puertos USB​

Conecta cada brazo y ejecuta esta utilidad para identificar qué puerto pertenece a cada brazo:

lerobot-find-port

Ejecuta esto una vez por brazo (conecta uno a la vez). Anota las rutas de los puertos; normalmente /dev/ttyACM0 y /dev/ttyACM1.

Calibrar ambos brazos​

La calibración asigna valores brutos del motor a posiciones normalizadas. Sigue la guía tanto para el brazo líder como para el seguidor: Guía de calibración

El archivo de calibración se guardará automáticamente en:

~/.cache/huggingface/lerobot/calibration/robots/so_follower/<your_arm_id>.json


Parte 3 — Configurar el controlador de voz​

cd ~/lerobot/examples/voice_arm

Instalar dependencias​

# System dependency required for PyAudio
sudo apt-get install -y portaudio19-dev

pip install -r requirements.txt

Descargar el modelo de palabra de activación​

Descarga el modelo preentrenado "Hey Jarvis" desde openwakeword en ~/.openwakeword/:

python download_model.py

Encontrar el índice de tu micrófono​

Conecta tu reSpeaker y luego ejecuta:

python list_mics.py

Salida de ejemplo:

Available audio INPUT devices:

[0] bcm2835 Headphones (rate=44100Hz)
[1] ReSpeaker 4 Mic Array (rate=16000Hz)
[2] USB PnP Sound Device (rate=16000Hz)

Anota el número de índice junto a tu ReSpeaker — ese es tu MIC_INDEX.

Configurar el proyecto​

cp config.env.example config.env
nano config.env

Como mínimo, actualiza estos dos valores:

# Your Groq API key (required) — get one free at console.groq.com
GROQ_API_KEY=gsk_xxxxxxxxxxxxxxxxxxxxxxxx

# The number from list_mics.py
MIC_INDEX=1

Parte 4 — Definir las acciones de tu brazo​

Paso 1 — Leer las posiciones actuales de las articulaciones​

Mueve físicamente el brazo a una pose que quieras guardar y luego ejecuta:

python read_positions.py

El script imprime valores normalizados de las articulaciones en vivo mientras mueves el brazo. Cuando estés satisfecho con la pose, pulsa Ctrl+C y la posición final se imprimirá para que la copies.

Paso 2 — Añadir la pose a robot_arm.py​

Abre robot_arm.py y busca el diccionario ACTION_MAP. Añade tu pose:

pir

"my_custom_pose": _pose(**{
"shoulder_pan.pos": 20.0,
"shoulder_lift.pos": 40.0,
"elbow_flex.pos": 60.0,
"wrist_flex.pos": -30.0,
"gripper.pos": 80.0,
}),

Para gestos animados (como un saludo), usa una lista de poses: cada paso se ejecuta con ARM_GESTURE_DELAY entre ellos:

"wave_hi": [
_pose(**{"shoulder_lift.pos": -70.0, "wrist_flex.pos": 60.0, ...}),
_pose(**{"shoulder_lift.pos": -70.0, "wrist_flex.pos": -60.0, ...}),
_HOME, # return to neutral
],

Paso 3 — Actualizar el prompt de sistema del LLM en llm.py​

Añade tu nueva acción a la lista de acciones válidas y a las reglas de activación para que el LLM la conozca:

pir

Valid actions:
my_custom_pose = describe what it does

Trigger rules:
- "your trigger phrase" → my_custom_pose

Ejecutar el controlador de voz​

Asegúrate de que tu entorno conda esté activo y luego:

conda activate lerobot
python pipeline.py

Deberías ver:

======================================================
SO100 Arm Voice Controller — Ready
Wake word : hey jarvis
LLM model : llama-3.1-8b-instant
STT model : whisper-large-v3-turbo
TTS voice : autumn
Arm port : /dev/ttyACM0 id='my_awesome_follower_arm'
======================================================
[WakeWord] Listening for 'hey jarvis' ...

Ahora di "Hey Jarvis" y da una orden.

Ejemplos de comandos de voz​

Lo que dicesLo que ocurre
"Hey Jarvis, open the gripper"La pinza se abre completamente
"Hey Jarvis, grab it"La pinza se cierra
"Hey Jarvis, go to pick up mode"El brazo se mueve a la pose de agarre
"Hey Jarvis, can you turn around"La base gira hacia un lado
"Hey Jarvis, wave at the camera"El brazo saluda y vuelve a la posición neutra
"Hey Jarvis, go home"Todas las articulaciones vuelven a la posición neutra

Descripción general de los archivos del proyecto​

examples/voice_arm/
├── pipeline.py # Main entry point — orchestrates the full flow
├── robot_arm.py # SO100 arm controller — add your poses here
├── llm.py # LLM prompt — add your voice triggers here
├── wakeword.py # Listens for "Hey Jarvis" in a background thread
├── audio_recorder.py # Records audio after wake word fires
├── stt.py # Sends audio to Groq Whisper → returns text
├── tts.py # Sends reply to Groq Orpheus → plays audio
├── config.py # Loads all settings from config.env
├── config.env.example # Template — copy to config.env and fill in
├── read_positions.py # Helper: read live joint positions for tuning poses
├── list_mics.py # Helper: find your MIC_INDEX
└── download_model.py # Downloads the openwakeword model files

Referencia de configuración​

VariablePredeterminadoDescripción
GROQ_API_KEY(required)Tu clave de API de Groq
WAKEWORD_MODELhey jarvisFrase de palabra de activación
MIC_INDEX1Índice de dispositivo PyAudio
WAKEWORD_THRESHOLD0.5Sensibilidad de detección (0.0–1.0)
WAKEWORD_COOLDOWN2Segundos entre reactivaciones
RECORDING_SECONDS3Tiempo de grabación después de la palabra de activación
LLM_MODELllama-3.1-8b-instantModelo LLM de Groq
STT_MODELwhisper-large-v3-turboModelo Whisper de Groq
TTS_VOICEautumnVoz para la salida de voz
ARM_PORT/dev/ttyACM0Puerto USB del brazo seguidor
ARM_IDmy_awesome_follower_armID del brazo (coincide con el nombre del archivo de calibración)
ARM_MOVE_DELAY1.5Segundos de espera después de un movimiento de pose
ARM_GESTURE_DELAY0.4Segundos entre pasos de la secuencia de gestos

Solución de problemas​

PyAudio no se instala Instala primero la biblioteca del sistema PortAudio:

sudo apt-get install -y portaudio19-dev

La palabra de activación nunca se dispara Ejecuta list_mics.py de nuevo y confirma que MIC_INDEX coincide con tu ReSpeaker. Intenta bajar WAKEWORD_THRESHOLD a 0.3. Habla claramente a ~1 metro del micrófono.

El brazo no se mueve después de un comando Comprueba que ARM_PORT sea correcto (lerobot-find-port). Verifica que el archivo de calibración exista en ~/.cache/huggingface/lerobot/calibration/robots/so_follower/<ARM_ID>.json.

El brazo se mueve a una posición incorrecta Los valores de pose predeterminados en ACTION_MAP son estimaciones iniciales. Ejecuta read_positions.py, mueve físicamente el brazo a la pose deseada y copia los valores impresos en robot_arm.py.

Errores de TTS / STT Vuelve a comprobar GROQ_API_KEY en config.env. El nivel gratuito de Groq tiene límites de tasa: espera unos segundos entre comandos si encuentras errores.

El audio se reproduce pero suena distorsionado En Raspberry Pi, configura la salida de audio al dispositivo correcto mediante raspi-config → System Options → Audio.


Créditos​

Creado con:

  • LeRobot — framework de robótica de código abierto de Hugging Face
  • SO-ARM100 — brazo robótico de código abierto y bajo costo de Seeed Studio
  • openwakeword — detección local de palabra de activación
  • Groq — Whisper STT, LLaMA LLM y Orpheus TTS ultrarrápidos
  • ReSpeaker Flex — matriz de micrófonos USB
Loading Comments...