2015-09-08 9 views
5

Sono nuovo in Python. Sto lavorando a un esperimento che utilizza file audio (WAV). E ho più di 100 file audio con lunghezze variabili. Quale il più lungo è di 10 secondi. Ma per il mio esperimento ho bisogno che tutti i file abbiano la stessa lunghezza di 10 secondi. Quindi voglio aggiungere qualche secondo di silenzio davanti a questi file con una lunghezza inferiore a 10 secondi.Come aggiungere il silenzio davanti a un file wav

Quindi, come posso aggiungere silenzio all'inizio di un file WAV con python? con una lunghezza variabile di silenzio

+1

Avrei pensato che fosse meglio mettere il silenzio alla fine, altrimenti l'ascoltatore deve sopportare un periodo di silenzio sconosciuto prima di essere sorpreso dal suono reale. In ogni caso, puoi provare a farlo creando/riproducendo un file WAV che ha un numero sufficiente di campioni alla frequenza di campionamento che stai utilizzando per una durata di (10-L) secondi, dove L è la durata del file audio effettivo. Che cosa hai provato? PS c'è un pacchetto Python Standard Library chiamato _wave_ a cui potresti essere interessato. L'ho trovato cercando: python wav audio. Hai provato a cercare? – barny

risposta

2

Ho fatto un piccolo script che consente di anteporre il segnale a un silenzio per ottenere la durata target in secondi. Usa la funzione scipy per leggere il file 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) 
+0

qual è la variabile T? – Same

+0

Come descritto: 'target_time_s'. Nel tuo caso sono 10 secondi. – jojek

+0

Eseguo il codice e viene visualizzato il seguente messaggio di errore quando si utilizza vstack. "valueError: tutte le dimensioni dell'array di input, ad eccezione dell'asse di concatenazione, devono corrispondere esattamente". Penso che sia perché la dimensione dei paddate zero e dei dati sono diversi. Ma non riesco a capire come aggiustarlo. – Same

0

Se si desidera aggiungere il silenzio, alla fine, questo è davvero semplice con PySoundFile.

Proprio open the file in modalità 'r+', utilizzare seek(0, sf.SEEK_END) per spostarsi alla fine del file e utilizzare write() di scrivere il numero necessario di zero-frame. Alla fine, non dimenticare di close() il file (o utilizzare SoundFile come gestore del contesto).

Questo cambia i file sul posto.

Se si desidera aggiungere il silenzio all'inizio, è necessario copiare il contenuto esistente come mostrato da @jojek (ma è comunque possibile utilizzare PySoundFile per questo, se lo si desidera).

Problemi correlati