Générer des ondes sinusoïdales en Python

je dois générer un son d'onde sinusoïdale en Python, et je dois être capable de 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 par les haut-parleurs immédiatement, pas enregistrer dans un fichier.

Quelle est la meilleure façon de le faire?

21
demandé sur Wilduck 2011-11-28 20:51:34

5 réponses

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()
27
répondu ivan_onys 2015-01-16 07:06:39

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 Pyaudio write a besoin de données de chaîne de caractères de float32, mais quand vous passez le tableau de numpy à cette méthode, il convertit le tableau entier en entity à une chaîne de caractères, donc vous devez convertir les données dans le tableau de numpy à la séquence de Octet vous-même comme ceci:

samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32).tobytes()

et vous devez changer cette ligne:

stream.write(samples)
4
répondu yahweh 2018-01-26 02:18:09

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

je recommande de l'utiliser - il y a le pygame.sndarray submodule qui vous permet de manipuler des nombres dans un vecteur de données qui deviennent un objet sonore de haut niveau qui peut être playerd dans le pygame.module de mixage.

la documentation dans le pygame.org site devrait être suffisant pour utiliser le module sndarray.

2
répondu jsbueno 2011-11-28 18:04:34

I le bregman laboratoire boîte à outils 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

0
répondu lizzie 2013-07-23 06:21:58

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 do

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

avant d'essayer d'installer pyaudio

0
répondu Drill Bit 2017-09-27 14:14:37