[从头读历史] 第281节 始制文字 世界上的语系及语言
来源:互联网 发布:淘宝上的shockabsorber 编辑:程序博客网 时间:2024/06/01 07:32
剧情提要:
春秋时期,中华混沌帝国一片兴旺发达的景象,但这在厄尔斯星球上并不是孤例。
那么在那个时期,星球各地的人们用什么语言在交流呢?他们的文字又是怎样的呢?
正剧开始:
星历2016年07月03日 09:36:51, 银河系厄尔斯星球中华帝国江南行省。
春秋时期,中华混沌帝国一片兴旺发达的景象,但这在厄尔斯星球上并不是孤例。
那么在那个时期,星球各地的人们用什么语言在交流呢?他们的文字又是怎样的呢?
正剧开始:
星历2016年07月03日 09:36:51, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[始制文字 世界上的语系及语言]。
下面看一下音节:
<span style="font-size:18px;">import struct;import math;'''import os from os.path import join, getsizeimport voice.tian, voice.di, voice.xuan, voice.huang;'''#辅音音节class Voice(): def idleWave(self): return [b'\x00']*200; def consonant(self): terms = [ 'b', 'c', 'ch', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 'sh', 't', 'v', 'w', 'x', 'y', 'z' ]; return terms; def vowel(self): terms = [ 'a', 'ai', 'an', 'ang', 'ao', 'e', 'ei', 'en', 'eng', 'er', 'i', 'ian', 'iang', 'ie', 'in', 'ing', 'iong', 'iu' 'o', 'oi', 'on', 'ong', 'ou', 'u', 'ua', 'uan', 'uang', 'ue', 'uei', 'uen', 'ueng', 'üe', 'ün' ]; return terms; def pingYin(self): terms = [#410项'a', 'ai', 'an', 'ang', 'ao', 'ba', 'bai', 'ban', 'bang', 'bao', 'bei', 'ben', 'beng', 'bi', 'bian', 'biao', 'bie', 'bin', 'bing', 'bo', 'bu', 'ca', 'cai', 'can', 'cang', 'cao', 'ce', 'cen', 'ceng', 'cha', 'chai', 'chan', 'chang', 'chao', 'che', 'chen', 'cheng', 'chi', 'chong', 'chou', 'chu', 'chua', 'chuai', 'chuan', 'chuang', 'chui', 'chun', 'chuo', 'ci', 'cong', 'cou', 'cu', 'cuan', 'cui', 'cun', 'cuo', 'da', 'dai', 'dan', 'dang', 'dao', 'de', 'den', 'dei', 'deng', 'di', 'dia', 'dian', 'diao', 'die', 'ding', 'diu', 'dong', 'dou', 'du', 'duan', 'dui', 'dun', 'duo', 'e', 'ei', 'en', 'eng', 'er', 'fa', 'fan', 'fang', 'fei', 'fen', 'feng', 'fo', 'fou', 'fu', 'ga', 'gai', 'gan', 'gang', 'gao', 'ge', 'gei', 'gen', 'geng', 'gong', 'gou', 'gu', 'gua', 'guai', 'guan', 'guang', 'gui', 'gun', 'guo', 'ha', 'hai', 'han', 'hang', 'hao', 'he', 'hei', 'hen', 'heng', 'hong', 'hou', 'hu', 'hua', 'huai', 'huan', 'huang', 'hui', 'hun', 'huo', 'ji', 'jia', 'jian', 'jiang', 'jiao', 'jie', 'jin', 'jing', 'jiong', 'jiu', 'ju', 'juan', 'jue', 'jun', 'ka', 'kai', 'kan', 'kang', 'kao', 'ke', 'ken', 'keng', 'kong', 'kou', 'ku', 'kua', 'kuai', 'kuan', 'kuang', 'kui', 'kun', 'kuo', 'la', 'lai', 'lan', 'lang', 'lao', 'le', 'lei', 'leng', 'li', 'lia', 'lian', 'liang', 'liao', 'lie', 'lin', 'ling', 'liu', 'long', 'lou', 'lu', 'lü', 'luan', 'lue', 'lüe', 'lun', 'luo', 'm', 'ma', 'mai', 'man', 'mang', 'mao', 'me', 'mei', 'men', 'meng', 'mi', 'mian', 'miao', 'mie', 'min', 'ming', 'miu', 'mo', 'mou', 'mu', 'na', 'nai', 'nan', 'nang', 'nao', 'ne', 'nei', 'nen', 'neng', 'ni', 'nian', 'niang', 'niao', 'nie', 'nin', 'ning', 'niu', 'nong', 'nou', 'nu', 'nü', 'nuan', 'nüe', 'nuo', 'nun', 'o', 'ou', 'pa', 'pai', 'pan', 'pang', 'pao', 'pei', 'pen', 'peng', 'pi', 'pian', 'piao', 'pie', 'pin', 'ping', 'po', 'pou', 'pu', 'qi', 'qia', 'qian', 'qiang', 'qiao', 'qie', 'qin', 'qing', 'qiong', 'qiu', 'qu', 'quan', 'que', 'qun', 'ran', 'rang', 'rao', 're', 'ren', 'reng', 'ri', 'rong', 'rou', 'ru', 'ruan', 'rui', 'run', 'ruo', 'sa', 'sai', 'san', 'sang', 'sao', 'se', 'sen', 'seng', 'sha', 'shai', 'shan', 'shang', 'shao', 'she', 'shei', 'shen', 'sheng', 'shi', 'shou', 'shu', 'shua', 'shuai', 'shuan', 'shuang', 'shui', 'shun', 'shuo', 'si', 'song', 'sou', 'su', 'suan', 'sui', 'sun', 'suo', 'ta', 'tai', 'tan', 'tang', 'tao', 'te', 'teng', 'ti', 'tian', 'tiao', 'tie', 'ting', 'tong', 'tou', 'tu', 'tuan', 'tui', 'tun', 'tuo', 'wa', 'wai', 'wan', 'wang', 'wei', 'wen', 'weng', 'wo', 'wu', 'xi', 'xia', 'xian', 'xiang', 'xiao', 'xie', 'xin', 'xing', 'xiong', 'xiu', 'xu', 'xuan', 'xue', 'xun', 'ya', 'yan', 'yang', 'yao', 'ye', 'yi', 'yin', 'ying', 'yo', 'yong', 'you', 'yu', 'yuan', 'yue', 'yun', 'za', 'zai', 'zan', 'zang', 'zao', 'ze', 'zei', 'zen', 'zeng', 'zha', 'zhai', 'zhan', 'zhang', 'zhao', 'zhe', 'zhei', 'zhen', 'zheng', 'zhi', 'zhong', 'zhou', 'zhu', 'zhua', 'zhuai', 'zhuan', 'zhuang', 'zhui', 'zhun', 'zhuo', 'zi', 'zong', 'zou', 'zu', 'zuan', 'zui', 'zun', 'zuo', ]; return terms; def combineYinJie(self): v = self.vowel(); c = self.consonant(); com_ = []; for i in range(len(v)): if (v[i][0] == 'i' or v[i][0] == 'u'): continue; else: com_.append(v[i]); for i in range(len(c)): for j in range(len(v)): com_.append(c[i]+v[j]); return com_; #从音节的录音中(.wav)处理出音节,把数据写入文件 def yinJieProcess(self, sFile): fileSize = getFileSize(sFile); if (fileSize < 44): return; c = []; #每次读取1000个字节 perRead = 100; with open(sFile, 'rb') as f: #这是标准.wav的文件头长度 a = f.read(44); index = 44; start = 0; end = 0; spareCount = 0; while (index < fileSize): a = f.read(perRead); b = list(a); count = countZero(b[1:-1:2], 64); if (count > perRead / 2* 17/20): #认为这是空白 index += perRead; if (start == 0): #前端空白 continue; else: #后端空白 end = index; if (end -start < 5000): continue; else: index = fileSize+1; break; else: if (start == 0): start = index; #正部开始 index += perRead; validLength = end-start; f.seek(start, 0);#第二个参数whence = 0表示从开头,=2表示从结尾倒着数 data = list(f.read(validLength)); f.close(); print('有效部分从{0}字节开始,到{1}字节结束,共有{2}个字节。即{3}秒到{4}秒' .format(start ,end, validLength, round(start/22050, 3), round(end/22050, 3))); dataArray = []; for i in range(len(data)): byte = struct.pack('B', data[i]); dataArray.append(byte); print('文件写入开始。请至tone.py查收>>>'); fout = open('tone.py', 'w'); fout.write('tone_X = ['); size_1 = len(dataArray); for n in range(size_1): fout.write(str(dataArray[n])); if (n < size_1-1): fout.write(', '); fout.write('];'); fout.write('\r\n'); fout.close(); print('文件写入完毕。'); #把十进制数按照小尾字节序切割 def littleEndian(self, number, byte = 4): result = [0]*byte; for i in range(byte): result[i] = number%256; number//=256; return result; #把UltraEdit中的值字串转化为hex序列组 def hexExpr(self, string): resultString = ''; size = len(string); for i in range(size): if (i == 0 ): resultString += '0x'+string[i]; elif (string[i] == ' '): resultString += ', 0x'; else: resultString += string[i]; print(resultString); ### # @usage 写.wav文件,能把声波数据阵列用二进制写成.wav。 # @author mw # @date 2016年04月28日 星期四 14:31:34 # @param # @return # ### def writeWav(self, filename = 'soundwave'): byteArray = []; dataArray = []; #样本数据阵列 sampleArray = []; idleWave = self.idleWave(); sampleArray = self.waveDataGen(); #样本数据点数 N = len(sampleArray); times = 1; dataSize = N*times; fileSize = dataSize+44; #44为格式头部分所用字节数 #RIFF WAVE CHUNK RIFF_ID = [0x52, 0x49, 0x46, 0x46]; #'RIFF' RIFF_Size = self.littleEndian(fileSize-8, 4); #文件总字节数减去8 RIFF_Type = [0x57, 0x41,0x56, 0x45, 0x66, 0x6D, 0x74, 0x20]; #'WAVEfat ' #Format Chunk Format_10_17 = [0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00];#过滤4+格式2+声道2=8个字节 Format_18_1B = [0x11, 0x2B, 0x00, 0x00]; #采样频率0x2B11 = 11025 Format_1C_1F = [0x22, 0x56, 0x00, 0x00]; #比持率 = 频率*通道*样本位 = 22050 Format_20_23 = [0x02, 0x00, 0x10, 0x00]; #块对齐 = 通道数* 样本位数 = 1*2 = 2 #Fact Chunk(optional) #Data Chunk Data_24_27 = [0x64, 0x61, 0x74, 0x61]; #'DATA'标记 Data_Size = self.littleEndian(fileSize-44, 4); #下面的Data部分的字节数,文件总字节数-44 #RIFF WAVE CHUNK ''' for i in range(4): byte = struct.pack('B', RIFF_ID[i]); byteArray.append(byte); ''' RIFF = [b'R', b'I', b'F', b'F']; for i in range(4): byteArray.append(RIFF[i]); for i in range(4): byte = struct.pack('B', RIFF_Size[i]); byteArray.append(byte); ''' for i in range(8): byte = struct.pack('B', RIFF_Type[i]); byteArray.append(byte); #Format Chunk for i in range(8): byte = struct.pack('B', Format_10_17[i]); byteArray.append(byte); for i in range(4): byte = struct.pack('B', Format_18_1B[i]); byteArray.append(byte); for i in range(4): byte = struct.pack('B', Format_1C_1F[i]); byteArray.append(byte); for i in range(4): byte = struct.pack('B', Format_20_23[i]); byteArray.append(byte); #Data Chunk for i in range(4): byte = struct.pack('B', Data_24_27[i]); byteArray.append(byte); ''' #Format_28_2B是数据块大小,formatHead是它前面的所有部分 formatHead = [b'W', b'A', b'V', b'E', b'f', b'm', b't', b' ', \ b'\x10', b'\x00', b'\x00', b'\x00', b'\x01', b'\x00', b'\x01', b'\x00', \ b'\x11', b'+', b'\x00', b'\x00', \ b'"', b'V', b'\x00', b'\x00', \ b'\x02', b'\x00', b'\x10', b'\x00', \ b'd', b'a', b't', b'a']; for i in range(len(formatHead)): byteArray.append(formatHead[i]); for i in range(4): byte = struct.pack('B', Data_Size[i]); byteArray.append(byte); #写出到文件 print('文件写入开始。>>>'); s = ''; s = filename+'.wav'; fout= open(s, 'wb'); size = len(byteArray); for i in range(size): fout.write(byteArray[i]); size = len(sampleArray); sizeIdle = len(idleWave); for j in range(times): for i in range(size): fout.write(sampleArray[i]); fout.close(); print('文件写入完毕。'); #声音数据的生成 def waveDataGen(self): tian1 = voice.tian.tone_tian1; di1 = voice.di.tone_di1; xuan1 = voice.xuan.tone_xuan1; huang1 = voice.huang.tone_huang1; idle = self.idleWave(); data = []; sArray = [ 'tian1', 'di1', 'xuan1', 'huang1' ,'di1', 'xuan1', 'huang1', 'tian1']*2; for i in range(len(sArray)): data += eval(sArray[i]); data += idle*30; return data; def read(): fin = open('../input.txt', 'r'); array = []; for line in fin.readlines(): if (line[0]!= '拼' and line[0].isalpha()): array.append(line[:-1]); #print(len(array)); fin.close(); for i in range(len(array)): print('\''+array[i]+'\', ', end = ''); if (i%10 == 9): print(''); #print(array); def getFileSize(sFile): size = getsize(sFile); #print('文件{0}的大小是{1}字节'.format(sFile, size)); return size;def countZero(array, judgeValue): count = 0; for i in range(len(array)): if (abs(array[i]) < judgeValue): count+=1; return count; def tmp(): if (0): pron = Voice(); terms = pron.combineYinJie(); print('音节数共有{0}个'.format(len(terms))); read(); ''' index = 2; pron = Voice(); if (index == 1): #把录音的音节去除空白部分 pron.yinJieProcess('huang1.wav'); elif (index == 2): #写声音文件 pron.writeWav(); ''' if __name__ == '__main__': tmp();</span>
本节到此结束,欲知后事如何,请看下回分解。
0 0
- [从头读历史] 第281节 始制文字 世界上的语系及语言
- [从头读历史] 第249节 易经
- [从头读历史] 第241节 根据天时定历法
- [从头读历史] 第242节 根据地利定河山
- [从头读历史] 第243节 根据人和定生态
- [从头读历史] 第244节 三皇与五帝
- [从头读历史] 第246节 夏商与西周
- [从头读历史] 第250节 图解易经(上)
- [从头读历史] 第251节 图解易经(下)
- [从头读历史] 第259节 左传 [BC722至BC718]
- [从头读历史] 第260节 左传 [BC717至BC658]
- [从头读历史] 第261节 左传 [BC657至BC598]
- [从头读历史] 第262节 左传 [BC597至BC538]
- [从头读历史] 第263节 左传 [BC537至BC479]
- [从头读历史] 第264节 春秋诸侯国分布图
- [从头读历史] 第265节 诗经 周南
- [从头读历史] 第266节 诗经 召南
- [从头读历史] 第267节 诗经 邶风
- 2014.12.31 GY-291陀螺仪(ADXL345)串口输出字符形式加速度
- linux 下编程指令
- kmeans++
- php 跳转控制
- 数据结构复习之图(3)
- [从头读历史] 第281节 始制文字 世界上的语系及语言
- hdu 1394 Minimum Inversion Number(树状数组求逆序数)
- Picasso高逼格使用技巧
- 3-8[attribute!=value]属性选择器
- Linux开发工具之gcc
- Linux shell入门基础(八)
- GenyMotion不能启动的问题,Unable to start the virtual device.VirtualBox cannot start the virtual device
- Linux开发工具之Makefile(上)
- Linux开发工具之Makefile(下)