enregistrement audio à partir d'un lecteur audio Web à l'aide d'un périphérique de boucle ALSA


9

J'essaie d'enregistrer les messages vocaux du téléphone Verizon Fios de la meilleure qualité possible. Les messages vocaux sont disponibles en ligne , mais pour jouer uniquement (lecteur basé sur Java), aucune sauvegarde. Officiellement, il n'existe aucun moyen pris en charge pour enregistrer les messages vocaux numériques originaux sous forme de fichiers à partir du service Fios Digital Voice (pas de service payant, rien, aucune raison).

Ma seule idée était d'enregistrer les données numériques du lecteur pendant le trajet vers la carte son. J'ai essayé la configuration Linux ALSA avec un périphérique en boucle.

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

Cela semble fonctionner et enregistre de l'audio, par exemple lors de la lecture de quelque chose sur Youtube, la sortie audio va au périphérique de boucle (sortie audio par défaut) et je peux le capturer (je ne sais pas comment cela fonctionne exactement, j'ai testé à la fois 44,1 kHz et 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

Mais quand j'ai essayé de capturer la sortie du lecteur audio Java Verizon, elle est tronquée et la longueur ne semble pas correspondre. Je soupçonne qu'il pourrait être mono à 8 kHz et j'ai essayé différentes choses, en changeant la fréquence et les formats, mais rien n'y fait.

Avez-vous une idée de ce qui ne va pas ici et comment enregistrer les messages? Le problème est-il dans la configuration ALSA? Ou peut-être un problème de noyau? (J'utilise 3.4.88). Toutes les idées seraient les bienvenues.


Pourquoi utilisez-vous alsa et non le pouls? Même si vous souhaitez travailler sous le niveau du navigateur, c'est une meilleure option pour vous.
Evan Carroll

@Evan Carroll - alors comment pourrais-je résoudre mon problème en utilisant le pouls?
Martin Vegter

Vegeter: trouvez ma réponse ci-dessous. Je suggérerais fortement de réévaluer votre approche.
Evan Carroll

Réponses:


5

Question intéressante, il y a longtemps, je pensais à un simple enregistrement audio et vidéo numérique, possible via certains pilotes audio et vidéo virtuels, mais je n'y suis jamais arrivé.

J'ai utilisé votre fichier de configuration et j'ai eu exactement le même problème que celui que vous avez décrit. (J'ai supprimé les pilotes de compatibilité OSS d'ALSA pour être sûr, j'ai testé différents noyaux - cela ne semblait pas avoir d'importance et j'ai utilisé 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)

les commandes ci-dessus jouent toutes OK sur les haut-parleurs

$ 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

enregistre maintenant à partir de la boucle et joue à l'avant

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

tout envoyer de l'audio en boucle et jouer aux haut-parleurs OK

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

mais ici le son est cassé - très déformé !!! Il suffit de jouer sur l'appareil par défaut. La lecture spécifiée via la boucle a fonctionné!

Après avoir essayé divers changements, j'ai testé cette modification de asound.conf

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

Cela a résolu le problème! Lorsque le périphérique par défaut est en boucle, cela fonctionne. En essayantarecord -f cd -D loopin | aplay -f cd -D front n'a eu aucun effet. Je ne sais pas comment fonctionne la boucle, mais cela a pu capturer l'audio. Ou un bug dans ALSA? Utilisez-vous Debian? Est-ce que ça marche pour toi?

Remarques sur d'autres suggestions pour résoudre le problème:

Pour vider le flux réseau: Je suppose que si l'application ne veut pas que vous enregistriez des données, le transfert serait crypté (https ???). Dans le cas où le joueur ne vérifie pas le certificat du serveur, comment capturez-vous les données? Quelle est votre méthode rapide et facile préférée pour devenir un homme au milieu et capturer le flux?

Pulseaudio: Comment le faire fonctionner sur Debian Wheezy? Le Wiki dit que cela fonctionne. Il n'a pas.

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

Comment puis-je dépanner ce qui se passe? (Outils, diag?)

Jack: Je n'ai pas trouvé d'instructions simples pour installer Jack. Cela semble assez complexe. Est-ce que cela suppose que Pulseaudio fonctionne? La documentation est déroutante. Avez-vous un lien pour un bon démarrage rapide (comment installer et tester pour vous assurer qu'il fonctionne?)

Supposez-vous que la plupart des applications audio (comme le lecteur Fios Voicemail Java) pourront jouer sur Pulseaudio ou Jack et ne pas envoyer d'audio sur ALSA?


Fonctionne très bien! après avoir changé le fichier de configuration, je peux maintenant enregistrer à partir de fios. Merci beaucoup.
Martin Vegter

4

Avez-vous pensé à "modprobe snd-aloop"? Je l'ai essayé et cela fonctionne pour moi avec votre asound.conf sur youtube, pandora, tunein, vonage et ce lecteur java . Cela pourrait être quelque chose de spécifique à Fios, mais je n'ai pas de Fios pour tester. Pouvez-vous trouver un autre site accessible au public qui cause également le problème?

Essayez également d'enregistrer dans un fichier, puis de le lire:

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

4

Meilleure idée

Tout d'abord, en lisant votre question, je ne le ferais pas comme ça. J'espionnais le réseau et j'essayais de capturer le flux. C'est probablement dans un endroit assez prévisible qui peut être scénarisé avec un simple appel àtshark . C'est une autre question cependant.

Amélioration par rapport à ALSA

Bien que votre méthode soit une approche valide, je n'utiliserais pas ALSA. ALSA est une couche d'abstraction matérielle. J'utiliserais le démon de son qui est presque partout PulseAudio. Cela a plus de sens. Créez un puits nul.

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

Cette commande vous renverra module id. Cela ne nous est d'aucune utilité.

Maintenant, définissez simplement la variable d'environnement PULSE_SINK. (le nom de l'évier dans l'exemple ci-dessus est "MySink")

export PULSE_SINK=MySink;

Ou, démarrez un programme avec PULSE_SINK=MySinket ce récepteur nul capturera le flux.

Chaque fois que vous souhaitez le diffuser dans un fichier, exécutez simplement:

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

Un opus à faible débit est le meilleur choix pour enregistrer des conversations téléphoniques.

Notes de bas de page:

  • Vous pouvez également couper le silence avant et après. Ajoutez soxau flux pour cela. Voir man sox, rechercher vad.
  • nous utilisons --downmix-monosur un flux stéréo. Vous pouvez très bien vouloir expérimenter l'envoi de l' channels=1argument à module-null-sinkla première étape. Les téléphones sont tous mono.

Lorsque j'essaie d'utiliser cette solution, la sortie enregistrée contient beaucoup de bégaiements et d'abandons.
H.Rittich

4

Après avoir passé plus d'une heure à essayer vainement de configurer le périphérique de bouclage ALSA sur Debian, la solution la plus efficace et la moins longue était de souder un périphérique réel en 5 minutes.

Sérieusement, j'ai recompilé le noyau pour activer le bouclage ALSA, j'ai modifié les fichiers /etc/asound.conf et ~ / .asound.rc sans résultats.

Dispositif de bouclage


0

Je recommande fortement d'utiliser JACK. Il s'agit d'un acronyme récursif pour JACK Audio Connection Kit. Il est conçu pour exactement ce que vous faites, acheminant l'audio d'un logiciel, dans votre cas, l'outil de lecture Java à un autre, un logiciel d'enregistrement. Il est très bon pour l'enregistrement à faible latence, ce qui, je pense, peut vous aider à obtenir la qualité que vous recherchez.

Avec lui, vous pouvez facilement acheminer l'audio de n'importe quelle source sur votre ordinateur vers de nombreux outils d'enregistrement différents. En fait, il y a une très belle interface graphique appelée QjackCtl .

Cette page explique comment router l'audio du navigateur (Flash et éventuellement votre outil Java) vers Jack. La procédure à suivre dépend de votre système.

Par exemple:

Modifiez votre ~/.asoundrcou ~/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"
    }
}

Ensuite, vous devriez pouvoir utiliser

arecord -D pcm.jack <file>

Pour ce que ça vaut, c'est exactement la mauvaise raison d'utiliser JACK. JACK est à faible latence. pavucontrolfera la même chose que vous QjackCtlet vous pourrez toujours bouger pacmd move-sink-input.
Evan Carroll

1
Véritable curiosité de ma part ici; pourquoi une faible latence est-elle une mauvaise chose?
TheHerk

Ce n'est pas. Mais, il existe deux distributions qui utilisent Jack par défaut . Plaidoyer quelqu'un pour changer son démon de son de ce qui est devenu le choix de facto pour aucune raison autre que "latence plus faible" est une mauvaise réponse.
Evan Carroll

Vous donnez l'impression qu'il est difficile d'installer un programme qui fonctionne très bien avec pulseaudio , pasuspender -- jackd. Néanmoins, si l'affiche présente des problèmes de qualité, il peut être utile d'essayer quelque chose de si simple. En outre, QjackCtl permet d'ajuster très facilement les paramètres qui donnent un retour visible sur la latence et les xruns, qui sont généralement une cause de brouillage audio .
TheHerk

Et quand l'affiche se demande pourquoi d'autres choses qui utilisent le pilote Pulse cessent de fonctionner parce qu'un programme joue sur un récepteur nul (dans JACK plutôt que Pulse), alors quoi?
Evan Carroll
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.