Note

Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook ! Plongez plus profondément dans l’univers du Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez vos problèmes après-vente et défis techniques grâce à l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Bénéficiez d’un accès anticipé aux annonces de nouveaux produits et avant-premières.

  • Réductions exclusives : Profitez de réductions exclusives sur nos nouveaux produits.

  • Promotions festives et concours : Participez à des concours et promotions lors des fêtes.

👉 Prêt à explorer et créer avec nous ? Cliquez sur [here] et rejoignez-nous dès aujourd’hui !

21. Voiture Assistante Vocale IA

Cette leçon transforme votre PiCar-X en assistant vocal mobile alimenté par l’IA. Le robot peut se réveiller à votre voix, reconnaître ce que vous dites, répondre avec émotion, et exprimer ses “sentiments” à travers des mouvements, des gestes et des lumières.

Vous allez construire une voiture assistante vocale entièrement interactive en utilisant :

  • LLM - Large Language Model (OpenAI GPT ou Doubao).

  • STT - Speech-to-Text (voix vers texte).

  • TTS - Text-to-Speech (texte vers voix).

  • Capteurs + Actions - Ultrason, caméra et actions expressives intégrées.


Avant de Commencer

Assurez-vous d’avoir terminé :

Vous devez déjà disposer de :

  • Un microphone et un haut-parleur fonctionnels sur votre PiCar-X.

  • Une clé API valide enregistrée dans secret.py.

  • Une connexion réseau stable (une connexion filaire est recommandée pour une meilleure stabilité).


Exécuter l’Exemple

Les deux versions linguistiques sont placées dans le même répertoire :

cd ~/picar-x/example

Version anglaise (OpenAI GPT, instructions en anglais) :

sudo python3 21.voice_active_car_gpt.py
  • LLM : OpenAI GPT-4o-mini

  • TTS : en_US-ryan-low (Piper)

  • STT : Vosk (en-us)

Mot d’activation :

"Hey buddy"

Version chinoise (Doubao, instructions en chinois) :

sudo python3 21.voice_active_car_doubao_cn.py
  • LLM : Doubao-seed-1-6-250615

  • TTS : zh_CN-huayan-x_low (Piper)

  • STT : Vosk (cn)

Mot d’activation :

"你好 滴滴"

Note

Vous pouvez modifier le mot d’activation et le nom du robot dans le code : NAME = "Buddy" ou NAME = "滴滴" WAKE_WORD = ["hey buddy"] ou WAKE_WORD = ["你好 滴滴"]


Ce Qui Va se Passer

Lorsque vous exécutez cet exemple avec succès :

  • Le robot attend le mot d’activation (par ex. “Hey Buddy” / “你好 滴滴”).

  • Lorsqu’il entend le mot d’activation :

    • Les LED clignotent puis restent allumées.

    • Le robot vous salue avec une voix joyeuse.

  • Il commence ensuite à écouter votre voix en temps réel.

  • Après avoir reconnu ce que vous avez dit, il :

    • Envoie votre parole au LLM (OpenAI ou Doubao).

    • Réfléchit et fait clignoter les LED pendant le traitement.

    • Répond avec une voix TTS.

    • Exécute les actions correspondantes (par ex. hochement de tête, rotation, célébration).

  • Si vous vous approchez trop près, le capteur à ultrasons :

    • Déclenche un mouvement automatique de recul pour la sécurité.

    • Interrompt le cycle en cours avec une réponse d’avertissement.

Exemple d’interaction

Vous : Hey Buddy
Robot : Salut !

Vous : Tourne à gauche et regarde autour.
Robot : Bien reçu, je tourne la tête à gauche comme un chat curieux !
ACTIONS : turn_left, look_left

Basculer vers d’Autres LLM ou TTS

Vous pouvez facilement passer à d’autres LLM, TTS ou langues STT en effectuant seulement quelques modifications :

  • LLM pris en charge :

    • OpenAI

    • Doubao

    • Deepseek

    • Gemini

    • Qwen

    • Grok

  • 1. Tester Piper — Vérifiez les langues prises en charge par Piper TTS.

  • 2. Tester Vosk — Vérifiez les langues prises en charge par Vosk STT.

Pour changer, modifiez simplement la partie d’initialisation dans le code :

from picarx.llm import Gemini as LLM
llm = LLM(api_key="YOUR_KEY", model="gemini-pro")

# Définir les modèles et les langues
TTS_MODEL = "en_US-ryan-low"
STT_LANGUAGE = "en-us"

Référence des Actions et Sons

Voici les mots-clés d’action que le LLM peut renvoyer (après la ligne ACTIONS:) et leur effet sur le robot.

Action

Ce qu’elle fait (selon preset_actions.py)

Effet / Remarques

shake head

Balance rapidement l’angle de panoramique de la caméra de droite à gauche en mouvements décroissants, puis se recentre.

Geste de “Non” ; les roues restent immobiles.

nod

Fait basculer la caméra vers le haut et le bas deux fois, puis se recentre.

Geste de “Oui” ; les roues restent immobiles.

wave hands

Incline la caméra, puis tourne le volant à gauche/droite deux fois (±25°), puis revient au centre.

Salutation ludique (utilise le servo de direction comme des “bras”).

resist

Petite inclinaison ; alterne (direction ±15°, panoramique ±15°) 3 fois ; s’arrête et se recentre.

Mouvement de “refus” ou défensif.

act cute

Incline la tête vers le bas ; petits allers-retours rapides (courtes impulsions moteurs), puis réinitialisation.

Mouvement “mignon” rebondissant ; très courtes actions.

rub hands

Petites oscillations répétées de la direction (±6°) cinq fois ; réinitialisation.

Imite le geste de “frotter les mains”.

think

Panoramique fluide vers la droite + inclinaison vers le bas + direction à droite ; courte pause ; pose réfléchie ; réinitialisation.

Utilisé comme animation unique de “réflexion”.

twist body

Trois cycles de court mouvement avant / arrêt / pan gauche / direction gauche, puis court mouvement arrière / arrêt / pan droit / direction droite.

Donne une impression de “torsion” du corps.

celebrate

Inclinaison vers le haut ; deux mouvements pan/direction vers la droite, puis deux vers la gauche ; retour au centre.

Mouvement festif et symétrique.

depressed

Série d’inclinaisons vers le bas avec des angles et des pauses variés ; se termine après un long battement et se réinitialise.

Séquence de posture “triste”.

Mouvements & Utilitaires

Action

Ce qu’elle fait

Remarques

forward

Avance à basse vitesse pendant environ 1 seconde, puis s’arrête.

Implémenté par forward(car) (5 % de vitesse + 1 s).

backward

Recule à basse vitesse pendant environ 1 seconde, puis s’arrête.

Implémenté par backward(car) (5 % de vitesse + 1 s).

Effets Sonores

Son

Ce qu’il fait

Remarques

honking

Joue car-double-horn.wav de manière asynchrone (volume ~100).

Déclenché via Music.sound_play_threading.

start engine

Joue car-start-engine.wav de manière asynchrone (volume ~50).

Signal de démarrage / prêt.

Déclencheurs Capteurs (Automatiques)

  • Proximité ultrasonique

    • Déclenchement : distance < 10 cm

    • Effet secondaire : mouvement automatique backward + désactivation de l’image pour ce tour

    • Message injecté : <<<Ultrasonic sense too close: {distance}cm>>>

Hooks du Cycle de Vie (Indicateurs LED)

  • before_listen → clignote deux fois (prêt à écouter)

  • before_think → clignotement continu (réflexion)

  • before_say → LED allumée (parole)

  • after_say → attend les actions → LED éteinte

  • on_stop → arrêt des actions, fermeture des périphériques


Dépannage

  • Le robot ne réagit pas au mot d’activation

    • Vérifiez si le microphone fonctionne.

    • Assurez-vous que WAKE_ENABLE = True.

    • Ajustez le mot d’activation pour correspondre à votre prononciation.

  • Aucun son ne sort du haut-parleur

    • Vérifiez la configuration du modèle TTS.

    • Testez Piper ou Espeak manuellement.

    • Vérifiez la connexion et le volume du haut-parleur.

  • Erreur ou délai d’expiration de la clé API

    • Vérifiez votre clé dans secret.py.

    • Assurez-vous que la connexion réseau est active.

    • Confirmez que le LLM est pris en charge.

  • Le PiCar-X ne bouge pas ou n’exécute pas les actions

    • Vérifiez que le nom de l’action correspond à actions_dict.

    • Vérifiez les connexions moteur et servomoteur.

  • Le capteur à ultrasons se déclenche de manière inattendue.

    • Vérifiez la hauteur et l’angle d’installation du capteur.

    • Ajustez le seuil de distance TOO_CLOSE dans le code.