TA的每日心情 | 衰 2022-4-5 15:20 |
---|
签到天数: 32 天 [LV.5]常住居民I
会元
岁月如心,终会淡然
- 积分
- 6143
|
本帖最后由 lzcykevin 于 2018-2-25 11:08 编辑
一,思想
首先要明白mdx和mdd里面的音频一一对应,mdx相当于词典索引,而mdd则是资源。
根据这个关系,则可以进行解析了。
先用论坛上的工具解析出mdx.txt和mdd的资源。
然后用下面的脚本进行处理,具体可以根据mdx和mdd进行针对修改
二,脚本
我用python写的,其实用什么脚本都一样,因为之前没有用过python,借这个机会学一下。
理论上,这个脚本可以应用于所有mdx和mdd文件的音频库制作
三,很重要的关键点
四,脚本代码
主要需要了解的是正则表达式,或者不用正则,用字符串处理也行,方法都可以。
用正则比较简单一些。
下面,我把代码给注释上,方便查阅。
代码压缩包
- #!/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()
复制代码
五,改进点?
重复的单词,脚本默认复写,如果需要可以修改放到其他路径,然后再人工判断。
很多错误处理都没有判断,建议后续用的时候,逐步完善。
如果想提高效率,可以增加多线程。
|
评分
-
1
查看全部评分
-
|