2017-02-21 2 views
1

Pour mon projet de dernière année à l'université, je travaille avec Wav Files et Python et déconner avec eux. J'aimerais être capable de jouer les échantillons sonores de la mémoire plutôt que d'écrire les échantillons sonores dans un fichier WAV avant que je puisse les entendre.Comment jouer des échantillons sonores Wav de la mémoire

J'ai cherché des semaines en ligne et j'ai trouvé PyMedia, PySound, PyGame etc et aucun d'entre eux ne semble fonctionner pour moi. Chaque paquet me donne des erreurs.

Y a-t-il d'autres bibliothèques qui me manquent pour m'aider? Ou suis-je juste stupide et ne peux pas faire fonctionner les autres paquets.

Exactement ce que je veux faire est le long des lignes de ce:

#open file and get parameters 
    wavfile = Wave.open("file.wav", "r") 
    params = wfile.getparams() 
    nframes = params[3] 

    #get sound samples in a list 
    samples = [] 
    for i in range(nframes): 
     samples.append(wfile.readframes(1)) 

    playsound(samples) 

    changedSamples = makeChangeTo(samples) 

    playsound(changedSamples) 

Et je voudrais être en mesure d'avoir cela dans une boucle afin que je puisse éditer et entendre les modifications alors que le programme est encore runnning sans avoir à écrire les échantillons dans un fichier wav avant de pouvoir l'entendre car cela prend trop de temps.

Des suggestions? À votre santé !

+0

essayer SSDD ou RAM virtuelle des disques? les fichiers, les interfaces de streaming peuvent masquer les latences qui provoqueraient des écarts de lecture/enregistrement - ce qui est attendu avec un langage interprété avec garbage collection comme Python – f5r5e5d

+0

Vous n'avez fourni aucune information sur les erreurs que vous rencontrez pour faire fonctionner ces bibliothèques. pygame peut certainement [créer un objet Sound] (https://www.pygame.org/docs/ref/mixer.html#pygame.mixer.Sound) à partir d'un fichier audio OGG ou d'un WAV non compressé. –

Répondre

0

Vous devez séparer clairement ces deux préoccupations:

  1. lecture/écriture des fichiers WAV (ou d'autres fichiers audio)

  2. Lecture/enregistrement de sons

Il y a plusieurs questions et des réponses aux deux sujets ici sur SO.

Ceci est ma recommandation personnelle (et bien sûr biaisée):

Vous devez utiliser NumPy pour manipuler les sons, il est beaucoup plus facile que la manipulation des tampons Python simples. Si, pour une raison quelconque, vous ne pouvez pas utiliser NumPy, vous pouvez toujours faire tout cela, mais ce sera un peu plus de travail.

Pour lire/écrire des fichiers son, je recommande le module soundfile (divulgation complète: je suis un co-auteur).

Pour la lecture/enregistrement des sons, je recommande le module sounddevice (divulgation complète: je suis son auteur principal).

Lorsque vous utilisez ces modules, votre exemple serait probablement devenu quelque chose comme ceci:

import soundfile as sf 
import sounddevice as sd 

samples, samplerate = sf.read('file.wav') 
sd.play(samples, samplerate) 
sd.wait() 
changed_samples = make_change_to(samples) 
sd.play(changed_samples, samplerate) 
sd.wait() 

Si vous travaillez dans une invite de Python interactif, vous n'avez pas besoin probablement les sd.wait() appels, vous pouvez simplement attendre la la lecture est terminée.Ou, si vous vous ennuyez d'écouter, vous pouvez utiliser:

sd.stop() 

Si vous savez que vous utiliserez le même taux d'échantillonnage pendant un certain temps, vous pouvez le régler par défaut:

sd.default.samplerate = 48000 

Après cela, vous pouvez déposer l'argument samplerate lors de l'utilisation play():

sd.play(samples) 

Si vous souhaitez enregistrer le son a changé dans un fichier, vous pouvez utiliser quelque chose comme ceci:

sf.write('changed_file.wav', changed_samples, samplerate) 

Pour en savoir plus:

+0

Génial, l'air bien Je vais essayer et voir ce qui se passe. Merci l'homme je l'apprécie! – ConorSpn

+0

@ConorSpn Génial! Si cela vous aide, vous devriez envisager de voter et/ou d'accepter ma réponse. Sinon, faites le moi savoir afin que je puisse essayer d'améliorer ma réponse! – Matthias