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 中生成正弦音,而不是从文件中加载它。我写了一些关于创建简单正弦音调的教程:
- https://nbviewer.jupyter.org/github/mgeier/python-audio/blob/master/simple-signals.ipynb
- http://nbviewer.jupyter.org/github/spatialaudio/communication-acoustics-exercises/blob/master/intro.ipynb
这些教程使用 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 倍的字节。
我正在尝试将一些代码放在 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 中生成正弦音,而不是从文件中加载它。我写了一些关于创建简单正弦音调的教程:
- https://nbviewer.jupyter.org/github/mgeier/python-audio/blob/master/simple-signals.ipynb
- http://nbviewer.jupyter.org/github/spatialaudio/communication-acoustics-exercises/blob/master/intro.ipynb
这些教程使用 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 倍的字节。