registrare l'audio dal lettore audio basato sul web utilizzando il dispositivo loop ALSA


9

Sto cercando di salvare i messaggi di posta vocale dal telefono Verizon Fios nella migliore qualità possibile. I messaggi di posta vocale sono disponibili online , ma solo per la riproduzione (lettore basato su Java), nessun salvataggio. Ufficialmente, non esiste un modo supportato su come salvare i messaggi vocali digitali originali come file dal servizio Voice Digital di Fios (nessun servizio a pagamento, niente, nessun motivo per cui).

La mia unica idea era quella di registrare i dati digitali dal lettore mentre si trovava sulla scheda audio. Ho provato la configurazione ALSA di Linux con un dispositivo loop.

# 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"
      }
    }
}

Questo sembra funzionare e registra l'audio, ad esempio quando si riproduce qualcosa su Youtube l'uscita audio va al dispositivo loop (uscita audio predefinita) e posso catturarlo (non sono sicuro di come funzioni esattamente, ho testato sia 44.1kHz che 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

Ma quando ho provato a catturare l'output del lettore audio Java Verizon, è confuso e la lunghezza non sembra corrispondere. Ho il sospetto che potrebbe essere mono a 8 kHz e ho provato diverse cose, cambiando la frequenza e i formati, ma nulla ha aiutato.

Hai idea di cosa non va qui e come registrare i messaggi? Il problema è nella configurazione ALSA? O forse problema del kernel? (Sto usando 3.4.88). Qualsiasi idea sarebbe molto gradita.


Perché stai usando alsa e non il polso? Anche se vuoi lavorare a livello di browser, questa è un'opzione migliore per te.
Evan Carroll,

@Evan Carroll - come risolverei il mio problema usando il polso?
Martin Vegter,

Vegetariano: trova la mia risposta qui sotto. Consiglio vivamente di rivalutare il tuo approccio.
Evan Carroll,

Risposte:


5

Domanda interessante, molto tempo fa stavo pensando alla semplice registrazione di audio e video digitali, possibile tramite alcuni driver audio e video virtuali, ma non ci sono mai arrivato.

Ho usato il tuo file di configurazione e ho avuto esattamente lo stesso problema che hai descritto. (Per essere sicuro, ho rimosso i driver di compatibilità OSS da ALSA, testato diversi kernel - non sembrava importare e ho usato 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)

tutti i comandi sopra riproducono OK agli altoparlanti

$ 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

ora registra dal loop e suona in primo piano

$ 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)

tutto l'invio di audio in loop e la riproduzione su altoparlanti OK

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

ma qui il suono è rotto - molto distorto !!! Basta giocare al dispositivo predefinito. La riproduzione specificata tramite loop ha funzionato!

Dopo aver provato varie modifiche ho provato questa modifica di asound.conf

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

Ha risolto il problema! Quando il dispositivo predefinito è loopout funziona. Provare arecord -f cd -D loopin | aplay -f cd -D frontnon ha avuto alcun effetto. Non sono sicuro di come funzioni il loop ma questo è stato in grado di catturare l'audio. O un bug in ALSA? Stai usando Debian? Per te funziona?

Note per altri suggerimenti per risolvere il problema:

Per scaricare il flusso di rete: suppongo che se l'applicazione non vuole che tu salvi i dati, il trasferimento sarebbe crittografato (https ???). Nel caso in cui il lettore non controlli il certificato del server come acquisite i dati? Qual è il tuo metodo rapido e semplice preferito come diventare uomo nel mezzo e catturare il flusso?

Pulseaudio: Come posso farlo funzionare su Debian Wheezy? Il Wiki dice che funziona. Io non l'ho fatto.

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

Come posso risolvere cosa sta succedendo? (Strumenti, diag?)

Jack: Non ho trovato semplici istruzioni su come installare Jack. Sembra abbastanza complesso. Presume che Pulseaudio funzioni? La documentazione è confusa. Hai un link per una bella guida rapida (come installare e testare per assicurarsi che funzioni?)

Supponete che la maggior parte delle applicazioni audio (come il lettore Java di Fios Voicemail) sarà in grado di riprodurre su Pulseaudio o Jack e non inviare l'audio ad ALSA?


Funziona alla grande! dopo aver modificato il file di configurazione, ora posso registrare da fios. Molte grazie.
Martin Vegter,

4

Ti sei ricordato di "modprobe snd-aloop"? L'ho provato e funziona per me con il tuo asound.conf su YouTube, Pandora, Tunein, vonage e questo lettore Java . Potrebbe essere qualcosa di specifico per Fios, ma non ho Fios con cui provare. Riesci a trovare un altro sito disponibile pubblicamente che causa anche il problema?

Inoltre, prova a registrare su un file, quindi riproducilo:

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

4

La migliore idea

In primo luogo, leggendo la tua domanda non lo farei così. Starei ficcando il naso nella rete e provando a catturare il flusso. È probabilmente in un posto abbastanza prevedibile che può essere scritto con una semplice chiamata tshark. Questa è un'altra domanda però.

Miglioramento rispetto ad ALSA

Mentre il tuo metodo è un approccio valido, non vorrei usare ALSA. ALSA è uno strato di astrazione hardware. Userei il demone audio che è quasi ovunque PulseAudio. Questo ha più senso. Crea un null-sink.

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

Questo comando restituirà il tuo module id. Questo non ci serve.

Ora imposta la variabile ambientale PULSE_SINK. (sink_name nell'esempio sopra è "MySink")

export PULSE_SINK=MySink;

Oppure, avvia un programma con PULSE_SINK=MySinke quel sink null acquisirà il flusso.

Ogni volta che vuoi trasmetterlo in streaming su un file, esegui semplicemente:

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

L'opus a basso bitrate è la soluzione migliore per la registrazione di conversazioni telefoniche.

Note:

  • Potresti anche voler eliminare il silenzio prima e dopo. Aggiungi soxallo stream per questo. Vedi man sox, cerca vad.
  • stiamo usando --downmix-monosu un flusso stereo. Potresti benissimo provare a inviare l' channels=1argomento module-null-sinknel primo passaggio. I telefoni sono tutti mono.

Quando provo ad usare questa soluzione, l'output registrato contiene molti stutter e interruzioni.
H. Rittich,

4

Dopo aver trascorso più di un'ora a cercare di configurare invano il dispositivo di loopback ALSA su Debian, la soluzione più efficace e che richiede meno tempo è stata quella di saldare un dispositivo reale in 5 minuti.

Scherzi a parte, ho ricompilato il kernel per abilitare il loopback ALSA, ho modificato /etc/asound.conf e ~ / .asound.rc senza risultati.

Dispositivo di loopback


0

Consiglio vivamente di usare JACK. Questo è un acronimo ricorsivo per JACK Audio Connection Kit. È su misura per esattamente quello che stai facendo, instradando l'audio da un software, nel tuo caso lo strumento di riproduzione Java, a un altro, un software di registrazione. È ottimo per la registrazione a bassa latenza, che penso possa aiutarti a ottenere la qualità che stai cercando.

Con esso puoi facilmente instradare l'audio da qualsiasi fonte sul tuo computer a molti diversi strumenti di registrazione. In effetti, esiste una GUI molto bella per questo chiamata QjackCtl .

Questa pagina spiega come indirizzare l'audio dal browser (Flash e possibilmente il tuo strumento Java) a Jack. Come questo dipende dal tuo sistema.

Per esempio:

Modifica il tuo ~/.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"
    }
}

Quindi dovresti essere in grado di utilizzare

arecord -D pcm.jack <file>

Per quello che vale, questa è esattamente la ragione sbagliata per usare JACK. JACK ha una bassa latenza. pavucontrolfarà la stessa cosa di te QjackCtle puoi sempre muoverti pacmd move-sink-input.
Evan Carroll,

1
Vera curiosità da parte mia qui; perché la bassa latenza è una cosa negativa?
TheHerk

Non è. Ma ci sono due distro che usano Jack per impostazione predefinita . Sostenere qualcuno che cambia il suo demone sonoro da quella che è diventata di fatto la scelta per nessun motivo diverso dalla "bassa latenza" è una direzione di risposta piuttosto cattiva.
Evan Carroll,

Lo fai sembrare come è difficile installare un programma che funziona bene insieme a pulseaudio , pasuspender -- jackd. Tuttavia, se il poster presenta problemi di qualità, può essere utile provare qualcosa di così semplice. Inoltre, QjackCtl semplifica la regolazione delle impostazioni che forniscono un feedback visibile su latenza e xrun, che sono comunemente causa di audio confuso .
TheHerk

E quando il poster si chiede perché altre cose che stanno usando il driver Pulse smettano di funzionare perché un programma sta suonando su un sink null (in JACK anziché Pulse), allora cosa?
Evan Carroll,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.