我正在尝试在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上找到了这个。
当然,如果有人知道更快,更轻松地完成此任务,请分享!
答案 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
中保留的字节数是所需样本数的四倍。