Pyaudio - 测试电脑扬声器?

Pyaudio - test computer speakers?

我正在尝试将一些代码放在 Python 3.6 中,以帮助测试通过我作为 IT 技术人员的计算机硬件。

我想要一个脚本,在左扬声器上播放简单的正弦波音调,然后是右扬声器,然后是两个扬声器一起播放。

我在 找到了一个可能有用的脚本,但实际上 运行 它缺少一些代码 - 主要是制作正弦波音调的代码。我在网上四处看看,并尝试将其逆向工程回该页面上的代码,但数学对我来说有点高!对不起。

谢谢,

更新: 我想我已经找到了 'sounddevice' for python 3

的部分(尽管是冗长的解决方案)
#!/usr/bin/env python3
import argparse
import logging

parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("filename", help="audio file to be played back")
parser.add_argument("-d", "--device", type=int, help="device ID")
args = parser.parse_args()


try:
    import sounddevice as sd
    import soundfile as sf
    data, fs = sf.read(args.filename, dtype='float32')
    sd.play(data, fs, device=args.device, blocking=True, mapping=[1])
    status = sd.get_status()
    if status:
        logging.warning(str(status))
except BaseException as e:
    # This avoids printing the traceback, especially if Ctrl-C is used.
    raise SystemExit(str(e))

主要代码块再重复两次,但将 "mapping = [1]" 更改为 "mapping = [2]" 以测试正确的扬声器,最后在最后一个块中删除 "mapping = [?]" 以测试两个扬声器.

我在 https://python-sounddevice.readthedocs.io/en/0.2.1/examples.html 找到了这个。

当然,如果有人知道完成此操作的更快、更优雅的方法,请分享!

您可以直接在 Python 中生成正弦音,而不是从文件中加载它。我写了一些关于创建简单正弦音调的教程:

这些教程使用 NumPy,因为它使处理音频缓冲区变得非常容易。但是,如果您愿意,您当然也可以在纯 Python 中进行。 这是一个例子:

#!/usr/bin/env python3
import math
import sounddevice as sd

sd.default.device = None
sd.default.samplerate = samplerate = 48000

duration = 1.5
volume = 0.3
frequency = 440

# fade time in seconds:
fade_in = 0.01
fade_out = 0.3

buffer = memoryview(bytearray(int(duration * samplerate) * 4)).cast('f')

for i in range(len(buffer)):
    buffer[i] = volume * math.cos(2 * math.pi * frequency * i / samplerate)

fade_in_samples = int(fade_in * samplerate)
for i in range(fade_in_samples):
    buffer[i] *= i / fade_in_samples

fade_out_samples = int(fade_out * samplerate)
for i in range(fade_out_samples):
    buffer[-(i + 1)] *= i / fade_out_samples

for mapping in ([1], [2], [1, 2]):
    sd.play(buffer, blocking=True, mapping=mapping)
    sd.sleep(500)

请注意,此代码使用 32 位浮点数(每个使用 4 个字节),这就是为什么我们在 bytearray 中保留比所需样本数多 4 倍的字节。