2015-09-08 4 views
5

Ich bin neu in Python. Ich arbeite an einem Experiment, das Audio (WAV) -Dateien verwendet. Und ich habe mehr als 100 Audiodateien mit variablen Längen. Welches ist das längste 10 Sekunden. Aber für mein Experiment brauche ich alle Dateien die gleiche Länge haben, die 10 Sekunden ist. Daher möchte ich vor diesen Dateien mit einer Länge von weniger als 10 Sekunden ein paar Sekunden Stille hinzufügen.Wie Stille vor einer WAV-Datei hinzufügen

Also, wie kann ich Stille am Anfang einer WAV-Datei mit Python hinzufügen? mit variabler Länge der Stille

+1

Ich hätte gedacht, es wäre besser, die Stille auf das Ende zu stellen, sonst muss der Hörer eine unbekannte Schweigeminute ertragen, bevor er vom eigentlichen Sound überrascht wird. Wie auch immer, Sie könnten versuchen, dies zu tun, indem Sie eine WAV-Datei erstellen/abspielen, die genügend Samples mit der von Ihnen verwendeten Sample-Rate für (10-L) Sekunden enthält, wobei L die Dauer der eigentlichen Audiodatei ist. Was hast du probiert? PS: Es gibt ein Python-Standard-Bibliothekspaket mit dem Namen _wave_, an dem Sie vielleicht interessiert sind. Ich habe es gefunden, indem ich nach: python wav audio gesucht habe. Hast du versucht zu suchen? – barny

Antwort

2

Ich habe ein kleines Skript, mit dem Sie Ihr Signal mit einer Stille voranzustellen, um die Zieldauer in Sekunden zu erhalten. Es verwendet die scipy-Funktion zum Lesen der wav-Datei.

#!/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) 
+0

Was ist die Variable T? – Same

+0

Wie beschrieben: 'target_time_s'. In Ihrem Fall sind es 10 Sekunden. – jojek

+0

Ich führe deinen Code und ich bekomme die folgende Fehlermeldung, wenn Sie vstack verwenden. "valueError: Alle Eingabe-Array-Dimensionen außer der Verkettungsachse müssen exakt übereinstimmen". Ich denke, es liegt daran, dass die Dimension der Nullpolster und die Daten unterschiedlich sind. Aber ich kann nicht herausfinden, wie ich es beheben kann. – Same

0

Wenn Sie die Stille am Ende angehängt werden sollen, das ist wirklich einfach mit PySoundFile.

Gerade open the file in 'r+' Modus verwenden seek(0, sf.SEEK_END) bis zum Ende der Datei zu bewegen und write() verwenden, um die erforderliche Anzahl von Null-Frames zu schreiben. Am Ende vergessen Sie nicht, close() die Datei (oder verwenden Sie SoundFile als Kontextmanager).

Dies ändert die Dateien an Ort und Stelle.

Wenn Sie die Stille am Anfang hinzufügen möchten, müssen Sie den vorhandenen Inhalt kopieren, wie @jojek gezeigt hat (aber Sie können immer noch PySoundFile dafür verwenden, wenn Sie möchten).