如何从一个数字数组生成音频?

我想创建“心率监测器”效果从一个二维数组麻木,并希望音调反映数组中的值。

107503 次浏览

你可以使用 scipy.io.wavfile中的 write功能创建一个 wav 文件,然后你可以按照自己的意愿播放。注意,数组必须是整数,因此如果有浮点数,可能需要适当地缩放它们:

import numpy as np
from scipy.io.wavfile import write


rate = 44100
data = np.random.uniform(-1, 1, rate) # 1 second worth of random samples between -1 and 1
scaled = np.int16(data / np.max(np.abs(data)) * 32767)
write('test.wav', rate, scaled)

如果希望 Python 实际播放音频,那么 这一页提供了一些包/模块的概述。

此外,您可以尝试 尖端科学实验室。它具有文件 IO 和“播放”数组的能力。数组不必是整数。模仿 dbaupp 的例子:

import numpy as np
import scikits.audiolab


data = np.random.uniform(-1,1,44100)
# write array to file:
scikits.audiolab.wavwrite(data, 'test.wav', fs=44100, enc='pcm16')
# play the array:
scikits.audiolab.play(data, fs=44100)

不确定你将如何从数组中产生音频的细节,但我发现 Mpg321是一个很好的命令行音频播放器,并且可能为您工作。

我用它作为我选择的 安琪播放器,它是用 python 编写的,并且有一些库,这些库可以作为一个很好的起点,用来将代码/数组与音频连接起来。

检查:

PyGame 有一个模块 pygame.sndarray,它可以将数据作为音频播放。其他的答案可能更好,因为 PyGame 很难启动和运行。然而,scypy 和 numpy 也有它们自己的困难,所以把 PyGame 加入进来可能不是一个很大的步骤。

Http://www.pygame.org/docs/ref/sndarray.html

对于那些2016年来到这里的人们来说,高音实验室似乎已经不再有用了。我可以通过声音设备得到一个解决方案。

import numpy as np
import sounddevice as sd


fs = 44100
data = np.random.uniform(-1, 1, fs)
sd.play(data, fs)

我在使用 scikit.audiolabs时遇到了一些问题,所以我为这个任务寻找了一些其他选项。我想出了 音响设备,它似乎更新。我还没有检查它是否与 Python3一起工作。

执行您想要的操作的一个简单方法是:

import numpy as np
import sounddevice as sd


sd.default.samplerate = 44100


time = 2.0
frequency = 440


# Generate time of samples between 0 and two seconds
samples = np.arange(44100 * time) / 44100.0
# Recall that a sinusoidal wave of frequency f has formula w(t) = A*sin(2*pi*f*t)
wave = 10000 * np.sin(2 * np.pi * frequency * samples)
# Convert it to wav format (16 bits)
wav_wave = np.array(wave, dtype=np.int16)


sd.play(wav_wave, blocking=True)

在 Jupyter,最好的选择是:

from IPython.display import Audio
wave_audio = numpy.sin(numpy.linspace(0, 3000, 20000))
Audio(wave_audio, rate=20000)

另一个现代方便的解决方案是使用 Pysoundfile,它可以读写 广泛的音频文件格式:

import numpy as np
import soundfile as sf


data = np.random.uniform(-1, 1, 44100)
sf.write('new_file.wav', data, 44100)