Bonjour tous le monde
Il semble que Python soit livré avec un module wave en standard, et il semble que vous puissiez lire et écrire des fichiers wav en l'utilisant. Cette fois, jouons avec un programme qui l'utilise pour créer un fichier wav court avec la dernière moitié coupée d'un long fichier wav.
Je suis PHPer, donc je ne sais pas comment préparer l'environnement python, mais j'ai une image docker avec des keras que j'utilise souvent, donc j'utilise celle-ci. (Bien que ce soit assez lourd) https://hub.docker.com/r/gw000/keras-full/
De plus, bien sûr, je n'ai pas le courage de créer un fichier et de l'exécuter à plusieurs reprises sur la console, donc je lance rapidement jupyter et l'exécute via un navigateur.
$ docker run --rm -v `pwd`/src:/srv -v `pwd`/data:/data -p 8888:8888 -p 6006:6006 -m 2g gw000/keras-full
J'étais inquiet pour la mémoire, j'ai donc réservé 2 Go au cas où. plus tard, http://127.0.0.1:8888 Si vous accédez avec un navigateur, jupyter est en cours d'exécution, alors entrez le mot de passe [keras] et démarrez.
Maintenant que la préparation est terminée, lisons le fichier wave et récupérons les informations. Entrez ce qui suit sur le jupyter.
import wave
import struct
from scipy import fromstring, int16
#Lire le fichier
wavf = '/data/input/test.wav'
wr = wave.open(wavf, 'r')
#Obtenir les propriétés d'un fichier wave
ch = wr.getnchannels()
width = wr.getsampwidth()
fr = wr.getframerate()
fn = wr.getnframes()
print("Channel: ", ch)
print("Sample width: ", width)
print("Frame Rate: ", fr)
print("Frame num: ", fn)
print("Params: ", wr.getparams())
print("Total time: ", 1.0 * fn / fr)
#Obtenez les données de vagues réelles et quantifiez-les
data = wr.readframes(wr.getnframes())
wr.close()
X = fromstring(data, dtype=int16)
Je vais essayer de l'exécuter jusqu'à présent.
Channel: 2
Sample width: 2
Frame Rate: 44100
Frame num: 15884224
Params: _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=15884224, comptype='NONE', compname='not compressed')
Total time: 360.18648526077095
Le résultat suivant est sorti. Puisque le canal est 2, vous pouvez voir que ce fichier est en stéréo. En outre, vous pouvez voir que le temps total est de 360 secondes = 6 minutes, ce qui est un fichier relativement long.
Ensuite, écrivons le contenu lu pendant 90 secondes à partir du début dans un autre fichier.
#Calculez le nombre d'images équivalent à 90 secondes
time = 90
frames = int(ch * fr * time)
#Générer des données de sortie
outf = '/data/output/test.wav'
Y = X[:frames]
outd = struct.pack("h" * len(Y), *Y)
#Exportation
ww = wave.open(outf, 'w')
ww.setnchannels(ch)
ww.setsampwidth(width)
ww.setframerate(fr)
ww.writeframes(outd)
ww.close()
C'est comme ça. S'il y a plusieurs canaux, le nombre de trames nécessaires augmentera en conséquence, ce qui est donc pris en considération. Ainsi, après avoir à nouveau converti les données de sortie au format de chaîne de caractères, vous avez l'impression d'écrire en spécifiant les mêmes paramètres que lors de la lecture. Donc, si vous regardez si le fichier a réellement été créé,
On dirait que c'est fait.
Cette fois, j'ai étudié comment éditer un fichier wav directement en utilisant wave, qui est un module standard de Python. C'est pourquoi j'en parle. .. ..
Cette fois, c'est comme ça.
http://yukara-13.hatenablog.com/entry/2013/11/09/103848 http://denshi.blog.jp/signal_processing/python/save_sine_wave
Recommended Posts