ELO-330: Programación de Sistemas
Tarea 2: Eliminación de silencios en archivo de audio

Objetivos: En esta tarea usted aplicará: creación de procesos, manejo de señales, comunicación entre procesos usando pipes e integración de servicios provistos por otras aplicaciones. En este caso se solicitará servicios de GNU octave y aplay (Player for ALSA sound-card driver, Linux).

Introducción

   La transmisión de audio paquetizado utiliza técnicas de detección de la actividad de la voz (Voice Activity Detection -VAD-) para remover los paquetes con ausencia de señal de voz y así disminuir el uso de los recursos ocupados en la comunicación extremo a extremo. Varias técnicas han sido propuestas para detectar la actividad de la voz [1]. El objetivo de esta tarea es ejercitar mecanismos ofrecidos en algunos sistemas operativos para comunicar procesos y requerir servicios de aplicaciones y herramientas instaladas en un sistema. Para dar un contexto de aplicación, en esta tarea su grupo aplicará una técnica de detección de la voz descrita en [1] que se basa en una medición de la distribución de la energía del espectro de la señal de audio. En esta técnica, se dice que un paquete contiene voz si el cociente de la suma de las componentes espectrales entre 125 [Hz] y 1000 [Hz] sobre la suma de todas las componentes espectrales supera un umbral dado. Cuando esta situación es deteectada, los sistemas de comunicaciones suelen enviar un paquete muy pequeño para señalar al extremo receptor de la presencia de silencio, ante lo cual el recpetor reproduce una señal de ruido de nivel confortable para que la persona no crea que la comunicación se perdió. En esta tarea no cubriremos todo aquello, su grupo deberá reemplazar los paquetes de silencio por una señal nula y se reproducirá la versión original y aquella con el silencio removido. Formas de onda de una señal original y otra con silencio removido se muestran en la Figura 1.


Figura 1: Señal de archivo saludo. Superior: segmento de señal original; señal inferior: misma señal con segmentos de silencio de 40 [ms] removidos.

  Recordar que el foco es experimentar con los mecanismos útiles en la programación de sistemas, no llegar a una solución óptima para el problema.

Nombre: assr : removedor de silencio en stream de audio (audio stream silence removal).

Sintaxis: assr    <archivo_de_audio_original> <fracción de energía en parte baja de espectro> <tamaño de paquete> <offset> [p]

El archivo de audio original contiene muestras de audio mono canal en formato PCM, little endian, con signo y de 16 bits. La frecuencia de muestreo debe ser de 8KHz.  Puede usar este archivo de ejemplo o generar el suyo usando aplicaciones como Audacity.

La fracción de energía en la parte baja del espectro es un número real y corresponde al umbral usado para declarar que un paquete contiene silencio (aquel cuya fracción supere este umbral). Para cada paquete este umbral será comparado con el cociente entre la energía del especto en el rango de frecuencia de 125 [Hz] a 1000 [Hz] sobre el total de la energía de la señal (es decir la suma de todas las bandas de frecuencia).

El tamaño del paquete es el número de muestras de audio a ser analizada cada vez. Se sugiere usar valores entre 160 y 320 muestras equivalentes a 20 y 40 [ms] de audio a 8[KHz].

Offset permite especificar el tiempo en [ms] desde el inicio del archivo a mostrar en los gráficos generados por la aplicación.

Si el parámetro p es ingresado, assr reproduce el archivo de audio completo luego de reemplazadar por ceros los paquetes de silencio como se muestra en la Figura 1.

Descripción
   assr muestra dos gráficos de 400 milisegundos desde el tiempo especificado por offset respecto del inicio del archivo: el primer gráfico muestra el segmento de señal de audio original y el segundo muestra el segmento de la señal con silencio llevado a cero.  Si bien los gráficos muestran sólo 400 milisegundos de la señal, el procesamiento se hace sobre toda la señal.

   Luego de mostrar los dos gráficos, assr muestra un índice de compresión logrado. El índice de compresión C se calcula usando:
   C = (Número de paquetes preservados) / (total de paquetes de audio)   ; ignore los efectos de borde pues el último paquete podría ser de menor tamaño.
   assr termina cuando el usuario presiona cualquier tecla.

Evaluación de la Tarea y qué entregar: revisar las instrucciones para entregar y evaluar su tarea.

Recomendaciones
* Para analizar un archivo de audio, este código puede ser de ayuda.
* Revise uso de octave y ejemplo para generar gráficos.
* Sobre la obtención del espectro en frecuencia de un paquete: usted debe usar la transformada discreta de fourier disponible en Octave o matlab. Usted elija si desea calcular el índice de energía en baja frecuencia en su programa o en octtave (o matllab).
* Sobre reproducción de audio en Linux: Su programa se apoyará en la aplicación aplay para reproducir las muestras de audio. Por ejemplo, para reproducir el archivo de ejemplo, usted puede ejecutar:
$aplay --format=S16_LE -t raw SaludoAudacity.raw
  Naturalmente su aplicación no será probada en aragorn con la opión p.
* Más ayuda puede ser incluida en la medida que surjan vuestras preguntas.
* Haga su tarea de a poco y con tiempo. Con gusto atenderé todas sus preguntas en especial en clases y horas de atención en oficina.

Referencias
[1] I.D. Lee, H.P. Stern, and S.A. Mahmoud, “A Voice Activity Detection Algorithm for Communication Systems with Dynamically Varying Background Acoustic Noises,” Proc. Veh. Technol. Conf., vol. 2, 1998, pp. 1214-1218.