web-dev-qa-db-fra.com

Comment générer de l'audio à partir d'un tableau numpy?

Je veux créer un effet de "moniteur de fréquence cardiaque" à partir d'un tableau 2D en numpy et je veux que la tonalité reflète les valeurs du tableau.

44
gisgyaan

Vous pouvez utiliser la fonction write de scipy.io.wavfile pour créer un fichier wav que vous pourrez ensuite lire comme bon vous semble. Notez que le tableau doit être des entiers, donc si vous avez des flottants, vous voudrez peut-être les mettre à l'échelle de manière appropriée:

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)

Si vous voulez que Python joue réellement l'audio, alors cette page donne un aperçu de certains des packages/modules.

63
huon

Pour les gens qui viennent ici en 2016, scikits.audiolab ne semble plus vraiment fonctionner. J'ai pu obtenir une solution en utilisant sounddevice.

import numpy as np
import sounddevice as sd

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

De plus, vous pouvez essayer scikits.audiolab . Il comprend le fichier IO et la possibilité de "jouer" des tableaux. Les tableaux ne doivent pas nécessairement être des nombres entiers. Pour imiter l'exemple de 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)
15
mwv

Si vous utilisez Jupyter, la meilleure option est:

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

J'ai eu quelques problèmes avec scikit.audiolabs, j'ai donc cherché d'autres options pour cette tâche. J'ai trouvé sounddevice , ce qui semble beaucoup plus à jour. Je n'ai pas vérifié si cela fonctionne avec Python 3.

Un moyen simple de réaliser ce que vous voulez est le suivant:

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)
4
geekazoid

PyGame a le module pygame.sndarray qui peut lire des données numpy en audio. Les autres réponses sont probablement meilleures, car PyGame peut être difficile à mettre en service. Là encore, scipy et numpy viennent avec leurs propres difficultés, donc ce n'est peut-être pas un grand pas pour ajouter PyGame dans le mix.

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

2
Bryan

Je ne suis pas sûr des détails de la façon dont vous produiriez l'audio à partir du tableau, mais j'ai trouvé mpg321 pour être un excellent lecteur audio en ligne de commande, et pourrait potentiellement fonctionner pour vous.

Je l'utilise comme lecteur de choix pour Anki , qui est écrit en python et possède des bibliothèques qui pourraient être un excellent point de départ pour interfacer votre code/tableaux avec l'audio .

Check-out:

0
ryanjdillon

Une autre solution moderne et pratique consiste à utiliser pysoundfile , qui peut lire et écrire ne large gamme de formats de fichiers audio :

import numpy as np
import soundfile as sf

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