如何从numpy数组生成音频?

gis*_*aan 45 python audio numpy matplotlib

我想在numpy中从2D数组创建"心率监视器"效果,并希望音调反映数组中的值.

huo*_*uon 65

您可以使用write函数 from scipy.io.wavfile来创建一个wav文件,然后您可以随意播放该文件.请注意,数组必须是整数,因此如果您有浮点数,则可能需要适当地缩放它们:

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

data = np.random.uniform(-1,1,44100) # 44100 random samples between -1 and 1
scaled = np.int16(data/np.max(np.abs(data)) * 32767)
write('test.wav', 44100, scaled)
Run Code Online (Sandbox Code Playgroud)

如果您希望Python实际播放音频,那么此页面提供了一些软件包/模块的概述.

  • 问题 - 数据/np.max(np.abs(data)) - 在缩放之前将其标准化为 1/-1 是否正确,这样如果最大值为 0.8,它会被放大? (2认同)
  • 谢谢。那不应该是* 32768吗?它是一个有符号的 16 位。 (2认同)

mdo*_*fe1 26

对于2016年来到这里的人来说,scikits.audiolab似乎不再适用了.我能够使用sounddevice获得解决方案.

import numpy as np
import sounddevice as sd

fs = 44100
data = np.random.uniform(-1, 1, fs)
sd.play(data, fs)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,完美的工作!`sd.play(data,fs,blocking = True)`使程序等到声音播放为止. (5认同)

小智 15

另外,你可以试试scikits.audiolab.它具有文件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)
Run Code Online (Sandbox Code Playgroud)


gee*_*oid 14

我在使用 时遇到了一些问题scikit.audiolabs,因此我为此任务寻找了一些其他选项。我想出了sounddevice,它似乎更新了很多。我还没有检查它是否适用于 Python 3。

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

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)
Run Code Online (Sandbox Code Playgroud)

  • 它适用于 Python 3。如果您在脚本中使用上述代码,则应确保使用 `blocking=True`,否则脚本将在未完成播放的情况下退出。 (2认同)

All*_*leo 11

如果您使用的是Jupyter,最好的选择是:

from IPython.display import Audio
Audio(numpy.sin(numpy.linspace(0, 3000, 20000)), rate=20000)
Run Code Online (Sandbox Code Playgroud)

  • 这是我多年来一直在寻找的解决方案! (3认同)