Я хочу создать эффект "сердечного ритма" из 2D-массива в numpy и хочу, чтобы тон отражал значения в массиве.
Как генерировать аудио из массива numpy?
Ответ 1
Вы можете использовать write
функцию из 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)
Если вы хотите, чтобы Python фактически воспроизводил аудио, эта страница содержит обзор некоторых пакетов/модулей.
Ответ 2
Для людей, приезжающих сюда в 2016 году, scikits.audiolab, похоже, больше не работает. Я смог получить решение, используя звуковое устройство.
import numpy as np
import sounddevice as sd
fs = 44100
data = np.random.uniform(-1, 1, fs)
sd.play(data, fs)
Ответ 3
Кроме того, вы можете попробовать 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)
Ответ 4
Если вы используете Jupyter, лучший вариант:
from IPython.display import Audio
Audio(numpy.sin(numpy.linspace(0, 3000, 20000)), rate=20000)
Ответ 5
У меня возникли проблемы с использованием 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)
Ответ 6
PyGame имеет модуль pygame.sndarray
, который может воспроизводить цифровые данные как аудио. Другие ответы, вероятно, лучше, так как PyGame может быть трудно подняться и работать. Опять же, scipy и numpy приходят со своими трудностями, поэтому, возможно, это не большой шаг, чтобы добавить PyGame в микс.
Ответ 7
Не уверен в том, как вы будете генерировать звук из массива, но я нашел mpg321, чтобы отличная команда -строчный аудиоплеер и может потенциально работать на вас.
Я использую его как своего игрока по выбору для Anki, который написан на python и имеет библиотеки, которые могли бы стать отличным стартовым местом для взаимодействия вашего кода/массивов с аудио.
Отъезд:
Ответ 8
Другое современное и удобное решение - использовать pysoundfile, который может читать и записывать широкий спектр аудио файлов:
import numpy as np
import soundfile as sf
data = np.random.uniform(-1, 1, 44100)
sf.write('new_file.wav', data, 44100)