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.
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.
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)
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)
Si vous utilisez Jupyter, la meilleure option est:
from IPython.display import Audio
Audio(numpy.sin(numpy.linspace(0, 3000, 20000)), rate=20000)
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)
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.
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:
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)