Nota

Hola, ¡bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirte?

  • Soporte de expertos: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Preestrenos exclusivos: Obtén acceso anticipado a nuevos anuncios de productos y avances exclusivos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones festivas y sorteos: Participa en sorteos y promociones especiales durante las festividades.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [here] y únete hoy mismo.

16. Coche Controlado por Voz con Vosk (Sin conexión)

Vosk es un motor ligero de reconocimiento de voz a texto (STT) que admite muchos idiomas y funciona completamente sin conexión en Raspberry Pi. Solo necesitas acceso a Internet una vez para descargar un modelo de idioma. Después de eso, todo funciona sin conexión de red.

En esta lección vamos a:

  • Comprobar el micrófono en Raspberry Pi.

  • Instalar y probar Vosk con un modelo de idioma elegido.

  • Construir un PiCar-X controlado por voz que escuche una palabra de activación y luego responda a comandos como adelante, atrás, izquierda y derecha.

Antes de Empezar

Asegúrate de haber completado:

1. Comprobar tu micrófono

Antes de usar el reconocimiento de voz, asegúrate de que tu micrófono USB funcione correctamente.

  1. Lista de dispositivos de grabación disponibles:

    arecord -l
    

    Busca una línea como card 1: ... device 0.

  2. Graba una muestra corta (reemplaza 1,0 con los números que encontraste):

    arecord -D plughw:1,0 -f S16_LE -r 16000 -d 3 test.wav
    
    • Ejemplo: si tu dispositivo es card 2, device 0, usa:

    arecord -D plughw:2,0 -f S16_LE -r 16000 -d 3 test.wav
    
  3. Reprodúcela para confirmar la grabación:

    aplay test.wav
    
  4. Ajusta el volumen del micrófono si es necesario:

    alsamixer
    
    • Presiona F6 para seleccionar tu micrófono USB.

    • Busca el canal Mic o Capture.

    • Asegúrate de que no esté silenciado ([MM] significa silenciado; presiona M para activar → debe mostrar [OO]).

    • Usa las flechas ↑ / ↓ para cambiar el volumen de grabación.

2. Probar Vosk

Pasos para probarlo:

  1. Crea un nuevo archivo:

    cd ~/picar-x/example
    sudo nano test_stt_vosk.py
    
  2. Copia el código de ejemplo en él. Pulsa Ctrl+X, luego Y, y Enter para guardar y salir.

    from picarx.stt import Vosk
    
    vosk = Vosk(language="en-us")
    
    print(vosk.available_languages)
    
    while True:
        print("Say something")
        result = vosk.listen(stream=False)
        print(result)
    
  3. Ejecuta el programa:

    sudo python3 test_stt_vosk.py
    
  4. La primera vez que ejecutes este código con un nuevo idioma, Vosk descargará automáticamente el modelo de idioma (por defecto descargará la versión pequeña). Al mismo tiempo, también mostrará la lista de idiomas admitidos. Luego verás:

    vosk-model-small-en-us-0.15.zip: 100%|███████████████████| 39.3M/39.3M [00:05<00:00, 7.85MB/s]
    ['ar', 'ar-tn', 'ca', 'cn', 'cs', 'de', 'en-gb', 'en-in', 'en-us', 'eo', 'es', 'fa', 'fr', 'gu', 'hi', 'it', 'ja', 'ko', 'kz', 'nl', 'pl', 'pt', 'ru', 'sv', 'te', 'tg', 'tr', 'ua', 'uz', 'vn']
    Say something
    

    Esto significa:

    • El archivo del modelo (vosk-model-small-en-us-0.15) se ha descargado.

    • Se ha mostrado la lista de idiomas admitidos.

    • El sistema ahora está escuchando — di algo al micrófono de PiCar-X y el texto reconocido aparecerá en la terminal.

    Consejos:

    • Mantén el micrófono a unos 15–30 cm de distancia.

    • Elige un modelo que coincida con tu idioma y acento.

Modo de Transmisión (opcional)

También puedes transmitir audio de forma continua para ver resultados parciales mientras hablas:

from picarx.stt import Vosk

vosk = Vosk(language="en-us")

while True:
    print("Say something")
    for result in vosk.listen(stream=True):
        if result["done"]:
            print(f"final:   {result['final']}")
        else:
            print(f"partial: {result['partial']}", end="\r", flush=True)

3. Coche Controlado por Voz

¡Ahora conectemos el reconocimiento de voz al PiCar-X!

Usaremos una palabra de activación («hey robot») para que el coche solo escuche comandos después de ser activado. Esto ahorra CPU y evita activaciones no deseadas.

Ejecutar el código

cd ~/picar-x/example
sudo python3 16.voice_controlled_car.py

En este programa, el coche:

  • Espera la palabra de activación «hey robot».

  • Después de eso, puedes hablar de forma natural — siempre que tu frase incluya una de las palabras clave (forward, backward, left, right), el coche responderá.

    Por ejemplo:

    • “Can you move forward a little?” → el coche avanza.

    • “Please turn left now.” → el coche gira a la izquierda.

  • El comando «sleep» detiene el bucle de control y pone al coche nuevamente en modo de espera.

Código

from picarx import Picarx
from picarx.stt import Vosk
import time

px = Picarx()
stt = Vosk(language="en-us")

WAKE_WORDS = ["hey robot"]

print('Say "hey robot" to wake me up! Then say: forward / backward / left / right. Say "sleep" to stop listening.')

try:
    while True:
        # --- wait for wake word once ---
        stt.wait_until_heard(WAKE_WORDS)
        print("Wake word detected. Listening for commands... (say 'sleep' to pause)")

        # --- command loop: multiple commands after one wake ---
        while True:
            res = stt.listen(stream=False)
            text = res.get("text", "") if isinstance(res, dict) else str(res)
            text = text.lower().strip()
            if not text:
                continue

            print("Heard:", text)

            if "sleep" in text:
                # pause command mode; go back to wait for wake word
                px.stop(); px.set_dir_servo_angle(0)
                print("Sleeping. Say 'hey robot' to wake me again.")
                break

            elif "forward" in text:
                px.set_dir_servo_angle(0)
                px.forward(30); time.sleep(1); px.stop()

            elif "backward" in text:
                px.set_dir_servo_angle(0)
                px.backward(30); time.sleep(1); px.stop()

            elif "left" in text:
                px.set_dir_servo_angle(-25)
                px.forward(30); time.sleep(1)
                px.stop(); px.set_dir_servo_angle(0)

            elif "right" in text:
                px.set_dir_servo_angle(25)
                px.forward(30); time.sleep(1)
                px.stop(); px.set_dir_servo_angle(0)
            # (ignore other words)

except KeyboardInterrupt:
    pass
finally:
    px.stop(); px.set_dir_servo_angle(0)
    print("Stopped and centered. Bye.")

Solución de Problemas

  • No such file or directory (al ejecutar `arecord`)

    Puede que estés usando el número de tarjeta/dispositivo incorrecto. Ejecuta:

    arecord -l
    

    y reemplaza 1,0 con los números que aparezcan para tu micrófono USB.

  • El archivo grabado no tiene sonido

    Abre el mezclador y revisa el volumen del micrófono:

    alsamixer
    
    • Presiona F6 para seleccionar tu micrófono USB.

    • Asegúrate de que Mic/Capture no esté silenciado ([OO] en lugar de [MM]).

    • Sube el nivel con la tecla ↑.

  • Vosk no reconoce la voz

    • Asegúrate de que el código de idioma coincida con tu modelo (por ejemplo, en-us para inglés, zh-cn para chino).

    • Mantén el micrófono a 15–30 cm de distancia y evita ruidos de fondo.

    • Habla con claridad y lentamente.

  • La palabra de activación (“hey robot”) nunca se activa

    • Dila en un tono natural, no demasiado rápido.

    • Verifica que el programa imprima el texto reconocido. Si no lo hace, el micrófono no está funcionando.

  • Alta latencia / reconocimiento lento

    • La descarga automática por defecto es un modelo pequeño (más rápido pero menos preciso).

    • Si sigue lento, cierra otros programas para liberar CPU.