gravação de áudio de um reprodutor de áudio baseado na web usando um dispositivo de loop ALSA

8

Estou tentando salvar as mensagens do correio de voz do telefone da Verizon Fios na melhor qualidade possível. As mensagens de correio de voz estão disponíveis on-line , mas somente para reprodução (player baseado em Java), sem poupança. Oficialmente, não há nenhuma maneira com suporte de como salvar mensagens de voz digitais originais como arquivos do Fios Digital Voice serviço (sem serviço pago, sem nada, sem motivo).

Minha única ideia era gravar dados digitais do player enquanto estava no caminho para a placa de som. Eu tentei a configuração do Linux ALSA com o 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 tocar algo no Youtube a saída de áudio vai para o dispositivo de loop (padrão saída de áudio) e eu posso capturá-lo (não sei como funciona exatamente, Eu testei ambos os 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, ele ficou ilegível e o comprimento não parece corresponder. Eu suspeito que possa ser mono a 8 kHz e eu tentei coisas diferentes, mudando a frequência e formatos, mas nada ajudou.

Tem alguma ideia do que está errado aqui e como gravar as mensagens? O problema está na configuração do ALSA? Ou possivelmente problema do kernel? (Estou usando 3.4.88). Qualquer ideia seria muito bem vinda.

    
por Martin Vegter 02.05.2014 / 15:16

5 respostas

4

Pergunta interessante, há muito tempo atrás eu estava pensando em gravação simples de áudio e vídeo digital, possível através de algum áudio e vídeo virtual drivers, mas nunca chegou lá.

Eu usei o seu arquivo de configuração e tive exatamente o mesmo problema que você descrito. (Eu removi drivers de compatibilidade OSS da ALSA para ter certeza, testei diferentes kernels - não parecem importar, e usaram 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 compatíveis com os 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)

todo o envio de áudio para loop e reprodução para 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. Reprodução especificada via loop funcionou!

Depois de tentar várias mudanças eu testei essa modificação do asound.conf

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

Resolveu o problema! Quando o dispositivo padrão é loopout, funciona. A tentativa de arecord -f cd -D loopin | aplay -f cd -D front nã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? Isso funciona para você?

Notas para outras sugestões para resolver o problema:

Para descarregar o fluxo da rede: Eu suponho que se o aplicativo não quiser que você salvar dados, a transferência seria criptografada (https ???). Caso o jogador não não verificar o certificado do servidor como você captura os dados? Qual é o seu favorito quick & método fácil como se tornar homem no meio e capturar o fluxo?

Pulseaudio: Como faço para executá-lo 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 resolvo o que está acontecendo? (Ferramentas, diag?)

Jack: Não encontrei instruções simples sobre como instalar o Jack. Parece bastante complexo. Assume o Pulseaudio em execução? A documentação é confusa. Você tem um link para um início rápido? (como instalar e testar para se certificar de que está funcionando?)

Você assume que a maioria dos aplicativos de áudio (como o Fios Voicemail Java Player) será capaz de tocar para o Pulseaudio ou Jack e não enviar áudio para a ALSA?

    
por 10.05.2014 / 14:58
4

Melhor ideia

Primeiramente, lendo sua pergunta, eu não faria assim. Eu estaria bisbilhotando a rede e tentando capturar o fluxo. É provavelmente em um lugar bastante previsível que pode ser roteirizado com uma simples chamada para tshark . Essa é outra questão embora.

Melhoria sobre o ALSA

Enquanto seu método é válido, eu não usaria o ALSA. O ALSA é uma camada de abstração de hardware. Eu estaria usando o daemon de som que está quase em todos os lugares do PulseAudio. Isso faz mais sentido. Crie um dissipador nulo.

$ 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 de ambiente PULSE_SINK . (sink_name no exemplo acima é "MySink")

export PULSE_SINK=MySink;

Ou inicie um programa com PULSE_SINK=MySink e esse coletor nulo capturará o fluxo.

Sempre que você quiser transmitir para um arquivo, basta executar:

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

O baixo custo da taxa de bits é a melhor aposta para gravar conversas telefônicas.

Notas de rodapé:

  • Você também pode querer cortar o silêncio antes e depois. Adicione sox ao fluxo para isso. Veja man sox , procure por vad .
  • estamos usando --downmix-mono em um fluxo estéreo. Você pode muito bem querer experimentar o envio do argumento channels=1 para module-null-sink no primeiro passo. Telefones são todos mono.
por 06.05.2014 / 20:17
3

Você se lembra de "modprobe snd-aloop"? Eu tentei e funciona para mim com o seu asound.conf no youtube, pandora, tunein, vonage e jogador java . 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, em seguida, reproduza:

arecord -f cd -D loop > recording.wav
aplay -f cd -D hw:0,0 recording.wav
    
por 06.05.2014 / 18:15
2

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

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

    
por 01.12.2014 / 22:30
0

Eu recomendo usar o JACK. Este é um acrônimo recursivo para o JACK Audio Connection Kit. Ele é adaptado para exatamente o que você está fazendo, roteamento de á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 eu acho que pode ajudá-lo a obter a qualidade que você está procurando.

Com ele, você pode facilmente direcionar o áudio de qualquer fonte no seu computador para várias ferramentas de gravação diferentes. Na verdade, há uma interface gráfica muito legal para ele chamada QjackCtl .

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

Por exemplo:

Modifique seu ~/.asoundrc ou ~/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>
    
por 07.05.2014 / 20:57