jeudi 3 janvier 2013

Reconnaissance Vocale sous linux

Après de nombreuses recherches et de nombreux essais, j'ai enfin réussit à avoir une reconnaissance vocale en français sous linux. J'ai donc testé CMU Sphinx, Simon et Julius. Ces solutions bien qu'intéressantes sont complexes à mettre en oeuvre et surtout sont très mauvaises en français. Pour ceux qui veulent une reconnaissance vocale en anglais en revanche, j'ai trouvé Sphinx très performant. En français, j'ai donc utiliser l'API Google Speech. Cette API n'est pas officiellement disponible au public. Elle sert à la reconnaissance vocale intégré dans Chrome depuis quelques versions. Toutefois elle est accessible facilement via des scripts.



Voici donc un petit script python vous permettant d'exploiter cette reconnaissance vocale:
import subprocess
print("Parler maintenant")
audio=subprocess.Popen(["arecord","-q","-f","cd","-t","wav","-d","5","-r"
,"16000","text"],stdout=subprocess.PIPE)
a=audio.communicate()[0]
audio1=subprocess.Popen(["cat","text"],stdout=subprocess.PIPE)
audio2=subprocess.Popen(["flac","--totally-silent","-","-f","--best",
"--sample-rate","16000","-o","tmp.flac"],stdin=audio1.stdout,
stdout=subprocess.PIPE)
b=audio2.communicate()[0]
print("audio recuperer")
trad=subprocess.Popen(["wget","-q","-O","speech.txt","-U","Mozilla/5.0",
"--post-file","tmp.flac","--header=Content-Type:audio/x-flac;rate=16000",
"http://www.google.com/speech-api/v1/recognize?lang=fr&client=chromium"],
stdout=subprocess.PIPE)
print("trad recuperer")
file=open('speech.txt','r')
msg=""
for ligne in file:
    tmp = ligne
    t=tmp.split(":")
    u=t[4].split(",")
    msg=u[0]
    msg=msg.replace("\"","")
print(msg)
Ce script commence par enregistrer une séquence audio de 5sec. Ensuite il la convertit en flac puis l'envoie aux serveurs de Google. Il récupére le fichier généré qui contient le texte ainsi que le pourcentage de correspondance.

12 commentaires:

  1. C'est sympa ! une bonne piste. Merci

    RépondreSupprimer
  2. Bonjour merci pour l'info et le partage de ton script. J'ai une question est-il possible d'ouvrir des applications avec ce procédé?

    Je recherche une application efficace pour effectuer des tâches en vocale. Je m'en vais tester tout de même cette appli.
    Merci

    RépondreSupprimer
    Réponses
    1. Il est tout à fait possible une fois le message (msg) obtenu à la fin du script de lancer une application en fonction de ce qui a été dis. Ce script n'est d'ailleurs qu'une partie de mon programme d'intelligence artificielle. Chaque commande vocale entraine une action: lancement d'application, envoie d'un mail, recherche sur internet, etc

      Supprimer
  3. Bonjour

    J' essai de lancer le script et j'ai le message suivant qui apparaît :

    debug@Debug-Notebook-PC:~$ python recon.py
    File "recon.py", line 3
    audio=subprocess.Popen(["arecord","-q","-f","cd","-t","wav","-d","5","-r","16000","text"],stdout=subprocess.PIPE)
    ^
    IndentationError: unexpected indent

    Pouvez m'aider s'il vous plait?

    RépondreSupprimer
  4. Bonjour,

    L'indentation en python est essentielle, il faut ici la retirer sur toutes les lignes. C'est la mise en page qui trompe

    RépondreSupprimer
  5. J'obtiens l'erreur suivante lorsque je lance ton programme:
    Traceback (most recent call last):
    File "test_audio.py", line 8, in
    stdout=subprocess.PIPE)
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
    File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
    raise child_exception
    OSError: [Errno 2] No such file or directory
    cat: erreur d'écriture: Relais brisé (pipe)

    RépondreSupprimer
    Réponses
    1. Je viens d'apporter une petite modification au code pour qu'il fonctionne mieux.

      Supprimer
    2. bonjour, j'obtiens une erreur lorsque je lance le script:

      Traceback (most recent call last):
      File "C:\Python33\lib\subprocess.py", line 1106, in _execute_child
      startupinfo)
      FileNotFoundError: [WinError 2] Le fichier spécifié est introuvable

      During handling of the above exception, another exception occurred:

      Traceback (most recent call last):
      File "C:/Users/user/Desktop/python/essaison.py", line 4, in
      ,"16000","text"],stdout=subprocess.PIPE)
      File "C:\Python33\lib\subprocess.py", line 820, in __init__
      restore_signals, start_new_session)
      File "C:\Python33\lib\subprocess.py", line 1112, in _execute_child
      raise WindowsError(*e.args)
      FileNotFoundError: [WinError 2] Le fichier spécifié est introuvable


      Merci d'avance ^^

      Supprimer
    3. Bonjour,

      Est-ce que vous aviez bien arecord d'installé sur la machine?

      Supprimer
  6. Bonjour
    J'ai le même messager d''erreur

    ~ $ python test.py
    Parler maintenant
    Traceback (most recent call last):
    File "test.py", line 9, in
    stdout=subprocess.PIPE)
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
    File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
    OSError: [Errno 2] No such file or directory
    cat: erreur d'écriture: Relais brisé (pipe)

    J'ai bien arecord

    Y a t il ququechose qui m'échappe ??

    Merci

    RépondreSupprimer
  7. Salut! Très bon script ça marche nickel :)
    Je cherche à enregistrer tant que le niveau sonore reste élevé (pour que ça s'arrête seul à la fin de la requête).
    Je cherche donc un équivalent de arecord, mais qu'on puisse interrompre manuellement, et un moyen de mesurer le niveau sonore dans un autre thread. Des idées?
    Merci!

    RépondreSupprimer
  8. bonjour,
    Aviez-vous des pistes pour les erreurs décrites ci-dessus ???
    Merci
    André

    RépondreSupprimer