53 votes

Génération de son d'onde sinusoïdale en Python

J'ai besoin de générer un son d'onde sinusoïdale en Python, et j'ai besoin de pouvoir contrôler la fréquence, la durée et le volume relatif. Par « générer », je veux dire que je veux qu'il joue à travers les haut-parleurs immédiatement, pas enregistrer dans un fichier.

Quelle est la manière la plus simple de le faire ?

73voto

ivan_onys Points 1286
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()

17voto

yahweh Points 145

ivan-onys a donné une excellente réponse, mais il y a un petit ajout à cela : ce script produira un son 4 fois plus court que prévu parce que la méthode d'écriture Pyaudio a besoin de données de chaîne de float32, mais quand vous passez le tableau numpy à cette méthode, il convertit le tableau entier en une entité en une chaîne, donc vous devez convertir les données dans le tableau numpy à la séquence d'octets vous-même 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)

4voto

jsbueno Points 22212

L'une des méthodes les plus cohérentes et les plus faciles à installer pour gérer le son dans Python est la bibliothèque multimédia Pygame.

Je recommanderais de l'utiliser - il y a le sous-module pygame.sndarray qui vous permet de manipuler des nombres dans un vecteur de données qui devient un objet sonore de haut niveau qui peut être lu dans le module pygame.mixer.

La documentation dans le site pygame.org devrait être suffisante pour utiliser le module sndarray.

4voto

Drill Bit Points 19

Aujourd'hui pour Python 3.5+ la meilleure façon est d'installer les paquets recommandés par le développeur.

http://people.csail.mit.edu/hubert/pyaudio/

Pour Debian, faites

sudo apt-get install python3-all-dev portaudio19-dev

avant d'essayer d'installer pyaudio

0voto

lizzie Points 372

Je la boîte à outils de laboratoire de bregman vous avez un ensemble de fonctions qui fait exactement ce que vous voulez. Ce module python est un peu buggy mais vous pouvez adapter ce code pour obtenir vos propres fonctions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X