Un módem de voz es un módem de datos telefónicos analógicos con una capacidad incorporada para transmitir y recibir grabaciones de voz a través de la línea telefónica. Los módems de voz se utilizan para aplicaciones de telefonía y contestadores automáticos . De manera similar al conjunto de comandos Hayes utilizado para los módems de datos, en el que la PC host da órdenes al módem a través de una serie de comandos conocidos como comandos AT , existe un conjunto bien definido de comandos AT de voz comunes que son bastante consistentes en toda la industria.
Dado que el modo de voz no es el uso típico de un módem, muchos módems del mercado ofrecen compatibilidad deficiente o con errores para sus modos de voz. Las características de un buen módem de voz dependen en gran medida de la aplicación prevista, e incluyen:
Cada plataforma de módem de voz tiende a admitir uno de dos conjuntos de comandos de voz; en particular, un tipo del conjunto de comandos contiene un signo más (+) y el otro contiene un signo almohadilla (#).
La compatibilidad con el modo de voz se puede detectar en un módem emitiendo el siguiente comando: AT+FCLASS=?
Este comando generalmente se admite si contiene el signo más, independientemente de si un módem admite el conjunto de comandos "más" o "hash", porque el comando (que significa "clase de fax") es parte de los comandos de fax estándar de la industria que siempre usan el signo más.
Un módem que admita voz responderá con una lista de números delimitada por comas que incluye el número 8. Un módem que no admita voz responderá con ERROR o con una lista de números que no incluya el 8. (Muchos módems informarán 0,1,2, lo que indica compatibilidad con datos (0) y faxes de clase 1 y 2; esto es una indicación de que no existe compatibilidad con voz).
Los módems que admiten el conjunto de comandos "hash" generalmente también responden a AT#CLS=?.
El comando AT+FCLASS=8 o AT#CLS=8 pondrá el módem en modo de voz. La mayoría de los módems siguen colgados y responden con OK . Una vez que se acepta este comando, la mayoría de los módems responderán con mensajes de escape de enlace de datos (DLE) en lugar de o además de las respuestas normales del módem. Por ejemplo, en lugar de informar que una línea telefónica está sonando con el mensaje RING , muchos módems enviarán el carácter ASCII DLE , seguido de la letra R. El conjunto específico de eventos DLE informados por cada módem es específico de su conjunto de chips y está documentado en su guía de referencia.
El comando AT+VLS=? o AT#VLS=? normalmente devuelve una lista de modos de funcionamiento específicos de cada módem. Cada uno de estos modos numerados determina el estado de la línea telefónica colgada o descolgada, así como el enrutamiento del sonido entre cada uno de los siguientes:
Muchos chipsets ofrecen una lista de todas las combinaciones posibles de modos, incluso si la placa de módem específica no las admite todas. Esto se debe a que el fabricante de la placa casi siempre es diferente del fabricante del chipset, y el chipset viene preconfigurado para admitir todo el hardware posible, incluso si no está implementado en la placa de circuito.
Ejemplo de respuesta a AT+VLS=? de un módem comercializado en 2006:
EN+VLS=? 0,"",0000000000,0000000000,B084008000 1, "T", 0B8418E000, 0FE418E000, 0B8419E000 2,"L",0884008000,0CE4008000,0884018000 3,"LT",0B8418E000,0FE418E000,0B8419E000 4, "S", 0084008000, 0484008000, 3084018000 5, "ST", 0B8418E000, 0FE418E000, 0B8419E000 6,"M",0084008000,04E4008000,3084008000 7, "MST", 0B8418E000, 0FE418E000, 0B8419E000 8, "S1", 0084008000,0484008000,3084018000 9,"S1T",0B8418E000,0FE418E000,0B8419E000 10,"MS1T",0B8418E000,0FE418E000,0B8419E000 11, "M1", 0084008000,04E4008000,3084008000 13,"M1S1T",0B8418E000,0FE418E000,0B8419E000 14, "H", 0084008000, 04E4008000, 3084018000 15, "HT", 0B8418E000, 0FE418E000, 0B8419E000 16,"MS",0084008000,04E4008000,3084018000 17,"MS1",0084008000,04E4008000,3084018000 19,"M1S1",0084008000,04E4008000,3084018000 20, "t", 0B8418E000, 0FE418E000, BB8419E000
Si bien cada módem es diferente, generalmente el modo 0 significa colgado y el modo 1 es suficiente para levantar el teléfono, grabar/reproducir audio y detectar DTMF (tonos táctiles).
El comando AT+VSM=? o AT#VSM=? normalmente devuelve una lista de formatos de datos de audio compatibles con el módem. Cada formato incluye un nombre (como PCM , ADPCM , μ-law , A-law ), una cantidad de bits por muestra (normalmente 2, 3, 4, 8 o 16) y una frecuencia de muestreo de audio (normalmente 7200, 8000 o 11 025 Hertz ). Se trata de códecs de audio estándar de la industria cuyas implementaciones están bien publicadas. El estándar ADPCM es una excepción. Los módems que afirman ser compatibles con ADPCM casi siempre son compatibles con Dialogic ADPCM , también conocido como "VOX", que es similar pero no compatible con otras implementaciones de ADPCM, incluidas Interactive Multimedia Association (IMA) ADPCM y MS ADPCM (una implementación de Microsoft utilizada en archivos WAV ). Los módems también pueden ser compatibles con estos, si se incluye un calificador; de lo contrario, de forma predeterminada, ADPCM significa Dialogic.
Ejemplo de respuesta a AT+VSM=? de un módem comercializado en 2006:
¿A+VSM=? 1,"PCM SIN FIRMA",8,0,8000,0,0 129,"IMA ADPCM",4,0,8000,0,0 130,"PCM SIN FIRMA",8,0,8000,0,0 140, "ADPCM de 2 bits", 2,0,8000, 141, "ADPCM de 4 bits", 4,0,8000,0,0
El formato de datos de audio deseado se selecciona con el mismo comando pero con un número en lugar de un signo de interrogación. Se utiliza tanto para enviar como para recibir.
La respuesta a las llamadas se realiza normalmente con los comandos AT+VLS=n o AT#VLS=n , donde n es un número que representa el modo del módem. Para la gran mayoría de los módems, este número será 1 para responder una llamada telefónica y 0 para colgar; otros números activan otras funciones cuando están presentes, como el altavoz del teléfono. Algunos módems responden en respuesta a ATA (el comando de respuesta estándar en modo de datos), pero otros módems lo interpretarán como un comando para responder en modo de datos y no en modo de voz.
Para comenzar a transmitir datos de audio, el host envía el comando AT+VTX o AT#VTX . Esto da como resultado una respuesta del módem de CONNECT o VCON . (Los módems que utilizan el conjunto de comandos "plus" generalmente responden CONNECT, mientras que los que utilizan el conjunto "hash" responden VCON, que significa conexión de voz).
A partir de ese momento, el módem interpreta cualquier dato enviado desde el ordenador como datos de audio de onda, utilizando el códec seleccionado mediante el comando AT+VSM o AT#VSM.
Los datos de audio siempre se envían al módem un poco más rápido de lo que puede reproducirlos, por lo que el módem puede almacenar en búfer una pequeña parte de ellos y reproducirlos sin problemas, sin clics ni ruidos provocados por demoras en el sistema operativo de la computadora. Por ejemplo, durante la reproducción de un archivo de audio de 8 kHz con una resolución de 8 bits (que crea 8000 bytes, u 80 000 bits al incluir los bits de inicio/parada, por segundo), los datos deben viajar por el puerto serie a un mínimo de 115 200 bits por segundo. (115 200 bit/s es el primer valor de un puerto serie de computadora típico que es mayor que 80 000). Además, debido a cierta sobrecarga adicional involucrada en la duplicación de bytes DLE en la transmisión (mencionada a continuación), es obligatoria una pequeña cantidad de ancho de banda adicional para permitir esto.
Cuando el módem desea que la computadora haga una pausa temporal para que la reproducción pueda ponerse al día, reduce temporalmente la señal CTS (Listo para enviar) en el puerto serial RS-232. El módem vuelve a aumentar la señal a tiempo para que la computadora reanude el envío de datos de audio antes de que el búfer de reproducción se vacíe por completo.
Cuando la computadora desea señalar el final de los datos de audio, la mayoría de los módems esperan ver un carácter ASCII DLE (0x10), seguido del carácter !.
Dado que el byte DLE puede aparecer (y aparece a menudo) en datos de audio normales, debe enviarse dos veces al módem cuando se debe interpretar como un byte de datos de audio.
La mayoría de los módems también aceptan una secuencia de DLE + CAN (cancelar) como señal para cancelar la reproducción de audio. La diferencia es que el módem debe entender que debe abortar inmediatamente la reproducción en lugar de dejar que los datos restantes en el búfer de reproducción se ejecuten hasta completarse.
Cuando el módem termina de reproducir, responde OK .
Durante la reproducción, es necesario enviar los datos de audio a una velocidad que permita que el audio se reproduzca sin problemas, pero sin enviarlo más rápido de lo que el módem puede manejarlo. También es conveniente asegurarse de que el módem siempre pueda cancelar la reproducción y descartar cualquier audio almacenado en búfer en caso de que se deba cancelar un mensaje. La cancelación de mensajes es algo que esperan los usuarios que llaman y que ya conocen las respuestas a los mensajes de voz y dan su respuesta con anticipación (y que se irritarían si se les obligara a escuchar un mensaje al que ya respondieron).
Hay varias maneras de mantener la computadora enviando datos de audio al módem a una velocidad que permita seguir el ritmo de la reproducción sin saturar el búfer de audio.
La forma más sencilla es utilizar el control de flujo CTS. Existen las siguientes advertencias.
Una segunda forma de limitar la reproducción consiste en consultar un temporizador de "tick" proporcionado por el sistema operativo del ordenador anfitrión y basado en un reloj de hardware que es independiente de la carga de la CPU del ordenador anfitrión. Esto puede estar disponible o no, y depende totalmente del sistema operativo del ordenador anfitrión. Sin embargo, cuando está disponible, es extremadamente fiable. Es razonable suponer que el ordenador necesita adelantarse a la reproducción un par de cientos de bytes y que el módem almacenará esto en el búfer. (Los comandos AT+VBQ o AT#VBQ en los módems de voz suelen revelar el tamaño del búfer en bytes, y de 1 a 2 kilobytes es una respuesta típica).
Una tercera forma de limitar la reproducción implica insertar mensajes DLE ficticios en el flujo de salida de modo que los datos de audio tarden una cantidad de tiempo conocida en transmitirse a través del puerto serial, y la reproducción esté esencialmente sincronizada por el UART en el puerto serial.
Por ejemplo, al considerar el uso de relleno DLE ficticio, primero se deben tener en cuenta algunas cosas. En un escenario típico, un segundo de audio puede ser de 8000 muestras de un byte, y con un pequeño porcentaje de las muestras que son iguales al byte DLE y deben duplicarse, un segundo típico de audio puede ser de 8050 bytes. El truco consiste en insertar suficientes mensajes DLE sin sentido en los bytes que el módem descartará (es decir, un DLE seguido de un byte sin ningún significado específico) de modo que haya exactamente 11 520 bytes (suponiendo que un puerto serie está bloqueado a 115 200 bit/s) que tardarán exactamente 1 segundo en transmitirse a través del puerto serie. Aunque es posible que la latencia de interrupción en la PC host pueda hacer que se envíen un poco menos de 11 520 bytes por segundo, la mayoría de los módems de voz almacenarán en búfer suficientes bytes antes de comenzar realmente la reproducción para permitir un pequeño sesgo en este punto. También se puede programar la PC para convertir un segundo de audio en algo menos de 11.520 bytes (todos los módems de voz almacenarán en búfer un pequeño desbordamiento sin necesidad de control de flujo, siempre que no sea más que unos pocos cientos de bytes).
Es poco probable que el relleno de DLE ficticio funcione con "Winmodems" que no tienen UART físico. Solo tiene sentido con módems seriales externos que están sincronizados físicamente a una velocidad de bits específica mediante un generador de reloj detrás del puerto serial externo.
El método para grabar datos de audio es el mismo, excepto que el comando es AT+VRX o AT#VRX y el módem transmite datos de audio mientras la computadora los recibe. El control de flujo RTS/CTS no se utiliza aquí (la computadora debe aceptar todos los datos de audio que recibe y el módem ajusta automáticamente su transmisión para que coincida con la frecuencia de muestreo de audio).
El módem nunca deja de transmitir hasta que la computadora le indica que se detenga, lo que suele hacerse con CTRL-C. Los datos siempre terminan con DLE+!, y todos los bytes DLE que aparecen naturalmente en el flujo se envían dos veces para diferenciarlos de los mensajes DLE normales.
Antes, durante y después de la grabación, el módem puede notificar al host de la computadora sobre eventos específicos, incluidos, entre otros, los siguientes:
Cuando el módem desea informar al host sobre estos eventos, envía un byte DLE, además de un mensaje (normalmente) de 1 byte que describe el evento. La lista de eventos admitidos varía según el módem, pero normalmente un dígito (así como * y #) significa que se presionaron tonos táctiles, y la letra "s" significa que se detectó silencio. Algunos módems informan solo un evento por cada pulsación de tecla de tono, mientras que otros informan de una pulsación de tecla repetida hasta que se suelta la tecla y luego un evento especial de "tecla liberada".
Generalmente, cualquiera de los siguientes comandos hace que el módem cuelgue y finalice una llamada de voz: AT+VLS=0 , AT#VLS=0 , ATH , ATZ . Esto también suele lograrse si se elimina la señal RS-232 DTR (terminal de datos listo). El módem permanece en modo de voz (excepto en el caso de ATZ).
Los módems de voz no cuelgan automáticamente aunque lo haga la persona que llama en el otro extremo. Pueden informar de los eventos de colgado, tono de marcado o silencio, pero la computadora es la que debe actuar en consecuencia. Si cuando el módem está grabando, la persona que llama cuelga y la computadora no reacciona, el módem seguirá proporcionando la grabación de audio de todo lo demás que se escuche en la línea, como tonos de marcado, mensajes de error de la compañía telefónica, etc.
El estándar AT de Hayes ayudó a promover la aceptación generalizada de los módems de datos porque los programas podían simplemente enviar el AT-mumble-this y AT-mumble-that adecuados, y cualquier módem que hable el estándar AT sabrá qué hacer. Parece que también ha surgido un estándar similar, AT+V, para módems de voz. El conjunto de comandos AT+V consta de comandos con prefijo AT de Hayes y comandos de voz con prefijo +V. AT+V está documentado como estándar ANSI/TIA/EIA IS-101 titulado "Interfaces digitales de fax: estándar provisional de control de voz para DCE asíncrono". Una continuación de esta especificación es PN-3131 del Subcomité Técnico TR-29.2 de TIA.