csv 到 wav python

gab*_*b55 0 python csv wav

嗨,我有这个代码,假设将 csv 文件转换为 wav 文件。它创建了一个 wav 文件,但我们什么也没听到。如果我在 csv 文件中放入 10 行,它会生成一个大约 1 分钟的 wav 文件!所以根本不成正比。

我的 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
Run Code Online (Sandbox Code Playgroud)

和这里的代码:

#!/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 !")
Run Code Online (Sandbox Code Playgroud)

原始代码来自 github - pretz,其中包含我在 google 上看到的一些修复程序。

谢谢大家

gab*_*b55 6

解决 !这里是将 CSV 文件转换为 WAV 文件的代码。CSV 文件必须有 2 列:第一列是样本的时间 - 在此文件中无关紧要,因此您可以将 0 放在所有此列中。第二列是样本本身——例如,如果你的样本是 16 位长度——样本应该在 -32678 和 32767 之间( int range )。这个数字将在第 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 !")
Run Code Online (Sandbox Code Playgroud)

享受 !

CSV example:
0 , 20
0 , 15
0 , -40
0 , -1000
...
Run Code Online (Sandbox Code Playgroud)