2016-12-08 1 views
2

Ich habe Tausende von Aufnahmen, die ich für eine App verwende, die ich erstelle. In letzter Zeit habe ich festgestellt, dass einige der Aufnahmen ein seltsames Echo haben.Finden Sie, ob es ein Echo in einer Audiodatei gibt

Die Aufnahme ist im .wav-Format und ich benutze Python, um sie zu verarbeiten.

Ich sah viele Fragen, in denen Pepole versucht, das Echo abzubrechen, aber ich muss nur diese Dateien finden.

Gibt es ein Tool oder einen Code, mit dem ich diese Dateien finden kann (das Echo muss nicht abgebrochen werden).

Ich habe versucht, Code zu schreiben, um das Echo abzubrechen, und sehen, ob dies hilft mir zu verstehen, wenn eine Datei Echo hat, aber es hat nicht funktioniert. Die resultierende Datei war nur Rauschen, also denke ich, dass mein Algorithmus falsch ist.

def nlms(u, d, M, step, eps=0.001, leak=0, initCoeffs=None, N=None, returnCoeffs=False): 
    # Initialization 
    if N is None: 
    N = len(u)-M+1 
    if initCoeffs is None: 
    initCoeffs = np.zeros(M) 
    y = np.zeros(N) # Filter output 
    e = np.zeros(N) # Error signal 
    w = initCoeffs # Initial filter coeffs 
    leakstep = (1 - step*leak) 
    if returnCoeffs: 
     W = np.zeros((N, M)) # Matrix to hold coeffs for each iteration 

    # Perform filtering 
    for n in xrange(N): 
     x = np.flipud(u[n:n+M]) # Slice to get view of M latest datapoints 
     y[n] = np.dot(x, w) 
     e[n] = d[n+M-1] - y[n] 

     normFactor = 1./(np.dot(x, x) + eps) 
     w = leakstep * w + step * normFactor * x * e[n] 
     y[n] = np.dot(x, w) 
     if returnCoeffs: 
      W[n] = w 

    if returnCoeffs: 
     w = W 

    return y, e, w 



def CancelEcho(file_path): 
    np.seterr(all='raise') 

    audio_file = wave.open(file_path, 'r') 
    audio_params = audio_file.getparams() 
    new_frames = [] 
    u = 'a' 
    while u != " ": 
     data = audio_file.readframes(1024) 
     u = np.fromstring(data, np.int16) 
     u = np.float64(u) 
     if len(u) ==0: 
     break 
     # Generate received signal d(n) using randomly chosen coefficients 
     coeffs = np.concatenate(([0.8], np.zeros(8), [-0.7], np.zeros(9), 
           [0.5], np.zeros(11), [-0.3], np.zeros(3), 
           [0.1], np.zeros(20), [-0.05])) 

     coeffs.dtype = np.int16 
     d = np.convolve(u, coeffs) 

     # Add background noise 
     v = np.random.randn(len(d)) * np.sqrt(5000) 
     d += v 

     # Apply adaptive filter 
     M = 100 # Number of filter taps in adaptive filter 
     step = 0.1 # Step size 
     y, e, w = nlms(u, d, M, step, returnCoeffs=True) 

     new_frames.extend(y) 

    audio_file.close() 
    audio_file = wave.open(out_file, 'w') 
    audio_file.setparams(audio_params) 
    audio_file.writeframes(y.astype(np.int16).tostring()) 
    audio_file.close() 
+0

Um .. Sie sind Code Cancel Echo erzeugt ein Echo-Rauschen in der Datei und entfernt dieses dann. – cjds

+0

"aber es hat nicht funktioniert" - was nicht funktioniert hat, der Code, um das Echo oder die Erhöhung des Verständnisses, die Sie erhofft, würde vom Schreiben des Codes kommen zu stornieren? –

Antwort

0

Eine Idee wäre, einen Teil der Datei zu nehmen und dann, dass durch den Rest der Datei bewegen und den Multiplikationsfaktor finden, die es dauern würde, für ein Signal in die andere zu drehen.

-Code Zuschreibung: https://docs.python.org/2/library/audioop.html

Dies kann funktionieren:

def echocancel(outputdata, inputdata): 
    pos = audioop.findmax(outputdata, 800) # one tenth second 
    out_test = outputdata[pos*2:] 
    in_test = inputdata[pos*2:] 
    ipos, factor = audioop.findfit(in_test, out_test) 
    # Optional (for better cancellation): 
    # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], 
    #    out_test) 
    return factor 

Je näher der Faktor 1,0 ist, desto wahrscheinlicher ist es ein Echo

+0

Wie erstelle ich Output-/Input-Daten? – user844541

Verwandte Themen