【发布时间】:2019-09-18 14:29:24
【问题描述】:
我正在使用 voice.csv 数据将其转换为音频 wav 形式,但它有 21 列,在我的代码中它只需要两个值(列),所以我应该在我的代码中进行哪些更改来创建wav 格式。
数据来自https://www.kaggle.com/primaryobjects/voicegender,其中也有数据描述:
测量每个声音的以下声学属性并将其包含在 CSV 中:
- meanfreq:平均频率(以 kHz 为单位)
- sd:频率的标准偏差
- median:中值频率(以 kHz 为单位)
- Q25:第一个分位数(以 kHz 为单位)
- Q75:第三分位数(以 kHz 为单位)
- IQR:分位数范围(以 kHz 为单位)
- skew:偏度(参见规范说明中的注释)
- kurt:峰度(参见 specprop 描述中的注释)
- sp.ent:谱熵
- sfm:光谱平坦度
- 模式:模式频率
- centroid:频率质心(参见 specprop)
- peakf:峰值频率(能量最高的频率)
- meanfun:通过声学信号测量的基频平均值
- minfun:通过声学信号测量的最小基频
- maxfun:通过声学信号测量的最大基频
- meandom:在声学信号中测量的主频率的平均值
- mindom:在声学信号中测量的主频率的最小值
- maxdom:在声学信号中测量的最大主频率
- dfrange:在声信号中测量的主频率范围
- modindx:调制指数。计算为基频相邻测量值之间的累积绝对差除以频率范围
- 标签:男性或女性
我的代码需要两列输入。我试图将这些列转换为时间和频率,并通过跳过多个列进行了尝试,但没有得到我想要的结果。
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('voice.csv'), 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 !")
ValueError Traceback (most recent call
last)
<ipython-input-10-ad8c56a24b4d> in <module>
6
7 data = []
----> 8 for time, value in csv.reader(open('voice.csv'),
delimiter=','):
9 try:
10 data.append(float(value))#Here you can see that the
time column is skipped
ValueError: too many values to unpack (expected 2)
【问题讨论】:
-
在不了解您正在使用的数据的情况下,问题之一是
for time, value in csv.reade(...)不是您逐行读取 csv 的方式。查看 csv 模块 manual 的基本示例。您的代码还尝试遍历命令行参数,但每次都会打开并写入相同的文件。