2016-12-18 1 views
-1

안녕하세요 저는 csv 파일을 wav 파일로 변환한다고 가정합니다. wav 파일을 만들었지 만 아무 것도 듣지 못합니다. csv 파일에 10 개의 행을 넣으면 약 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.

감사합니다 모두

+2

정확하게 코드 형식을 지정하십시오. –

답변

2

결재되었습니다! 다음은 WAV 파일의 CSV 파일을 변환하는 코드입니다. CSV 파일에는 다음과 같은 두 개의 열이 있어야합니다. 첫 번째는 샘플 시간입니다.이 파일에서는이 열에 0을 넣을 수 있으므로 중요하지 않습니다. 두 번째 열은 샘플 자체입니다. 예를 들어 샘플이 16 비트 길이 인 경우 - 샘플은 -32678 ~ 32767 (int 범위) 여야합니다. 이 숫자는 56 행의 -1과 1 사이에서 정상화됩니다. 이 파일을 가지고 나면 .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

여기 scipy.io에서 가져온'wavfile' 클래스를 사용하고 있습니까? – Kanmani

+0

예. 마지막 줄 앞의 파일 wavfile.write ('rec.wav', 16000, data_resampled). – gab55

+0

그러면 main에서'write_wav' 함수를 어디에서 사용합니까? – Kanmani