lunes, 24 de diciembre de 2012

Domótica por control de voz

... ordenador ... mata a Flanders ...

Buenos días, si te supo a poco este post, a lo mejor este te gusta un poco más. Hoy vamos a controlar la instalación domótica con la voz, eso si, con un Asterisk de por medio. Lo primero antes de nada, es tener muy claro los términos:

  • ASR: automatic spell recognition, convierte la voz a texto escrito.
  • TTS: text-to-speech convierte un texto escrito, a un archivo de audio. Como por ejemplo el famoso loquendo o en software libre Festival.
Veamos como se hace ...
La parte más compleja, es la de conseguir un ASR en software libre o por lo menos que sea gratuito. Si googleamos un poco vemos que no es tarea fácil. En software libre tenemos el Sphinx que tras muchas configuraciones conseguí que reconociera números, así que realmente, no conseguí nada. Así que me voy a sacar un truco de la manga, voy a usar el ASR de Google Translator.
Seguramente has usado el Google Translator en modo texto y luego le as dado al altavoz para que te lo pronuncie perfectamente. Si usas Chrome, verás que además puedes hablarle y te lo transcribe, ahí es donde queremos llegar.
Cuando me interesé por esto la primera vez, me baje el código fuente de Chrome, busqué en la documentación y encontré la parte la que andamos buscando. Después vi que otro fricazo pensó en lo mismo y lo encontró más rápido y mejor ... y ya cuando yo lo estaba usando, en la lista de correo de Asterisk en español sacaron una medio-api para hacerlo más fácil. Como me dio un poco de coraje, lo uso como yo quiero.
Para el ASR necesitamos:
apt-get install ffmpeg curl
y el script es /usr/local/bin/asr_google.sh :
#!/bin/bash
# programado por Juanmol para http://rsppi.blogspot.com
# $1 es el archivo de audio
# $2 es el idioma (es)
ffmpeg -i $1.wav -ar 16000 $1.flac
resultado=$(echo $(echo $(curl -H "Content-Type: audio/x-flac; rate=16000" "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=$2" -F "myfile=@$1.flac" | cut -f12 -d\")))
rm $(echo $1).flac
rm $1.wav
asterisk -rx "database put asr_accion $(echo $1 | cut -f3 -d\/) \"$(echo $resultado | cut -f1 -d\ )\""
asterisk -rx "database put asr_modulo $(echo $1 | cut -f3 -d\/) \"$(echo $resultado | cut -f2 -d\ )\""
La verdad es que es supersimple. Ahora la parte del código en Asterisk /etc/asterisk/extensions.conf :
[from-incoming]
exten => 400,1,Answer()
same => n(record),Record(/tmp/${UNIQUEID}.wav,2,10)
same => n,System(/bin/bash /usr/local/bin/asr_google.sh /tmp/${UNIQUEID} es)
same => n,Set(accion=${DB_DELETE(asr_accion/${UNIQUEID})})
same => n,Set(modulo=${DB_DELETE(asr_modulo/${UNIQUEID})})
same => n,ExecIf($[ "${accion}" = "encender" ]?Set(accion=on))
same => n,ExecIf($[ "${accion}" = "apagar" ]?Set(accion=off))
same => n,ExecIf($[ "${modulo}" = "salon" ]?Set(modulo=a4))
same => n,ExecIf($[ "${modulo}" = "comedor" ]?Set(modulo=a3))
same => n,ExecIf($[ "${modulo}" = "termo" ]?Set(modulo=a2))
same => n,System(echo pl ${modulo} ${accion} | nc localhost 1099 > /dev/null)
same => n,Playback(mensajes/${accion}&mensajes/${modulo})
same => n,Goto(record)
same => n,Goto(nulo,s,1)
Suponemos además que ya tienes Asterisk instalado y tu instalación domótica funciona a las mil maravillas.
Y este es el resultado:

esta vez no haré un tour por toda la casa ;)

22 comentarios:

  1. Lanzar misil hacia Rajoy. Lanzando misil hacia Rajoy. xD

    ResponderEliminar
  2. Jajajaja, fazte un scrip con eso y te quedas con todo el mundo!

    ResponderEliminar
  3. Cada día más alucinado con lo que haces... espero que un día saques la versión del blog para lentos como yo y lo pongas todo paso a paso, no hace falta que pongas como se usa un teléfono dejemos la linea de dificultad en ese punto jaja

    ResponderEliminar
    Respuestas
    1. hombreeee mis scripts son copypaste total, no requieren conocimientos a penas. Tu, si no consigues hacer algo, no dudes en preguntar, yo jamas daré una respuesta del tipo "eso ya se ha preguntado antes, búscalo" o un "búscalo en el Google". Tu inténtalo, vuelve a intentarlo y si sigue sin salirte, pregunta, que para eso estamos.

      Eliminar
  4. Hola Juan,
    Enhorabuena por tu blog, es impresionante lo que llegas a hacer con la raspberry, he estado investigando por ahí, y he visto que hay gente que controla la raspberry a través del movil con la voz, utilizan el Siriproxy de apple para abrir una puerta del garage, el problema es que ese programa solo corre en Apple (iphone, ipad...) crees que seria posible hacer algo así con Android?, es decir mandarle por medio del movil el texto ya reconocido para que se pueda gestionar directamente de la raspberry.
    Gracias por la atención y enhorabuena de nuevo por compartir toda la información.

    ResponderEliminar
    Respuestas
    1. en el sdk de android habia un asr creo recordar. Esmas, juraria que incluso en el appinventor lo hay, con lo que te puedes hacer una app para android en 5 minutos que haga eso mismo.

      Eliminar
  5. No tendrás una cuenta de correo o algo para explicarte una cosita no?

    Me puedes ser de gran ayuda!

    ResponderEliminar
    Respuestas
    1. si preguntas aqui mismo, puede que le sirva a alguien mas. De todas formas puedes escribirme a rsppi.blog@gmail.com

      Eliminar
  6. Muy buenos tus articulos, y los estoy integrando a mis proyectos de domotica.
    Una pregunta, los mensajes (respuestas) hablados, los descargaste, los grabaste?
    Gracias!

    ResponderEliminar
  7. Saludos quisiera me respondan una duda como instalo voz en español de festival sobre la raspi. pude en ubuntu pero en raspi me indica que el paquete no es candidatop eso que quiere decir. PORFAVOR tambien use raspbx quiero poder contestar llamadas con un archivo de sonido generado por festival en español. gracias de antemano.

    ResponderEliminar
    Respuestas
    1. el paquete de voces en español del festival estaba en la web de la Junta de Andalucia, hace como un millon de años o así. No te lo recomiendo, suena a lata. Te recomiendo usar el TTS de Google, que puedes entresacar del post http://rsppi.blogspot.com.es/2012/06/generador-mp3-para-despertador.html
      viene a ser algo como:
      cadena="hola, buenas tardes"
      wget -F -U "Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:2.0) Gecko/20110307 Firefox/4.0" "http://translate.google.com/translate_tts?tl=es&q='$cadena" -O salida.mp3
      Tenia pendiente otro post con esto, a ver si me pongo.

      Eliminar
    2. Las voces de mbrola en español no están nada mal y no necesitan de conexión a Internet :)

      Eliminar
  8. Un favor quiero entrar en el mundo de raspberry pi, que debo tener en cuenta a la hora de adquirir una

    Gracias

    ResponderEliminar
    Respuestas
    1. tener ganas! ... y comprar uno ;) ... y una SD

      Eliminar
  9. puedo utilizar sox para convertir los archivos en flac?... en teoria segun la documentacion que he localizado, para ASR GOOGLE y ASTERISK, los archivos los convierto con
    sox /tmp/archiv.wav /tmp/archiv.flac, pero es nefasto, da desconocido el archivo, y eso que estan instaladas las librearias

    saludos

    ResponderEliminar
    Respuestas
    1. pues la verdad ni idea ¿no te funciona ffmpeg?

      Eliminar
  10. hola quisera saber como puedo mandarle un comando por voz a la rasberry que encienda un led y esta lo encienda y me diga por voz que este led a sido encendido
    tambien preguntarle la temperatura del sensor lm35 y me diga por voz lla lectura de este sensor

    ResponderEliminar
    Respuestas
    1. hola muchisimas gracias , no tendras un link para orientarme en el tema un poco mas

      Eliminar
  11. Esto puede servir para web ? como puedo utilizar el habla en lenguaje python para web

    ResponderEliminar