8
votes

Comment ajouter du silence devant un fichier wav

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.

Alors, comment puis-je ajouter du silence au début d'un fichier WAV avec python? avec une longueur variable de silence


1 commentaires

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 que vous pourriez être intéressé. Je l'ai trouvé en cherchant: Python WAV Audio. Avez-vous essayé de chercher?


3 Réponses :


4
votes

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)


8 commentaires

Quelle est la variable t?


Comme décrit: cible_time_s . 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



0
votes

Si vous voulez ajouter le silence à la fin, c'est vraiment simple avec Pysoundfile .

juste Ouvrez le fichier dans 'R +' 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).

Ceci modifie les fichiers en place.

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).


0 commentaires

0
votes

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)


0 commentaires