Como eliminar el eco en llamadas: instalando OSLEC y usando fxotune

7 Sep

El eco en una señal de telefonía ocurre cuando tenemos 2 conductores a diferentes impedancias. El desacople de las mismas ocasiona que la señal se refleje y se perciba por nuestro cerebro como 2 señales diferentes. Si el eco es superior a 150ms, comienza a volverse molesto ya que como humanos nos distrae de la conversación que estamos teniendo.

En un sistema 100% VoIP el eco no existe. Definitivo: no existe. Sin embargo, dado que aún ocupamos medios analógicos para poder nosotros enviar o recibir el audio (micrófonos y altavoces), es en estos dispositivos donde el eco puede ocurrir. El punto más común donde se produce el eco es en el medio que ocupemos para conectarnos con medios 100% analógicos, como la línea telefónica, así que es responsabilidad de nuestras tarjetas o gateways, hacerse cargo de cancelar este eco, ya sea mediante hardware o software (recuerden que en VoIP, la voz al final son datos, y los datos pueden manipularse por software).

Para poder manipular el eco en Asterisk tenemos 2 opciones:

  1. Hardware: es la más cara de las opciones, ya que nos exige comprar hardware dedicado a esta función. Sin embargo, es la de mejor rendimiento ya que libera al CPU de esta carga extra.
  2. Software: justo lo contrario, es la opción más económica, pero depende del CPU para hacer el procesamiento.

Para opciones de hardware podemos comprar tarjetas que soporten esta característica. En tarjetas Sangoma podemos ir por los modelos que tengan la letra D (como la B600DE, A200DE, A101DE). El problema con estas tarjetas es que no son actualizables, es decir, no podemos comprar el módulo de cancelador de eco después. Las tarjetas Digium tienen la ventaja de que podemos adquirir el módulo de cancelador de eco por separado, asi nuestra inversión está asegurada.

En este artículo nos centraremos en las soluciones para software, ya que la mayoría de nosotros tiene equipos que no cuentan con el módulo en HW necesario para lograr esta función, y para hacerlo, primero haremos la instalación de OSLEC (Open Source Line Echo Canceller), la cual, tiene que ser compilada dentro de DAHDI.

Empezando con el trabajo: primero necesitamos conseguir el código fuente de DAHDI y también el código fuente de Wanpipe (los drivers de Sangoma que contienen la referencia a OSLEC).

cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/releases/dahdi-linux-complete-2.4.1.2+2.4.1.tar.gz
wget ftp://ftp.sangoma.com/linux/current_wanpipe/wanpipe-3.5.22.tgz
tar -zxf dahdi-linux-complete-2.4.1.2+2.4.1.tar.gz
tar -zxf wanpipe-3.5.22.tgz

Quizá se pregunten: ¿por qué descargar wanpipe si lo podemos conseguir en el código fuente de Linux? Simplemente porque wanpipe es más pequeño y tarda menos en descargarse.

Luego, creamos las carpetas necesarias dentro del código de DAHDI y copiamos la parte de OSLEC que necesitamos:

cd /usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers
mkdir staging
cp -r /usr/src/wanpipe-3.5.22/OSLEC/echo staging

En este punto, hay 2 archivos que debemos de modificar:

/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/staging/echo/Kbuild
/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/dahdi/Kbuild

Empezamos por el primero (el cual está vacio). Solo necesita que agreguemos una línea en su interior:

#
# Archivo /usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/staging/echo/Kbuild
#
obj-m += echo.o

El segundo archivo si tiene contenido. Buscamos un contenido similar a este:

# Archivo: /usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/dahdi/Kbuild

# Only enable this if you think you know what you're doing. This is not
# supported yet:
#obj-m += dahdi_echocan_oslec.o
#
# A quick and dirty way to build OSLEC, if you happened to place it
# yourself in the dahdi source tree. This is experimental. See README
# regarding OSLEC.
#obj-m += ../staging/echo/

Quitamos el comentario a las 2 lineas de código para dejarlo así:

# Archivo /usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/dahdi/Kbuild

# Only enable this if you think you know what you're doing. This is not
# supported yet:
obj-m += dahdi_echocan_oslec.o
#
# A quick and dirty way to build OSLEC, if you happened to place it
# yourself in the dahdi source tree. This is experimental. See README
# regarding OSLEC.
obj-m += ../staging/echo/

Procedemos a recompilar DAHDI desde nuestra carpeta /usr/src/dahdi-linux-complete-2.4.1.2+2.4.1


cd /usr/src/dahdi-linux-complete-2.4.1.2+2.4.1
make
make install

2 passos más: editamos /etc/dahdi/system.conf

#
# Archivo /etc/dahdi/system.conf
#
# Tomen en cuenta reemplazar sus canales por los de su equipo
# En este ejemplo tengo una tarjeta de 4 puertos FXO
fxsks=1-4
echocanceller=oslec,1-4

Y aplicamos los cambios desde el CLI de Linux:

dahdi_cfg -vv
DAHDI Tools Version - 2.4.0.1

DAHDI Version: 2.4.0.1
Echo Canceller(s): OSLEC
Configuration
======================

Channel map:

Channel 1: FXS Kewlstart (Default) (Echo Canceler: oslec) (Slaves: 01)
Channel 2: FXS Kewlstart (Default) (Echo Canceler: oslec) (Slaves: 02)
Channel 3: FXS Kewlstart (Default) (Echo Canceler: oslec) (Slaves: 03)
Channel 4: FXS Kewlstart (Default) (Echo Canceler: oslec) (Slaves: 04)

Si todo carga sin errores, ¡listo! tenemos habilitado el cancelador de eco OSLEC, que es considerablemente mejor contrarestando el eco que el default de MG2.

Estos pasos son bastante buenos para reducir el eco de nuestra línea, pero si aún así tenemos problemas, podemos usar fxotune para virtualmente, eliminar el eco remanente. Es muy sencillo de usar. El procedimiento sería el siguiente:

  1. Detenemos Asterisk para que los canales DAHDI no estén en uso
  2. Creamos el archivo /etc/fxotune.conf (se crea automáticamente usando el comando fxotune -i)
  3. Cargamos los coeficientes encontrados cada vez que arranque el sistema
  4. Reiniciamos Asterisk

Visto en código sería algo así:


/etc/init.d/asterisk stop
fxotune -i # Esto puede demorar algunos minutos
echo 'fxotune -s' >> /etc/rc.local
/etc/init.d/asterisk start 

Nota final: El fxotune debe ser ejecutado cuando Asterisk NO está corriendo. En el ejemplo anterior, estoy agregando el fxotune -s al rc.local para que cargue en automático, pero esto hará que tras el re-arranque, se ejecute hasta después de que Asterisk ya inició (lo cual no está bien). Si queremos asegurarnos que cargue siempre, podemos agregar al rc.local las instrucciones para que Asterisk se detenga, se ejecute fxotune y luego re-arranque Asterisk. Hay muchas maneras de hacer esto, pero eso escapa a la intención de este artículo.

Siguiendo todos estos pasos, el eco debe quedar prácticamente eliminado. Hasta el momento he hecho instalaciones que han mantenido eco con uno de estos pasos, pero nunca alguno que haya persistido con los 2.

¡Suerte!

  • Dariohimo

    he realizado el procedimiento, pero lo realice con dahdi+complete+2.5.0 y al realizar
    DAHDI Tools Version – 2.5.0
    DAHDI Version: 2.5.0
    Echo Canceller(s): HWEC,OSLEC
    Configuration
    ======================
    Channel map:
    Channel 1: FXS Kewlstart (Default) (Echo Canceler: oslec) (Slaves: 01)Una pregunta HWEC es una cancelador de echo de digium?Y, es lo mismo que hpec como cancelador de echo de digium ?Si sale esto con dos canceladores esta bien. en /etc/dahdi/system.com estaconfigurado oslec. reinicie el equipo todo bien y realizo llamadas bien.esa es mi duda.gracias.

    • Dario,

      OSLEC es un cancelador Open Source, y lo puedes usar en Sangoma/Digium/Openvox. Comunmente se usa el mg2, pero OSLEC da mucho mayor calidad en ambientes de alto eco. Combínalo con fxotune y es casi garantia que tu eco desaparecerá.

      Saludos,

      • Carlos

        Hola christian, ¿Para una tarjeta b600de, también es recomendable instalar OSLEC en lugar de MG2?

        • No seria necesario, porqu esa tarjeta ya viene con cancelador de eco en hardware. Solo asegúrate que el wanpipe1.conf tenga el hwec=yes

          • Buena noches Christian soy pedro del ultimo curso. Yo tengo un “problema” similar mi archivo de configuración wanpipe1.conf no me admite hwec=yes me tira error al levantarlo (tengo la v. 3.5.23 de wanrouter) pero si esta TDMV_HWEC=YES y otro HWEC_OPERATION_MODE=OCT_NORMAL ¿esta esto bien?

            antes en el system.conf tenia “echocanceller=mg2,1” y me daba esto
            >service dahdi status
            1 FXO        FXSKS       (In use) (EC: MG2 – INACTIVE)Ahora tengo “echocanceller=HWEC,1”>service dahdi status
            1 FXO        FXSKS       (In use) (EC: HWEC – INACTIVE)durante la llamanda el cancelador se activa
            1 FXO        FXSKS       (In use) (EC: HWEC – ACTIVE)

            ¿Que opinas esta todo normal? ¿Algo mas que me recomiendes para quitar mi problema ocasional de voz robotizada? Saludos y de ante mano gracias.

          • Tienes razón, me equivoqué con los valores, los tuyos son los correctos.
            El hecho que veas HWEC significa que estás usando el hardware y no el software, lo cual está bien. Para tus problemas de voz recomiendo que corras el dahdi_test y revises en que nivel estan tus tarjetas. Algo como 99.98 esta bien, pero si tienes menos que eso, puede que tenas un problema de IRQ y eso ocasione tu voz robotizada. De ser asi yo probaria cambiando las tarjetas de puertos a ver si eso corrije el problema.

            Saludos,

  • Anónimo

    Tengo una tarjeta tdm410 clon algunas ocaciones al hacer llamadas a numero fijos al hablar se escuchan por el
    Auricular un ruido o eco distorcionado ya instale OLSEC pero no he probado con fxotune ¿Este tipo de ruido puede solucionarse o es un problema de las tarjetas clones?

    • He tenido casos reportados de clientes que han experimentado problemas de ruido en las lineas con enlaces digitales (donde no deberia haber ruido) y tarjetas clones. Esto se solucionó al primer momento en que introdujeron una tarjeta Sangoma al sistema, por lo que es probable que también pueda ser la causa.

      Recuerda que el “fxotune -s” tiene que ser ejecutado *antes* que Asterisk cargue, de lo contrario no cargará los coeficientes de manera correcta y seguirás igual que como cuando empezaste.

      • Anónimo

        El día de hoy voy a hacer pruebas con el fxotune en la oficina donde tenemos el problema más notorio y ya te comentare los resultados.  En la oficina donde estoyse  corrigió con solo con el OSLEC y por ultimo hace alguna diferencia poner “OSLEC” con mayusculas o con minusculas en /etc/dahdi/system.conf  (en ocasiones pequeños detalles hacen la diferencia).

        ¿Que tarjeta me recomiendas en caso de que no se solucione el problema? Necesito al menos una que tenga de 3 a 4 puertos FXO

        Muchas gracias por tu aportes en el blog y por compartir con la comunidad tu tiempo y conocimiento.

        • Yo suelo utilizar la Sangoma A200 con 2 módulos para que tengas 4FXO. Si lo requieres también hay una modalidad con cancelador de eco en hardware, aunque es bastante más costosa. Sin embargo, usando oslec y fxotune nunca he tenido necesidad de usar un cancelador realmente.

          Saludos,

          • Anónimo

            Saludos, Christian ya corri las pruebas de fxotune y e hice los ajustes necesarios y hasta el momento si mejoro bastante

            Comparto los resultados

            ==================
            Antes de fxotune
            ==================
            fxotune -d -b 1
            Dumping module /dev/dahdi/1
            echo ratio = 0.3137 (1429.6 / 4557.0)

            fxotune -d -b 2
            Dumping module /dev/dahdi/2
            echo ratio = 0.3173 (1445.9 / 4557.0)

            fxotune -d -b 3
            Dumping module /dev/dahdi/3
            echo ratio = 0.4010 (1827.1 / 4557.0)

            fxotune -d -b 4
            Dumping module /dev/dahdi/4
            echo ratio = 0.6592 (3004.0 / 4557.0)

            ==================
            Despues de fxotune
            ==================
            fxotune -d -b 1
            Dumping module /dev/dahdi/1
            echo ratio = 0.0345 (157.0 / 4557.0)

            fxotune -d -b 2
            Dumping module /dev/dahdi/2
            echo ratio = 0.0369 (168.3 / 4557.0)

            fxotune -d -b 3
            Dumping module /dev/dahdi/3
            echo ratio = 0.0251 (114.3 / 4557.0)

            fxotune -d -b 4
            Dumping module /dev/dahdi/4
            echo ratio = 0.6592 (3004.0 / 4557.0)

            Ahora que los valores prácticamente tienden a lo recomendado, el canal 4 no esta en uso por lo que imagino que quedo igual.

            Por ultimo te comento, que por lo menos en la distribucion que estoy usando PIAAF (PBX in a FLASH) el script dahdi que esta en init.d ya incluye la carga de fxotune -s si es que se encuentra el archivo /etc/fxotune.conf y tambien para todos aquellos que tienen esta distribuion o alguna que use jabber y gtalk y esten en México (por lo menos gtalk no se puede usar para llamadas aqui)  es recomendable deshabilitarlos

            Hacemos amportal stop (o en su defecto paramos asterisk)
            en /etc/asterisk/modules.conf
             
            cambiamos las siguientes lineas
             load res_jabber.so
             load chan_gtalk.so
             
            a

             noload res_jabber.so
             noload chan_gtalk.so

            y reinciamos asterisk

            Y otro punto que no se si sea totalmente necesario en la pagina de OSLEC recomiendan deshabilitar echotraining en /etc/asterisk/chan_dahdi.conf

            Espero poder haber ayudado a alguien en base a mi experiencia y desde luego estoy dando mis primeros pasos.

            Por lo pronto ya tome en cuenta tu consejo de las tarjetas Sangoma para futuras implementaciones que que realicemos en nuestras otras oficinas, ya que realmente permite usar gabinetes para tarjetas miniITX mejorando ampliamente la estetica de la instalacion.

          • Que bueno que te dió resultados, esa era la intención del artículo.

            Te recomiendo veas el artículo que publiqué hoy sobre como hacer una caja de picnic con Elastix. Ahí ocupamos tarjetas USB con una micro PC que usa Atom, y aunque la canasta no está pensada para ser un producto final, tener el conmutador sobre la mesa si mejora la presentación (y el ruido) bastante.
            Saludos,

  • Pingback: Asterisk México» Blog Archive » Interconexión de Asterisk con otros conmutadores por R2 modificado()

  • Niot

    Tengo un problema al momento de hacer el make

    [root@localhost dahdi-linux-complete-2.4.1.2+2.4.1]# make

    -bash: make: command not found

    • Es porque seguramente estás tratando de instalarlo en una distro donde el comando ‘make’ no viene instalado por default. Consíguelo primero con yum.

  • Niot

    Instale “Development Tools” para poder usar los comandos, pero al termino de todo pude usarlo pero me salió lo siguiente, que puedo hacer?

    [root@localhost dahdi-linux-complete-2.4.1.2+2.4.1]# make

    make -C linux all

    make[1]: Entering directory `/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux’

    make -C drivers/dahdi/firmware firmware-loaders

    make[2]: Entering directory `/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/dahdi/firmware’

    Attempting to download dahdi-fwload-vpmadt032-1.25.0.tar.gz

    –2013-11-25 11:42:41– http://downloads.digium.com/pub/telephony/firmware/releases/dahdi-fwload-vpmadt032-1.25.0.tar.gz

    Resolving downloads.digium.com… 76.164.171.238, 2001:470:e0d4::ee

    Connecting to downloads.digium.com|76.164.171.238|:80… connected.

    HTTP request sent, awaiting response… 200 OK

    Length: 149360 (146K) [application/x-gzip]

    Saving to: `dahdi-fwload-vpmadt032-1.25.0.tar.gz’

    100%[======================================>] 149,360 693K/s in 0.2s

    2013-11-25 11:42:41 (693 KB/s) – `dahdi-fwload-vpmadt032-1.25.0.tar.gz’ saved [149360/149360]

    make[2]: Leaving directory `/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/dahdi/firmware’

    You do not appear to have the sources for the 2.6.32-358.2.1.el6.x86_64 kernel installed.

    make[1]: *** [modules] Error 1

    make[1]: Leaving directory `/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux’

    make: *** [all] Error 2

    [root@localhost dahdi-linux-complete-2.4.1.2+2.4.1]#

  • Niot

    esto es lo que sitio después de eso:

    HTTP request sent, awaiting response… 200 OK

    Length: 149360 (146K) [application/x-gzip]

    Saving to: `dahdi-fwload-vpmadt032-1.25.0.tar.gz’

    100%[======================================>] 149,360 693K/s in 0.2s

    2013-11-25 11:42:41 (693 KB/s) – `dahdi-fwload-vpmadt032-1.25.0.tar.gz’ saved [149360/149360]

    make[2]: Leaving directory `/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux/drivers/dahdi/firmware’

    You do not appear to have the sources for the 2.6.32-358.2.1.el6.x86_64 kernel installed.

    make[1]: *** [modules] Error 1

    make[1]: Leaving directory `/usr/src/dahdi-linux-complete-2.4.1.2+2.4.1/linux’

    make: *** [all] Error 2

  • Niot

    :S no se que puede ser, espero tu ayuda gracias

    • Antes de poder compilar DAHDI, necesitas cumplir sus dependencias. Es necesario instalar los headers del Kernel de Linux, y en CentOS esto se logra con yum install kernel kernel-devel y reiniciando la máquina.

      Sigue los mismos pasos que seguiste en el curso *antes* de tratar de compilar. Si te los brincas, te vas a topar con errores como estos.

    • Antes de poder compilar DAHDI, necesitas cumplir sus dependencias. Es necesario instalar los headers del Kernel de Linux, y en CentOS esto se logra con yum install kernel kernel-devel y reiniciando la máquina.

      Sigue los mismos pasos que seguiste en el curso *antes* de tratar de compilar. Si te los brincas, te vas a topar con errores como estos.

  • Niot

    Muchas Gracias Christian, ya pude hacer la compilación pero al ejecutar el siguiente comando me sale este mensaje:

    Connected to Asterisk 11.2.1 currently running on localhost (pid = 6392)

    localhost*CLI> dahdi_cfg -vv

    No such command ‘dahdi_cfg -vv’ (type ‘core show help dahdi_cfg -vv’ for other possible commands)

    • Richard

      Y aplicamos los cambios desde el CLI de Linux(no del CLI del Asterisk):
      dahdi_cfg -vv

  • Pingback: Ruidos y chasquidos en el conmutador Elastix.()

  • Angel

    Excelente aporte y funcionó muy bien en una Sangoma U100 que les compré la semana pasada, el único detalle es que al guardar algún cambio en la configuración se borra la línea de

    echocanceller=oslec,1-2

    en mi archivo /etc/dahdi/system.conf

    alguna solución?