2017-08-26 1 views
1

Ich versuche, Audio-Sample-Rate (von 44100 bis 22050) eines numpy.array mit 88200 Samples zu konvertieren, in denen ich bereits einen Prozess (wie Stille hinzufügen und konvertieren zu Mono) . Ich habe versucht, dieses Array mit audioop.ratecv zu konvertieren, und es funktioniert, aber es gibt eine str anstelle einer numpy Array und als ich schrieb diese Daten mit scipy.io.wavfile.write das Ergebnis wurde die Hälfte der Daten verloren und die Audio-Geschwindigkeit ist doppelt so schnell (statt langsamer, zumindest würde das irgendwie Sinn machen). audio.ratecv funktioniert gut mit Str Arrays wie wave.open zurück, aber ich weiß nicht, wie diese zu verarbeiten, also habe ich versucht, von str zu numpy mit numpy.array2string(data) zu konvertieren dies auf Ratecv und bekomme korrekte Ergebnisse, und dann wieder zu numpy konvertieren mit numpy.fromstring(data, dtype) und jetzt len ​​der Daten ist 8 Proben. Ich denke, das liegt an der Kompliziertheit der Formate, aber ich weiß nicht, wie ich es kontrollieren kann. Ich habe auch nicht herausgefunden, welche Art von Format str wave.open zurückgibt, so kann ich Format auf diesem zwingen.Audio-Daten-String-Format zu numpy Array

Hier ist dieser Teil meines Codes ist

def conv_sr(data, srold, fixSR, dType, chan = 1): 
    state = None 
    width = 2 # numpy.int16 
    print "data shape", data.shape, type(data[0]) # returns shape 88200, type int16 
    fragments = numpy.array2string(data) 
    print "new fragments len", len(fragments), "type", type(fragments) # return len 30 type str 
    fragments_new, state = audioop.ratecv(fragments, width, chan, srold, fixSR, state) 
    print "fragments", len(fragments_new), type(fragments_new[0]) # returns 16, type str 
    data_to_return = numpy.fromstring(fragments_new, dtype=dType) 
    return data_to_return 

und ich nenne es wie diese

data1 = numpy.array(data1, dtype=dType) 
data_to_copy = numpy.append(data1, data2) 
data_to_copy = _to_copy.sum(axis = 1)/chan 
data_to_copy = data_to_copy.flatten() # because its mono 

data_to_copy = conv_sr(data_to_copy, sr, fixSR, dType) #sr = 44100, fixSR = 22050 

scipy.io.wavfile.write(filename, fixSR, data_to_copy) 

Antwort

0

Nach einem bisschen mehr Forschung, die ich meinen Fehler gefunden, so scheint es, dass 16-Bit-Audio gemacht werden von zwei 8-Bit 'Zellen', also war der Dtyp, den ich anlegte, falsch und deshalb hatte ich Probleme mit der Audio-Geschwindigkeit. Ich habe den richtigen Typ here gefunden. Also, in conv_sr def, ich numpy Array bin geben, wandelt es in Datenfolge, übergeben Sie es Abtastrate zu konvertieren, konvertieren wieder zu numpy Array für scipy.io.wavfile.write und schließlich Umwandlung 2 8bits zu 16-Bit-Format

def widthFinder(dType): 
    try: 
     b = str(dType) 
     bits = int(b[-2:]) 
    except: 
     b = str(dType) 
     bits = int(b[-1:]) 
    width = bits/8 
    return width 

def conv_sr(data, srold, fixSR, dType, chan = 1): 
    state = None 
    width = widthFinder(dType) 
    if width != 1 and width != 2 and width != 4: 
     width = 2 
    fragments = data.tobytes() 
    fragments_new, state = audioop.ratecv(fragments, width, chan, srold, fixSR, state) 
    fragments_dtype = numpy.dtype((numpy.int16, {'x':(numpy.int8,0), 'y':(numpy.int8,1)})) 
    data_to_return = numpy.fromstring(fragments_new, dtype=fragments_dtype) 
    data_to_return = data_to_return.astype(dType) 
    return data_to_return 

Wenn Sie etwas falsch finden, bitte zögern Sie nicht, mich zu korrigieren, ich bin immer noch ein Lerner