lunes, 5 de enero de 2015

Spotify vs. CD: un experimento de captura y comparación de audio

Creo que a estas alturas Spotify no necesita presentaciones. El futuro del audio doméstico pasa por la retransmisión de audio desde la Nube, el streaming, nos guste o no. Servicios como este y otros como Deezer, Rdio, Google Music o el audiófilo Tidal nos lo están demostrando ya día a día... y no podemos dejar de permanecer atentos a lo que se pueda sacar de la manga Apple tras la compra por un pastizal indecente de Beats, la conocida marca de auriculares para gente guay, que también dispone de un servicio de streaming musical extremadamente popular en Estados Unidos. 

El objetivo de este artículo es documentar un pequeño experimento, sin mayores pretensiones que las de pasar un buen rato, para  comparar la calidad dooe sonido que ofrece Spotify con respecto a la del audio en calidad CD.

Pero antes, una pequeña introducción. Prometo ser breve.

El audio almacenado en un CD está registrado a 44 Khz y 16 bits por muestra en estéreo (normalmente representado como 16/44). Esto quiere decir que se reproducen 44.100 muestras de audio por segundo, cada una de ellas con una resolución de 16 bits, para cada uno de los 2 canales existentes. Haciendo una cuenta rápida:

44.100 x 16 x 2 = 1.411.200 bps (bits / segundo)

... o lo que es lo mismo, aproximadamente:

1,35 Mbps (megabits / segundo).

Esto quiere decir que para poder escuchar audio con esta calidad emitido a través de Internet necesitamos una conexión de una velocidad igual o superior a la indicada. Aunque aparentemente se trata de una cifra modesta, no nos debemos olvidar de que estos servicios nacen con la vocación de ser globales y universales, es decir, de ser accesibles utilizando una multitud de dispositivos (ordenadores, teléfonos, tabletas...) conectados empleando tecnologías de todo tipo (cable, ADSL, 3G / 4G) y desde cualquier lugar del mundo mundial. No hay misterio alguno en esto: Ya se sabe, tener más clientes supone mayores ingresos.

Es por esta razón que con la excepción del recién llegado Tidal, aún no disponible de modo abierto en nuestro país, el resto de servicios utilizan estrategias de compresión con pérdidas con el objetivo de reducir el tamaño, y por tanto la tasa de transferencia necesaria, de los archivos de audio que se reproducen desde él.

Este tipo de compresión utiliza principios psicoacústicos y perceptuales (basados en el modo en que percibimos el sonido) para descartar aquella información sonora que, en principio, tiene menor importancia. El proceso es parametrizable, de modo que a medida que se aumenta el grado de compresión deseada el tamaño de los archivos resultantes y su tasa de transferencia asociada disminuye, pero también lo hace de un modo parejo la calidad sonora a medida que se va eliminando información de la muestra de sonido.

La pregunta es ¿hasta qué punto estas estrategias de compresión con pérdidas suponen una disminución perceptible de la calidad de sonido? En este blog ya se ha tratado anteriormente la cuestión. Concretamente, en el artículo mp3 vs. flac se analizaban de modo comparado muestras de audio en los formatos flac y alac, que utilizan compresión sin pérdidas, con sus correspondientes versiones convertidas a mp3, que como sabemos es un formato que emplea una estrategia de compresión con pérdidas. Podéis echarle un vistazo si os apetece.


No obstante, ahora que soy un usuario casi convencido de Spotify, pretendo hacer algo parecido con el audio emitido por este servicio. Trataremos de capturar el audio que se emite para poder analizarlo tranquilamente y compararlo con las mismas pistas ripeadas a partir de un CD.

Spotify dispone de dos niveles de calidad:
  • Las cuentas gratuitas están limitadas a una compresión ogg a 160 kbps. Este códec es más eficiente que mp3, por lo que a igual tasa de bits la compresión es menos destructiva y, por tanto, en principio suena mejor.
  • Las cuentas premium (de pago) emplean la misma codificación ogg, pero incrementando la tasa de bits hasta los 320 kbps.
Inicialmente nos centraremos en el servicio de pago (ogg a 320 kbps), aunque al final del artículo le meteremos mano también a alguna pista codificada a 160 kbps.

Bueno, al grano.

1. Capturando audio de Spotify

Lo primero, claro, es capturar el audio... Seguramente habrá por ahí aplicaciones que ya hacen esto directamente, pero tiene más morbo hacerlo uno mismo ¿no os parece? 

Comenzaremos descargando el cliente de escritorio de Spotify, lo instalaremos, daremos de alta una cuenta premium y activaremos el streaming en alta calidad. Si no os apetece facilitar datos de vuestra tarjeta (aunque los primeros 30 días son gratis) podéis usar una cuenta paypal desvinculada de vuestra cuenta bancaria o tarjeta de crédito / débito. Así seguro que no os cobran en un descuido.


A continuación descargaremos e instalaremos Audacity, un estupendo editor de sonido multiplataforma gratuito, desde aquí.


Nos falta un último software. Se trata de Soundflower. Soundflower es un enrutador de audio para OS X, una estupenda aplicación, también gratuita, que crea dispositivos de sonido virtuales en el sistema y permite de este modo conectar la salida de audio de una aplicación que emita sonido con cualquier otra con capacidades de grabación.


La descargamos desde aquí para instalarla a continuación haciendo doble clic sobre el paquete Soundflower.pkg.



Será necesario reiniciar el ordenador.


Tras arrancar, si abrimos Aplicaciones :: Utilidades :: Configuración de Audio Midi veremos allí los nuevos dispositivos de audio virtuales, dispositivos que lógicamente no "suenan" pero que nos permiten, como decíamos más arriba, enrutar el audio de unas aplicaciones a otras.


Lo que pretendemos hacer es algo como esto:


Como Spotify utiliza el mismo dispositivo de reproducción de audio del sistema, lo primero será indicar que este será Soundflower (alt + clic en el icono del altavoz en la barra superior del Finder).


Además, silenciaremos los sonidos del sistema, no vaya a ser que algún evento con aviso sonoro nos fastidie la grabación (Preferencias del sistema :: Sonido). Para ello desactivaremos la opción que se muestra en la siguiente captura. Insisto en el hecho de que Spotify no utiliza el dispositivo de audio en modo exclusivo como sí hacen JRiver Media Center, Audirvana, Bitperfect, etc.


Ahora abriremos Audacity y seleccionaremos el dispositivo de grabación de Soundflower.


Ya solo nos queda ejecutar Spotify y localizar la pista / disco que deseemos grabar. Comenzaremos la grabación haciendo clic en el botón rojo de Audacity y, rápidamente, iniciaremos la reproducción en Spotify. El silencio inicial lo podremos eliminar posteriormente.

Si todo ha ido bien, al momento comenzaremos a ver en Audacity la forma de onda del flujo de audio emitido por Spotify. La toma se realiza por defecto a 44 Khz (aunque esto se puede modificar fácilmente utilizando el desplegable en la esquina inferior izquierda de la ventana de Audacity). No tengo claro ahora mismo si el audio de Spotify se emite a 44 o 48 Khz, pero no creo que el remuestreo, de producirse, le haga mucho daño.




Cuando queramos podemos detener 1) la reproducción en Spotify 2) la grabación en Audacity (por este orden). Aquí tenéis el resultado tras registrar los 3 primeros temas de la maravillosa BSO de Romeo y Julieta de Abel Korzeniowski, que son las pistas que he seleccionado, más o menos arbitrariamente, para el experimento.


Los 3 fragmentos se identifican a simple vista (aunque Audacity dispone de herramientas para buscar sonido / silencios automáticamente). Ahora basta con seleccionar manualmente cada uno de ellos y exportarlo al formato que deseemos (Archivo :: Exportar selección).


Como mi objetivo es comparar cada una de las pistas capturadas de Spotify con sus correspondientes versiones obtenidas a partir de un CD exportaremos en un formato sin pérdidas (flac o wav, por ejemplo) para que una eventual recompresión a un códec con pérdidas, como mp3 o aac, no introduzca artefactos adicionales que distorsionen la comparativa. Estamos por tanto registrando el audio tal cual es reproducido por nuestro cliente de Spotify.

Y ya está. Como véis no se ha diferenciado mucho de aquello del PLAY / RECORD que hacíamos hace miles de años con las cintas de casete, ni tampoco del proceso empleado para ripear vinilos.

Por otro lado, utilizando XLD, el conocido software de extracción y conversión para OS X, obtendremos las correspondientes versiones desmaterizalizadas de estas 3 pistas, de nuevo en un formato sin pérdidas. Esto no tiene mayor misterio.



Ahora viene lo interesante, analizar el rango dinámico y el contenido espectral de las pistas capturadas. 

Un aclaración, no obstante, antes de pasar al siguiente apartado: Los que uséis Windows podéis recurrir a Virtual Audio Cable, un enrutador de audio análogo a Soundflower en Mac (aunque no gratuito). No lo he probado pero debería funcionar de un modo similar.

2. Análisis del rango dinámico y del contenido espectral

Vamos a ver cómo andan ambos conjuntos de muestras (Spotify y CD) por lo que hace a su rango dinámico. Para analizarlo he recurrido a la aplicación TT Dynamic Range Meter, que nos devuelve el conocido indicador DR, un valor entre 1 (malo) y 20 (excelente) que mide la dinámica de la pista de audio analizada. Para saber más sobre la dinámica y por qué es relevante, podéis echarle un vistazo a este artículo de la wikipedia sobre la Guerra del Volumen y a esta base de datos de DR.



Como podéis ver el resultado es prácticamente idéntico. Los tamaños de los archivos (muestras) no son exactamente iguales porque como decía antes he cortado las pistas manualmente sin tratar de alinear la versión tomada de Spotify con la de CD con precisión. Tanto las pistas que escuchamos a través de Spotify como las contenidas en el CD de esta banda sonora tienen casi exactamente la misma dinámica.

A continuación he utilizado Spek, un analizador de espectro gratuito, para ver el contenido espectral de las muestras. Aquí tenéis el resultado. Cada captura muestra la misma pista en sus dos versiones (Spotify a la derecha y rip de CD a la izquierda). Conviene hacer clic sobre la imagen para ampliarla y ver los detalles.

Pista 1 (CD izquierda, Spotify derecha):


Pista 2 (CD izquierda, Spotify derecha):


Pista 3 (CD izquierda, Spotify derecha):


Curiosamente, las versiones obtenidas a partir de Spotify (derecha) parecen tener mayor energía en la parte alta del espectro, que aparentemente se manifiesta en esa especie de grano en la imagen. No sé si será debido, quizás, a la codificación ogg que utiliza Spotify. Por otro lado en todas las capturas de ambas versiones se aprecia una banda límite en torno a los 19Khz, justo por encima de la cual nos encontramos con este fenómeno.

En cualquier caso no parecen encontrarse tampoco grandes diferencias.

3. Análisis comparativo por sustracción

Lo siguiente que haremos es invertir un grupo de pistas, por ejemplo las ripeadas de CD, y sumar su contenido, muestra a muestra, al del otro conjunto obtenido a partir de Spotify para "escuchar" las diferencias, del mismo modo que se propuso en este hilo en Audio Planet:


El problema es que para para ello es necesario alinearlas temporalmente con gran exactitud, puesto que la captura del audio emitido por Spotify se ha realizado como un flujo de audio continuo que se ha troceado a mano para obtener las 3 pistas.

Puesto que realizar esta alineación temporal manualmente es costoso, inicialmente pensé en tratar de desarrollar un pequeño script en Scilab (una especia de Matlab para pobres) que, basándose en la correlación cruzada, un coeficiente estadístico que se puede emplear para cuantificar el grado de similitud entre dos señales, tomara un par de pistas o muestras de audio (CD, Spotify) y generase un conjunto alineado temporalmente. De hecho incluso creé un pequeño prototipo que no funcionaba del todo mal:

  // Vectores de prueba
  a=[0,0,1,2,1,0,0,0,0]
  b=[0,0,0,0,0,1.1,2.2,1.3,0,0,0]

  disp("Vectores iniciales A y B:")
  disp(a)
  disp(b)

  // De momento no se usa
  //[d1,i1] =loadwave(uigetfile(["*.wav"]))
  //[d2,i2] =loadwave(uigetfile(["*.wav"]))
  //tam1=i1( 8 )
  //tam2=i2( 8 )
  //disp("Tamaño muestra 1" + string(tam1) + " bytes")
  //disp("Tamaño muestra 1" + string(tam2) + " bytes")

  // Igualar longitudes  antes de calcular correlación cruzada
  l1=length(a)
  l2=length(b)

  disp("Tamaño de vector A:"+string(l1)+" / Vector B:" +string(l2))

  if l1>l2 then
      // rellenar b con 0 por el final
      b = cat(2,b,zeros(1,l1-l2))
      disp("Se incrementa B en " + string(l1-l2)+ " muestra(s)")
  else
      // rellenar a con 0 por el final
      a = cat(2,a,zeros(1,l2-l1))
      disp("Se incrementa A en " + string(l2-l1)+ " muestra(s)")
  end

  disp("Tamaño de vector A:"+string(length(a))+" / Vector B:" +string(length(b)))

  // Cálculo de la correlación cruzada
  x=xcorr(a,b,"coeff")
  [m,p]=max(x)
  disp("Correlación máxima "+string(m)+" en offset "+string(p))
  d=p-length(a)

  // Veámos qué hay que desplazar y en qué medida
  if m<>0 then
    if d==0 then
      mprintf ('\nMuestras idénticas')
      a2=a
      b2=b
    elseif d>0 then
      disp(""Retrasar B" %i muestras',d)
      a2=cat(2,a,zeros(1,d)) // rellenar con 0 por el final
      b2=cat(2,zeros(1,d),b) // colocar 0 delante
    else // d<0
      mprintf ('\nAdelantar B %i muestras',abs(d))
      b2=cat(2,b,zeros(1,abs(d))) // rellenar con 0 por el final
      a2=cat(2,zeros(1,abs(d)),a) // colocar 0 delante
    end
  else
      mprintf('\nNo se parecen ni en pintura')
  end

  // Mostrar vectores alineados
  disp("Vectores alineados A y B:")
  disp(a2)
  disp(b2)

Este script, dados 2 vectores de enteros que no son exactamente iguales y que además están desplazados un número arbitrario de elementos:
  1. Calcula el desplazamiento necesario para que la correlación cruzada entre ambos sea máxima, esto es, ambas muestras de audio queden tan superpuestas como sea posible.
  2. Aplica el desplazamiento calculado y genera un nuevo par de vectores alineados.
Este es el resultado de la ejecución con datos de prueba:


No obstante, leyendo sobre este tipo de operaciones me di cuenta de que la cosa es bastante más complicada y llegué, afortunadamente, a un viejo conocido en el que no había caído: Audio DiffMaker.

Audio DiffMaker es una herramienta que hace justo lo que pretendemos. Esta aplicación se ha venido utilizando para detectar diferencias audibles al introducir cambios realizados en cualquier punto de la cadena de reproducción (reproductores, cables, condensadores...). No estamos hablando de pruebas ciegas ni de confiar en los números, sino en el oído, para valorar si estos cambios suponen un diferencia sónica perceptible, que en definitiva es de lo que se trata. Cito a los creadores de la aplicación:

When to use Audio DiffMaker?
Testing for audible effects of Changing interconnect cables (compensation for cable capacitance may be required).
Different types of basic components (resistors, capacitors, inductors).
Special power cords.
Changing loudspeaker cables (cable inductance may need to be matched or compensated).
Treatments to audio CDs (pens, demagnetizers, lathes, dampers, coatings...).
Vibration control devices.
EMI control devices.
Paints and lacquers used on cables, etc.
Premium audio connectors.
Devices said to modify electrons or their travel, such as certain treated "clocks".
Different kinds of operational amplifiers, transistors, or vacuum tubes.
Different kinds of CD players.
Changing between power amplifiers.
General audio "tweaks" said to affect audio signals (rather than to affect the listener directly).
Anything else where the ability to change an audio signal is questioned.

Audio DiffMaker nos va a permitir:
  • Capturar o cargar una pista de sonido que llamaremos pista de referencia (A)
  • Capturar o cargar una pista de sonido que se ha reproducido introduciendo algún cambio en la cadena de reproducción (B).
Tras ello el programa realiza un análisis de ambas pistas e introduce una serie de cambios en (B) de modo que quede alineada temporalmente con la primera, al tiempo que se ajusta su ganancia e incluso se tratan de compensar errores debidos a la deriva en la frecuencia de muestreo. La cosa tiene bastante tela, como podréis comprobar si le echáis un vistazo al "paper" del AES que explica el funcionamiento del programa:


Una vez se ha procesado la pista a comparar, Audio DiffMaker procede a "restar" las pistas, es decir, obtener una tercera pista (C), denominada pista diferencia, cuyas muestras son el resultado de sustraer, una a una, las de las pistas (A) y (B) modificada. Casi nada.


La esencia del asunto reside en escuchar esta pista (C), Difference track, obtenida por diferencia de las anteriores. Si no somos capaces de escuchar ningún sonido, a efectos prácticos, no existen diferencias entre la pista de referencia y la comparada. Lógicamente esto no implica necesariamente que ambas pistas sean numéricamente iguales muestra a muestra, sino que las muestras de ambas son lo suficientemente parecidas como para anularse hasta el punto de que no podemos percibir (escuchar) las diferencias.

Así de pragmático.

La interfaz del programa nos permite reproducir (A), (B), (V), y también una cuarta pista obtenida sumando a la de referencia la pista diferencia (A) + (C) de un modo totalmente sincronizado. Podemos ir haciendo clic en cada uno de los botones de reproducción para pasar de una a otra.


Puesto que Audio DiffMaker es en origen una aplicación para Windows, he generado con el excelente Wineskin un paquete listo para correr en  OS X. Así podéis también realizar vuestras pruebas en un Mac:


Vamos con los resultados:

Primero que nada, aquí están todas las pistas de audio (x va de 1 a 3) utilizadas por si queréis experimentar directamente con ellas (solo con fines estrictamente científicos, recordadlo bien):

- Tx.spotty.wav: Pista X capturada de Spotify
- Tx.cd.wav: Pista X ripeada del CD.
- Tx.cd @ Tx.spotty.wav: Pista X obtenida del CD alineada con la de Spotify
- Tx.cd-Tx.spotty.wav: Pista diferencia.

Y aquí tenéis en escucha directa cada una de las 3 pistas obtenidas por resta de las de Spotify y CD, junto con el espectrograma de cada una de esas pistas - diferencia:

Pista 1




Pista 2




Pista 3





Fijaos en el grano que aparece en la parte alta de los espectrogramas de los archivos diferencia. Si recordáis, veréis que las versiones capturadas de Spotify mostraban mayor energía que sus homólogas en CD por encima de los 18Khz - 19Khz. Esto se pone nuevamente de manifiesto aquí ¿Serán artefactos debidos a algún mecanismo de conformación de ruido (o similar) inherente a la propia compresión ogg? ¿O a que el master empleado por Spotify es distinto al que fue utilizado para editar los CD?

Que cada cual escuche y decida por si mismo si la diferencia es audible o no.

¿Y qué pasa con la versión gratuita de Spotify?

Decíamos al comienzo del artículo que la modalidad gratuita de Spotify emplea una codificación ogg a 160 kbps, esto es, la mitad que la versión premium.

Repitamos pues el experimento con la pista 3, comparando nuevamente la versión CD, pero esta vez con la emitida por Spotify en ogg@160 Kbps.




Dadle un poco de alegría al volumen porque esta vez sí se oye algo (cuidado al principio y al final porque suena notablemente más alto).

La correlation depth, una medida que ofrece Audio DiffMaker para valorar lo parecidas que son las pistas que se comparan, es en este caso de unos 48 dB (pésima, el valor que devolverían 2 pistas idénticas es de 300 dB).

La diferencia en este caso es clara y perfectamente audible. 

Conclusiones

La primera es que personalmente me he divertido un buen rato con todo este tinglado, que he venido orquestando a ratos a lo largo de varios meses, con pausa incluida y desencanto (temporal) con Spotify. Podéis seguir todo el proceso desde su comienzo en un hilo que abrí en Audio Planet allá por el mes de abril del año pasado:


La segunda es que Spotify ha cambiado radicalmente el modo en que consumo música. De hecho, desde que soy suscriptor de la versión premium he reducido considerablemente el volumen de descargas de sitios de torrent y similares, ya sabéis, y paradójicamente compro más música que nunca, tanto en CD como en vinilo. Y sí... Sí compro discos aún cuando Spotify me haya permitido escucharlos antes por poco más de 6 euros al mes ¿Y eso por qué? Muy fácil, porque tengo la posibilidad de descubrir más música y con mayor facilidad que nunca.

Si mi caso fuera generalizable (lo que me inclino a pensar, aunque no me atrevería a afirmar rotundamente), un zas en toda la boca para los amigos del lucro cesante, empeñados como están en proteger un modelo de negocio obsoleto a base de criminalizar al consumidor. Un consumidor que por otra parte solo espera (esperamos) una alternativa que le de acceso a un amplio catálogo musical que pueda escuchar en el dispositivo que quiera, en el momento que quiera, y a un precio razonable.

Pero bueno, dejando de lado estas cuestiones ¿me atrevo a sacar alguna conclusión general con respecto a la calidad de las emisiones de Spotify? Bueno, alguna que otra...

La diferencia entre la calidad de audio de la versión gratuita y la de pago es notable. No hacen falta tampoco grandes experimentos. Basta con escuchar durante un rato en ambas modalidades para darse cuenta de ello, al menos cuando se utiliza un equipo de reproducción de cierta calidad. Y no me estoy refiriendo a cacharros de miles de euros, sino a algo bastante más modesto.

No puedo decir lo mismo del audio emitido por Spotify Premium con respecto al de un CD original. Es obvio que no tenemos la seguridad de que el master empleado para generar la versión digital emitida por Spotify sea el mismo que el utilizado para elaborar el CD, por lo que la comparación está de algún modo sesgada. No obstante este hecho únicamente tendría relevancia si detectáramos diferencias claras, en cuyo caso no sabríamos si achacárselas a hipotéticos masters distintos o a la propia compresión con pérdidas empleada por la codificación ogg.

El caso es que escuchando estas 3 pistas seleccionadas (maravillosas, lo tengo que decir otra vez), yo no soy capaz, y lo digo con toda honestidad, de detectar diferencias audibles claras de un modo consistente entre las codificadas en ogg a 320 Kbps y las procedentes del CD, ni en audición comparada directa de cada una de las pistas ni escuchando atentamente la pista diferencia generada por Audio DiffMaker. Y lo digo con pesar, porque de veras que me gustaría poder afirmar lo contrario. Quizás mi equipo no esté a la altura; quizás las diferencias no son perceptibles en los temas escogidos pero si hubieran aflorado de utilizar otros; quizás sea mi (mala) percepción... O quizás simplemente no exista diferencia audible para el común de los mortales entre audio sin comprimir a 44/16 y ogg a 320 Kbps.

En cualquier caso, la muestra ha sido ridículamente pequeña: 3 temas de los más de 30 millones disponibles. Casi nada. Lógicamente no se puede concluir nada que sea estadísticamente significativo a partir de una muestra tan minúscula, más allá quizás de las sensaciones generales descritas.

No obstante sí tengo la fuerte impresión, tras unas semanas de uso intensivo de Spotify Premium, de que la calidad es irregular. Me explico: hay temas que suenan excepcionalmente bien, otros no tanto y algunos incluso francamente mal. Si la compresión empleada es la misma, y a falta de disponer de los cedés originales, la explicación habrá que buscarla tal vez en otra parte, quizás en la calidad del propio master utilizado por Spotify para obtener la versión en streaming.

Y eso me lleva una vez más a reconocer la importancia capital que tienen la grabación y la postproducción posterior en el estudio de cualquier registro musical, importancia que situaría solo por detrás de la correspondiente a la interacción de altavoces y acústica de la sala en el ámbito del equipo de reproducción.

Nada más, me gustaría concluir este artículo animándoos a que capturéis vuestras pistas favoritas de Spotify y las comparéis, siguiendo el procedimiento descrito, con sus versiones en CD... y a que, por supuesto, compartáis los resultados.

1 comentario :

Alicia A. Mier dijo...

¡Me encantó su estudio!

Gracias por tomarte el tiempo de compartirlo