Подтвердить что ты не робот

Как генерировать аудио из массива numpy?

Я хочу создать эффект "сердечного ритма" из 2D-массива в numpy и хочу, чтобы тон отражал значения в массиве.

4b9b3361

Ответ 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 в микс.

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

Ответ 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)