【问题标题】:How to convert voice.csv data into audio wav form?如何将 voice.csv 数据转换为音频 wav 形式?
【发布时间】: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 的基本示例。您的代码还尝试遍历命令行参数,但每次都会打开并写入相同的文件。

标签: python scipy


【解决方案1】:

该文件包含统计汇总,而不是实际的音频数据。仅凭这些整体测量结果,您无法对忠实的音频信号进行逆向工程。

总而言之,这就像尝试仅根据距离和时间在两点之间创建地形剖面。额外的测量数据,如海拔差异或时间段内的平均加速度将极大地限制可能猜测的数量,但你仍然在疯狂地猜测。

【讨论】:

  • 那么,有什么方法可以将这些数据重新整形为两列?
  • 我确定有,但你完全没有抓住重点。您的代码需要样本,并且无法将您拥有的数据转换为样本。
  • 您可以将 20 公里/小时变成一系列数据点,例如每 3 分钟 1 公里(或进行随机化以使其看起来更真实),但这几乎没有机会代表实际性能结果为 20 公里/小时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2021-04-09
  • 2018-09-25
  • 1970-01-01
相关资源
最近更新 更多