gravação de áudio do reprodutor de áudio baseado na Web usando o dispositivo de loop ALSA

9

Estou tentando salvar as mensagens do correio de voz do telefone Verizon Fios com a melhor qualidade possível. As mensagens do correio de voz estão disponíveis online , mas apenas para reprodução (reprodutor baseado em Java), sem economia. Oficialmente, não há maneira suportada de como salvar mensagens de voz digital originais como arquivos do serviço Fios Digital Voice (sem serviço pago, sem nada, sem motivo).

Minha única idéia era gravar dados digitais do player enquanto estava no caminho para a placa de som. Eu tentei a configuração do Linux ALSA com dispositivo de 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"
      }
    }
}

Isso parece estar funcionando e grava áudio; por exemplo, ao reproduzir algo no Youtube, a saída de áudio vai para o dispositivo de loop (saída de áudio padrão) e posso capturá-lo (sem ter certeza de como funciona exatamente, testei 44.1kHz e 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

Mas quando tentei capturar a saída do player de áudio Verizon Java, ela fica distorcida e o comprimento parece não coincidir. Eu suspeito que possa ser mono a 8 kHz e tentei coisas diferentes, alterando a frequência e os formatos, mas nada ajudou.

Você tem alguma idéia do que está errado aqui e como gravar as mensagens? O problema está na configuração do ALSA? Ou possivelmente problema com o kernel? (Eu estou usando 3.4.88). Qualquer idéia seria muito bem-vinda.

Martin Vegter
fonte
Por que você está usando alsa, e não pulso? Mesmo se você quiser trabalhar no nível do navegador, é uma opção melhor para você.
Evan Carroll
@Evan Carroll - então como eu resolveria meu problema usando o pulso?
Martin Vegter
Vegeter: encontre minha resposta abaixo. Eu sugiro reavaliar sua abordagem.
Evan Carroll

Respostas:

5

Pergunta interessante: há muito tempo eu estava pensando em uma gravação simples de áudio e vídeo digital, possível através de alguns drivers virtuais de áudio e vídeo, mas nunca cheguei lá.

Usei seu arquivo de configuração e tive exatamente o mesmo problema que você descreveu. (Eu removi os drivers de compatibilidade OSS do ALSA para ter certeza, testei diferentes kernels - não parecia importar e usei o 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 os comandos acima são reproduzidos OK nos alto-falantes

$ 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

agora gravando do loop e tocando para 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)

tudo enviando áudio para loop e tocando nos alto-falantes OK

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

mas aqui o som está quebrado - muito distorcido !!! Apenas jogando no dispositivo padrão. A reprodução especificada via loop funcionou!

Depois de tentar várias alterações, testei esta modificação do asound.conf

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

Resolveu o problema! Quando o dispositivo padrão está em loop, ele funciona. Tentar arecord -f cd -D loopin | aplay -f cd -D frontnão teve nenhum efeito. Não tenho certeza de como o loop funciona, mas isso foi capaz de capturar o áudio. Ou um bug no ALSA? Você está usando o Debian? Funciona para você?

Notas para outras sugestões para resolver o problema:

Para despejar o fluxo da rede: Presumo que, se o aplicativo não deseja que você salve dados, a transferência seria criptografada (https ???). Caso o jogador não verifique o certificado do servidor, como você captura os dados? Qual é o seu método rápido e fácil favorito de como se tornar homem no meio e capturar o fluxo?

Pulseaudio: Como faço para rodar no Debian Wheezy? O Wiki diz que simplesmente funciona. Isso não aconteceu.

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

Como solucionar problemas do que está acontecendo? (Ferramentas, diag?)

Jack: Não encontrei instruções simples sobre como instalar o Jack. Parece bastante complexo. Supõe que o Pulseaudio esteja sendo executado? A documentação é confusa. Você tem um link para um bom começo rápido (como instalar e testar para garantir que está funcionando?)

Você supõe que a maioria dos aplicativos de áudio (como o Fios Voicemail Java player) poderá tocar no Pulseaudio ou Jack e não enviar áudio para o ALSA?

Robert Hayek
fonte
Funciona bem! depois de alterar o arquivo de configuração, agora posso gravar a partir de fios. Muito obrigado.
Martin Vegter
4

Você se lembrou de "modprobe snd-aloop"? Eu tentei e funciona para mim com o seu asound.conf no youtube, pandora, tunein, vonage e este java player . Pode ser algo específico para o Fios, mas não tenho o Fios para testar. Você pode encontrar outro site publicamente disponível que também cause o problema?

Além disso, tente gravar em um arquivo e reproduza-o:

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

Melhor ideia

Em primeiro lugar, lendo sua pergunta, eu não faria assim. Eu estaria bisbilhotando a rede e tentando capturar o fluxo. Provavelmente está em um lugar bastante previsível que pode ser roteirizado com uma simples chamada para tshark. Essa é outra questão, no entanto.

Melhoria sobre ALSA

Embora seu método seja uma abordagem válida, eu não usaria o ALSA. ALSA é uma camada de abstração de hardware. Eu estaria usando o daemon de som que está em quase toda parte PulseAudio. Isso faz mais sentido. Crie um nulo-coletor.

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

Esse comando retornará seu module id. Isso não serve para nós.

Agora basta definir a variável ambiental PULSE_SINK. (nome_coletor no exemplo acima é "MySink")

export PULSE_SINK=MySink;

Ou, inicie um programa com PULSE_SINK=MySinke esse coletor nulo capturará o fluxo.

Sempre que você quiser transmiti-lo para um arquivo, basta executar:

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

Opus de baixa taxa de bits é a melhor aposta para gravar conversas telefônicas.

Notas de rodapé:

  • Você também pode cortar o silêncio antes e depois. Adicione soxao fluxo para isso. Veja man sox, procure vad.
  • estamos usando --downmix-monoem um fluxo estéreo. Você pode muito bem experimentar experimentar o envio do channels=1argumento module-null-sinkna primeira etapa. Os telefones são todos mono.
Evan Carroll
fonte
Quando tento usar esta solução, a saída gravada contém muitas interrupções e interrupções.
H. Rittich 21/09/19
4

Depois de passar mais de uma hora tentando configurar em vão o dispositivo de loopback ALSA no Debian, a solução mais eficaz e menos demorada foi soldar um dispositivo real em 5 minutos.

Sério, recompilei o kernel para ativar o loopback ALSA, ajustei o /etc/asound.conf e o ~ / .asound.rc sem resultados.

Dispositivo de loopback

davide
fonte
0

Eu recomendo usar o JACK. Esse é um acrônimo recursivo para o JACK Audio Connection Kit. Ele é adaptado exatamente para o que você está fazendo, direcionando o áudio de um software, no seu caso, a ferramenta de reprodução Java, para outro, um software de gravação. É muito bom para gravação de baixa latência, o que acho que pode ajudá-lo a obter a qualidade que você está procurando.

Com ele, você pode direcionar facilmente o áudio de qualquer fonte do seu computador para muitas ferramentas de gravação diferentes. De fato, existe uma interface gráfica muito boa chamada QjackCtl .

Esta página descreve como encaminhar o áudio do navegador (Flash e possivelmente sua ferramenta Java) para Jack. Como isso é feito depende do seu sistema.

Por exemplo:

Modifique seu ~/.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"
    }
}

Então você deve poder usar

arecord -D pcm.jack <file>
TheHerk
fonte
Pelo que vale, esse é exatamente o motivo errado para usar o JACK. JACK é de baixa latência. pavucontrolfará a mesma coisa que você QjackCtle você sempre poderá se mover pacmd move-sink-input.
Evan Carroll
1
Curiosidade genuína da minha parte aqui; por que a baixa latência é uma coisa ruim?
TheHerk
Não é. Mas há duas distros que usam Jack por padrão . Defender alguém que mude seu daemon de som do que se tornou a opção de fato por nenhuma outra razão senão a "menor latência" é uma direção de resposta bastante ruim.
Evan Carroll
Você fazê-lo soar como ele é difícil de instalar um programa que funciona muito bem ao lado pulseaudio , pasuspender -- jackd. No entanto, se o pôster estiver com problemas de qualidade, pode ser valioso tentar algo tão fácil. Além disso, o QjackCtl facilita muito o ajuste de configurações que fornecem feedback visível sobre latência e xruns, que geralmente são uma causa de áudio ilegível .
TheHerk
E quando o pôster se pergunta por que outras coisas que estão usando o driver do Pulse param de funcionar porque um programa está sendo reproduzido em um coletor nulo (no JACK em vez do Pulse), e daí?
Evan Carroll