Python - sous-échantillonnage wav fichier audio
J'ai pour sous-échantillonner un fichier wav à partir de 44100 hz à 16000Hz sans l'aide extérieure de bibliothèques python, donc de préférence wave
et/ou audioop
. J'ai essayé en changeant simplement les fichiers wav framerate à 16000 en utilisant setframerate
fonction, mais cela ralentit l'ensemble de l'enregistrement. Comment puis-je sous-échantillonner le fichier audio à 16kHz et maintenir la même longueur de l'audio?
Je vous remercie beaucoup à l'avance
Si vous allez vers le bas pour 11025Hz il sera plus facile, il suffit de filtre passe-bas, puis prenez tous les 4 échantillons
Est audioop de ratecv ce que vous êtes après? docs.python.org/2/library/audioop.html#audioop.ratecv
Il doit être 16kHz parce que notre pipeline de l'outil a besoin d'exporter pour l'Unité des projets. Pourriez-vous me donner un exemple d'utilisation de la audioop.ratecv fonction? Parce que je suis un peu perdu avec le fragment paramètre de cette fonction. Comment puis-je l'obtenir? @JimJeffries
Est audioop de ratecv ce que vous êtes après? docs.python.org/2/library/audioop.html#audioop.ratecv
Il doit être 16kHz parce que notre pipeline de l'outil a besoin d'exporter pour l'Unité des projets. Pourriez-vous me donner un exemple d'utilisation de la audioop.ratecv fonction? Parce que je suis un peu perdu avec le fragment paramètre de cette fonction. Comment puis-je l'obtenir? @JimJeffries
OriginalL'auteur d3cr1pt0r | 2015-06-03
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser Librosa de la fonction load (),
L'effort supplémentaire pour installer Librosa vaut probablement la peine de la paix de l'esprit.
Pro-tip: lors de l'installation de Librosa sur Anaconda, vous devez installer ffmpeg, ainsi
Cela vous permet d'économiser le NoBackendError() erreur.
librosa.output.write_wav(filename, y, sr)
.OriginalL'auteur wafflecat
Merci à vous tous pour vos réponses. J'ai trouvé une solution déjà et il fonctionne très belle. Ici est la fonction entière.
Les modules ci-dessus sont tous dans la prévention des mst lib
OriginalL'auteur d3cr1pt0r
Vous pouvez utiliser de rééchantillonnage dans
scipy
. C'est un peu un mal de tête à faire, car il y a certains type de conversion à effectuer entre lebytestring
natif de python et les tableaux nécessaires dansscipy
. Il y a un autre mal de tête, parce que dans la vague du module en Python, il n'y a aucun moyen de savoir si les données sont signées ou non (seulement si elle est de 8 ou 16 bits). Il peut (doit) travailler pour les deux, mais je n'ai pas testé.Voici un petit programme qui convertit (non signé) 8 et 16 bits mono de 44,1 à 16. Si vous avez stéréo, ou utiliser d'autres formats, il ne devrait pas être difficile de s'adapter. Modifier l'entrée/sortie des noms au début du code. Jamais eu à utiliser les arguments de ligne de commande.
OriginalL'auteur jcoppens
Pour sous-échantillonner (également appelé les décimer), le signal (il s'agit de réduire la fréquence d'échantillonnage), ou de sur-échantillonner (augmentation de la fréquence d'échantillonnage) vous avez besoin d'interpoler entre vos données.
L'idée est que vous devez en quelque sorte tirage une courbe entre vos points, et ensuite prendre les valeurs de cette courbe à la nouvelle fréquence d'échantillonnage. C'est parce que vous voulez connaître le valuesof l'onde sonore à un moment qui n'a pas été échantillonnés, alors vous devez deviner cette valeur par une manière ou d'une autre. Le seul cas où le sous-échantillonnage serait facile, c'est quand vous divisez le taux d'échantillonnage par un entier $k$. Dans ce cas vous avez juste à prendre des seaux de $k$ d'échantillons et de ne garder que la première. Mais ce ne sera pas répondre à votre question. Voir l'image ci-dessous où vous avez une courbe échantillonnées à deux échelles différentes.
Vous pourriez le faire à la main si vous comprenez le principe, mais je vous recommande fortement de l'utiliser d'une bibliothèque. La raison en est que l'interpolation le droit chemin n'est pas facile ou évident.
Vous pouvez utiliser une interpolation linéaire (points de connexion avec une ligne) ou d'un binôme d'interpolation (se connecter en trois points avec un morceau de degré) ou (parfois, le meilleur pour le son) l'utilisation d'une transformée de Fourier et l'interpolation dans l'espace des fréquences.
Depuis la transformée de fourier n'est pas quelque chose que vous voulez ré-écrire à la main, si vous voulez un bon échantillonnage/supsampling,
Voir l'image ci-dessous pour les deux courbe de suréchantillonnage à l'aide de différents algorithmes de scipy. Le "rééchantillonnage" fonction de l'utilisation de la transformation de fourier.
J'étais en effet dans le cas que j'était en train de charger un 44100Hz fichier wave et exigé une 48000Hz de données échantillonnées, j'ai donc écrit les quelques lignes suivantes pour charger mes données:
Notez que vous pouvez aussi utiliser la méthode les décimer dans le cas où vous ne faites que des sous-échantillonnage et veulent quelque chose de plus rapide que de fourier.
OriginalL'auteur Jeremy Cochoy