2016-12-18 8 views
-1

Привет, у меня есть этот код, который предполагает преобразовать файл csv в wav-файл. создает wav-файл, но мы ничего не слышим. Если я поставил 10 строк в файле csv, он сделает примерно 1 мин wav-файл! Так что это не пропорционально вообще.csv to wav python

мой CSV выглядит следующим образом:

0.000785,0.30886552 
0.00157,0.587527526 
0.002355,0.808736061 
0.00314,0.950859461 
0.003925,0.999999683 
0.00471,0.951351376 
0.005495,0.809671788 
0.00628,0.588815562 
0.007065,0.31037991 
0.00785,0.001592653 
0.008635,-0.307350347 
0.00942,-0.586237999 
0.010205,-0.807798281 
0.01099,-0.950365133 
0.011775,-0.999997146 
0.01256,-0.951840879 
0.013345,-0.810605462 
0.01413,-0.590102105 
0.014915,-0.311893512 
0.0157,-0.003185302 
0.016485,0.305834394 
0.01727,0.584946986 
0.018055,0.806858453 
0.01884,0.949868395 
0.019625,0.999992073 
0.02041,0.952327967 
0.021195,0.81153708 
0.02198,0.591387151 
0.022765,0.313406323 

и код здесь:

#!/usr/bin/python 

import wave 
import numpy 
import struct 
import sys 
import csv 
import resampy 

def write_wav(data, filename, framerate, amplitude): 
    wavfile = wave.open(filename, "w") 
    nchannels = 1 
    sampwidth = 2 
    framerate = framerate 
    nframes = len(data) 
    comptype = "NONE" 
    compname = "not compressed" 
    wavfile.setparams((nchannels, 
         sampwidth, 
         framerate, 
         nframes, 
         comptype, 
         compname)) 
    #print("Please be patient while the file is written") 
    frames = [] 
    for s in data: 
     mul = int(s * amplitude) 
     # print "s: %f mul: %d" % (s, mul) 
     frames.append(struct.pack('h', mul)) 
    #frames = (struct.pack('h', int(s*self.amp)) for s in sine_list) 
    frames = ''.join(frames) 
    #for x in xrange(0, 7200): 
    wavfile.writeframes(frames) 
    wavfile.close() 
    print("%s written" %(filename)) 


if __name__ == "__main__": 
    if len(sys.argv) <= 1: 
     print ("You must supply a filename to generate") 
     exit(-1) 
    for fname in sys.argv[1:]: 

     data = [] 
     for time, value in csv.reader(open(fname, 'U'), delimiter=','): 
      try: 
       data.append(float(value)) 
      except ValueError: 
       pass # Just skip it 


     print("This is data lenght: %d" %(len(data))) 
     arr = numpy.array(data) 
     print arr 
     # Normalize data 
     arr /= numpy.max(numpy.abs(data)) 
     print arr 
     filename_head, extension = fname.rsplit(".", 1) 
     # Resample normalized data to 8000 kHz 
     target_samplerate = 8000 
     sampled = resampy.resample(arr, target_samplerate/100000.0,16000) 
     #print sampled 
     write_wav(sampled, "new" + ".wav", target_samplerate, 32700) 
     print ("File written succesfully !") 

Исходный код находится в GitHub - pretz с некоторыми исправлениями я видел на Google.

спасибо

+2

правильно отформатируйте свой код –

ответ

2

RESOLVED! Здесь приведен код для преобразования CSV-файла в WAV-файл. Файл CSV должен иметь 2 столбца: Первое - это время образца - в этом файле не имеет значения, поэтому вы можете поставить 0 во весь этот столбец. Второй столбец - это сам образец - например, если ваш образец имеет длину в 16 бит - образец должен быть между -32678 и 32767 (диапазон интервала). Это число будет нормализовано между -1 и 1 в строке 56. После этого файла вам просто нужно запустить .py с именем файла csv в качестве аргумента. (например, python generate.py sinewave.csv).

#!/usr/bin/python 

import wave 
import struct 
import sys 
import csv 
import numpy 
from scipy.io import wavfile 
from scipy.signal import resample 

def write_wav(data, filename, framerate, amplitude): 
    wavfile = wave.open(filename,'w') 
    nchannels = 1 
    sampwidth = 2 
    framerate = framerate 
    nframes = len(data) 
    comptype = "NONE" 
    compname = "not compressed" 
    wavfile.setparams((nchannels, 
         sampwidth, 
         framerate, 
         nframes, 
         comptype, 
         compname)) 
    frames = [] 
    for s in data: 
     mul = int(s * amplitude) 
     frames.append(struct.pack('h', mul)) 

    frames = ''.join(frames) 
    wavfile.writeframes(frames) 
    wavfile.close() 
    print("%s written" %(filename)) 


if __name__ == "__main__": 
    if len(sys.argv) <= 1: 
     print ("You must supply a filename to generate") 
     exit(-1) 
    for fname in sys.argv[1:]: 

     data = [] 
     for time, value in csv.reader(open(fname, 'U'), delimiter=','): 
      try: 
       data.append(float(value))#Here you can see that the time column is skipped 
      except ValueError: 
       pass # Just skip it 


     arr = numpy.array(data)#Just organize all your samples into an array 
     # Normalize data 
     arr /= numpy.max(numpy.abs(data)) #Divide all your samples by the max sample value 
     filename_head, extension = fname.rsplit(".", 1)   
     data_resampled = resample(arr, len(data)) 
     wavfile.write('rec.wav', 16000, data_resampled) #resampling at 16khz 
     print ("File written succesfully !") 

Наслаждайтесь!

CSV example: 
0 , 20 
0 , 15 
0 , -40 
0 , -1000 
... 
+0

Вы используете класс 'wavfile', который вы импортировали из scipy.io здесь? – Kanmani

+0

есть. перед предыдущей строкой wavfile.write ('rec.wav', 16000, data_resampled). – gab55

+0

Тогда, где вы используете функцию 'write_wav' в главном? – Kanmani