Translate

viernes, 1 de febrero de 2013

Reconocimiento de Voz para Control del GPIO

Después de haber probado el control del GPIO de la Raspberry Pi vía DTMF, aquí hay una pequeña demostración de como utilizar el reconocimiento de Voz de Google junto con Asterisk para encender y apagar LEDS conectados al GPIO de la RPi.

Los Scripts para usar el reconocimiento de voz con asterisk los pueden conseguir aqui: http://zaf.github.com/asterisk-speech-recog/

Primero inicializamos las salidas(en este caso 4 y 17):
# echo "4" > /sys/class/gpio/export
# echo "out" > /sys/class/gpio/gpio4/direction
# echo "17" > /sys/class/gpio/export
# echo "out" > /sys/class/gpio/gpio17/direction

El dialplan Utilizado para esta prueba es el siguiente:
exten => *53,1,Answer()
same => n,Playback(ordene)
same => n(record),agi(speech-recog.agi,es-Es)
same => n,GotoIf($[$["${status}" = "0"] & $["${confidence}" > "0.5"]]?success:retry)

same => n(success),AGI(on-off.agi,${utterance})
same => n,Hangup()

same => n(retry),agi(googletts.agi,"Lo siento, Repita la Orden",es)
same => n,goto(record)

El script de PHP:
#!/usr/bin/php -q

<?php
set_time_limit(30);
require('phpagi/phpagi.php');

$arg=$argv[1];

$agi = new AGI();
// mostramos la cadena que estamos recibiendo
Verbose("Arg: $arg");
 
        //Separamos la cadena para saber que accion tomar
        $vars=explode(" ",$arg);
        //Evaluamos la orden
        switch($vars[0]){
                // En caso de encender verificamos que led
                case 'encender':
                        if ( $vars[1] == 'led'){
                                if ( $vars[2] == '1'){
                                        exec("echo 1 > /sys/class/gpio/gpio4/value");

                                }elseif ( $vars[2] == '2'){
                                        exec("echo 1 > /sys/class/gpio/gpio17/value");
                                }
                        }

                        break;

                //En caso de apagar verificamos que led
                case 'apagar':
                        if ( $vars[1] == 'led'){
                                if ( $vars[2] == '1'){
                                        exec("echo 0 > /sys/class/gpio/gpio4/value");

                                }elseif ( $vars[2] == '2'){
                                        exec("echo 0 > /sys/class/gpio/gpio17/value");
                                }
                        }

                        break;
        }

//Colgamos la llamada
$agi->Hangup();
?>

Entonces para encender un LED hay que marcar desde un telefono *53, esperar al "beep" y enviar la orden. Este es el video de el resultado: