8
votes

Quel est le moyen le plus simple de lire des fichiers WAV à l'aide de Python [Résumé]?

Je souhaite utiliser Python pour accéder à un fichier WAV et écrire son contenu dans un formulaire qui me permet d'analyser (disons des tableaux).

  1. J'ai entendu dire que "Audiolab" est un outil approprié pour cela (il transforme des tableaux numpus en WAV et Vica Versa).
  2. J'ai installé "Audiolab", mais j'ai eu un problème avec la version de Numpy (je ne pouvais pas "de Numpy.Testing Testeur d'importation"). J'avais 1.1.1. version de NUMPY.
  3. J'ai installé une version plus récente sur NUMPY (1.4.0). Mais alors j'ai eu un nouvel ensemble d'erreurs:

    Traceback (appel le plus récent): Fichier "test.py", ligne 7, dans Import Scikits.Agédiolab Fichier "/USR/LIB/PYTHON2.5/SITE-PACKAGES/SCIKITS/AUDIOLAB/EXSTRONG-INITOINITOIPE" SSTRONGO.PY ", LIGNE 25, IN de pysndfile importer formadifo, sndfile Fichier "/USR/LIB/PYTHON2.5/SITE-PACACKES/SCIKITS/AUDIOLAB/PYSNDFILE/EXSTRONG >ILITOIRE" SSTSTRONGO.PY ", ligne 1, dans de _sndfile Import Sndfile, format, disponible_file_Formats, disponible_encodings Fichier "Numpy.PXD", ligne 30, dans Scikits.Audiolab.pysndfile._sndfile (Scikits / Audiolab / PYSnDFile / _SNDFILE.c: 9632) ValueError: Numpy.Dtype n'apparaît pas être l'objet de type correct

  4. J'ai abandonné à l'audiolab et j'ai pensé que je peux utiliser un package "Wave" à lire dans un fichier WAV. J'ai posé une question à ce sujet à ce sujet, mais les gens ont recommandé d'utiliser Scipy à la place. Ok, j'ai décidé de me concentrer sur Scipire (j'ai 0.6.0. Version).

  5. Mais quand j'ai essayé de faire ce qui suit:

    de scipey.io importer wavfile
    x = wavfile.read ('/ usr / sons / sons / violet / recevoir.wav')

    Je reçois ce qui suit: xxx

    1. Alors, j'ai abandonné pour utiliser Scipy. Puis-je utiliser juste un forfait vague? Je n'ai pas besoin de beaucoup. Je dois juste avoir du contenu du fichier WAV au format lisible humain et que je ne comprendrai quoi faire avec ça.

7 commentaires

Comment installiez-vous exactement audiolab?


Comment est-ce différent de vos questions précédentes sur le même sujet?


Audiolab est génial. Essayez de réussir ça. Assurez-vous d'avoir installé les paquets libsndfile et SeugoTools. Avez-vous suivi sec. 2.4 Dans le manuel?


Avez-vous reçu une nouvelle version de Scipy lorsque vous avez mis à niveau votre version de Numpy? J'utilise une vague pour lire dans des fichiers d'ondes telles que James Roth suggéré ci-dessous, mais si vous souhaitez utiliser SciPy, vous devez vérifier si votre version de Scipy est à jour. Des messages d'erreur que vous obtenez, je suppose que ce n'est pas le cas.


Avez-vous vu cette? Stackoverflow.com / Questions / 2060628 / ... Time-timbre est (plus) récente, mars 2011.


pydub est une autre alternative pour la lecture dans les fichiers d'ondes.


Comment gérer des sons stéréo? 2 tableaux qui ont 1-dimension? ou un seul tableau 2 dimensions?


8 Réponses :


1
votes

Audiolab est le meilleur moyen, mais cela ne fonctionne pas dans tous les environnements et le développeur ne fonctionne pas dessus. J'utilise toujours Python 2.5 afin que je puisse l'utiliser.

Avez-vous installé libsndfile ?


0 commentaires

13
votes

Avez-vous essayé le module de vague? Il a moins de dépendances:

http://docs.python.org/library/wave.html xxx


2 commentaires

Au lieu de tout, utilisez [0 :: 2] et out [1 :: 2].


Combinez ceci avec des outils de conversion externes pour ouvrir d'autres formats. assembler.com/code/ Freesound / Git / Nœuds / Freesound / Utils / ...



2
votes

Après avoir essayé tant de choses qui ne fonctionnent pas, j'ai utilisé la bibliothèque de décodage de Utilisez (python) gstreamer pour décoder audio (aux données PCM) et construire une fonction pour analyser les données PCM brutes dans un tableau SCIPY.

C'est bien et peut ouvrir n'importe quel fichier audio que Gstreamer peut ouvrir: http://gist.github.com/592776 (voir test et fin du fichier pour l'utilisation info)


0 commentaires

5
votes

C'est assez bon pour moi xxx

Il ignore les 24 premières valeurs, car ce n'est pas audio, c'est l'en-tête.

aussi, si le fichier était stéréo , vos canaux auront des index alternatifs, donc je le réduisez généralement à Mono avec Audacity d'abord.


1 commentaires

Cela fonctionne si vous connaissez le format de fichier (nombre de canaux, taux d'échantillonnage) et savoir qu'il n'y a pas de choses étranges dans le fichier (comme plusieurs blocs de données - voir CCRMA.STANFORD.EDU/COURSES/422/PROJECTS/WAVEFORMAT ).



6
votes

J'ai écrit un wrapper simple sur le module de vague dans le std lib. C'est ce qu'on appelle pydub et il a une méthode de lecture d'échantillons à partir des données audio en tant qu'OB.

>>> from pydub import AudioSegment
>>> song = AudioSegment.from_wav("your_song.wav")
<pydub.audio_segment.AudioSegment at 0x1068868d0>

>>> # This song is stereo
>>> song.channels
2

>>> # get the 5000th "frame" in the song
>>> frame = song.get_frame(5000)

>>> sample_left, sample_right = frame[:2], frame[2:]
>>> def sample_to_int(sample): 
        return int(sample.encode("hex"), 16)

>>> sample_to_int(sample_left)
8448

>>> sample_to_int(sample_right)
9984


0 commentaires

5
votes

Vous pouvez également utiliser le module d'onde avec la fonction numpy.fromstring () pour le convertir en une matrice

import wave
import numpy

fp = wave.open('test.wav')
nchan = fp.getnchannels()
N = fp.getnframes()
dstr = fp.readframes(N*nchan)
data = numpy.fromstring(dstr, numpy.int16)
data = numpy.reshape(data, (-1,nchan))


0 commentaires

1
votes

Audiolab semble être non maintenu, vous devriez essayer pysoundfile .

L'installation est simple: p> xxx pré>

et lire un fichier son aussi:

import soundfile as sf
x, fs = sf.read('/usr/share/sounds/purple/receive.wav')


0 commentaires

0
votes

pydub fournit une solution encore plus facile sans aucune dépendance à installer (pour les fichiers WAV). J'utilise actuellement cette méthode de production sans aucun problème.

from pydub import AudioSegment
awesome_song = AudioSegment.from_wav('awesome_song.wav')
print('Duration in seconds is {}'.format(awesome_song.duration_seconds))


0 commentaires