查看: 707|回复: 77
打印 上一主题 下一主题

[资料] 【12/28/2016】【教程】音频库制作方法 (内附 脚本和超详细...

  [复制链接]
  • TA的每日心情

    2022-4-5 15:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    15

    主题

    185

    回帖

    6143

    积分

    会元

    岁月如心,终会淡然

    Rank: 7Rank: 7Rank: 7

    积分
    6143

    灌水大神章小蜜蜂章笑傲江湖章推广专家

    跳转到指定楼层
    受到警告 1
    发表于 2016-12-28 18:48:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 lzcykevin 于 2018-2-25 11:08 编辑

    一,思想
    首先要明白mdx和mdd里面的音频一一对应,mdx相当于词典索引,而mdd则是资源。
    根据这个关系,则可以进行解析了。
    先用论坛上的工具解析出mdx.txt和mdd的资源。
    然后用下面的脚本进行处理,具体可以根据mdx和mdd进行针对修改


    二,脚本
    我用python写的,其实用什么脚本都一样,因为之前没有用过python,借这个机会学一下。
    理论上,这个脚本可以应用于所有mdx和mdd文件的音频库制作


    三,很重要的关键点
    如果您要查看本帖隐藏内容请回复


    四,脚本代码
    主要需要了解的是正则表达式,或者不用正则,用字符串处理也行,方法都可以。
    用正则比较简单一些。
    下面,我把代码给注释上,方便查阅。


    代码压缩包
    如果您要查看本帖隐藏内容请回复


    1. #!/usr/bin/python3
    2. import re
    3. import os
    4. import shutil

    5. // 这个变量是解析出来mdx的txt文件
    6. OPDmdx="D:\\EN\\audio\\Oxford Pronunciation Dictionary\\OPD_offline.txt"
    7. // 这个变量用来记录当前查找到的单词
    8. OPDword='word'
    9. // 读取缓存变量
    10. OPDtxt='txt'
    11. // 这个变量用来起到结尾标识
    12. OPDend='’zine'
    13. // 这个变量用来放置输出文件夹
    14. OPDaudtmp='D:\\EN\\audio\\tmp\\'
    15. // 这个变量用来存更改后的音频名称
    16. OPDaudout='out'
    17. // 根据mdd解析出的资源路径
    18. OPDaudir='D:\\EN\\audio\\Oxford Pronunciation Dictionary\\OPD_offline'
    19. // 这个变量用来存mdd库中找到的音频路径
    20. OPDaud='audio'
    21. // 后缀
    22. OPDmp3='.mp3'

    23. // 打开mdx解析出来的txt文件
    24. xfile = open(OPDmdx,encoding= 'utf-8')

    25. while True:
    26. // 因为OPD是四行一个循环,其中第一行是单词,第三行是一些对应关系,所以我们只需要记录第一行和分析第三行即可。
    27.     for i in range(1,5,1):
    28.         OPDtxt = xfile.readline()
    29. // 对第一行单词进行分析,如果和结尾对比相同,则退出,解析完毕,否则继续解析。
    30.         if 1==i:
    31.             OPDword=OPDtxt
    32.             OPDword=OPDword.strip('\n')
    33. // 如果是数字,则放到0-9这个文件夹中
    34.             isnum = re.search("[0-9]",OPDword[0])
    35.             if isnum:
    36.                 OPDaudout=OPDaudtmp+'0-9'+'\\'+OPDword+OPDmp3
    37. // 否则,放到首字母a-z的文件夹中,通过正则,排除WIN下非法名称
    38.             else:
    39.                 OPDword=re.sub("[\/\?\*\\<>|]",'-',OPDword)
    40.                 OPDtmp=OPDaudtmp+OPDword[0]+'\\'
    41.                 if os.path.exists(OPDtmp):
    42.                     OPDaudout=OPDtmp+OPDword+OPDmp3
    43. // 如果都没有,写入log文件,记录
    44.                 else:
    45.                     logtxt = open('log.txt', 'a+')
    46.                     print(OPDtmp+OPDword, file=logtxt)
    47.                     logtxt.close()
    48.                 #print (OPDword)
    49.             
    50.             if OPDword==OPDend:
    51.                 break
    52. // 在第三行开始处理,提取音频,此处提取美音
    53.         elif 3==i:
    54.             OPDaud=re.search("data-src-mp3="http:\/\/www.oxfordlearnersdictionaries.com\/media\/english\/us_pron(.+?)mp3",OPDtxt)
    55.             if OPDaud:
    56.                 OPDaud=OPDaud.group(0)
    57. // 进行二次解析,获取到MP3路径,并更改/为\以让WIN识别
    58.                 if OPDaud:
    59.                     OPDaud=re.search("/media\/english\/us_pron(.+?)mp3",OPDaud)
    60.                     OPDaud=re.sub("\/",'\\\\',OPDaud.group(0))
    61.                     OPDaud=OPDaudir+OPDaud
    62. // 如果确定在mdd解出的库中找到对应的文件,则重命名,并且放到对应的目录下,对应的目录在第一行时就已经处理好了,就是OPDaudout存放的变量
    63.                     if os.path.exists(OPDaud):
    64.                         shutil.copyfile(OPDaud, OPDaudout)
    65. // 否则记录到文件
    66.                     else:
    67.                         logtxt = open('log.txt', 'a+')
    68.                         print(OPDaud, file=logtxt)
    69.                         logtxt.close()
    70.                     #print(OPDaud)
    71.                     #print(OPDaudout)
    72. // 如果是结尾则退出循环
    73.     if OPDword==OPDend:
    74.         break

    75. xfile.close()
    复制代码



    五,改进点?


    重复的单词,脚本默认复写,如果需要可以修改放到其他路径,然后再人工判断。
    很多错误处理都没有判断,建议后续用的时候,逐步完善。
    如果想提高效率,可以增加多线程。


    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2020-5-23 22:47
  • 签到天数: 128 天

    [LV.7]常住居民III

    1

    主题

    212

    回帖

    1745

    积分

    解元

    Rank: 5Rank: 5

    积分
    1745
    推荐
    发表于 2018-5-2 23:05:20 | 只看该作者
    下载下来跑一跑,然后我再看看有什么地方能优化的吧……
    刚接触python
    之前research **.group(0)
    都是用catch和except过的……
    原来可以直接if 写啊
                    if OPDaud:
                        OPDaud=re.search("/media\/english\/us_pron(.+?)mp3",OPDaud)
                        OPDaud=re.sub("\/",'\\\\',OPDaud.group(0)
    不过这里有没有少一个if来判定这里的.group(0)对应的search是否为none object呢……没具体理清逻辑呢……
    回头跑跑看

    该用户从未签到

    58

    主题

    933

    回帖

    3897

    积分

    被盗用户

    积分
    3897

    灌水大神章小蜜蜂章笑傲江湖章

    推荐
    发表于 2017-1-3 02:41:26 | 只看该作者
    lzcykevin 发表于 2017-1-2 10:03
    我第一次用python,对这些包不太熟悉,以后要多学习。

    共同进步  我学Python时间也不长  之前也老是遇到乱码的问题

    现在读写中文或者utf-8的文件 我基本上习惯性加上codecs

    该用户从未签到

    58

    主题

    933

    回帖

    3897

    积分

    被盗用户

    积分
    3897

    灌水大神章小蜜蜂章笑傲江湖章

    推荐
    发表于 2017-1-2 17:00:40 | 只看该作者
    lzcykevin 发表于 2017-1-2 07:49
    对是指字幕开头ā或者中间有ā这类的外来词排除掉了,最开始我这里显示出来乱码,所以排除掉了。
    我估计 ...

    我一般会加载codecs包

    出现乱码的可能性比较小

    codecs.open('xxxx', 'r', 'utf-8')

    该用户从未签到

    2

    主题

    60

    回帖

    338

    积分

    秀才

    Rank: 3Rank: 3

    积分
    338
    2
    发表于 2017-1-2 11:22:56 | 只看该作者
    这个功能很好,如果能导出单词和例句成为带字幕的MP3就更好了
  • TA的每日心情
    开心
    2023-1-18 23:24
  • 签到天数: 211 天

    [LV.7]常住居民III

    427

    主题

    4539

    回帖

    9万

    积分

    超级版主

    Rank: 12Rank: 12Rank: 12

    积分
    92011

    灌水大神章小蜜蜂章笑傲江湖章翰林院专用章管理组专用章城管大队长

    3
    发表于 2017-1-2 11:37:23 | 只看该作者
    感觉www.merriam-webster.com的美式发音很纯正
  • TA的每日心情

    2022-4-5 15:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    15

    主题

    185

    回帖

    6143

    积分

    会元

    岁月如心,终会淡然

    Rank: 7Rank: 7Rank: 7

    积分
    6143

    灌水大神章小蜜蜂章笑傲江湖章推广专家

    4
     楼主| 发表于 2017-1-2 11:45:07 | 只看该作者
    kyletruman 发表于 2017-1-2 11:37
    感觉www.merriam-webster.com的美式发音很纯正

    那个18万单词,基于merriam-webster做的,剩下补充的是OPD和CEPD
  • TA的每日心情

    2022-4-5 15:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    15

    主题

    185

    回帖

    6143

    积分

    会元

    岁月如心,终会淡然

    Rank: 7Rank: 7Rank: 7

    积分
    6143

    灌水大神章小蜜蜂章笑傲江湖章推广专家

    5
     楼主| 发表于 2017-1-2 11:46:05 | 只看该作者
    dashuchong 发表于 2017-1-2 11:22
    这个功能很好,如果能导出单词和例句成为带字幕的MP3就更好了

    带字幕是指带中文释义么?

    该用户从未签到

    58

    主题

    933

    回帖

    3897

    积分

    被盗用户

    积分
    3897

    灌水大神章小蜜蜂章笑傲江湖章

    6
    发表于 2017-1-2 13:55:06 | 只看该作者
    楼主 能否将代码打个包? 复制出来加了很多乱码  谢谢
  • TA的每日心情

    2022-4-5 15:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    15

    主题

    185

    回帖

    6143

    积分

    会元

    岁月如心,终会淡然

    Rank: 7Rank: 7Rank: 7

    积分
    6143

    灌水大神章小蜜蜂章笑傲江湖章推广专家

    7
     楼主| 发表于 2017-1-2 13:58:58 | 只看该作者
    lxchen2001 发表于 2017-1-2 13:55
    楼主 能否将代码打个包? 复制出来加了很多乱码  谢谢

    点那个点击复制,就没有乱码了,我刚试了,我用的chrome

    该用户从未签到

    58

    主题

    933

    回帖

    3897

    积分

    被盗用户

    积分
    3897

    灌水大神章小蜜蜂章笑傲江湖章

    8
    发表于 2017-1-2 14:04:03 | 只看该作者
    lzcykevin 发表于 2017-1-2 06:58
    点那个点击复制,就没有乱码了,我刚试了,我用的chrome

    我也是用的Chrome 点击复制 出来的乱码

    20170102070311.jpg (112.64 KB, 下载次数: 0)

    20170102070311.jpg
  • TA的每日心情

    2022-4-5 15:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    15

    主题

    185

    回帖

    6143

    积分

    会元

    岁月如心,终会淡然

    Rank: 7Rank: 7Rank: 7

    积分
    6143

    灌水大神章小蜜蜂章笑傲江湖章推广专家

    9
     楼主| 发表于 2017-1-2 14:04:48 | 只看该作者
    lxchen2001 发表于 2017-1-2 14:04
    我也是用的Chrome 点击复制 出来的乱码

    我上传个压缩包,稍等

    该用户从未签到

    58

    主题

    933

    回帖

    3897

    积分

    被盗用户

    积分
    3897

    灌水大神章小蜜蜂章笑傲江湖章

    10
    发表于 2017-1-2 14:22:23 | 只看该作者
    谢谢

    请教一下
    - 语音库中写到外来词排除掉了 是指字母开头的?  比如将ā 并入到a里  那你的语音库就更完善了
  • TA的每日心情

    2022-4-5 15:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    15

    主题

    185

    回帖

    6143

    积分

    会元

    岁月如心,终会淡然

    Rank: 7Rank: 7Rank: 7

    积分
    6143

    灌水大神章小蜜蜂章笑傲江湖章推广专家

    11
     楼主| 发表于 2017-1-2 14:49:12 | 只看该作者

    对是指字幕开头ā或者中间有ā这类的外来词排除掉了,最开始我这里显示出来乱码,所以排除掉了。
    我估计是因为匹配的时候编码不对应造成的。
  • TA的每日心情

    2022-4-5 15:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    15

    主题

    185

    回帖

    6143

    积分

    会元

    岁月如心,终会淡然

    Rank: 7Rank: 7Rank: 7

    积分
    6143

    灌水大神章小蜜蜂章笑傲江湖章推广专家

    13
     楼主| 发表于 2017-1-2 17:03:50 | 只看该作者
    lxchen2001 发表于 2017-1-2 17:00
    我一般会加载codecs包

    出现乱码的可能性比较小

    我第一次用python,对这些包不太熟悉,以后要多学习。
  • TA的每日心情
    开心
    2022-8-18 20:20
  • 签到天数: 345 天

    [LV.8]以坛为家I

    0

    主题

    856

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    13319

    灌水大神章

    16
    发表于 2018-4-12 16:42:24 | 只看该作者
    谢谢楼主分享经验。
  • TA的每日心情
    开心
    2018-5-27 05:26
  • 签到天数: 55 天

    [LV.5]常住居民I

    22

    主题

    388

    回帖

    4362

    积分

    被盗用户

    积分
    4362
    17
    发表于 2018-4-12 20:09:39 | 只看该作者
    搬个小板凳来听课。
  • TA的每日心情
    开心
    2018-5-27 05:26
  • 签到天数: 55 天

    [LV.5]常住居民I

    22

    主题

    388

    回帖

    4362

    积分

    被盗用户

    积分
    4362
    18
    发表于 2018-4-12 20:19:16 | 只看该作者
    如果能把针对每一个单词的发音例句(比如LADE5,LAAD3),按顺序提取出来合并,名称为此单词词条,构建一个例句语音库。大量反复听一定会有很多好处。
  • TA的每日心情
    奋斗
    2019-11-23 21:19
  • 签到天数: 444 天

    [LV.9]以坛为家II

    0

    主题

    548

    回帖

    26万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    265112
    19
    发表于 2018-4-12 20:40:05 | 只看该作者
    一直对发音很重视,却始终没有找到满意的发音词典,谢谢老大....
  • TA的每日心情
    开心
    2021-1-27 23:23
  • 签到天数: 41 天

    [LV.5]常住居民I

    6

    主题

    111

    回帖

    1019

    积分

    解元

    Rank: 5Rank: 5

    积分
    1019
    20
    发表于 2018-4-12 22:54:26 | 只看该作者
    这样就可以diy了?顺便学习python实例
  • TA的每日心情
    奋斗
    2018-5-24 00:05
  • 签到天数: 55 天

    [LV.5]常住居民I

    0

    主题

    7

    回帖

    342

    积分

    秀才

    Rank: 3Rank: 3

    积分
    342
    21
    发表于 2018-4-20 10:28:13 | 只看该作者
    回复看看,感谢分享。
  • TA的每日心情
    开心
    2021-6-13 22:28
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    0

    主题

    124

    回帖

    441

    积分

    秀才

    Rank: 3Rank: 3

    积分
    441
    22
    发表于 2018-4-20 12:22:36 | 只看该作者
    查看一下,呵呵。
  • TA的每日心情
    开心
    2020-4-2 14:11
  • 签到天数: 464 天

    [LV.9]以坛为家II

    0

    主题

    795

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17042

    灌水大神章小蜜蜂章笑傲江湖章QQ 章

    23
    发表于 2018-4-20 13:31:19 | 只看该作者
    非常感谢楼主的分享!!!
  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 1538 天

    [LV.Master]伴坛终老

    62

    主题

    2317

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    29113

    灌水大神章小蜜蜂章笑傲江湖章

    24
    发表于 2018-4-20 17:59:29 | 只看该作者
    多谢你的技术分享!
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79549

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    25
    发表于 2018-4-20 18:36:44 | 只看该作者
    學習一下您的 思考模式