Pyaudio-测试计算机扬声器吗?

时间:2018-07-12 18:05:20

标签: python-3.6 pyaudio

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

我想创建一个脚本,该脚本在左扬声器上播放简单的正弦波音调,然后在右扬声器上然后将两个扬声器同时播放。

我在Pyaudio How to get sound on only one speaker上发现了一个可能有用的脚本,但是缺少一些实际运行该脚本的代码-主要是用于制作正弦波音调的代码。我在网上浏览了一下,并尝试将其反向工程回该页面的代码中,但是数学对我来说有点高级!抱歉。

谢谢

更新: 我想我已经为python 3找到了带有“ sounddevice”的部分(尽管是长期解决方案)

#!/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上找到了这个。

当然,如果有人知道更快,更轻松地完成此任务,请分享!

1 个答案:

答案 0 :(得分:2)

您可以直接在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中保留的字节数是所需样本数的四倍。