Cómo usar las bibliotecas CMU Sphinx y PocketSphinx en Raspberry Pi 2 en Python para el reconocimiento de voz

En primer lugar, necesitamos instalar PocketSphinx en Raspberry Pi para hacer el reconocimiento de voz. Estoy usando una cámara USB estándar con micrófono (compatible con Raspberry Pi) y sigo las instrucciones disponibles aquí: Reconocimiento de voz con Raspberry Pi: observación. En esencia, esto es lo que he hecho (como root en la Raspberry Pi), consulte el enlace de arriba para obtener detalles adicionales: apt-get install rpi-update apt-get install git-core rpi-update -> Conecte su USB micrófono (o cámara + micrófono) y -> reinicie el RPi en este punto vi /etc/modprobe.d/alsa-base.conf # cambie de la siguiente manera: # Comente esta línea # opciones snd-usb-audio index = -2 # y agregue lo siguiente: opciones snd-usb-audio index = 0 -> cierre el archivo y vuelva a cargar alsa: alsa force-reload

Página wget en sourceforge.net0.8 / sphinxbase-0.8.tar.gz / download

mv download sphinxbase-0.8.tar.gz wget Página en sourceforge.netpocketsphinx / 0.8 / pocketsphinx-0.8.tar.gz / download mv download pocketsphinx-0.8.tar.gz tar -xzvf sphinxbase-0.8.tar.gz tar -xzvf pocketsphinx -0.8.tar.gz apt-get install bison apt-get install libasound2-dev cd sphinxbase-0.8 ./configure –enable-fixed make make install cd ../pocketsphinx-0.8/ ./configure make sudo make install

ahora está listo para probar su instalación de PocketSphinx. Vaya a pocketsphinx-0.8 / src / programs y ejecute:

./pocketsphinx_continuous

Si tiene suerte, debería recibir un mensaje de texto … No tengo espacio aquí (y tiempo) para entrar en los detalles de la esfinge (de bolsillo). Pruebe algunas palabras simples y vea si son reconocidas. Terminé construyendo un modelo de lenguaje muy simple usando la herramienta en línea en este enlace: Sphinx Knowledge Base Tool VERSIÓN 3. Utilizo solo “verde”, “rojo” y “apagado” y parecen funcionar bien a pesar de mi acento italiano
En el siguiente paso, necesitamos conectar la salida de PocketSphinx con Racket. Hago esto de una manera muy primitiva:
Modifico el código fuente de pocketsphinx_continous para generar solo la palabra que se reconoce. Esto es muy simple: simplemente modifique continous.c en pocketsphinx-0.8 / src / programas, comente toda la declaración printf y envíe solo la palabra reconocida (envíeme un correo electrónico si no sabe cómo hacerlo). Agrego una cadena “RACKET:” al comienzo de la cadena impresa para asegurarme de que esto es algo que he generado. Luego puede ejecutar pocketsphinx y redirigir la salida a un archivo con algo como:

./pocketsphinx_continuous -lm /home/pi/sphinx/simple/4867.lm \ -dict /home/pi/sphinx/simple/4867.dic> /tmp/capture.txt

(observe que estoy usando el modelo de idioma + diccionario generado en línea)
Es hora de volver a Racket. Supongo que sabe cómo conectar una Raspberry Pi con una placa Arduino y hablar con Racket usando Firmata (si este no es el caso, consulte las instrucciones disponibles en Raspberry Pi, Arduino y Firmata). En el siguiente archivo Racket, simplemente leo el archivo /tmp/capture.txt y envío instrucciones a la pizarra de acuerdo con las instrucciones recibidas. Si no se reconoce un comando, imprimo un mensaje en la pantalla. El código para esto es el siguiente:
#lang racket (requiere “firmata.rkt”) (define verde 12) (define rojo 13) (define en (open-input-file “/tmp/capture.txt”)) (define (process-input str) (printf “procesamiento de entrada ~ a \ n ” str) (set! str (substring str 8)) (cond ((string =? (string-upcase str) “RED”) (printf “Estoy configurando rojo \ n “) ( set-arduino-pin! red)) ((string =? (string-upcase str) “GREEN”) (printf “Estoy configurando green \ n “) (set-arduino-pin! green)) ((string = ? (string-upcase str) “OFF”) (printf “Estoy borrando los PIN \ n “) (clear-arduino-pin! rojo) (clear-arduino-pin! green)) (más (printf “Lo siento, no puede entender: ~ a \ n “str) (salida de descarga)))) (define (read-loop) (define str (read-line in)) (a menos que (eof-object? str) (process-input str) ) (read-loop)) (define (start-everything) (open-firmata “/ dev / ttyACM0”) (set-pin-mode! green OUTPUT_MODE) (set-pin-mode! rojo OUTPUT_MODE) (read-loop)) (inicio-todo)
Trabajo hecho. Ahora verifique eso:

  • La versión modificada de pocketsphinx_continuous se está ejecutando y redirigiendo la salida a /tmp/capture.txt
  • Inicie el archivo de arriba con algo como raqueta sphinx-arduino.rkt
  • Compruebe que su placa Arduino esté conectada y cableada adecuadamente

y deberías obtener algo como esto:
Trabajo futuro:

  • No creo que sea necesario escribir en un archivo … ¿quizás pocketsphinx puede redirigir a un puerto y Racket puede escucharlo?
  • Mejore el modelo de idioma para un dominio de su elección
  • Agregue un par de altavoces al Raspberry Pi para que Racket pueda decirle qué está haciendo, si algo no ha sido reconocido, etc.