MixMonitor es el aplicativo de Asterisk que graba el audio de un canal en un archivo. Por defecto
mezcla ambas direcciones de la llamada — lo que el canal escucha y lo que dice — en un único
archivo mono. Eso basta para una grabación simple de un operador hablando con un cliente. Pero en
cuanto la grabación pasa a reconocimiento de voz, análisis de tono o QA scoring, un archivo
mezclado estorba: ya no se sabe quién dijo qué.
Este artículo explica cómo grabar cada lado de una llamada de Asterisk en su propio archivo con las
opciones r() y t(), cuándo conviene más la opción estéreo D y a qué hay que prestar atención.
Llamada básica
MixMonitor(filename.extension,[options,[command]])
La extensión define el formato de audio (.wav, .gsm, .sln, etc.). Un nombre de archivo relativo
acaba en el directorio de grabaciones de Asterisk, por defecto /var/spool/asterisk/monitor.
El canal debe estar contestado (Answer o Progress) antes de ejecutar MixMonitor, que no lo
hace por sí mismo. Si necesitas el archivo dentro de la misma ejecución del plan de marcado, por
ejemplo para procesarlo de inmediato, cierra la grabación con StopMixMonitor. Eso garantiza que
el archivo esté completamente escrito y disponible en disco.
Conviene conocer dos opciones antes de dividir:
aañade al archivo existente en lugar de sobrescribirlo;bguarda el audio solo mientras el canal está en puente, así que el tono de llamada y el tiempo en el IVR quedan fuera de la grabación.
Cómo grabar cada lado de la llamada por separado: r() y t()
Dos opciones escriben cada dirección del audio en su propio archivo, de forma independiente:
r(file)— el flujo receive: lo que el canal escucha;t(file)— el flujo transmit: lo que el canal dice.
MixMonitor(call.wav,r(call-in.wav)t(call-out.wav))
call.wav sigue siendo el archivo mezclado de siempre, porque el argumento del nombre de archivo es
obligatorio. Los otros dos son flujos independientes que se escriben al mismo tiempo. No es
posprocesamiento de un solo archivo, sino tres grabaciones hechas en paralelo.
En un plan de marcado AEL se ve así:
context incoming {
s => {
Answer();
MixMonitor(${UNIQUEID}.wav,r(${UNIQUEID}-in.wav)t(${UNIQUEID}-out.wav));
Dial(PJSIP/operator);
StopMixMonitor();
}
}
Usar ${UNIQUEID} en los nombres da a cada llamada su propio juego de archivos y facilita
relacionarlos después con una fila del CDR.
Cuando se usa r() o t(), MixMonitor inserta silencio en ambos archivos para mantenerlos
sincronizados entre sí. La opción n lo desactiva cuando no hace falta sincronizar.
Un solo archivo estéreo: la opción D
La opción D hace algo distinto: entrelaza ambas direcciones en un único archivo estéreo, una
dirección por canal (izquierdo y derecho). La elección es entre «dos archivos separados» y «un
archivo con dos canales de audio».
| Necesitas | Usa |
|---|---|
| Una grabación para que la escuche una persona | el archivo mezclado por defecto |
| Dos archivos que puedas enviar a distintos servicios o herramientas | r() y t() |
| Un archivo que mantiene a los hablantes separados y es fácil de mover | D |
La mayoría de los servicios de reconocimiento de voz aceptan estéreo y tratan cada canal como un
hablante distinto, así que D suele ser el camino más corto. Si tu pipeline espera un archivo por
hablante, usa r() y t().
Por qué importan los canales separados en reconocimiento de voz y analítica
Cuando operador y cliente ya están en pistas distintas, el servicio de reconocimiento no tiene que separar a los hablantes (diarización) en un flujo mezclado. Cada pista entra al reconocimiento por sí sola, con una respuesta garantizada a «quién dijo esto». Lo mismo vale para el análisis de tono o el QA scoring: cuando la entrada ya viene dividida por rol, la precisión no depende de lo bien que funcione una diarización de terceros.
También permite métricas simples sin IA: proporción de tiempo de habla, cuántas veces el operador interrumpe al cliente y el silencio al inicio de la llamada.
Grabación en PearlPBX2
PearlPBX2 inicia las grabaciones desde su manejador FastAGI. Para cada llamada revisa las reglas de
grabación (forzar activación o desactivación por número de origen o destino), fija la variable de
canal MIXMONITOR en 1 o 0, crea el registro en la base de datos y el directorio YYYY/MM/DD, y
luego ejecuta MixMonitor sobre un archivo .wav con la opción a. El resultado es un archivo
mezclado por llamada, indexado por origen, destino y uniqueid del CDR, y descargable con
GET /api/v1/recordings/<uniqueid>/ con soporte de HTTP Range. Las llamadas de cola las graba el
propio app_queue, que PearlPBX2 configura con monitor-type = MixMonitor.
Es decir, de fábrica PearlPBX2 no divide los canales. Si quieres flujos separados, MixMonitor está
en la lista blanca de aplicaciones del editor AEL, así que puedes llamarlo con r() y t() desde tu
propio plan de marcado. Ten en cuenta que una grabación iniciada así queda bajo tu responsabilidad:
el registro en la base de datos lo crea el manejador FastAGI.
Qué vigilar
- Espacio en disco. Un WAV mono de 8 kHz ocupa aproximadamente 1 MB por minuto. Con
r()yt()obtienes el archivo mezclado más dos, así que calcula unas tres veces más. Convertir las grabaciones terminadas a MP3 lo reduce. - Primero Answer.
MixMonitorsobre un canal sin contestar no graba nada útil. - Lee el archivo solo después de
StopMixMonitorsi lo usas en la misma ejecución del plan de marcado. - Consentimiento. Las reglas de grabación varían según el país. Averigua qué debes decir al llamante antes de activar la grabación.
Resumen
| Opción | Qué hace |
|---|---|
| sin opciones | un archivo mono mezclado (por defecto) |
a |
añade al archivo en lugar de sobrescribirlo |
b |
graba solo mientras el canal está en puente |
r(file) |
archivo aparte para el flujo entrante (receive) |
t(file) |
archivo aparte para el flujo saliente (transmit) |
n |
desactiva la inserción automática de silencio para sincronizar r()/t() |
D |
un archivo estéreo en lugar de dos separados (receive/transmit por canal) |
Para la lista completa de opciones, consulta la página de MixMonitor en la documentación de Asterisk.