Main

Référence : Fonctions Pyduino

Pyduino Multimedia : analyzeVoice


Description

  • Cette fonction va permettre de réaliser la reconnaissance vocale à partir d'un fichier son enregistré avec recordSound() : en un mot, la fonction reçoit le chemin du fichier son et renvoie... la chaîne texte correspondante, tout simplement !
  • Cette fonction repose sur le moteur de reconnaissance vocale Google Voice et n'est donc disponible qu'en mode connecté uniquement. Ceci étant, le mini-pc peut très bien être connecté en wifi au routeur... donc au sein d'un réseau local ayant l'accès au web, cette fonction sera disponible en tout point d'une maison ou d'un local !
  • L'utilisation d'un moteur de reconnaissance vocale en ligne n'est certes pas idéal... mais c'est vraiment la solution qui donne les meilleurs résultats, avec plus de 90% de reconnaissance juste. Une solution purement embarquée serait bien sûr préférable, mais n'existe pas avec ce niveau de performance à ce jour dans le monde Gnu/Linux.

Pré-requis

NOUVEAU : L'installation des dépendances multimédia est automatiquement effectuée en 1 fois par l'installation du paquet *.deb PyduinoMultimedia

  • Il est tout d'abord nécessaire de disposer d'une interface audio opérationnelle sur le système :
    • sur le rapsberrypi, c'est le cas en natif avec la distribution raspbian
    • sur le pcduino, il faut installer les paquets suivants qui fournissent une interface audio classique sur un système Gnu/Linux (réglage volume, choix des entrées / sorties audio, etc...) :
$ sudo apt-get install pulseaudio
$ sudo apt-get install pavucontrol
  • La fonction de reconnaissance vocale analyzeVoice() utilise un utilitaire de formatage du fichier son qui dont donc être installé :
$ sudo apt-get install sox

Matériel nécessaire

  • Pour capturer les sons avec la fonction recordSound(), il est nécessaire de disposer d'une entrée audio sur le système. Il n'y a pas d'entrée audio généralement sur les plateformes mini-PC :
    • sur le raspberrypi, une sortie audio RCA sur Jack mais pas d'entrée Audio
    • sur le pcduino, pas d'entrée audio
  • Selon les cas, on utilisera au choix :
    • le micro intégré de la webcam utilisée : c'est la solution la plus simple et la plus compacte en pratique ! On fait "d'une pierre deux coups" : capture d'image et capture audio. Le micro des webcams suivantes a été reconnue "out of the box" sur le système :
      • Logitech C170
      • Hercules Dualpix Exchange
      • ..
    • une mini-carte son USB reconnue par le système Gnu/Linux, qui aura l'avantage d'intégré à la fois une sortie et une entrée audio, associée à un micro. Moins pratique à l'usage.

Tests préalables

  • Il est utile de vérifier au préalable le bon fonctionnement de la capture audio. Le plus simple et le plus pratique pour des tests, mais aussi pour réaliser du traitement des fichiers sons est d'utiliser le logiciiel Audacity. A installer avec la commande :
$ sudo apt-get install audacity
  • Le logiciel Audacity se lance ensuite depuis le menu graphique Applications > Sound and Video > Audacity
  • Pour tester l'enregistrement du son, cliquer simplement sur le bouton "enregistrer" : une nouvelle piste se crée avec l'affichage en direct du spectrogramme du son. Parlez ! Puis cliquer sur "STOP" et puis sur "PLAY" : vous devez entendre ce que vous avez dit...
  • Pour régler les problèmes éventuels, je conseille de lancer simultanément le logiciel Contrôleur de Volume Pulse Audio depuis le menu Applications > Sound and Video :
    • se placer dans l'onglet "Input Device" et vérifier que l'entrée son voulue est bien détectée..
    • %bluependant l'enregistrement avec Audacity, se placer dans l'onglet "Recording" du contrôleur de Volume pulse Audio et vérifier que l'interface d'enregistrement est bien active. Ce point est essentiel ! Au besoin, choisissez la bonne interface et régler les niveaux d'enregistrement.
  • Un point important et même essentiel pour la reconnaissance vocale est de vérifier que les niveaux d'enregistrement sont bons : l'onde tracée dans Audacity doit occuper les 2/3 de la hauteur du tracé en moyenne, sans trop toucher le maximum. Régler les niveaux au besoin dans l'onglet "Input Device" du Contrôleur de Volume Pulse Audio ou dans l'onglet "Recording" pendant un enregistrement.

Si vous n'obtenez pas de bons résultats de reconnaissance, revenez à cette étape cruciale !

  • Tout fonctionne ? Vous êtes parés !

Syntaxe

analyzeVoice()
analyzeVoice(filepath)

Paramètres

  • filepath : le chemin absolu du fichier son à utiliser. Utiliser un format *.wav obtenu avec recordSound(). Si aucun fichier n'est précisé, la fonction utilise le fichier audio temporaire interne obtenu avec recordSound()

Valeur renvoyée

  • la chaine str reconnue.

Explication technique

  • Cette fonction fait plusieurs choses :
    • tout d'abord le fichier *.wav reçu en entrée est formaté dans un format *.flac à l'aide d'un utilitaire de conversion en ligne de commande appelé sox
    • ensuite ce fichier est envoyé vers les serveurs google au sein d'une requête assez complexe
    • puis la réponse reçue, également complexe, est analysée à l'aide des expressions régulières afin d'extraire la chaîne reconnue
  • Noter que la fonction de reconnaissance vocale ne se connecte pas au serveur si la durée du son n'est pas suffisante, par exemple si vous n'avez pas parlé. Ceci évite une connexion intempestive au serveur de reconnaissance vocale.
  • L'intérêt majeur de la fonction analyzeVoice() est de réaliser toute cette cuisine pour vous ! Cool non ?

Exemple:

  • L'exemple qui suit assure une reconnaissance vocale en boucle :
    • un message vocal invite à dire quelque chose
    • important : attendez l'apparition de la ligne "record WAVE" pour parler (dans une application réelle, on pourrait allumer une LED verte pour parler...)
    • ensuite un message est enregistré pendant 3 secondes
    • puis le message vocal vous dit ce que vous avez dit !

La lecture des fichiers audio peut générer parfois quelques messages de warning qui sont sans conséquences sur la lecture des fichiers sons elle-même, ni sur la reconnaissance vocale.



#!/usr/bin/python
# -*- coding: utf-8 -*-

# exemple pyDuino - par X. HINAULT - www.mon-club-elec.fr
# Juin 2013 - Tous droits réservés - GPLv3
# voir : https://github.com/sensor56/pyDuino

# test analyzeVoice

from pyduinoMultimedia import * # importe les fonctions Arduino pour Python

# entete declarative
#noLoop=True

#--- setup ---
def setup():

        return
# -- fin setup --

# -- loop --
def loop():

        filepathAudio=homePath()+dataPath(AUDIO)
        filename="test.wav"
        print (filepathAudio+filename)

        speak("Test de reconnaissance vocale. Dites quelque chose")

        recordSound(filepathAudio+filename,3) # enregistre son fichier voulu et duree voulue en secondes

        #playSound(filepathAudio+filename)

        chaine=analyzeVoice(filepathAudio+filename) # reconnaissance vocale

        if chaine=="":
                speak("Vous n'avez rien dit.")
        else:
                speak("Vous avez dit " + chaine)


# -- fin loop --

#--- obligatoire pour lancement du code --
if __name__=="__main__": # pour rendre le code executable
        setup() # appelle la fonction main
        while not noLoop: loop() # appelle fonction loop sans fin
 

Note technique

  • Il peut être intéressant d'analyser la chaîne obtenue d'un point de vue phonétique au lieu des seuls caractères : pour çà, le langage Python dispose de modules dédiés. Par exemple :

Commentaires utilisateurs

  • Pouvoir commander des dispositifs à la voix en quelques lignes de code : pas belle la vie ?!

Voir également


Page d'accueil de la référence Pyduino en français

Corrections, suggestions et nouvelle documentation peuvent être postées à l'adresse suivante : support_at_mon-club-elec_point_fr

Cette page a été réalisée par Xavier HINAULT (2013) (www.mon-club-elec.fr) et est sous licence Creative Commons Attribution-ShareAlike 3.0.