web-dev-qa-db-fra.com

Jouer un son avec Python

Quel est le moyen le plus simple de lire un fichier son (.wav) en Python? Par plus simple, j'entends à la fois la plupart des plateformes indépendantes et celles qui requièrent le moins de dépendances. Pygame est certainement une option, mais il semble exagéré pour un son juste.

98
Claudiu

The Snack Sound Toolkit peut lire les fichiers wav, au et mp3.

s = Sound() 
s.read('sound.wav') 
s.play()
30
csexton

Pour Windows, vous pouvez utiliser Winsound. Il est construit en

import winsound

winsound.PlaySound('sound.wav', winsound.SND_FILENAME)

Vous devriez pouvoir utiliser ossaudiodev pour Linux:

from wave import open as waveOpen
from ossaudiodev import open as ossOpen
s = waveOpen('tada.wav','rb')
(nc,sw,fr,nf,comptype, compname) = s.getparams( )
dsp = ossOpen('/dev/dsp','w')
try:
  from ossaudiodev import AFMT_S16_NE
except ImportError:
  from sys import byteorder
  if byteorder == "little":
    AFMT_S16_NE = ossaudiodev.AFMT_S16_LE
  else:
    AFMT_S16_NE = ossaudiodev.AFMT_S16_BE
dsp.setparameters(AFMT_S16_NE, nc, fr)
data = s.readframes(nf)
s.close()
dsp.write(data)
dsp.close()

(Crédit pour ossaudiodev: Bill Dandreta http://mail.python.org/pipermail/python-list/2004-October/288905.html )

103
orestis

Cela semble ridicule et tiré par les cheveux, mais vous pouvez toujours utiliser Windows (ou le système d'exploitation de votre choix) pour gérer le son pour vous!

import os
os.system("start C:/thepathyouwant/file")

Simple, pas d'extensions, un peu lent et capricieux, mais fonctionnel.

28
Fillip

Utilisez certainement Pyglet pour cela. C'est un gros paquet, mais c'est du pur python sans module d'extension. Ce sera certainement le plus facile à déployer. Il prend également en charge les formats et les codecs.

import pyglet

music = pyglet.resource.media('music.mp3')
music.play()

pyglet.app.run()
16
Peter Shinners

Après la commande play (), ajoutez un délai de 10 secondes environ, cela fonctionnera

import pygame

import time

pygame.init()

pygame.mixer.music.load("test.wav")

pygame.mixer.music.play()

time.sleep(10)

Cela lit également les fichiers .mp3.

7
ramkumar

l'exemple sonore de pyMedia fait juste ça . Cela devrait être tout ce dont vous avez besoin.

import time, wave, pymedia.audio.sound as sound
f= wave.open( 'YOUR FILE NAME', 'rb' )
sampleRate= f.getframerate()
channels= f.getnchannels()
format= sound.AFMT_S16_LE
snd= sound.Output( sampleRate, channels, format )
s= f.readframes( 300000 )
snd.play( s )
4
Rizwan Kassim

J'aime pygame, et la commande ci-dessous devrait marcher:

pygame.init()
pygame.mixer.Sound('sound.wav').play()

mais ce n'est pas le cas sur l'un ou l'autre de mes ordinateurs et l'aide en la matière est limitée. edit: J'ai compris pourquoi le son pygame ne fonctionne pas pour moi, il ne charge pas la plupart des sons correctement, l'attribut 'length' est ~ 0,0002 lorsque je les charge. peut-être que les charger en utilisant autre chose que mygame le fera fonctionner plus généralement.

avec une pyglet je reçois une erreur de ressource non trouvée En utilisant l'exemple ci-dessus, identifiez à la fois les chemins relatifs et complets vers les fichiers.

utiliser pyglet.media.load() au lieu de pyglet.resource.media() me permet de charger les fichiers.

mais sound.play() ne lit que la première fraction de seconde du fichier, sauf si je lance pyglet.app.run() qui bloque tout le reste ...

2
suki

wxPython prend en charge la lecture de fichiers wav sous Windows et Unix - je ne sais pas si cela inclut les Mac. Cependant, il ne prend en charge que les fichiers wav, pour autant que je sache, il ne prend pas en charge les autres formats courants tels que mp3 ou ogg.

2
Dave Kirby

Je viens de publier un simple wrapper python autour de sox qui va jouer un son avec Python. Il est très facile à installer car vous avez besoin de Python 2.6 ou supérieur, de sox (facile d’obtenir des binaires pour la plupart des architectures) et du wrapper ( https://github.com/standarddeviant/sound4python =). Si vous n'avez pas sox, allez ici: http://sourceforge.net/projects/sox/files/sox/

Vous voudriez jouer de l'audio avec:

from sound4python import sound
import random
a = []
for idx in xrange(1*16000):
    a.append(random.randint(-16384,16384))
sound(a)

N'oubliez pas que les seules parties réellement impliquées dans la lecture de l'audio sont les suivantes:

from sound4python import sound
...
sound(a)    
2
Dave C

Pour les utilisateurs Linux, si une manipulation de données pcm de bas niveau est nécessaire, essayez le module alsaaudio . Il existe également un exemple playwav.py dans le package.

1
GBY