正剧开始:
星历2016年05月13日 10:25:06, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[声调的频谱]。
元音的数据:
生成代码:
#生成声音样本,返回样本矩阵 def sampleGen_2(N, freq1, freq2, freq3): #设立20000个数值点,约可听2秒 sampleArray = []; coef = 2*math.pi/11025; #音色调节 weight = [1.53, 1, 0.87]; totalWeight = 0; if (freq2 <= 0): totalWeight = weight[0]; elif (freq3 <= 0): totalWeight = weight[0] + weight[1]; else: totalWeight = sum(weight); multi = 1.06**6; for i in range(N): xcoef_1 = coef*i*freq1*multi; xcoef_2 = coef*i*freq2*multi; xcoef_3 = coef*i*freq3*multi; yvalue = 0; if (freq2 <= 0): yvalue = (weight[0]*math.sin(xcoef_1))/totalWeight; elif (freq3 <= 0): yvalue = (weight[0]*math.sin(xcoef_1)+ weight[1]*math.sin(xcoef_2))/totalWeight; else: yvalue = (weight[0]*math.sin(xcoef_1)+ weight[1]*math.sin(xcoef_2) + weight[2]*math.sin(xcoef_3))/totalWeight; if (yvalue < 0): yvalue *= 32768; else: yvalue *= 32767; sampleArray.append(round(yvalue)); return sampleArray; #生成声波数据 def tmp2_2(): print('生成波形开始。>>>'); fout= open('output.txt', 'w'); #普通话元音,浊辅音 frequence = [[1000,1400,2400], #a [1100,1550,2600], #a(女) [600,1000,2000], #o [900,1300,3000], #o(女) [600,1400,2400], #e [700,1450,3200], #e(女) [650,2050,2600], #e^ [550,2400,3000], #e^(女) [400,2300,3500], #i [350,2900,3500], #i(女) [400, 700], #u [350, 650], #u(女) [450, 2200, 2500],#yu [350, 2300, 2750],#yu(女) [500, 1500, 2600],#i(兹) [500,1500,3100], #i(兹)(女) [450, 1700, 2400],#i(知) [450, 1900, 2600],#i(知)(女) [600, 1500, 2000],#er [750, 1750, 3600],#er(女) #普通话浊辅音 [550, 1800, 2650], #r [300, 1200, 2350], #m [400, 1500, 2400], #n [380, 1000, 1800], #-n [400, 1000, 1900], #-ng [350, 1500, 2400], #l [300, 2200, 3500], #y(i) [300, 600], #w(u) [350, 2400, 3600] #yu ]; size = len(frequence); for i in range(size): dataStr = ''; size_1 = len(frequence[i]); if (size_1 == 2): dataStr = 'primaryTone_'+ str(frequence[i][0])+'_'+str(frequence[i][1]) + ' = ['; elif (size_1 == 3): dataStr = 'primaryTone_'+ str(frequence[i][0])+'_'+str(frequence[i][1]) +'_'+str(frequence[i][2])+ ' = ['; fout.write(dataStr); data = []; if (size_1 == 2): data = waveDataGen_2(frequence[i][0], frequence[i][1], 0); elif (size_1 == 3): data = waveDataGen_2(frequence[i][0], frequence[i][1], frequence[i][2]); size_1 = len(data); for n in range(size_1): fout.write(str(data[n])); if (n < size_1-1): fout.write(', '); fout.write('];'); fout.write('\r\n'); fout.close(); print('生成波形结束,请到output.txt查收。');
声调的比较:
def waveDataChoose_2(filename): import vowel_0; import vowel_1; import vowel_1_1; import vowel_1_2; import vowel_1_3; import vowel_1_4; import vowel_1_5; import vowel_1_6; size = len(filename); sampledata = []; for i in range(size): tmpdata1 = eval('vowel_1.'+filename[i]); tmpdata1_1 = eval('vowel_1_1.'+filename[i]); tmpdata1_2 = eval('vowel_1_2.'+filename[i]); tmpdata1_3 = eval('vowel_1_3.'+filename[i]); tmpdata1_4 = eval('vowel_1_4.'+filename[i]); tmpdata1_5 = eval('vowel_1_5.'+filename[i]); tmpdata1_6 = eval('vowel_1_6.'+filename[i]); #阴平 sampledata += tmpdata1*9; sampledata += idleWave*50; #阳平 sampledata += tmpdata1; sampledata += tmpdata1_1*2; sampledata += tmpdata1_2*1; sampledata += tmpdata1_3*1; sampledata += tmpdata1_4*1; sampledata += tmpdata1_5*1; sampledata += tmpdata1_6*2; sampledata += idleWave*50; #上声 sampledata += tmpdata1_4*2; sampledata += tmpdata1_3*1; sampledata += tmpdata1_2*1; sampledata += tmpdata1_1*1; sampledata += tmpdata1; sampledata += tmpdata1_1*1; sampledata += tmpdata1_2*1; sampledata += tmpdata1_3*1; sampledata += tmpdata1_4*1; sampledata += tmpdata1_5*1; sampledata += tmpdata1_6*2; sampledata += idleWave*50; #去声 sampledata += tmpdata1_6*2; sampledata += tmpdata1_5*1; sampledata += tmpdata1_4*1; sampledata += tmpdata1_3*1; sampledata += tmpdata1_2*1; sampledata += tmpdata1_1*1; sampledata += tmpdata1*2; sampledata += idleWave*50; sampledata += idleWave*20; for i in range(size): tmpdata1 = eval('vowel_1.'+filename[i]); tmpdata1_1 = eval('vowel_1_1.'+filename[i]); tmpdata1_2 = eval('vowel_1_2.'+filename[i]); tmpdata1_3 = eval('vowel_1_3.'+filename[i]); tmpdata1_4 = eval('vowel_1_4.'+filename[i]); tmpdata1_5 = eval('vowel_1_5.'+filename[i]); tmpdata1_6 = eval('vowel_1_6.'+filename[i]); #各元数据组 sampledata += tmpdata1_1*5; sampledata += idleWave*50; sampledata += tmpdata1_2*5; sampledata += idleWave*50; sampledata += tmpdata1_3*5; sampledata += idleWave*50; sampledata += tmpdata1_4*5; sampledata += idleWave*50; sampledata += tmpdata1_5*5; sampledata += idleWave*50; sampledata += tmpdata1_6*5; sampledata += idleWave*50; sampledata += idleWave*20; return sampledata;
点击打开链接--元音与音调
四种声调[阴平、阳平、上声、去声]的频谱:
同一种元音的频率由低到高:
本节到此结束,欲知后事如何,请看下回分解。