Geek@Paris

Kdic词库数据结构分析,Zdic语音库拆解(附音轨),维基必须分卷的原因

2007-08-05
所有讨论在这个帖子里
http://www.hi-pda.com/forum/viewthread.php?tid=371043
下面是一个个回帖合并的内容
————————————————————————————
看图说话
我拿了小帅猫做的TEF词典来分析,该词库一共7400个词条,体积是163633字节。

用RescoExplorer或者Bird等软件看这个词库,共有75个records,每个record大约在2200字节左右。(不知道这里是不是跟palm限制的每个记录的大小有关?)

其索引是第一张图,可以看到,00000020h行有个4A,转换成10进制就是74。
下面从00 00 03 4F开始,每32位(也就是4个两位数,每位都是16进制,转换成2进制后是32位)表示一个record的地址(可见光records的索引就允许达到32位长度),有74个

其词库开头是第二章图,可以看到00000040h行有个4B,十进制是75。表示record总数
后面紧跟着的00 00 02 A8表示词条的地址(可见这里又是32位长度)
下面有跟语音库一样的406f以及确实可能表示词条序号的8000,8001……
这部分索引的最后一条是00 02 7E 4E 40 6F 80 4A,是第75条(80 00 到 80 4A嘛)

第三章图是词库中间那部分图,可以看到上面的00 02 7E 4E 40 6F 80 4A这个最后一条索引。
这个看成是地址的32位,00 02 7E 4E,算成10进制后是163406。而用RescoExplorer查看最后一个record的长度是227。加上其地址后,正好是这个词库的总体积。所以这个32位确实是地址。

接着后面有一段看不懂的,然后就开始了连续的词条,直到某处后,发现再接着就是连续的解释
——————————————————————————————————————————————
另外我看了
韦伯斯特词典,词条数108584条,record数6087个。
英文字根词典,词条数7836条,record数195个。

——————————————————————————————————————————
具体看我的第三张图的解释
由此已经可以看出语音库的数据结构了
语音库第一条数据的首地址是00 02 92 40,所以是第168512字节处。第二个数据的首地址是00 02 95 8A,是第169354字节处。
用工具复制从168512字节到169353字节的数据,保存的16进制文本,重新命名为a.ogg的话,不知是否可以用播放器播放?

索引有32位,所以最大文件大小是4GB。
如果是LS所说的24位的话,就只有16MB了,显然不对。而事实上,看语音库的地址数据,后面的都用到28位地址了。都是01开头的。

语音库里面有(523E)hex也就是21054个数据。
不知道是不是就是咱所说的两万条的语音库?
——————————————————————————————————

我抠出了abaci和abacus的音轨,其实就是按地址找出其首地址后一直到下一个首一直前那部分,全部拷贝出来,另存为一个文件。
用Foobar可以播放,看附件

但是,同样的做法,第一个音轨我就是弄不出来。那个a老是不能播放

附件:
abaci.ogg (2007-8-5 13:52, 1.3 K)
该附件被下载次数 2

附件:
abacus.ogg (2007-8-5 13:52, 1.21 K)
该附件被下载次数 1
——————————————————————————————————
什么32767?
里面文件写着OggS,什么PSpeex   speex-1.1.6,Encoded with Speex speex-1.1.6等
看来是某种Ogg的格式吧
因为发音组件speech是这个格式的,所以也不能改成wav

如果要wav,可以将抠出来的音轨转成wav,不过没必要吧……
网上下的14.2万语音库是mp3的……

——————————————————————————————————
哦,你说那个8001、8001,一直到FFFF后,没法再下去了是不是?
我拿117万词库看看去
——————————————————
看到了,供2BC4个records,也就是11204个
因为一个records里面可以有100个左右的词,所以可以支持117万词库
如果这么算,最多32766个records的话,可以支持最大到320万左右个词条
这个还只是这种简明词库,如果像维基那样的每个词条都几乎撑满4K的词库,就不知道了……

这次的维基,我分成两半的词库里,records总数是43664+42716个,也就是86380个
超过了是吧
然后我看看最后的地址索引是……
看图吧,确实占用了前面的空间

第000554C0行
地址索引是40 70 2A 8F

如果这样的话
算他可以用到24位,那最大records数量是FF FF FF – 6F 7F FF =9469952个
如果可以用到32位,那最大records数量是FF FF FF FF – 40 6F 7F FF =3213918208个

另外不知道speech.prc里面是否会处理进位的情况

我认为,这个跟speech没有关系
Zdic主程序判断到位置后,取出那个音轨,提供给speech播放
speech仅管播放功能,具体的地址查询是Zdic的一个算法支持的
——————————————————————————————————
跟FF聊天了解到
palm里限制一个pdb的records最多为65535(看来record的索引是16位索引)个
而这个维基,这样很明显要分86380左右个才行
大大超过了65535,所以……

要解决维基的问题,只有不用palm的pdb格式,用自创格式。
以前做的pdb,是为了放在palmIII这样的旧设备的内存里用的
现在有SD卡了,有外存了,大可不必遵循palm的pdb限制

Author:admin | Categories:PDA | Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *


Clickcha - The One-Click Captcha