grabación de audio desde un reproductor de audio basado en la web utilizando un dispositivo de bucle ALSA

9

Estoy tratando de guardar los mensajes de correo de voz del teléfono Verizon Fios con la mejor calidad posible. Los mensajes de correo de voz están disponibles en línea , pero solo para jugar (reproductor basado en Java), sin guardar. Oficialmente, no hay una forma compatible de cómo guardar mensajes de voz digitales originales como archivos del servicio Fios Digital Voice (sin servicio de pago, sin nada, sin razón alguna).

Mi única idea era grabar datos digitales del reproductor mientras se dirigía a la tarjeta de sonido. Intenté la configuración de Linux ALSA con el dispositivo de bucle.

# cat /etc/asound.conf

# default device
pcm.!default {
    type plug
    slave.pcm "loop"
}

# output device
pcm.loopout {
    type dmix
    ipc_key 328211
    slave.pcm "hw:Loopback,0,0"
}

# input device
pcm.loopin {
    type dsnoop
    ipc_key 686592
    slave.pcm "hw:Loopback,1,0"
}

# duplex plug device
pcm.loop {
    type plug
    slave {
      pcm {
         type asym
         playback.pcm "loopout"
         capture.pcm "loopin"
      }
    }
}

Esto parece estar funcionando y graba audio, por ejemplo, cuando se reproduce algo en Youtube, la salida de audio va al dispositivo de bucle (salida de audio predeterminada) y puedo capturarlo (no estoy seguro de cómo funciona exactamente, probé 44.1kHz y 48 Khz )

arecord -f cd -D loop | aplay -f cd -D hw:0,0
arecord -f dat -D loop | aplay -f dat -D hw:0,0

Pero cuando traté de capturar la salida del reproductor de audio Java de Verizon, es confusa y la longitud no parece coincidir. Sospecho que podría ser mono a 8 kHz e intenté diferentes cosas, cambiando la frecuencia y los formatos, pero nada ayudó.

¿Tienes alguna idea de lo que está mal aquí y cómo grabar los mensajes? ¿El problema está en la configuración de ALSA? ¿O posiblemente un problema de kernel? (Estoy usando 3.4.88). Cualquier idea sería muy bienvenida.

Martin Vegter
fuente
¿Por qué estás usando alsa y no pulso? Incluso si desea trabajar bajo el nivel del navegador, esa es una mejor opción para usted.
Evan Carroll
@Evan Carroll: ¿cómo resolvería mi problema con el pulso?
Martin Vegter
Vegeter: encuentra mi respuesta a continuación. Sin embargo, sugeriría reevaluar tu enfoque.
Evan Carroll

Respuestas:

5

Pregunta interesante: hace mucho tiempo estaba pensando en la grabación simple de audio y video digital, posible a través de algunos controladores de audio y video virtuales, pero nunca llegué allí.

Usé su archivo de configuración y tuve exactamente el mismo problema que usted describió. (Quité los controladores de compatibilidad OSS de ALSA para estar seguro, probé diferentes núcleos, no parecía importar, y usé Debian Wheezy)

$ alsaplayer -d front audio.mp3

$ mplayer -vo null -ao alsa:device=front video.mp4
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)

$ mplayer -ao alsa:device=front audio.mp3
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)

todos los comandos anteriores reproducen OK para los altavoces

$ arecord -f cd -D loop | aplay -f cd -D front
Recording WAVE 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

ahora grabando desde loop y tocando al frente

$ alsaplayer audio.mp3
$ alsaplayer -d loop audio.mp3

$ mplayer -vo null video.mp4
$ mplayer -vo null -ao alsa:device=loop video.mp4
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)

$ mplayer -ao alsa:device=loop audio.mp3
AO: [alsa] 48000Hz 2ch floatle (4 bytes per sample)

todo enviando audio al bucle y reproduciendo a los altavoces OK

$ mplayer audio.mp3
AO: [alsa] 48000Hz 2ch floatle (4 bytes per sample)

pero aquí el sonido está roto, ¡muy distorsionado! Solo estoy jugando con el dispositivo predeterminado. ¡La reproducción especificada a través del bucle funcionó!

Después de probar varios cambios, probé esta modificación de asound.conf

pcm.!default {
    type plug
    slave.pcm "loopout"
}

¡Resolvió el problema! Cuando el dispositivo predeterminado es loopout, funciona. Intentar arecord -f cd -D loopin | aplay -f cd -D frontno tuvo ningún efecto. No estoy seguro de cómo funciona el bucle, pero esto fue capaz de capturar el audio. O un error en ALSA? ¿Estás usando Debian? ¿Funciona para ti?

Notas a otras sugerencias para resolver el problema:

Para volcar la transmisión de red: supongo que si la aplicación no quiere que guarde datos, la transferencia se cifrará (https ???). En caso de que el reproductor no verifique el certificado del servidor, ¿cómo captura los datos? ¿Cuál es tu método rápido y fácil favorito para convertirte en hombre en el medio y capturar la transmisión?

Pulseaudio: ¿Cómo lo ejecuto en Debian Wheezy? El Wiki dice que simplemente funciona. No lo hizo.

/etc/init.d/pulseaudio start
[warn] PulseAudio configured for per-user sessions ... (warning).

¿Cómo soluciono los problemas de lo que está sucediendo? (Herramientas, diag?)

Jack: No encontré instrucciones simples sobre cómo instalar Jack. Parece bastante complejo. ¿Se supone que Pulseaudio se está ejecutando? La documentación es confusa. ¿Tiene un enlace para un buen inicio rápido (cómo instalar y probar para asegurarse de que funciona)?

¿Asume que la mayoría de las aplicaciones de audio (como el reproductor Fios Voicemail Java) podrán reproducirse en Pulseaudio o Jack y no enviar audio a ALSA?

Robert Hayek
fuente
¡Funciona genial! Después de cambiar el archivo de configuración, ahora puedo grabar desde fios. Muchas gracias.
Martin Vegter
4

¿Te acordaste de "modprobe snd-aloop"? Lo he probado y funciona para mí con su asound.conf en youtube, pandora, tunein, vonage y este reproductor java . Podría ser algo específico de Fios, pero no tengo Fios para probar. ¿Puedes encontrar otro sitio disponible públicamente que también cause el problema?

Además, intente grabar en un archivo, luego reprodúzcalo:

arecord -f cd -D loop > recording.wav
aplay -f cd -D hw:0,0 recording.wav
gogators
fuente
4

Mejor idea

En primer lugar, leyendo tu pregunta, no lo haría así. Estaría husmeando la red e intentando capturar la transmisión. Probablemente esté en un lugar bastante predecible que se pueda programar con una simple llamada a tshark. Sin embargo, esa es otra pregunta.

Mejora sobre ALSA

Si bien su método es un enfoque válido, no usaría ALSA. ALSA es una capa de abstracción de hardware. Estaría usando el demonio de sonido que está en casi todas partes PulseAudio. Eso tiene más sentido. Crea un sumidero nulo.

$ pactl load-module module-null-sink sink_name=MySink

Ese comando te devolverá module id. Eso no nos sirve de nada.

Ahora solo establezca la variable ambiental PULSE_SINK. (sink_name en el ejemplo anterior es "MySink")

export PULSE_SINK=MySink;

O, inicie un programa con PULSE_SINK=MySinky ese sumidero nulo capturará la secuencia.

Cuando quiera transmitirlo a un archivo, simplemente ejecute:

parec -v -d MySink.monitor | opusenc --raw --downmix-mono --bitrate 64 - out.opus

Opus de baja tasa de bits es la mejor apuesta para grabar conversaciones telefónicas.

Notas al pie:

  • También es posible que desee recortar el silencio antes y después. Añadir soxa la secuencia para eso. Ver man sox, buscar vad.
  • Lo estamos usando --downmix-monoen una transmisión estéreo. Es muy posible que desee experimentar enviando el channels=1argumento module-null-sinken el primer paso. Los teléfonos son todos mono.
Evan Carroll
fuente
Cuando intento usar esta solución, la salida grabada contiene muchos tartamudeos y abandonos.
H. Rittich
4

Después de pasar más de una hora intentando configurar en vano el dispositivo ALSA loopback en Debian, la solución más efectiva y que requirió menos tiempo fue soldar un dispositivo real en 5 minutos.

En serio, volví a compilar el kernel para habilitar el bucle de retorno de ALSA, modifiqué /etc/asound.conf y ~ / .asound.rc sin resultados.

Dispositivo de bucle invertido

davide
fuente
0

Recomiendo mucho usar JACK. Es un acrónimo recursivo para JACK Audio Connection Kit. Está diseñado exactamente para lo que está haciendo, enrutando el audio de una pieza de software, en su caso la herramienta de reproducción Java, a otra, un software de grabación. Es muy bueno para la grabación de baja latencia, lo que creo que puede ayudarlo a obtener la calidad que está buscando.

Con él, puede enrutar fácilmente el audio desde cualquier fuente en su computadora a muchas herramientas de grabación diferentes. De hecho, hay una interfaz gráfica de usuario muy agradable llamada QjackCtl .

Esta página cubre cómo enrutar audio desde el navegador (Flash y posiblemente su herramienta Java) a Jack. Cómo se hace esto depende de su sistema.

Por ejemplo:

Modifique su ~/.asoundrco ~/asound.conf:

pcm.rawjack {
    type jack
    playback_ports {
        0 system:playback_1
        1 system:playback_2
    }
    capture_ports {
        0 system:capture_1
        1 system:capture_2
    }
}

pcm.jack {
    type plug
    slave { pcm "rawjack" }
    hint {
    description "JACK Audio Connection Kit"
    }
}

Entonces deberías poder usar

arecord -D pcm.jack <file>
TheHerk
fuente
Por lo que vale, esta es exactamente la razón incorrecta para usar JACK. JACK es de baja latencia. pavucontrolhará lo mismo que usted QjackCtl, y siempre puede moverse pacmd move-sink-input.
Evan Carroll
1
Genuina curiosidad de mi parte aquí; ¿Por qué la baja latencia es algo malo?
TheHerk
No es. Pero, hay dos distribuciones que usan Jack por defecto . Abogar por que alguien cambie su demonio de sonido de lo que se ha convertido en la elección de facto sin más razón que "latencia más baja" es una dirección de respuesta bastante mala.
Evan Carroll
Lo haces sonar como que es difícil de instalar un programa que funciona muy bien junto con PulseAudio , pasuspender -- jackd. Sin embargo, si el póster tiene problemas de calidad, puede ser valioso probar algo tan fácil. Además, QjackCtl hace que sea muy fácil ajustar las configuraciones que brindan retroalimentación visible sobre la latencia y xruns, que comúnmente son una causa de audio confuso .
TheHerk
Y cuando el póster se pregunta por qué otras cosas que usan el controlador Pulse dejan de funcionar porque un programa se está reproduciendo en un sumidero nulo (en JACK en lugar de Pulse), ¿entonces qué?
Evan Carroll