Je dois générer un son sinusoïdal en Python et pouvoir contrôler la fréquence, la durée et le volume relatif. Par «générer», je veux dire que je veux que les haut-parleurs soient lus immédiatement, pas sauvegardés dans un fichier.
Quelle est la manière la plus simple de faire ça?
import pyaudio
import numpy as np
p = pyaudio.PyAudio()
volume = 0.5 # range [0.0, 1.0]
fs = 44100 # sampling rate, Hz, must be integer
duration = 1.0 # in seconds, may be float
f = 440.0 # sine frequency, Hz, may be float
# generate samples, note conversion to float32 array
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32)
# for paFloat32 sample values must be in range [-1.0, 1.0]
stream = p.open(format=pyaudio.paFloat32,
channels=1,
rate=fs,
output=True)
# play. May repeat with different volume values (if done interactively)
stream.write(volume*samples)
stream.stop_stream()
stream.close()
p.terminate()
ivan-onys a donné une excellente réponse, mais il y a un petit ajout: Ce script produira un son 4 fois plus court que prévu car la méthode d'écriture Pyaudio a besoin des données de chaîne de float32, mais lorsque vous passez numpy array à celui-ci. méthode, il convertit tout le tableau en entité en chaîne, vous devez donc convertir vous-même les données de tableau numpy en séquences d'octets comme ceci:
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()
et vous devez également changer cette ligne:
stream.write(samples)
Les bibliothèques multimédia Pygame sont l’un des moyens les plus cohérents et faciles à installer pour gérer le son en Python.
Je le recommanderais. Il existe un sous-module pygame.sndarray qui vous permet de manipuler des nombres dans un vecteur de données qui deviennent un objet sonore de haut niveau pouvant être lu dans le module pygame.mixer.
La documentation sur le site pygame.org devrait suffire à utiliser le module sndarray.
Aujourd'hui, pour Python 3.5+, la meilleure méthode consiste à installer les packages recommandés par le développeur.
http://people.csail.mit.edu/hubert/pyaudio/
Pour Debian do
Sudo apt-get install python3-all-dev portaudio19-dev
avant d'essayer d'installer pyaudio
Je la bregman lab toolbox vous avez un ensemble de fonctions qui fait exactement ce que vous voulez. Ce module python est un peu buggé mais vous pouvez adapter ce code pour obtenir vos propres fonctions