Progression du robot pour la Coupe 2013

dimanche 21 octobre 2012

Coupe 2013 : De la voix dans nos robots

Qui n'a jamais rêvé de faire parler son robot ? Bien sur on à tous, à un moment ou un autre, bidouillé un montage avec un buzzer et fait "parler" son robot en fonction des actions en cours. C'est très pratique, simple et ça peut même devenir super fun en modulant le signal. Mais faire véritablement parler un robot ? Avec de mots et tous le tralala ? Avouez que ça serez génial !

Au début, Heureux détenteur d'un RaspberryPi, j'avais hésité à suivre le tuto de Pobot pour faire de la synthèse vocale . Et puis en cherchant un peu je suis tombé sur ce composant : le SpeakJet, un petit IC de 18 pattes permettant de générer des phonèmes anglais ainsi que d'autres sons en le reliant à un µC par le biais d'une liaison série.

Joie et allégresse ! J'ai de ce pas commandé ce composant et, après une semaine longue et stressante je ne vous le cache pas, je suis allé chercher mon colis ce vendredi avec une certaine fébrilité !

Quelques straps plus loin, le composant était câblé. En parlant de ça, le montage est d'une simplicité déconcertante ! Aucun composant externe n'est utile pour un montage basique ( à part un ampli audio mais je reviendrais plus tard sur ce sujet ). On se forcera tout de même à intégrer des résistances pour protéger le composant sur le montage final.



1er montage :

Ce montage simplisme permet de tester le bon fonctionnement du composant. C'est le mode "démo". Le composant va énoncer tous les sons dont il dispose et ceci en boucle.
Vous remarquerez que je n'ai pas d'ampli sur mon montage. En fait je suis directement branché sur ma carte son. Dans le cas d'un montage embarqué, comme se sera le cas dans un robot, il faudra intégré un ampli correctement dimensionné pour la sortie désirée.
Voici le résultat du mode démo :
2eme montage :

On va maintenant relier notre montage à notre carte PicAxe que l'on ne présente plus.
On est ici relié via une liason série à notre µC ( en B.4 pour moi ). Pour "parler" à notre composant il faut utiliser une liaison série non inversé à 9600Bauds. Ceci va donc se traduire en code Basic par la ligne :

SEROUT B.4,T9600_8,(Commande,0x0d)

"Commande" sera remplacé par la commande à envoyer à notre module. Le "0x0d" indique au module que l'envoi est terminé et qu'il peut exécuter la commande. La commande peut être une succesion de commande séparé par une virgule comme on le verra par la suite.

La commande à envoyer et un nombre de 0 à 255 qui correspond à un son ou à un ordre. Le mieux à faire et de répertorier toutes les commandes possibles ( disponibles dans la datasheet du composant ), et de les associer à un symbol au début de notre code.


SYMBOL IY=128 'See,Even,Feed (70ms) VoicedLongVowel
SYMBOL IH=129 'Sit,Fix,Pin (70ms) VoicedShortVowel
SYMBOL EY=130 'Hair,Gate,Beige(70ms) VoicedLongVowel
(...)


Il sera par la suite plus facile d'écrire votre code.

Il est donc relativement aisé de dialoguer avec notre composant. Mais maintenant, les choses se compliques un peux. Il va falloir assembler les différent phonèmes (sons) pour générer des mots. Mais pas de panique, on peux récupérer sur le site du module un mini dictionnaire sous forme de fichier texte , qui donne la conversion "mot/phonème". Il suffit donc de rechercher les différents mots de notre phrase et de copier-coller la traduction.

On envoie ensuite tous cela sur la liaison série :


SEROUT B.4,T9600_8, (HE,EHLE,LO,OWWW,WW,AXRR,LE,ED,0x0d) ' "Hello World"


On remarque que le résultat est pas terrible. Il manque un dynamisme dans la phrase. Il va falloir jouer des sons plus vite ou plus doucement, faire des pauses et mettre un peu de vie dans cette phrase. Le module possède quelques ordre qui permettent de jouer les phonèmes plus ou moins rapidement et de moduler la voix de manière à rendre ça plus naturelle. Après quelques essais  la commande suivante donnera un meilleur résultat :

SEROUT B.4,T9600_8,(Stress,HE,Fast,Stress,EHLE,Stress,LO,Stress,OWWW,Pause1,Stress,WW,Slow,Stress,AXRR,Stress,LE,Slow,Stress,ED,0x0d) ' "Hello World"

Certes, c'est plus long et fastidieux à écrire mais beaucoup plus agréable à entendre. Et après plusieurs essais on arrive à faire des trucs intéressants :
Pour vérifier que ça marche bien, je vous propose un petit jeux : dans les commentaires de ce billet postez le texte que vous venez d'entendre !

Et pour ceux qui souhaitent s'amuser chez eux, voici le lien pour télécharger le code Basic. 

La suite ?

Nous allons certainement intégrer ce module dans notre robot. On fera donc une carte spéciale avec le SpeakJet, un PicAxe8M2 et trés certainement une liaison vers un LCD afin d'avoir une interface simple et complète image et son ! Mais ce sera l'objet d'un autre billet !

A bientôt !