Je suis nouveau à Python. Je travaille sur une expérience qui utilise des fichiers audio (WAV). Et j'ai plus de 100 fichiers audio avec des longueurs variables. Dont le plus long est de 10 secondes. Mais pour mon expérience, j'ai besoin de tous les fichiers pour avoir la même longueur qui est de 10 secondes. Donc, je veux ajouter quelques secondes de silence devant ces fichiers avec une longueur inférieure à 10 secondes. p>
Alors, comment puis-je ajouter du silence au début d'un fichier WAV avec python? avec une longueur variable de silence p>
3 Réponses :
J'ai fait un petit script qui vous permet de préparer votre signal avec un silence afin d'obtenir la durée de la cible en quelques secondes. Il utilise la fonction scipe pour la lecture du fichier WAV.
#!/usr/bin/env python from __future__ import print_function, division import scipy.io.wavfile as wavf import numpy as np from sys import argv def pad_audio(data, fs, T): # Calculate target number of samples N_tar = int(fs * T) # Calculate number of zero samples to append shape = data.shape # Create the target shape N_pad = N_tar - shape[0] print("Padding with %s seconds of silence" % str(N_pad/fs) ) shape = (N_pad,) + shape[1:] # Stack only if there is something to append if shape[0] > 0: if len(shape) > 1: return np.vstack((np.zeros(shape), data)) else: return np.hstack((np.zeros(shape), data)) else: return data if __name__ == "__main__": if len(argv) != 4: print("Wrong arguments.") print("Use: %s in.wav out.wav target_time_s" % argv[0]) else: in_wav = argv[1] out_wav = argv[2] T = float(argv[3]) # Read the wav file fs, in_data = wavf.read(in_wav) # Prepend with zeros out_data = pad_audio(in_data, fs, T) # Save the output file wavf.write(out_wav, fs, out_data)
Quelle est la variable t?
Comme décrit: cible_time_s code>. Dans votre cas, il est 10 secondes.
J'exécute votre code et je reçois le message d'erreur suivant lors de l'utilisation de VStack. "ValueError: Toutes les dimensions de la matrice d'entrée sauf pour l'axe de la concaténation doivent correspondre exactement". Je pense que c'est parce que la dimension des pavages zéro et les données sont différentes. Mais je ne peux pas comprendre comment le réparer.
Le code fonctionne bien maintenant. Mais la qualité audio est trop dégradée. Vous ne pouvez même pas ici un mot purement. Avez-vous quelque chose à dire à ce sujet?
Je n'ai aucune idée puisque nous n'avons aucun de vos signaux. Avec mes signaux, ce n'est pas différent, juste des zéros numériques au début.
Comment éduqueriez-vous cela pour ajouter à l'arrière du fichier?
Il suffit d'échanger l'ordre des zéros et des données à l'intérieur des tuples (* Fonctions de pile).
Remplacement de npl.zeros (forme) avec npl.zeros (forme, données.dtype) fixe la dégradation de la qualité. @Même
Si vous voulez ajouter le silence à la fin, c'est vraiment simple avec Pysoundfile . P >
juste Ouvrez le fichier dans Ceci modifie les fichiers en place. P>
Si vous souhaitez ajouter le silence au début, vous devrez copier le contenu existant, car @jojek a montré (mais vous pouvez toujours utiliser PRSoundFile pour cela, si vous le souhaitez). P> 'R +' CODE> MODE, Utilisez recherche (0, sf.seek_end) pour passer à la fin du fichier et passer à la fin du fichier et Utilisez écrire () pour écrire le nombre nécessaire de cadres zéro.
En fin de compte, n'oubliez pas de Fermer () Le fichier (ou utiliser < un href = "http://pysounoundfile.readthedocs.org/#ssssoundfile.soundfile" rel = "nofollow"> SoundFile en tant que gestionnaire de contexte). P>
Comme indiqué dans les commentaires @ les mêmes, ces deux méthodes ont abouti à une dégradation de qualité énorme pour moi. Au lieu de cela, j'ai finalement fini par utiliser le PYSOX Paquet pour résoudre mon problème (pour moi, je préparais un Définir la durée, mais vous pouvez étendre cette réponse autour de l'affaire d'utilisation ci-dessus). Notez que une meilleure documentation peut être trouvée à https: //buildmedia.readthedocs. Org / Media / PDF / Pysox / Dernier / Pysox.pdf .
import sox tfm = sox.Transformer() tfm.pad(start_duration=prepend_duration) tfm.build(in_wav, out_wav)
J'aurais pensé qu'il était préférable de mettre le silence à la fin, sinon l'auditeur doit supporter une période inconnue de silence avant d'être surprise par le son réel. Quoi que vous puissiez essayer de le faire en créant / la lecture d'un fichier WAV qui a suffisamment d'échantillons à la fréquence d'échantillonnage que vous utilisez pour durer (10-L) secondes, où L est la durée du fichier audio réel. Qu'avez-vous essayé? PS Il y a un package de bibliothèque standard Python appelé Wave i> que vous pourriez être intéressé. Je l'ai trouvé en cherchant: Python WAV Audio. Avez-vous essayé de chercher?