8
votes

Comment convertir un fichier wav en amplitude flottante

Alors j'ai tout demandé à tout dans le titre:

J'ai un fichier WAV (écrit par Pyaudio à partir d'un audio d'entrée) et je souhaite la convertir dans des données de flotteur correspondant du niveau sonore (amplitude) pour faire une transformation de Fourier, etc.

Quelqu'un a une idée de convertir des données WAV pour flotter?


0 commentaires

5 Réponses :



5
votes

La plupart des fichiers Wave sont au format entier de PCM 16 bits.

Ce que vous voulez:

  • Analyser l'en-tête pour savoir quel format il est (Vérifiez le lien de XOPHMEISTER)
  • Lisez les données, prenez les valeurs entier et convertissez-les en flottant

    Les valeurs entière vont de -32768 à 32767, et vous devez convertir en valeurs de -1,0 à 1,0 dans des points flottants.

    Je n'ai pas le code dans Python, cependant En C ++, voici un extrait de code si les données PCM sont entier de 16 bits et le convertissent en float (32 bits): xxx

    Soyez prudent avec des fichiers stéréo, Lorsque les données STEREO PCM dans des fichiers Wave sont entrelacées, ce qui signifie que les données ressemblent à Lrlrlrlrlrlrlr (au lieu de LLLLLLLLLRRRRRRRR). Vous pouvez ou peut-être pas besoin de désentreler en fonction de ce que vous faites avec les données.


0 commentaires

6
votes

J'ai passé des heures à essayer de trouver la réponse à cela. La solution se révèle vraiment simple: structure.unpack est ce que vous recherchez. Le code final ressemblera à ceci:

rawdata=stream.read()                  # The raw PCM data in need of conversion
from struct import unpack              # Import unpack -- this is what does the conversion
npts=len(rawdata)                      # Number of data points to be converted
formatstr='%ih' % npts                 # The format to convert the data; use '%iB' for unsigned PCM
int_data=unpack(formatstr,rawdata)     # Convert from raw PCM to integer tuple


0 commentaires

11
votes

J'ai identifié deux façons décentes de le faire.

Méthode 1: Utilisation du module de fil de vagues

Utilisez cette méthode si cela ne vous dérange pas d'installer certaines bibliothèques supplémentaires qui impliquaient un peu de messages sur mon Mac mais qui était facile sur mon serveur Ubuntu.

https://github.com/vokimon/python-wavefile < / p> xxx

Méthode 2: Utilisation du module d'onde

Utilisez cette méthode si vous voulez moins de module Installez les tracas.

lit un fichier WAV du système de fichiers et la convertit en flotteurs dans la plage -1 en 1. Il fonctionne avec 16 fichiers bits et si elles sont> 1 canal, alloniront les échantillons de la même manière qu'ils se trouvent dans le fichier. Pour les autres profondeurs de bits, changez la "H" dans l'argument en structure.unpack en fonction de la table en bas de cette page:

https://docs.python.org/2/library/truct.html

Il ne fonctionnera pas pour les fichiers 24 bits Comme il n'y a pas de type de données 24 bits, il n'ya donc aucun moyen de dire structurer.unpack quoi faire. xxx


1 commentaires

Si vous obtenez OsError ou wave.error Essayez d'utiliser FFMPEG Commande ffmpeg -i chanson.mp3 chanson.wav via CLI pour convertir le fichier audio. Il devrait fonctionner alors ( SRC )



1
votes

Cette version lit un fichier WAV du système de fichiers et le convertit en flotteurs dans la plage -1 à 1. Il fonctionne avec des fichiers de toutes les largeurs d'échantillons et des échantillons de la même manière qu'ils sont trouvés dans le fichier.

import wave

def read_wav_file(filename):
    def get_int(bytes_obj):
        an_int = int.from_bytes(bytes_obj, 'little',  signed=sampwidth!=1)
        return an_int - 128 * (sampwidth == 1)
    with wave.open(filename, 'rb') as file:
        sampwidth = file.getsampwidth()
        frames = file.readframes(-1)
    bytes_samples = (frames[i : i+sampwidth] for i in range(0, len(frames), sampwidth))
    return [get_int(b) / pow(2, sampwidth * 8 - 1) for b in bytes_samples]


0 commentaires