|
本帖最后由 idict 于 2016-10-30 08:08 编辑
首先多谢各位的帖子, 和论坛前辈们的教学帖, 以及大神们分享的词典. 让人受益良多. 非常感谢. 也非常感谢以下要使用到的软件的作者们!
愚人千虑偶有一得. 在重新打包Mdx/Mdd的过程中有点体会. (重申: 只是重新打包的过程, 其他的如排版等等...的并不会.)
重新打包的目的是希望继续使用Mdict PC版(因Mp3文件不能发音; GoldenDict是很好, 也很庞大, 需要时间学习).
GetDict.exe v2.6很好, 在转换后会将目录名合并到文件名当中(需要重建目录结构也是麻烦事). 只好使用Readmdict.py了.
安装Python之32位版本(64位版本在全部下载里可以找到), 使用Python 2.7.x版本(Python 3.5.x双击不能引用Tkinter[可以自行改为3.5之兼容名], 在命令行输入参数是没有问题的). 安装选项: 全选 (必须的, 不然要手动增加Python的路径到Path)
https://www.python.org/downloads/
安装Python-lzo, 似乎这个不用安装也可以解压Mdd. 但XWang提到要安装. 就装上吧.
http://www.lfd.uci.edu/~gohlke/pythonlibs/#python-lzo
下载32位2.7版的, 64位的不能安装(即使在64位Windows, 版本位数是依据所安装的Python版本位数): python_lzo-1.11-cp27-none-win32.whl
然后以[管理员](重要, 否则不能正常安装)打开命令行窗口cmd.exe. 输入: (文件的目录名, 换成所在的下载目录名, 我的下载目录名是: r:\downloads, [下同]. 输入whl必须是全名, 也不能改名, 否则会出错.)
- pip install r:\downloads\python_lzo-1.11-cp27-none-win32.whl
复制代码
(如果pip提示要升级, 就按提示方式升级, 再安装也可)
- python -m pip install --upgrade pip
复制代码
查看是否安装成功:
如果成功:
下载Readmdict.py
https://bitbucket.org/xwang/mdict-analysis/downloads
解压zip后可以直接双击运行 Readmdict.py 选择要解压的mdx, 相同名称的mdd会一并解压. [***重要步骤***]
就会生成相应的txt和data目录.
在解压一些Mdd时, 如果有目录名是Windows的系统保留字时, 就会出错(如OALD9, 如图Title):
只好更改目录名称了.
打开Readmdict.py(不要用Windows自带的编辑器)
在700-701行之间增加替换目录名称的代码: 必须注意缩进, 建议不要用Tab, 改为空格(这是Python的建议), 或在编辑器中选中: Tab转为空格; 4个空格为一个缩进.
插入的代码时对齐上一行的fname = ...
- win_key = '\\con\\' # Windows系统保留字
- if fname.find(win_key) >= 0:
- win_key_sub = '\\con_win\\' # 替换的非保留字
- fname = fname.replace(win_key, win_key_sub) # 更换原字符串
复制代码
这样目录名: con 就会变成: con_win (其他的关键字没有作处理, 有一个改一个而已, 因为水平啊)
相应地, 在Mdx的txt文件就必须要改替换: /con/ 为: /con_win/ [***重要步骤***]
附件中Readmdict_mod.py是增加后的py文件.
接下来就是转换Mp3为Spx了. (附件中lame.exe v3.99.5, speexenc.exe v1.2beta2)
在转换spx之前必须将mp3转换为wav, 建议使用Lame.exe
http://www.rarewares.org/mp3-lame-bundle.php
再将wav转spx, 但这个speexenc.exe的1.2beta1.3并不兼容Win 7之后的系统. (或MdxBuilder里带的speexenc.exe都不兼容)
http://www.speex.org/downloads/
所以就要找其他的版本. 附件中是1.2beta2可以兼容(取自于Audio Transcoder, 这个软件在转换过程中很吃内存. 一下子就吃光了[在安装时会有附加软件]. speexdrop很好, 但不支持目录)
这个是MSVC9, 微软的编译器. 兼容. (虽然写是1.2rc1, 但实质上是1.2beta3)
http://www.rarewares.org/others.php#speex-unstable-win
现在要考虑的是:
speexenc.exe对采样率8/16/32kHz有优化. 而且mp3的采样率通常是16/22.05/44.1kHz, 不在同一采样率上.
如果重新采样, 会增加转码时间. 如果不重新采样, speexenc.exe在转码时的编码率会不尽相同. 转换后文件大小也不尽相同. 通常变大多1/3-1倍.
所以选择重新采样, 这样可以用时间弥补质量上和文件大小的差别. 于量尝试写批处理.
- :: convert mp3 to spx
- @echo off
- color 3f
- cls
- :~begin
- :: mp3所在的文件夹全路径名
- set _folder=r:\downloads\data
- if not exist "%_folder%" (
- echo. %_folder% 文件夹不存在.
- goto :~end)
- for /f "delims=" %%i in ('dir /b /s "%_folder%\*.mp3"') do (
- echo. %%~fi
- lame.exe --silent -b 32 -m j -h --resample 32 "%%~fi" "%%~dpni_new.mp3"
- del "%%~fi"
- lame.exe --silent --decode "%%~dpni_new.mp3" "%%~dpni.wav"
- del "%%~dpni_new.mp3"
- speexenc.exe -u --bitrate 24000 "%%~dpni.wav" "%%~dpni.spx"
- del "%%~dpni.wav"
- )
- :~end
复制代码
第9行是mp3所在目录名. (我的是: r:\downloads\data)
第16行是用Lame.exe对mp3重新采样. 参数: -b 32 是编码率: 32kbps, 参数: --resample 32 是采样率: 32kHz. 如果Mdd里mp3是24kbps, 11kHz的质量不算好(如果相同参数转为spx就质量损失很大). 质量好是22kbps, 22.05kHz.
第18行是用Lame.exe对mp3解码为wav.
第20行是用Speexenc.exe对wav重新编码压缩为spx. 参数: -u 是32kHz采样率优化, 参数: --bitrate 24000 是编码率. 可对应原mp3的码率而定. 如果原来mp3是24kbps, 22.05kHz, 经重新编码为24kbps, 32kHz的spx文件大小大致上没有变化. 而且保持相当质量.
第17/19/21行是删除mp3/wav文件. 所以必要备份数据.
然后打开cmd.exe命令行窗口运行批处理. [***重要步骤***]
附件中convert2spx.cmd
这个批处理可转换目录结构里的mp3. 但没有排错的功能. 所以不能用Ctrl-C中断. 如果中断了, 可能会增加重新采样的新文件如: *_new.mp3/wav/spx等文件. 就会发生文件数量不一致了.
如果mp3文件是128kbps, 44.1kHz的话, spx最好也是32kHz采样率. 至于编码率32kbps的质量也是很优秀的了, 文件大小也很优秀, 毕竟speex是针对语音优化压缩的. 或许是使用ogg格式编码的. 应该比mp3格式好吧. (重新采样时, 相应将编码率改为128kbps: -b 128)
转码时间是很漫长的, 15万个mp3文件可能要8个小时, 看机器的情况. 完成转码后吃不到1GB内存, 或者更少吧.
完成转码后, 再次核对文件数量是否一致. 到目前为止, 还没有不一致的情况. 还好.
相应地, 在Mdx的txt文件就必须要改替换: .mp3 为: .spx [***重要步骤***]
如果一致就可以用MdxBuilder直接重新打包了. 通常都将css和js放在data目录下一起打包为mdd. 以免丢掉了.
这样就可以在Mdict PC也使用. 目前也有一些js不能正常运行的. 因水平有限就不知道是什么原因了.
但就不会出现不能播放的问题了.
再次多谢各位! 谢谢.
(再次重申: 只是重新打包的过程, 其他的如排版等等...的并不会.)
readmdict_mod.zip
(394.68 KB, 下载次数: 28)
(如需要, 请下载下面更新的附件[适用全部的关键字和关键字符{除\外}])
2016.07.08更新
经过漫长的摸索, 终于对Python有点了一丁丁点的了解. 并转到了Python 3.5.x
查看了有关Windows的关键字和关键字符. (谢谢asicsfree, PurlingNayuki的信息)
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
The following reserved characters:
< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk) Do not use the following reserved names for the name of a file:
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
所以重新整理了一下Windows下的文件名/文件夹名称的问题.
首先是readmdict.py在Python 3下不能导入Tkinter, 原来是改了名字为: tkinter
因此将634-638行换成: (以下全部都要注意缩进)
- from tkinter import filedialog
- from tkinter import *
- root = Tk()
- root.withdraw()
- args.filename = filedialog.askopenfilename(initialdir = os.path.abspath('..'), title = "Select a mdx/mdd file:", filetypes = (("mdx/mdd files", "*.mdx *.mdd"), ("all files", "*.*")))
复制代码
至于关键字和关键字符.
在第696-697行插入:
- win_chr = re.compile(r'(<|>|:|"|\/|\||\?|\*)') # Windows系统保留字符
- win_key = re.compile(r'\\(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])\\', re.I) # Windows系统保留字
复制代码
在第703-704行插入:
- re_obj = re.search(win_chr, fname)
- if re_obj:
- fname = re.sub(win_chr, r'_', fname) # 更换保留字符为: _
- print(r'___ substituted "_" for "%s" ___ %s' % (re_obj.group(), fname))
- re_obj = re.search(win_key, fname)
- if re_obj:
- fname = re.sub(win_key, r'\\\1_win\\', fname) # 更换保留字为: *_win
- print(r'+++ substituted "\%s_win" for "%s"' % (re_obj.group().replace('\\', ''), re_obj.group()))
复制代码
建议打开命令行窗口运行文件. 这样可以用手抄下更改了的文件夹名和文件名(假如是有的话, 会显示).
见附件中的readmdict3_mod.py
而readmdict2_mod.py是Python 2.7.x适用.
另外, 由于mp3转spx是极耗时间的事(而且还重新采样[目的是保证spx的品质], 更多耗了一些时间. 于是尝试学习使用Python 3.5.x多线程调用外部命令, 以提高转换效能.
由于是新手, 始终都没有办法了解到调用Popen()后何时才能知道外部命令完成的信息. 如果使用communicate()或wait()的话, 好像与单线程一样, 要完成了才执行一下个指令, 与call()无区别. 即使已经开了多线程, 情况没有什么改善.
所以就使用呆呆法(还请不吝赐教. 谢谢.): 一次转换使用一次循环. 因此三次转换就用了三次循环, 还是采用Popen(). 这样效能还是很高的. 线程数取于CPU核心数目. 这时CPU的占时可是100%全速开转.
手提电脑要谨用. 不然的话, 风扇是极速狂转的. 很热很热的. (所以用dos转换就悠悠的. 反正晚上开转, 第二天早上基本就转好了.)
测试了一下, 线程数可以根据需要修改. 分别选1/2, 1, 2倍于CPU核心数目, 但等于核心时的耗时最少, 效能最好. 至于内存的情况, 呈浪涌形, 吃了5/600MB, 之后会释放掉. 情况良好.
无论是用dos转, 还是用Python转, 都会删除原mp3文件的. 所以必须做好数据的备份.
见附件的convert2spx.py适用于Python 3.5.x for Windows (没有做出错保护的功能, 也没有纠错能力. 在正常情况可以正常使用而已).
readmdict3_mod.zip
(485.74 KB, 下载次数: 41)
|
评分
-
1
查看全部评分
-
|