ghi âm thanh từ trình phát âm thanh dựa trên web bằng thiết bị lặp ALSA


9

Tôi đang cố gắng lưu tin nhắn thư thoại từ điện thoại Verizon Fios với chất lượng tốt nhất có thể. Các tin nhắn thư thoại có sẵn trực tuyến , nhưng chỉ để phát (trình phát dựa trên Java), không lưu. Chính thức, không có cách nào được hỗ trợ làm thế nào để lưu tin nhắn thoại kỹ thuật số gốc như các tệp từ dịch vụ Fios Digital Voice (không có dịch vụ phải trả tiền, không có gì, không có lý do tại sao).

Ý tưởng duy nhất của tôi là ghi lại dữ liệu kỹ thuật số từ người chơi khi đang trên đường đến soundcard. Tôi đã thử cấu hình Linux ALSA với thiết bị lặp.

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

Điều này dường như đang hoạt động và ghi lại âm thanh, ví dụ như khi phát một cái gì đó trên Youtube, đầu ra âm thanh đi đến thiết bị lặp (đầu ra âm thanh mặc định) và tôi có thể chụp nó (không chắc nó hoạt động chính xác như thế nào, tôi đã thử nghiệm cả 44.1kHz và 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

Nhưng khi tôi cố gắng bắt đầu ra trình phát âm thanh Java của Verizon, nó bị cắt xén và độ dài dường như không khớp. Tôi nghi ngờ nó có thể là đơn âm ở 8 kHz và tôi đã thử nhiều thứ khác nhau, thay đổi tần số và định dạng, nhưng không có gì giúp được.

Bạn có biết điều gì sai ở đây và làm thế nào để ghi lại các tin nhắn không? Là vấn đề trong cấu hình ALSA? Hoặc có thể vấn đề hạt nhân? (Tôi đang sử dụng 3.4,88). Bất kỳ ý tưởng sẽ rất được hoan nghênh.


Tại sao bạn sử dụng alsa, và không xung? Ngay cả khi bạn muốn làm việc dưới cấp trình duyệt, đó là một lựa chọn tốt hơn cho bạn.
Evan Carroll

@Evan Carroll - vậy tôi sẽ giải quyết vấn đề của mình bằng cách sử dụng xung như thế nào?
Martin Vegter

Vegeter: tìm câu trả lời của tôi dưới đây. Tôi rất muốn đề nghị đánh giá lại cách tiếp cận của bạn mặc dù.
Evan Carroll

Câu trả lời:


5

Câu hỏi thú vị, một thời gian dài trước đây tôi đã suy nghĩ về việc ghi âm đơn giản âm thanh và video kỹ thuật số, có thể thông qua một số trình điều khiển âm thanh và video ảo, nhưng không bao giờ đạt được điều đó.

Tôi đã sử dụng tập tin cấu hình của bạn và có vấn đề chính xác như bạn mô tả. (Tôi đã loại bỏ các trình điều khiển tương thích OSS khỏi ALSA để chắc chắn, đã kiểm tra các hạt nhân khác nhau - dường như không quan trọng và đã sử dụng 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)

tất cả các lệnh trên đều phát OK với loa

$ 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

Bây giờ ghi âm từ vòng lặp và chơi phía trước

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

tất cả gửi âm thanh đến vòng lặp và phát đến loa OK

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

nhưng ở đây âm thanh bị hỏng - rất méo !!! Chỉ cần chơi với thiết bị mặc định. Phát lại được chỉ định thông qua vòng lặp làm việc!

Sau khi thử nhiều thay đổi khác nhau, tôi đã thử nghiệm sửa đổi này của asound.conf

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

Nó đã giải quyết vấn đề! Khi thiết bị mặc định là loopout, nó hoạt động. Cố gắng arecord -f cd -D loopin | aplay -f cd -D frontkhông có bất kỳ ảnh hưởng. Không chắc cách thức hoạt động của vòng lặp nhưng điều này có thể thu được âm thanh. Hoặc một lỗi trong ALSA? Bạn đang sử dụng Debian? Nó làm việc cho bạn?

Lưu ý cho các đề xuất khác để giải quyết vấn đề:

Để kết xuất luồng mạng: Tôi giả sử nếu ứng dụng không muốn bạn lưu dữ liệu, việc chuyển sẽ được mã hóa (https ???). Trong trường hợp người chơi không kiểm tra chứng chỉ máy chủ, làm thế nào để bạn thu thập dữ liệu? Phương pháp nhanh chóng và dễ dàng yêu thích của bạn làm thế nào để trở thành người đàn ông ở giữa và bắt được luồng?

Pulseaudio: Làm cách nào để chạy nó trên Debian Wheezy? Wiki nói rằng nó chỉ hoạt động. Nó đã không làm.

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

Làm thế nào để tôi khắc phục sự cố những gì đang xảy ra? (Công cụ, diag?)

Jack: Tôi không tìm thấy bất kỳ hướng dẫn đơn giản nào về cách cài đặt Jack. Có vẻ khá phức tạp. Nó giả sử Pulseaudio đang chạy? Các tài liệu là khó hiểu. Bạn có một liên kết cho một khởi động nhanh đẹp (cách cài đặt và kiểm tra để đảm bảo nó đang hoạt động không?)

Bạn có cho rằng hầu hết các ứng dụng âm thanh (như trình phát Java Fios Voicemail) sẽ có thể phát tới Pulseaudio hoặc Jack và không gửi âm thanh đến ALSA không?


Hoạt động tuyệt vời! Sau khi thay đổi tập tin cấu hình, bây giờ tôi có thể ghi lại từ fios. Cảm ơn rất nhiều.
Martin Vegter

4

Bạn có nhớ "modprobe snd-aloop" không? Tôi đã thử nó và nó hoạt động với tôi với asound.conf của bạn trên youtube, pandora, Tunein, vonage và trình phát java này . Có thể là một cái gì đó cụ thể cho Fios, nhưng tôi không có Fios để thử nghiệm. Bạn có thể tìm thấy một trang web công khai khác cũng gây ra vấn đề?

Ngoài ra, hãy thử ghi vào một tệp, sau đó phát lại:

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

4

Ý tưởng tốt nhất

Đầu tiên, đọc câu hỏi của bạn tôi sẽ không làm như thế này. Tôi sẽ rình mò mạng và cố gắng bắt luồng. Có lẽ nó ở một nơi khá dễ đoán có thể được viết kịch bản chỉ bằng một cuộc gọi đơn giản tshark. Đó là một câu hỏi khác mặc dù.

Cải thiện ALSA

Mặc dù phương pháp của bạn là một cách tiếp cận hợp lệ, tôi sẽ không sử dụng ALSA. ALSA là một lớp trừu tượng phần cứng. Tôi sẽ sử dụng trình nền âm thanh gần như ở mọi nơi PulseAudio. Điều đó có ý nghĩa hơn. Tạo một bồn rửa rỗng.

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

Lệnh đó sẽ trả về của bạn module id. Điều đó không có ích gì với chúng ta.

Bây giờ chỉ cần đặt biến môi trường PULSE_SINK. (chìm_ tên trong ví dụ trên là "MySink")

export PULSE_SINK=MySink;

Hoặc, bắt đầu một chương trình với PULSE_SINK=MySinkvà null null sẽ thu được luồng.

Bất cứ khi nào bạn muốn truyền phát nó đến một tệp, chỉ cần chạy:

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

Opus bitrate thấp là đặt cược tốt nhất để ghi lại các cuộc trò chuyện điện thoại.

Chú thích:

  • Bạn cũng có thể muốn cắt bỏ sự im lặng trước và sau. Thêm soxvào luồng cho điều đó. Xem man sox, tìm kiếm vad.
  • chúng tôi đang sử dụng --downmix-monotrên một luồng âm thanh nổi. Bạn có thể rất muốn thử nghiệm gửi channels=1đối số đến module-null-sinkbước đầu tiên. Điện thoại đều là đơn âm.

Khi tôi thử sử dụng giải pháp này, đầu ra được ghi có chứa rất nhiều lỗi và bỏ qua.
H. Rittich

4

Sau khi dành hơn một giờ để cố gắng thiết lập thiết bị loopback ALSA trên Debian, giải pháp hiệu quả nhất và ít tốn thời gian nhất là hàn một thiết bị thực tế trong 5 phút.

Nghiêm túc, tôi đã biên dịch lại kernel để kích hoạt vòng lặp ALSA, tôi đã điều chỉnh /etc/asound.conf và ~ / .asound.rc mà không có kết quả.

Thiết bị lặp lại


0

Tôi rất khuyên bạn nên sử dụng JACK. Đó là từ viết tắt đệ quy cho Bộ kết nối âm thanh JACK. Nó được thiết kế cho chính xác những gì bạn đang làm, định tuyến âm thanh từ một phần mềm, trong trường hợp của bạn là công cụ phát lại Java, đến một phần mềm khác, một phần mềm ghi âm. Nó rất tốt cho ghi âm độ trễ thấp, mà tôi nghĩ có thể giúp bạn có được chất lượng mà bạn đang tìm kiếm.

Với nó, bạn có thể dễ dàng định tuyến âm thanh từ bất kỳ nguồn nào trên máy tính của mình đến nhiều công cụ ghi âm khác nhau. Trong thực tế, có một GUI rất đẹp cho nó được gọi là QjackCtl .

Trang này trình bày cách định tuyến âm thanh từ trình duyệt (Flash và có thể là công cụ Java của bạn) đến Jack. Làm thế nào điều này được thực hiện phụ thuộc vào hệ thống của bạn.

Ví dụ:

Sửa đổi ~/.asoundrchoặc ~/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"
    }
}

Sau đó, bạn sẽ có thể sử dụng

arecord -D pcm.jack <file>

Đối với những gì nó có giá trị, đây chính xác là lý do sai để sử dụng JACK. JACK là độ trễ thấp. pavucontrolsẽ làm điều tương tự như bạn QjackCtl, và bạn luôn có thể di chuyển pacmd move-sink-input.
Evan Carroll

1
Sự tò mò thực sự về phía tôi ở đây; Tại sao độ trễ thấp là một điều xấu?
TheHerk

Nó không thể. Nhưng, có hai distro sử dụng Jack theo mặc định . Ủng hộ ai đó thay đổi daemon âm thanh của họ từ những gì đã trở thành sự lựa chọn thực tế mà không có lý do nào khác ngoài "độ trễ thấp hơn" là một hướng trả lời khá tệ.
Evan Carroll

Bạn làm cho nó có vẻ như rất khó để cài đặt một chương trình hoạt động tốt cùng với pulseaudio , pasuspender -- jackd. Tuy nhiên, nếu người đăng có vấn đề về chất lượng, có thể có giá trị để thử một cái gì đó quá dễ dàng. Ngoài ra, QjackCtl giúp dễ dàng điều chỉnh các cài đặt cung cấp phản hồi rõ ràng về độ trễ và xruns, thường là nguyên nhân của âm thanh bị cắt xén .
TheHerk

Và khi người đăng tự hỏi tại sao những thứ khác đang sử dụng trình điều khiển Pulse lại ngừng hoạt động vì một chương trình đang phát tới mức không có giá trị (trong JACK chứ không phải Pulse), thì sao?
Evan Carroll
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.