Skip to main content.

Archive for the ‘Teléfonos IP’ Category

Provisionamiento Linksys SPA9XX

Miércoles, Enero 16th, 2008

Hace poco he necesitado hacer un poco de mass-deployment de teléfonos Linksys SPA922. La verdad es que son terminales que me gustan mucho. He probado los Thompson,los Grandstream y Snom de gama baja/media y la verdad es que para terminales comunes, no de operadora, me quedo con los Linksys: son bonitos y fiables.

El problema me llega cuando busco en Google ficheros de ejemplo sobre el provisionamiento de Linksys. No encuentro ningún ejemplo y tampoco explicaciones claras sobre cómo hacerlo. Bien, esto me pasa por no leerme completito el manual de administrador de los terminales donde en un párrafo se explica bien claro. El motivo de este post es que otro no pierda el tiempo que he perdido yo buscando en google algo tan sencillo.

Un fichero de provisionamiento de Linksys SPA9XX no es más que un fichero XML y es bastante sencillo de hacer. Voy a poner el ejemplo de un SPA922 pero es bastante generalizable a toda la gama.

Lo primero es saber que toda la configuración va en un fichero al que llamaremos spa922.cfg. El fichero admite todas las opciones que vemos normalmente en el interfaz web del terminal sin más que respetar algunas convenciones:

  • Los espacios en las opciones se sustituyen por guiones bajos
  • Las opciones asociadas a una línea han de llevar _X_ al final del nombre de la opción. X hace referncia al número de línea.
  • El fichero empieza y termina con las etiquetas <flat-profile></flat-profile>.

Pongo aquí un ejemplo de fichero. En realidad de dos porque las opciones comunes a todos los teléfonos se ponen en un único fichero y después las opciones particulares, tales como los datos de acceso, se ponen en ficheros individuales para cada teléfono. El genérico es el antes mencionado “spa922.cfg” y el particular es “spa922-${MAC}.cfg”

  1.  
  2. <flat-profile>
  3.  
  4.   <!– PROVISIONING –>
  5.   <resync_periodic>10</resync_periodic>
  6.   <resync_error_retry_delay>20</resync_error_retry_delay>
  7. <profile_rule>/spa922-MAC/spa922-$MA.cfg</profile_rule>
  8.  
  9.   <!– SYSTEM –>
  10.   <enable_web_server>yes</enable_web_server>
  11.   <enable_web_admin_access>yes</enable_web_admin_access>
  12.   <dhcp>yes</dhcp>
  13. <primary_ntp_server>10.10.10.1</primary_ntp_server>
  14.   <enable_vlan>no</enable_vlan>
  15.   <enable_cdp>no</enable_cdp>
  16.  
  17.   <!– SIP –>
  18.   <max_forward>70</max_forward>
  19.   <max_redirection>5</max_redirection>
  20.   <max_auth>2</max_auth>
  21.   <sip_user_agent_name>$VERSION</sip_user_agent_name>
  22.   <sip_reg_user_agent_name>$VERSION</sip_reg_user_agent_name>
  23. <dtmf_relay_mime_type>application/dtmf-relay</dtmf_relay_mime_type>
  24.   <use_compact_header>no</use_compact_header>
  25.   <rtp_port_min>8000</rtp_port_min>
  26.   <rtp_port_max>11000</rtp_port_max>
  27.   <symmetric_rtp>yes</symmetric_rtp>
  28.   <stun_enable>no</stun_enable>
  29.  
  30.   <!– REGIONAL –>
  31.   <time_zone>GMT+01:00</time_zone>
  32.  
  33.   <!– PHONE –>
  34.   <voice_mail_number>451</voice_mail_number>
  35.   <text_logo>Irontec%0ai::voz</text_logo>
  36.   <extension_1_>1</extension_1_>
  37.   <share_call_appearance_1_>private</share_call_appearance_1_>
  38.  
  39.   <!– EXT 1 –>
  40. <line_enable_1_>yes</line_enable_1_>
  41.   <subscription_expires_1_>3600</subscription_expires_1_>
  42.   <sip_port_1_>5060</sip_port_1_>
  43. <proxy_1_>10.10.10.1</proxy_1_>
  44.   <use_outbound_proxy_1_>no</use_outbound_proxy_1_>
  45.   <register_1_>yes</register_1_>
  46.   <make_call_without_reg_1_>no</make_call_without_reg_1_>
  47.   <register_expires_1_>3600</register_expires_1_>
  48.   <use_dns_srv_1_>no</use_dns_srv_1_>
  49.   <use_auth_id_1_>No</use_auth_id_1_>
  50. <preferred_codec_1_>G711a</preferred_codec_1_>
  51.   <use_pref_codec_only_1_>no</use_pref_codec_only_1_>
  52.   <g729a_enable_1_>yes</g729a_enable_1_>
  53.   <g723_enable_1_>no</g723_enable_1_>
  54.   <g726-16_enable_1_>no</g726-16_enable_1_>
  55.   <g726-24_enable_1_>no</g726-24_enable_1_>
  56.   <g726-32_enable_1_>no</g726-32_enable_1_>
  57.   <g726-40_enable_1_>no</g726-40_enable_1_>
  58. <dtmf_tx_method_1_>auto</dtmf_tx_method_1_>
  59.   <dial_plan_1_ ua="na">(1xxS0|2xxS0|6xxxxxxxxS0|9xxxxxxxxS0|xx.)</dial_plan_1_>
  60.   <enable_ip_dialing_1_ ua="na">No</enable_ip_dialing_1_>
  61.  
  62.   <!– User –>
  63.   <time_format>24hr</time_format>
  64.  
  65. </flat-profile>
  1. <flat-profile>
  2.  
  3.   <display_name_1_>Jon Bonilla</display_name_1_>
  4.   <user_id_1_>205</user_id_1_>
  5. <password_1_>secretillo</password_1_>
  6.  
  7. </flat-profile>

Una vez tenemos los dos ficheros, sólo necesitamos que el terminal sepa dónde encontrarlos. Hay varias maneras de hacerlo; la que he escogido es tener un servidor tftp en mi asterisk que sirva los ficheros al teléfono. Para ellos debemos instalar un servidor tftp. Para ellos como root instalamos atftp:
apt-get install atftpd
Editamos /etc/default/atftpd para decirle dónde estará nuestro directorio de tftp. En mi caso /tftpboot:
USE_INETD=true
OPTIONS="--daemon --port 69 --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftpboot"

Creamos el directorio /tftpboot y ponemos ahí el fichero general spa922.cfg. Después creamos el directorio “/tftpboot/spa922-MAC” donde irán los ficheros particulares de cada teléfono. Por ejemplo el “spa922-000e08de2995.cfg”

Ahora ya tenemos todo preparado. Sólo queda hacer saber al terminal dónde ha de buscar el servidor tftp. Para ello, lo que hacemos es pasarle una option desde el servidor dhcp cuando el terminal hace una petición. En el fichero de configuración del servidor dhcp /etc/dhcp3/dhcpd.conf tendríamos algo así:


subnet 10.10.10.0 netmask 255.255.255.0
{
range 10.10.10.100 10.10.10.254;
option domain-name-servers 212.55.8.132;
option routers 10.10.10.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.10.10.255;
option tftp-server-name "10.10.10.1";
}

Después de esto, tenemos que cuando enchufemos a la red el terminal nuevo éste cogerá la dirección de red del servidor, comprobará que hay un servidor tftp en el que encontrará sus ficheros de configuración y tendremos el terminal listo para usar sin haber tenido que tocar para nada el terminal o haber accedido a la configuración web. Esto es una gran ventaja en cuanto el número de terminales a implantar es mayor de unos pocos. Además si por alguna razón tenemos un usuario torpe y mete la pata, basta con reinicar el teléfono y éste se volvería a configurar con los valores correctos.

Para más parámetros a configurar en los terminales lo mejor es verlos todos detallados en el manual de linksys.

Integración de Verbio en Asterisk

Miércoles, Mayo 23rd, 2007

VerbioVerbio es un sistema de reconocimiento y síntesis de voz (ASR y TTS) independiente del locutor. Mediante un AGI podemos llamar a Verbio para así crear un IVR controlado mediante voz en vez de marcaciones.

Usando las diferentes gramáticas que nos ofrece Verbio o las creadas por nosotros mismos, podemos reconocer teléfonos, DNI, nombres y lo que se nos ocurra. Esto permite una interacción mucho más natural con nuestra centralita Asterisk que la típica marcación para navegar un menú.

Supondremos Verbio instalado y configurado ya en nuestro servidor por lo que no hablaremos de la configuración de Verbio. Eso sería material de otro artículo.

Un ejemplo sencillo: La centralita da un mensaje de bienvenida a una llamada entrante. Pide el nombre de Juan o de Pepe para transferir a la extensión adecuada o se disculpa y pide de nuevo el nombre si no ha entendido lo dicho.

DIALPLAN:

exten => 888,1,NoOp(Llamada entrante)
exten => 888,n,Playback(bienvenido_diga_nombre)
exten => 888,n,Goto(889,1)
exten => 889,1,AGI(ASR.agi|nombres.txt|ISOLATED|2|5000)
exten => 889,n,GotoIf($[$[${VASR_RESULT} != ERROR] & $[${VASR_SCORE}>${UMBRAL}]]?400,1:401,1)
;
;Si no hay error en el reconocimiento
;si juan vete a juan y si no vete a pepe
exten => 400,1,n,GotoIf($[${VASR_RESULT} = JUAN]?200,1:201,1)
;
;Si hay error en el reconocimiento disculpas y vuelve al ASR
exten => 401,1,Playback(no_he_entendido_repita)
exten => 401,n,Goto(889,1)
;
exten => 200,1,NoOp(Extension de Juan)
exten => 201,1,NoOp(Extension de Pepe)
;
;si queremos tts
exten => xxx,1,AGI(TTS.agi|es|laura|Hola mundo hoy es ${DIA_DE_LA SEMANA})

El ASR.agi es un script que recibe como parámetro el tipo de gramática así como el fichero de gramática que vamos a usar. De esta forma, podemos usar el mismo AGI para interpretar nombres, números…

Su funcionamiento es muy simple: Graba lo que el usuario ha dicho, ejecuta el cliente de verbio para ASR y devuelve el valor reconocido así como una puntuación que nos indica lo fiable que ha sido el reconocimiento. Estos valores son los que utilizamos en el dialplan para saltar a una u otra extensión.

ASR.agi:

  1. #!/usr/bin/perl
  2. use strict;
  3. #
  4. $|=1;
  5. #
  6. # Setup some variables
  7. my %AGI; my $tests = 0; my $fail = 0; my $pass = 0;
  8. #
  9. #
  10. #Recogemos las cosas que nos pasa asterisk
  11. while() {
  12. last unless length($_);
  13. if (/^agi_(w+):s+(.*)$/) {
  14. $AGI{$1} = $2;
  15. }
  16. }
  17. #
  18. #Ahora unas cuantas variables mas
  19. my $uid     = "$AGI{uniqueid}";
  20. my $ruid     = sprintf("%d", $uid);#%d signed int, %u unsigned int
  21. my $asr_cfg     = "es";
  22. my $lang     = "es";
  23. my $voc_file     = $ARGV[0];
  24. my $gram_type     = $ARGV[1];
  25. my $rectime     = $ARGV[3];
  26. my $vf2t_cmd    = "verbiof2t";
  27. my $result     = 0;
  28. my $basedir     = "/var/lib/asterisk/verbio";
  29. my $vf2tpath     = "/usr/bin";
  30. my $verbiowavedir = "audio";
  31. my $myrecpath     = "$basedir/$verbiowavedir";
  32. my $voc_path     = "$basedir/gram";
  33. my $myrecfile     = "verbio-rec-$ruid";
  34. my $codec     = "alaw";
  35. my $skip     = "0";
  36. my $silence     = $ARGV[3]
  37. my $offset     = "0";
  38. my $voxserver     = "127.0.0.1";
  39. #
  40. #
  41. #Vamos a grabar lo que se dice
  42. print STDERR "Empezamos a grabarn";
  43. print "RECORD FILE  $myrecpath/$myrecfile $codec $stoprec $rectime $offset $playbeep s=$silence n";
  44. my $result = <STDIN> ;
  45. #
  46. #
  47. # Creamos el comando de reconocimiento
  48. my $comando = "/usr/bin/verbiof2t -l $lang -g $voc_path/$voc_file -t $gram_type -f $myrecpath/$myrecfile.$codec -c $codec -d $ruid -s $voxserver -k $skip";
  49. #ahora ejecutamos el comando
  50. system($comando);
  51. my $result = <STDIN> ;
  52. #
  53. open VF2T, "$comando |" or die "Error en ejecucion del cliente verbio";
  54. my $data = ;
  55. my @datax = split(‘:_##_:’, $data);
  56. close VF2T;
  57. #
  58. my $exit_value=$? >>8;
  59. if( $exit_value != 1)
  60. {
  61. print "SET VARIABLE VASR_RESULT \"ERROR\"n";
  62. unlink($myrecpath."/".$myrecfile.".".$codec);
  63. }
  64. #
  65. #
  66. #Quitar espacios de las variables
  67. $datax[0] =~ s/ /_/g;
  68. $datax[1] =~ s/ /_/g;
  69. $datax[2] =~ s/ /_/g;
  70. #
  71. #Redondeo del score
  72. $datax[2] = sprintf("%d", $datax[2]);
  73. #
  74. #Seteamos las variables de asterisk
  75. print "SET VARIABLE VASR_INDEX $datax[0]n";
  76. print "SET VARIABLE VASR_RESULT $datax[1]n";
  77. print "SET VARIABLE VASR_SCORE $datax[2]n";
  78. #
  79. #
  80. print STDERR "ASR terminadon";
  81. #
  82. #borramos ficheros temporales y salimos
  83. unlink($myrecpath."/".$myrecfile.".".$codec);

Se puede ver que el script setea las variables VASR_RESULT con el resultado del ASR y VASR_SCORE con la puntuación obtenida. En el dialplan se comprueba que el resultado no sea ERROR y que la puntuación supere un cierto umbral de fiabilidad para que el ASR se considere correcto.

En este ejemplo hemos usado el tipo de gramática ISOLATED y un fichero de gramática nombres.txt. EL fichero de gramática es muy sencillo: Es un fichero de texto con las salidas del ASR asociadas a las entradas esperadas y separadas mediante un tabulador:

NOMBRES.TXT:

JUAN juan
PEPE pepe

Es importante observar, que sea cual sea la entrada del usuario, Verbio lo interpretará como una de las entradas esperadas y por lo tanto, aunque se diga patata, Verbio nos devolverá JUAN o PEPE. Naturalmente, la puntuación del reconocimiento será menor y podemos dar por inválido el reconocimiento en el dialplan al no haber superado ${UMBRAL}.
El valor de UMBRAL es algo que se ha de estimar después de hacer pruebas, pero un valor de 25-30 para una gramática ISOLATED de este ejemplo es una buena aproximación.
La parte del TTS es casi idéntica a la de ASR: Un script que genera un fichero de audio a partir del texto que se le pasa como parámetro y que lo reproduce.

TTS.agi:

  1. #!/usr/bin/perl
  2. use strict;
  3. #
  4. $|=1;
  5. my %AGI; my $tests = 0; my $fail = 0; my $pass = 0;
  6. #
  7. #
  8. #Recogemos las cosas que nos pasa asterisk
  9. while() {
  10. last unless length($_);
  11. if (/^agi_(w+):s+(.*)$/) {
  12. $AGI{$1} = $2;
  13. }
  14. }
  15. #
  16. #Ahora unas cuantas variables
  17. my $uid = "$AGI{uniqueid}";
  18. my $ruid = sprintf("%d", $uid);
  19. my $language     = $ARGV[0];
  20. my $speaker     = $ARGV[1];
  21. my $text    = $ARGV[2];
  22. my $textfile     = "verbio-tts-$ruid.txt";
  23. my $wavefile     = "verbio-tts-$ruid";
  24. my $result     = 0;
  25. my $basedir         = "/var/lib/asterisk/verbio";
  26. my $verbiowavedir     = "audio";
  27. my $verbiotextdir     = "text";
  28. my $text2filedir     = "/usr/bin";
  29. my $vt2f_cmd        = "verbiot2f";
  30. my $voxserver         = "127.0.0.1";
  31. my $codec         = "alaw";
  32. my $sounddir         = "$basedir/$verbiowavedir";
  33. my $textfiledir     = "$basedir/$verbiotextdir";
  34. #
  35. #
  36. # Vamos a crear un fichero de texto con los parametros que nos pasa el asr por medio de asterisk
  37. open(fileOUT, ">$textfiledir"."/$textfile");
  38. print fileOUT "$text";
  39. close(fileOUT);
  40. #
  41. #Generamos el fichero audio para poder reproducirlo
  42. my $comando = $text2filedir."/$vt2f_cmd -l $language -k $speaker -t $textfiledir/$textfile -f $sounddir/$wavefile -c $codec -d $ruid -s $voxserver";
  43. system($comando);
  44. #
  45. #
  46. my $filetoplay = $sounddir."/".$wavefile;
  47. print "STREAM FILE $filetoplay \"#\"n";
  48. #

Con esto ya tenemos una implementación sencilla de Verbio integrado en Asterisk. Hacer un menú personalizado, mejorar los TTS con el uso de variables y usar diferentes gramáticas es trivial a partir de este punto.

Para terminar con este post sólo queda comentar lo bueno y lo malo de mis primeras experiencias con Verbio y Asterisk.

LO BUENO:

  • Verbio es independiente del locutor y no requiere entrenamiento previo para reconocer voces en un ASR.
  • El reconocimiento tiene muy buen desempeño en ficheros de gramática pequeños.
  • El servicio técnico de Verbio ha sido sencillamente genial en cada llamada que le hemos hecho con dudas y problemas.
  • Desarrollado por empresa catalana, verbio ofrece gramáticas para castellano, euskera, gallego y catalán entre otras.

LO MALO:

  • Las gramáticas buit-in de Verbio no se han comportado tan bien como la ISOLATED. En concreto, la de telefonía, aunque reconoce muy bien el número dado, no devuelve un score fiable.
  • La documentación que viene con Verbio es insuficiente y anticuada.
  • Los paquetes debian que hemos usado eran rpm “alienizados”. Faltaba una librería que hubo que pedir al servicio técnico de Verbio.
  • Verbio no es software libre.

CONCLUSIONES

Por las pruebas que hemos hecho, se puede usar verbio para un IVR controlado por voz o para recoger datos de clientes que llamen para dejarlos (un concurso o una reserva de billetes por ejemplo) siempre y cuando haya una extensión con un operador humano que coja las llamadas fallidas.

Hemos comprobado que muy por encima del error técnico (fallos de reconocimiento o de la centralita) esta el error social: Mucha gente no se siente cómoda hablando con un operador artificial y no hace caso de las instrucciones, por muy sencillas que estas sean; esta gente ha de tener el recurso de poder acceder a un operador humano. Aún no se puede dejar todo en manos de la máquina.

ACTUALIZACIÓN: Ahora ya hay una forma de usar verbio directamente desde dialplan sin necesidad de usar AGIs. En este mismo blog se puede encontrar una entrada al respecto.

Nokia se decanta por SIP

Domingo, Octubre 1st, 2006

Nokia N80i Internet Edition - SIP

A menudo resulta que una pequeña gota es la responsable de que la balanza se incline de uno u otro lado. Ya pasó hace tiempo con los formatos de vídeo analógico Betamax y VHS, está pasando con los formatos de tarjetas de memoria flash y pasará con el soporte para la alta definición digital Blue-ray vs HD-DVD.

El mundo de la telefonía IP no iba a ser menos y desde hace tiempo existe una dura batalla por la supervivencia y egemonía en el mercado de la tarificación por minutos IP, un mercado incipiente que ya maneja una cifra de negocio de millones de dolares a nivel mundial. Aunque no es descabellado vaticinar que en un futuro no muy lejano la telefonía tradicional dejará de existir tal y como la conocemos hoy en día, dando paso a otros sistemas telefónicos mucho más económicos y dimensionables como la voz sobre Internet, la migración será paulatina y coexistirán durante años ambos sistemas.

En esta batalla el mercado ha seleccionado dos protocolos de señalización como aspirantes al trono: SIP y Skype. El uno es un estandar abierto de la IETF y el otro en un protocolo cerrado de una las empresas que mejor definen lo que se conoce como Burbuja Internet. Los fabricantes de terminales de telefonía, bien sean de VOIP o duales móviles (GSM-WIFI+VOIP), están jugando sus cartas y apostando por uno u otro intentando ser partícipes de esa batalla.

Nokia, la empresa fabricante de moviles más importante a nivel mundial y, sin duda, una de las piezas claves en esta balanza, se ha decantado por el estandar SIP. Sus nuevos teléfonos N80i (Internet Edition) vienen provistos de un cliente de voz IP (a través de la interfaz WI-FI que dispone) que permite configurar una cuenta SIP que dispongamos con alguno de los múltiples proveedores que ofrecen este servicio. Esta decisión estratégica de Nokia, no solo nos permite cambiar de operador de telefonía IP, acceder a un mercado de libre competencia y posibilita un mayor desarrollo de economías locales, sino que refuerza la importancia del uso e implementación de estándares abiertos y libres.

Provisión TFTP para teléfonos Linksys

Jueves, Septiembre 7th, 2006

TFTP en telefoní­a IPEn instalaciones de telefonía IP con un número considerable de teléfonos la posibilidad de autoconfiguración de los mismos se torna como una opción muy a tener en cuenta por las comodidades que brinda. No sólo porque minimiza el tiempo de configuración de todos los terminales, sino porque permite actualizaciones y cambios de parámetros bajo demanda.

Por ejemplo: imaginemos que llevamos a cabo una instalación de Voz-IP con 20 teléfonos y desechamos la idea de la autoconfiguración. No sólo perdemos un tiempo considerable configurando a mano cada terminal, sino que ante la necesidad de cambiar cualquier parámetro de forma global deberemos configurar, de nuevo, terminal a terminal con el coste que lleva implícito.

Detallaré a continuación cómo preparar un servidor Debian Sarge para la autoconfiguración de X teléfonos Linksys SPA901 conectados todos ellos a la misma red.

(más…)

2005 © Irontec S.L. :: Powered by Irontec & Wordpress
[ IRONTEC S.L. - C.I.F. B-95274890 ]
[ Ctra. Basurto-Kastrexana nº70 / Enpresaldea ]
[ 48002 - Bilbao - Bizkaia ]