J'utilise des données voice.csv pour les convertir en format audio wav mais il y a 21 colonnes et dans mon code il n'attend que deux valeurs (colonnes), alors quels changements dois-je faire dans mon code pour créer un formulaire wav.
Les données proviennent de https://www.kaggle.com/primaryobjects/voicegender qui contient également une description des données :
Les propriétés acoustiques suivantes de chaque voix sont mesurées et incluses dans le CSV :
- meanfreq : fréquence moyenne (en kHz)
- sd : écart-type de la fréquence
- median : fréquence médiane (en kHz)
- Q25 : premier quantile (en kHz)
- Q75 : troisième quantile (en kHz)
- IQR : intervalle interquantile (en kHz)
- skew : asymétrie (voir note dans la description de specprop)
- kurt : kurtosis (voir note dans la description de specprop)
- sp.ent : entropie spectrale
- sfm : planéité spectrale
- mode : fréquence du mode
- centroid : centroïde de fréquence (voir specprop)
- peakf : fréquence de crête (fréquence avec la plus haute énergie)
- meanfun : moyenne de la fréquence fondamentale mesurée sur l'ensemble du signal acoustique
- minfun : fréquence fondamentale minimale mesurée à travers le signal acoustique
- maxfun : fréquence fondamentale maximale mesurée à travers le signal acoustique
- meandom : moyenne de la fréquence dominante mesurée sur l'ensemble du signal acoustique
- mindom : minimum de la fréquence dominante mesurée à travers le signal acoustique
- maxdom : maximum de la fréquence dominante mesurée dans le signal acoustique
- dfrange : gamme de fréquence dominante mesurée à travers le signal acoustique
- modindx : indice de modulation. Calculé comme la différence absolue cumulée entre les mesures adjacentes des fréquences fondamentales, divisée par la gamme de fréquences.
- étiquette : homme ou femme
Mon code prévoit une saisie sur deux colonnes. J'ai essayé de convertir ces colonnes en temps et en fréquence en sautant plusieurs colonnes, mais je n'obtiens pas les résultats que je souhaite.
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)