L'écriture d'un fichier wav en Python avec wavfile.écrire à partir de SciPy
J'ai ce code:
import numpy as np
import scipy.io.wavfile
import math
rate, data = scipy.io.wavfile.read('xenencounter_23.wav')
data2 = []
for i in range(len(data)):
data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])
data2 = np.asarray(data2)
print data2
scipy.io.wavfile.write('xenencounter_23sin3.wav',rate,data2)
Cette affiche (tronquée):
[[-2524 2728]
[ -423 -2270]
[ 2270 423]
...,
[-2524 0]
[ 2524 -2728]
[-2270 838]]
Le wav fichier s'ouvre et joue dans Windows Media Player, donc au moins, le bon format. Cependant, lors de l'ouverture avec de l'Audace et de la recherche dans les échantillons individuels, ils sont tous à 0, et de façon concordante le fichier joue pas de son du tout.
Ce que je ne comprends pas comment est ce que un tableau numpy énumérés ci-dessus devient 0. Il devrait être inférieur à la valeur maximale pour un échantillon (ou ci-dessus, si elle est négative).
qu'advient-il si vous le recharger avec scipy? est-il de zéros ou les valeurs que vous avez enregistré?
Il retourne la même chose que de l'imprimer avant de les écrire.
Pouvez-vous ajouter un
Il imprime cette
essayez
Il retourne la même chose que de l'imprimer avant de les écrire.
Pouvez-vous ajouter un
print data
déclaration après la ligne rate, data = scipy.io.wavfile.read('xenencounter_23.wav')
. Je veux voir ce que l'apparence des données.Il imprime cette
[[-1 2] [-3 4] [-4 3] ..., [-1 0] [ 1 -2] [ 4 -6]]
Cependant, dans une autre partie du tableau, il énumère: [-2050 -1856] [-1814 -1621] [-1493 -1295] [-2042 -1848]
, de manière assez similaireessayez
scipy.io.wavfile.write('xenencounter_23sin3.wav',rate,data)
- vous voulez savoir si la méthode d'écriture ou de l'opération que vous faites sur les données est le problème.OriginalL'auteur JVE999 | 2013-09-05
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé que scipy.io.wavfile.write() écrit en entier 16 bits, ce qui explique la taille du fichier lors de l'utilisation d'un entier de 32 bits (par défaut) à la place. Si je ne pouvais pas trouver un moyen de changer cela dans wavfile.écrire, je n'ai trouver que, en changeant:
à
Je pourrais écrire un fichier de travail.
OriginalL'auteur
Comme vous l'avez découvert par l'impression de la sortie à différents points et ré-enregistrer ce que vous avez initialement chargé, la ligne
data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])
est la source du problème.Je soupçonne que 3000 est trop grand d'une amplitude. Essayez 1.
Essayez
data2.append([int(data[i][0]), [int(data[i][1])])
- malheureusement, vous avez besoin de garder en éliminant les choses jusqu'à ce que vous découvrirez la fonction qui brise votre code.Qui a fait la même chose. Je comprends vague fichier de données est stockée en tant que complément à deux d'un nombre par chaque échantillon. Je ne sais pas si cela ferait une différence. Il n'a pas l'impression comme un complément à deux du nombre, donc je me dis que la conversion est en wavefile.écrire
qu'est-ce que la sortie de
data1.shape == data2.shape
? Je commence à soupçonner que la seconde matrice a de mauvaises dimensions.La sortie est
true
OriginalL'auteur
Dans la création de fichiers wav à travers scipy.io.wavfile.write(), j'ai trouvé que l'amplitude est très important. si vous créez une onde sinusoïdale dont l'amplitude 150, cela ressemble à de silence lors de la lecture dans VLC. si l'amplitude est de 100, ça sonne comme une déformation de l'onde sinusoïdale, et si vous le faites 80, il commence à sonner comme un fichier normal.
Vraiment être prudent sur l'amplitude lors de la création des fichiers wave, mais il n'est pas clair pour moi maintenant ce que le niveau maximal avant qu'il ne commence l'écrêtage ou en voie de disparition.
OriginalL'auteur