PulseAudio:如何将 PulseAudio 中的音频输出到波形文件

PulseAudio:如何将 PulseAudio 中的音频输出到波形文件

我正在使用 PulseAudio 在 Linux 上对我们的呼叫中心平台进行一些测试。

我正在使用命令python -m playwright codegen 'https://my-call-center/site/login' -o test.py打开 chrome GUI 来测试调用。

我已经使用如下配置文件运行了 PulseAudio(cat ~/.config/pulse/default.pa):

.include /etc/pulse/default.pa

load-module module-pipe-sink file=/tmp/fifo.out
load-module module-pipe-source channels=2 file=/tmp/fifo.in

set-default-source fifo_input
set-default-sink fifo_output

这将创建管道文件 /tmp/fifo.out,当我在网站上调用时,chrome 将使用 /tmp/fifo.out 作为输出(作为扬声器)。我用它cat /tmp/fifo.out | tee output.out来获取音频内容。

但是 output.out 文件太大,无法收听。我删除了\x00\x00这个文件中的所有东西(使用 python)后,我可以听到文件中的一些单词,但仍然听不清楚。(我使用 Audacity APP 导入文件进行收听。)

所以,我想知道如何才能正确地将 PulseAudio 中的音频输出为波形格式文件。


pulseaudio 版本 15.99.1

答案1

经过多次尝试,结合实践规律和一些经验,较好地解决了这个问题。

只需要将 fifo.out 文件读取为固定频率并读取固定数据块。

脚本如下:

import os
import time

stream_out_file = '/tmp/fifo.out'
output_file = 'py_t.wav'

if not output_file.endswith('.wav'):
    output_file = output_file + '.wav'

# 经计算 16bit 2ch 44.1kHz 下,每秒读取数据 176400B
# 所以,200ms 有数据 35280B,20ms 有 3528B
# 系统 buf 大小 64k,为 65536B,约 18.57ms (无用)
stream = os.open(stream_out_file, os.O_RDONLY )
with open(output_file, 'wb') as wav_fd:
    start = time.time_ns()                   # start time
    _next = time.time_ns() + 20 * 1000*1000 # next time is after 20ms
    while True:
        if time.time_ns() > _next:   # 每 20ms 读取一次
            _next += 20 * 1000*1000 # next time
            s = os.read(stream, 3528)
            print("read length", len(s))
            wav_fd.write(s)
        else: # 睡 2ms
            time.sleep(0.002)

上面的数字是根据 pulseaudio 配置计算出来的。我的配置如下:

.include /etc/pulse/default.pa

load-module module-pipe-sink channels=2 rate=44100 format=s16le file=/tmp/fifo.out
load-module module-pipe-source channels=2  file=/tmp/fifo.in

set-default-source fifo_input
set-default-sink fifo_output

至于为什么,我无法解释。

相关内容