16 enero 2009

IRC hablado

¡Se acabaron los exámenes!

Hace unos días descubrí que algo andaba mal en mi entorno. Notaba un "algo", un repeluco, que me decía que estaba haciendo algo ineficientemente. Paso a relatar mi descubrimiento:

Como es habitual, al llegar a casa después del trabajo enciendo el PC, visito meneame, miro los feeds, miro el mail y finalmente conecto el IRC.

Las cuatro primeras cosas llevarán unos 10 minutos de tiempo de estudio no aprovechado. Esto no es nada en comparación con el tiempo que pierdo mirando constantemente la pantalla mientras estudio para saber si alguien ha hablado en el IRC.

Tengo cuaks que me alertan cuando dicen mi nombre en el chat, o cuando alguien me abre un privado. Lamentablemente, quiero enterarme todo el rato de lo que dicen y no perderme nada, da igual si me nombran o no.

¿Que solución hay para mis problemas de cuello ocasionados por tener que levantar la mirada del libro cada 5 segundos?

La solución me la proporcionó la tira de xkcd del otro día.

Hablan sobre el comando 'say' de Mac OSX. Es un sintetizador de voz que dice en voz alta lo que le pases como argumento desde la línea de comandos.

Me pareció graciosa la idea y me puse a hacer un simple 'say' para GNU/Linux usando festival. Allá va:

Primero hay que tener instalados los paquetes:

  • festival - Sintetizador de voz
  • festlex-cmu - Diccionario para festival
  • festvox-ellpc11k - Voz en español
Una vez los tenemos, hay que crear una configuración en el home para que festival use alsa en vez de oss. Simplemente, ejecutad lo siguiente como usuario:
printf ";use ALSA\n(Parameter.set 'Audio_Method 'Audio_Command)\n(Parameter.set 'Audio_Command \"aplay -q -c 1 -t raw -f s16 -r \$SR \$FILE\")\n" >> ~/.festivalrc

Ahora creamos un archivo de texto en /usr/bin/ llamado 'say' que contenga:
#!/bin/sh
echo $@ | festival --tts --language spanish

Finalmente le damos permisos de ejecución (sudo chmod +x /usr/bin/say) y listos.

Bien, una vez creado el comando, podeis probarlo ejecutando desde la consola:
say guat de fac, puedo hablar

¿Y como me ayuda esto a estudiar? Pues de la siguiente manera: haciendo un simple bot que se conecte al IRC y ejecute un say por cada línea que recibiera con el texto "$nick dice, $mensaje".

Aquí teneis el código (es bastante cutre, monocanal, no soporta acentos, etc; está hecho para mí, y me dan igual esas cosas; si tú quieres algo mejor, puedes cojer este código de ejemplo):

#!/usr/bin/perl

use IO::Socket;

my $server = 'servidor que querais';
my $port = 6667;
my $nick = 'pobrecito_hablador';
my $channel = '#canal';

my $socket = IO::Socket::INET->new(
    Timeout => 10,
    Proto => 'tcp',
    PeerAddr => $server,
    PeerPort => $port
) || die 'I can\'t connect to ' . $server . ':' . $port . "\n";

print $socket "user lol lol lol : lol\n";
print $socket 'nick ' . $nick . "\n";
print $socket 'join ' . $channel . "\n";

while (my $answer = <$socket>) {
    if($answer =~ /^PING :/) {
        print $socket "PONG :$'";
    }
    elsif ($answer =~ /^\:(\S*)!(\S*)\@(\S*)\sPRIVMSG\s(\S*)\s\:(.*)/) {
        my $from = parse($1);
        my $msg = parse($5);

        if (length($msg) > 0) {
            `say '$from dice, $msg'`;
        }
    }
}

sub parse {
    my $msg = $_[0];
    $msg =~ s/([^a-zA-Z0-9 .,]|xD+)//gi;

    return $msg;
}

Como se puede ver, hay que editar las cuatro variables del principio del archivo: $server, $port, $nick y $canal.

Saludos ;)