一,思想
首先要明白mdx和mdd里面的音频一一对应,mdx相当于词典索引,而mdd则是资源。根据这个关系,则可以进行解析了。先用论坛上的工具解析出mdx.txt和mdd的资源。然后用下面的脚本进行处理,具体可以根据mdx和mdd进行针对修改
二,脚本
我用python写的,其实用什么脚本都一样,因为之前没有用过python,借这个机会学一下。理论上,这个脚本可以应用于所有mdx和mdd文件的音频库制作
三,脚本代码
主要需要了解的是正则表达式,或者不用正则,用字符串处理也行,方法都可以。用正则比较简单一些。
下面,我把代码给注释上,方便查阅。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#!/usr/bin/python3 import re import os import shutil // 这个变量是解析出来mdx的txt文件 OPDmdx="D:\\EN\\audio\\Oxford Pronunciation Dictionary\\OPD_offline.txt" // 这个变量用来记录当前查找到的单词 OPDword='word' // 读取缓存变量 OPDtxt='txt' // 这个变量用来起到结尾标识 OPDend='’zine' // 这个变量用来放置输出文件夹 OPDaudtmp='D:\\EN\\audio\\tmp\\' // 这个变量用来存更改后的音频名称 OPDaudout='out' // 根据mdd解析出的资源路径 OPDaudir='D:\\EN\\audio\\Oxford Pronunciation Dictionary\\OPD_offline' // 这个变量用来存mdd库中找到的音频路径 OPDaud='audio' // 后缀 OPDmp3='.mp3' // 打开mdx解析出来的txt文件 xfile = open(OPDmdx,encoding= 'utf-8') while True: // 因为OPD是四行一个循环,其中第一行是单词,第三行是一些对应关系,所以我们只需要记录第一行和分析第三行即可。 for i in range(1,5,1): OPDtxt = xfile.readline() // 对第一行单词进行分析,如果和结尾对比相同,则退出,解析完毕,否则继续解析。 if 1==i: OPDword=OPDtxt OPDword=OPDword.strip('\n') // 如果是数字,则放到0-9这个文件夹中 isnum = re.search("[0-9]",OPDword[0]) if isnum: OPDaudout=OPDaudtmp+'0-9'+'\\'+OPDword+OPDmp3 // 否则,放到首字母a-z的文件夹中,通过正则,排除WIN下非法名称 else: OPDword=re.sub("[\/\?\*\\<>|]",'-',OPDword) OPDtmp=OPDaudtmp+OPDword[0]+'\\' if os.path.exists(OPDtmp): OPDaudout=OPDtmp+OPDword+OPDmp3 // 如果都没有,写入log文件,记录 else: logtxt = open('log.txt', 'a+') print(OPDtmp+OPDword, file=logtxt) logtxt.close() #print (OPDword) if OPDword==OPDend: break // 在第三行开始处理,提取音频,此处提取美音 elif 3==i: OPDaud=re.search("data-src-mp3="http:\/\/www.oxfordlearnersdictionaries.com\/media\/english\/us_pron(.+?)mp3",OPDtxt) if OPDaud: OPDaud=OPDaud.group(0) // 进行二次解析,获取到MP3路径,并更改/为\以让WIN识别 if OPDaud: OPDaud=re.search("/media\/english\/us_pron(.+?)mp3",OPDaud) OPDaud=re.sub("\/",'\\\\',OPDaud.group(0)) OPDaud=OPDaudir+OPDaud // 如果确定在mdd解出的库中找到对应的文件,则重命名,并且放到对应的目录下,对应的目录在第一行时就已经处理好了,就是OPDaudout存放的变量 if os.path.exists(OPDaud): shutil.copyfile(OPDaud, OPDaudout) // 否则记录到文件 else: logtxt = open('log.txt', 'a+') print(OPDaud, file=logtxt) logtxt.close() #print(OPDaud) #print(OPDaudout) // 如果是结尾则退出循环 if OPDword==OPDend: break xfile.close() |
Comment