OVH Cloud OVH Cloud

enregistrer un son sous python

8 réponses
Avatar
igor carron
Bonjour,

J'essaie d'enregistrer un son sous Windows et Python 2.2 afin de
pouvoir l'analyser en frequence.

J'ai joue un peu avec fastaudio
http://www.freenet.org.nz/python/pyPortAudio/
mais je ne comprends pas comment l'enregistrement qui devient une
string peut-etre sauver sous un fichier wav (en utlisant l'exemple) ?
Il n'y a pas non plus de documentation pour dsptools (
http://sourceforge.net/projects/dsptools )

Quelqu'un aurait-il un element de reponse ? Merci d'avance,

Igor.

8 réponses

Avatar
Sean McIlroy
je me demande que ceci vous interesserait:

http://www.speech.kth.se/snack/

peace
sean
Avatar
Do Re Mi chel La Si Do
'soir

J'avais fais une classe, qui fonctionnait avec Python 2.3 + ctypes, et
adressait directement windows.MCI
Si ça te dis, je met ça en-dessous...

Michel Claveau




import time
from ctypes import windll, c_buffer

class mci:
def __init__(self):
self.w32mci = windll.winmm.mciSendStringA
self.w32mcierror = windll.winmm.mciGetErrorStringA

def send(self,commande):
buffer = c_buffer(255)
errorcode = self.w32mci(str(commande),buffer,254,0)
if errorcode:
return errorcode, self.get_error(errorcode)
else:
return errorcode,buffer.value

def get_error(self,error):
error = int(error)
buffer = c_buffer(255)
self.w32mcierror(error,buffer,254)
return buffer.value

def directsend(self, txt):
(err,buf)=self.send(txt)
if err != 0:
print'Erreur',str(err),'sur',txt,':',buf
return (err,buf)

def record(self):
print"Record"
self.directsend('open new type waveaudio alias toto')
self.directsend('Set toto time format milliseconds')
self.directsend('set toto bitspersample 8') # 8 bits ou 16 bits
self.directsend('set toto samplespersec 11025') # 11025 low
qualité 22050 medium qualité 44100 high qualité (CD)
self.directsend('set toto channels 1') # 1 mono 2 stéréo
self.directsend('record toto')
time.sleep(0.1)

def finrecord(self, nomfichier):
self.directsend('stop toto')
self.directsend('save toto '+nomfichier)
self.directsend('close toto')
#self.directsend('delete toto')



message=mci()
message.record()
for i in xrange(5):
time.sleep(1)
print 5-i
print "Fin"
message.finrecord()
Avatar
igor carron
Michel,

Ca marche. Merci beaucoup. J'ai utilise Ctypes pour python 2.2 et ca
marche sous Python 2.2 aussi.

Un petit detail, la derniere ligne devrait etre:
message.finrecord('C:enregistrement1.wav')
afin d'enregistrer le son dans le fichier: enregistrement1.wav
cela semble evident mais je suis un nouveau avec python.

Merci aussi a Sean pour la reference sur Snack.

Igor.
Avatar
Do Re Mi chel La Si Do
Bonsoir !

Pour la dernière ligne, je suis d'accord. Mais j'ai donné un fichier "brut",
que j'utilise indirectement.


Pour le reste, si tu envisages de pouvoir faire des analyses (fréquences,
niveau, etc.), je serais intéressé par la façon de faire. Cela pourrait
permettre de trouver les début/fin automatiquement, d'approcher (doucement)
la reconnaissance vocale, etc.


@-salutations

Michel Claveau
Avatar
igorcarron
Bonjour,

Il y a bien sur cet article:
http://www.onlamp.com/pub/a/python/2001/01/31/numerically.html

au lieu d'utiliser dislin, j'utilise scipy. Pour l'instant je
m'interesse a des sons tres precis mais si tu es interesse par la
chose, je te conseille de regarder des articles sur les ondelettes
(wavelet en anglais).

Merci encore,

Igor.
Avatar
igorcarron
Michel,

A ta question, oui, je ferais un petit resume de mes incursions dans ce
domaine dans ce groupe.

Igor.
Avatar
Do Re Mi chel La Si Do
Bonsoir !

Merci pour le lien, très facile, malgré l'anglais omni-présent.
L'exemple donné ayant fonctionné du premier coup, je laisse ma
xénolinguiphobie de côté...

@-salutations

Michel Claveau
Avatar
Do Re Mi chel La Si Do
Merci d'avance.

MCI