我正在使用 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
至于为什么,我无法解释。