Modifier les fichiers wav à l'aide du module Wave de Python

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.

Préparation environnementale

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.

chargement wav

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.

Exporter vers wave

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éé,

スクリーンショット 2017-06-06 13.53.56.png

On dirait que c'est fait.

Résumé

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.

référence

http://yukara-13.hatenablog.com/entry/2013/11/09/103848 http://denshi.blog.jp/signal_processing/python/save_sine_wave

Recommended Posts

Modifier les fichiers wav à l'aide du module Wave de Python
En savoir plus sur la journalisation à l'aide du module de journalisation de Python ①
J'ai essayé de synthétiser des fichiers WAV en utilisant Pydub.
Enregistrez le tableau numpy dans un fichier wav à l'aide du module wave
Premiers pas avec le module ast de Python (à l'aide de NodeVisitor)
Essayez d'utiliser l'analyseur de flux de Python.
Essayez d'utiliser Tkinter de Python