web-dev-qa-db-fra.com

Génération / synthèse sonore avec python?

Est-il possible d'obtenir python pour générer un son simple comme une onde sinusoïdale?

Existe-t-il un module disponible pour cela? Sinon, comment feriez-vous pour créer le vôtre?

De plus, auriez-vous besoin d'une sorte d'environnement Host pour que python s'exécute afin de jouer du son, ou peut-il être obtenu simplement en passant des appels depuis le terminal?

Si la réponse dépend du système d'exploitation, j'utilise un mac.

36
Alex Coplan

Je cherchais la même chose, à la fin, j'ai écrit ce code qui fonctionne bien.

import math        #import needed modules
import pyaudio     #Sudo apt-get install python-pyaudio

PyAudio = pyaudio.PyAudio     #initialize pyaudio

#See https://en.wikipedia.org/wiki/Bit_rate#Audio
BITRATE = 16000     #number of frames per second/frameset.      

FREQUENCY = 500     #Hz, waves per second, 261.63=C4-note.
LENGTH = 1     #seconds to play sound

if FREQUENCY > BITRATE:
    BITRATE = FREQUENCY+100

NUMBEROFFRAMES = int(BITRATE * LENGTH)
RESTFRAMES = NUMBEROFFRAMES % BITRATE
WAVEDATA = ''    

#generating wawes
for x in xrange(NUMBEROFFRAMES):
 WAVEDATA = WAVEDATA+chr(int(math.sin(x/((BITRATE/FREQUENCY)/math.pi))*127+128))    

for x in xrange(RESTFRAMES): 
 WAVEDATA = WAVEDATA+chr(128)

p = PyAudio()
stream = p.open(format = p.get_format_from_width(1), 
                channels = 1, 
                rate = BITRATE, 
                output = True)

stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()
30
Liam

Je sais que je suis un peu en retard sur le jeu sur celui-ci, mais c'est un projet assez fantastique python pour la synthèse et la composition audio: https://github.com/ hecanjog/pippi

Il est toujours en cours de développement, mais cela dure depuis un certain temps.

11
acsmith

Après avoir perdu du temps sur des projets incompilables ou inexistants, j'ai découvert le module python wavebender , qui propose la génération de canaux simples ou multiples d'ondes sinusoïdales, carrées et combinées) Les résultats peuvent être écrits dans un fichier d'onde ou dans sys.stdout, d'où ils peuvent être interprétés directement par aplay en temps réel. Quelques exemples utiles sont expliqués ici , et sont inclus sur le projet page github .

5
J. Katzwinkel

La page Python In Music wiki n'a pas été très bien entretenue, mais c'est un bon point de départ. http://wiki.python.org/moin/PythonInMusic

5
eggsyntax

J'aime PyAudiere , qui vous permet de jouer des tableaux numpy en tant que sons ... Je suppose que cela correspond bien à mon arrière-plan Matlab. Je pense que c'est multiplateforme. Je pense que scikits.audiolab fait la même chose, et peut être plus actuel/mieux pris en charge ... me semble plus facile que d'essayer de sauvegarder des choses en tant que fichiers wav ou de les écrire dans des tampons et d'utiliser la bibliothèque de sons intégrée de Python .

3
rdchambers

J'ai trouvé ces deux python très utiles, je voudrais peut-être y jeter un œil ...

python https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder

ipython : https://timsainb.github.io/spectrograms-mfccs-and-inversion-in-python.html

[EDIT] Comme indiqué, voici une explication des deux liens

python on semble avoir une erreur, mais beaucoup de gens ont pu le faire fonctionner, donc je ne suis pas sûr. ipython fonctionnait comme un charme, donc j'espère que vous pourrez l'exécuter.

Les deux liens sont censés prendre un audio en entrée, de préférence . Wav fichier. Présentez-le (UTILISER FFT: 512, taille de pas = 512/8) pour obtenir des spectrogrammes (vous pouvez même le visualiser), c'est une matrice 2D, puis entraînez vos objets d'apprentissage machine ou faites ce que vous voulez en utilisant une matrice qui représente l'original l'audio. Si vous voulez, à un moment donné, ce que ces vecteurs représentent, vous pouvez également resynthétiser l'audio.

3
Priyank Pathak

Je travaille sur un puissant synthétiseur en python. J'ai utilisé des fonctions personnalisées pour écrire directement dans un fichier .wav. Il existe des fonctions intégrées qui peuvent être utilisées à cette fin. Vous devrez modifier l'en-tête .wav pour refléter la fréquence d'échantillonnage, les bits par échantillon, le nombre de canaux et la durée de la synthèse.

Voici une première version d'un générateur d'onde sinueuse qui génère une liste de valeurs qui, après application de bytearray, devient appropriée pour l'écriture dans le paramètre de données d'un fichier wave. [edit] Une fonction de conversion devra transformer la liste en petites valeurs hexadécimales endiennes avant d'appliquer le bytearray. Voir le lien de format de fichier son WAVE PCM ci-dessous pour plus de détails sur la spécification .wav. [/ edit]

def sin_basic(freq, time=1, amp=1, phase=0, samplerate=44100, bitspersample=16):
    bytelist = []
    import math
    TwoPiDivSamplerate = 2*math.pi/samplerate
    increment = TwoPiDivSamplerate * freq
    incadd = phase*increment
    for i in range(int(samplerate*time)):
        if incadd > (2**(bitspersample - 1) - 1):
            incadd = (2**(bitspersample - 1) - 1) - (incadd - (2**(bitspersample - 1) - 1))
        Elif incadd < -(2**(bitspersample - 1) - 1):
            incadd = -(2**(bitspersample - 1) - 1) + (-(2**(bitspersample - 1) - 1) - incadd)
        bytelist.append(int(round(amp*(2**(bitspersample - 1) - 1)*math.sin(incadd))))
        incadd += increment
    return bytelist

Une version plus récente peut utiliser des formes d'onde pour moduler la fréquence, l'amplitude et la phase des paramètres de forme d'onde. Le format des données rend trivial le mélange et la concaténation des ondes. Si cela vous convient, consultez format de fichier son WAVE PCM .

3
Octipi