| 
3D工具MikuMikuDance绘画工具Flash音乐工具Audacity所属类型調教
 
   
  
0 
9 
0 
 UID: 111156
 权限: 40
 属性: 宇宙人
 发帖: 201  					
 
(1精)
 积分: 540
 章鱼: 3
 大葱: 14
 茄子: 2688
 注册:2012/8/18
 存在感:476
 
 | 
 
| 本帖最后由 Zleepwalking 于 2015/3/22 18:28 编辑 
 2015.3
 本贴所包含信息时间过于久远,已废弃。出于保留项目历史原因在此搁置。
 
 
 本章介绍音源库发音词典CDT的文件结构
 为帮助理解,您可以下载目前放出的Roca Rena 1.6核心版,发音词典文件为Dict\HMCHNDICT.cdt
 
 概述
 
 
 
 CDT的作用:提供各种语音学信息帮助RSCCommon转换RSC到CVS。
 
 CDT也基于RDL,以纯文本保存,可用记事本打开。
 CDT分为三部分:
 
 
 | DEFList | 存储各音节的音素拆音方式 |  | PhoneticInfo | 存储语音学信息(口型大小、辅音参数) |  | DBInfo | 一张涵盖音源库中所有CBV文件信息的表格 | 
 
 DEFList结构
 
 
 提供各音节的拆音方式。
 在第一章里介绍了CVE基于过渡,所以DEF其实是对发音记号过渡的定义。
 
 在Rocaloid的发音词典里,DEFList看上去像这样:
 DEFList
 DEF        a
 Type        V
 TRatio        1
 TList
 T        a        a
 End
 End
 DEF        o
 Type        VV
 TRatio        0.4
 TList
 T        a        o
 T        p1        p2
 T        p1        p2
 End
 End
 DEF        e
 Type        V
 TRatio        1
 TList
 T        e-        e-
 End
 End
 它是由n个DEF组成的结构,是一个自动数组。拿第一个DEF开刀:
 DEF        a ←拼音为a
 Type        V ←类型是一个元音
 TRatio        1 ←过渡的变化率为1
 TList ←数据表TList储存发音记号过渡
 T        a        a ←第1个过渡中从a过渡到a(相当于没过渡)
 End ←数据表定义结束
 End ←拼音定义结束
 
 注:DEF a这一行中的a其实不能说是汉语拼音。在汉语拼音的基础上,如果这个拼音包含辅音,那么辅音的第一个字符使用Rocaloid发音记号表示,比如ban表示形式还是ban,但是chuan表示应该是^uan。
 
 再来一个yong的例子:
 DEF        yong
 Type        VVV
 TRatio        0.6
 TList
 T        i        o
 T        p2        NG
 T        p1        p2
 T        p1        p2
 End
 End
 这里p2就是CVS中Preserved 2的意思,p1同理。
 换句话说,p2的意思就是继续发出o的音,并过渡到NG。第三四行p1的意思是继续o(第二行的第一个)的发音,p2的意思是继续NG(第二行的第二个)的发音。
 过渡等同于如下,但是不用p1 p2表示会断元音:
 
 TList
 T        i        o
 T        o        NG
 T        o        NG
 T        o        NG
 End
 
 音节分类
 
 
 DEF中的Type属性是对拼音(音节)类型的定义,有以下几种:
 
 C即代表辅音,A代表介母,V代表元音和尾音。| 种类 | 定义 | 例子 |  | V | 元 | a |  | VV | 元 + 元 | an |  | VVV | 元 + 元 + 元 | yao |  | CV | 辅 + 元 | ba |  | CVV | 辅 + 元 + 元 | ban |  | CAV | 辅 + 介 + 元 | kua |  | CAVV | 辅 + 介 + 元 | juan | 
 Rocaloid中将尾音(如an中的n)当作一种元音。
 
 
 受音源库特性的影响(Diphone自带元音不一定合适),有时上述7种种类对应的TList长度可能会发生变化。下面给出一张所有变化形式(11种)的表格,这张表格仅供参考,不用记下来:
 
 | V |  | 1 |  | 
 | T | V | V |  | 
 |  | VV |  | 1 |  | 
 | T | V1 | V2 |  | 
 | T | p1 | p2 |  | 
 | T | p1 | p2 |  | 2 |  | 
 | T | V1 | V2 |  | 
 | T | p1 | p2 |  | 
 |  | VVV |  | 1 |  | 
 | T | V1 | V2 |  | 
 | T | p2 | V3 |  | 
 | T | p1 | p2 |  | 
 | T | p1 | p2 |  | 
 | 
 | 
 | 
 |  | CV |  | 1 |  | 
 | T | C | V |  | 
 | T | p1 | p2 |  | 
 |  | CVV |  | 1 |  | 
 | T | C+V | V |  | 
 | T | p1 | p2 |  | 
 | T | p1 | p2 |  | 2(Extended Form) |  | 
 | T | C | V1 |  | 
 | T | p2 | V2 |  | 
 | T | p1 | p2 |  | 
 | T | p1 | p2 |  | 
 |  | CAV |  | 1 |  | 
 | T | C+A | V |  | 
 | T | p1 | p2 |  | 2(Extended Form) |  | 
 | T | C | A |  | 
 | T | p2 | V |  | 
 | T | p1 | p2 |  | 
 |  | CAVV |  | 1 |  | 
 | T | C+A | V1 |  | 
 | T | p2 | V2 |  | 
 | T | p1 | p2 |  | 
 | T | p1 | p2 |  | 2(Extended Form) |  | 
 | T | C | A |  | 
 | T | p2 | V1 |  | 
 | T | p2 | V2 |  | 
 | T | p1 | p2 |  | 
 | T | p1 | p2 | 
 
 辅音泛型
 
 这个功能是用来批量声明相同韵母的音节的。
 对于如何称呼这个功能我没啥想法,感觉很像编程里的“泛型”或者“模板”的概念,于是就这么叫了。        即使不懂泛型也没必要纠结……这只是个称呼。
 
 使用/代替一个辅音的发音记号,在TList中也用/表示这个辅音,使其可以被任意一个辅音替换。
 例:
 DEF        /ai
 Type        CVV
 TRatio        0.7
 TList
 T        /@        e
 T        p1        p2
 T        p1        p2
 End
 End
 这个辅音泛型相当于定义了bai, cai, dai, fai, kai, gai, hai, sai, pai, ^ai, &ai……等等一系列辅音,大大缩短了发音词典长度。
 
 前置定义
 
 
 
 这个功能弥补辅音泛型的不足。
 
 有时辅音泛型会自动定义出一些不正确的DEF,比如上面那个/ai的例子,可能会把yai也一并定义了。但y是一个元音(其实yai=iai,虽然汉语拼音里没有这个音。。。)。通过前置定义,在/ai前面专门定义一个yai就可以解决这个问题:
 DEF        yai
 Type        VVV
 TRatio        0.7
 TList
 T        i        e
 T        p1        p2
 T        p1        p2
 End
 End
 DEF        /ai
 Type        CVV
 TRatio        0.7
 TList
 T        /@        e
 T        p1        p2
 T        p1        p2
 End
 End
 
 
 yai和/ai没有必要相邻,但是yai必须在/ai前面。RSCCommon在进行替换时的规则是始终找第一个符合条件的DEF。
 
 
 前置定义在对付一些辅音的时候也是必要的,尤其是当音源库中没有相应发音的时候:
 DEF        &ui
 Type        CAVV
 TRatio        0.5
 TList
 T        &[        e
 T        p2        i
 T        p1        p2
 T        p1        p2
 End
 End
 音源库中是没有&~(发音:shu)的,因为初音根本调不出这个……这时候只能用&[(发音:sho)代替。于是把&ui放在/ui前定义即可。
 
 
 PhoneticInfo结构
 
 
 
 用于保存语音学信息。在RSC->CVS转换中用到。
 包含两个子结构:OpennessList和PhoneList
 
 OpennessList结构
 
 
 
 这是用来保存各发音记号口型大小的。
 这是一个数据表的结构。
 口型越大,音量就越大。
 范围:0(静音) - 1(不进行处理的默认音量)。范围其实可以超过1,但是不推荐。
 例:
 OpennessListQ 18
 OpennessList
 a        1    ← a 对应的口型大小为1(即音量为1倍)
 o        0.7    ← o 对应的口型大小为0.7(即音量为0.7倍)
 e        0.7  ← 以此类推……
 e-        0.6
 i        0.5
 u        0.5
 N        0.3
 NN        0.3
 NG        0.3
 -        0.4
 -#        0.4
 v        0.4
 v-        0.5
 p@        0.6
 p[        0.6
 p~        0.6
 p3        0.6
 p#        0.6
 
 OpennessList会被RSCCommon在RSC->CVS转换中写入CVS的Segment的Effects的OpennessList结构。合成时由CVE引擎读取,将口型大小变化转换成包络然后变化音量。
 注:Openness双写n。。。不要拼错。
 
 
 PhoneList结构
 
 
 
 这是个包含了21个PhoneSet的结构数组。每个PhoneSet记录一个辅音的信息。
 例:
 PhoneSet
 Phone b ←发音记号的辅音部分为b
 Type Consonant ←类型是辅音
 PType PLO ←细分的类型是爆破音(Plosive)
 #DataMultiple ←数据偏移因子
 0.3        1        1
 #DataOffset ←数据偏移
 0        0        0
 DataPointQ 10 ←数据表大小为10列
 DataPoint ←数据表,这些是拿洛天依做实验得出的数据= =
 0.038        0                0.011
 0.031        0.001        0.010
 0.023        0.002        0.010
 0.024        0.004        0.010
 0.019        0                0.010
 0.021        0.001        0.010
 0.008        -0.001        0.006
 0.011        0                0.007
 0.004        -0.004        0.007
 0                0                0.007
 End
 
 先不用管数据表是干什么的。
 
 Type属性包含两种:
 
 | Type | 解释 | 例子 |  | Consonant | 一般的辅音 | b c ^ & k |  | Semi | 半元音 | l m n w | 
 
 
 
 PType属性相对Type更加细分:
 
 | PType | 解释 | 例子 |  | PLO | Plosive,爆破音 | b k t |  | FRC | Fricative,擦音 | s ^ & c |  | SEM | Semi-Vowel,半元音 | l m n w |  | VOW | Vowel,元音,这个表述没被启用 | 无 | 
 
 #DataMultiple和#DataOffset前面加井号,因为这两个是“预处理标识”,就像C语言的#Define一样。这两个属性在CDT结构中并没有对应,但是在读取过程中会根据这两个多值属性修改数据表的数据。
 #DataMultiple        0.3        1        1
 ↑然后数据表中第一列全都乘以0.3, 第二列和第三列不变。
 #DataOffset  0 0 0
 ↑然后数据表中第一列加0,第二列加0,第三列加0,都不变。
 这样做的好处是,如果数据表整体出现偏移,只用改#DataMultiple和#DataOffset就行了。
 
 
 
 
 DataPoint数据表
 
 
 
 记录了如何调整辅音长度和音节的位置。
 对Vocaloid的研究发现,Vocaloid会自动把辅音提前发出(会在Vocaloid与反向工程一章中详细讲解)。这样做发出的声音更自然。辅音还会根据一些条件被缩短。这个条件就是上一个音节的长度。
 DataPoint有三列,其实还有一列被隐藏了,这一列是上一个音节的长度(准确讲是上一个音节开始到这个音节开始的时间差)。第一排上,隐藏的长度是0.25秒,之后每列以0.025秒递减,直到第十排递减为0.025秒。
 没被隐藏的列数中,第一列是上一个音节提前结束的时间长度;第二列是这个音节提前发出的时间长度;第三列是这个音节中辅音的长度。
 这样看上去可能更清楚一些:
 
 | DataPoint | 上个音节提前结束时长 | 当前音节提前发出时长 | 当前音节辅音长度 |  | 
 | 0.093 | 0.026 | 0.048 |  | 
 | 0.081 | 0.022 | 0.047 |  | 
 | 0.076 | 0.023 | 0.043 |  | 
 | 0.066 | 0.019 | 0.041 |  | 
 | 0.055 | 0.015 | 0.037 |  | 
 | 0.046 | 0.011 | 0.032 |  | 
 | 0.032 | 0.006 | 0.025 |  | 
 | 0.026 | 0.008 | 0.025 |  | 
 | 0.014 | -0.002 | 0.023 |  | 
 | 0.009 | 0.001 | 0.024 | 
 
 
 DBInfo结构
 
 
 
 这是一张音源库的信息表,提供RSCCommon一些音源库信息以转换RSC->CVS。
 DBInfo包含一个长度为2997的DBList结构数组。你可能注意到了:音源库有3441个文件为什么DBList长度是2997?因为还有444个文件是元音,元音不需要提供数据。
 每个DBSet提供如下的数据:
 
 之所以把这些属性名缩写是因为DBList太长了,全称写上去又占空又拖慢读取速度。| 属性 | 全称 | 说明 |  | Pho | Phone | 发音记号 |  | Pit | Pitch | 音高 |  | VOT | Voice Onset Time | 周期性开始时间(单位:采样数) |  | PSnk | Pre Shrink | 预先缩短辅音的长度(单位:采样数) | 
 PSnk的作用是,如果音源库中有一个Diphone的辅音部分太长了,比如&3_C3的VOT本来是14546个采样,我就给它加了个5234采样长的PSnk,所以最后登记上去的VOT是14546 - 5234 = 9312。
 这么多数据当然不是我手写的= =。我写了个工具批量生成DBInfo:
 http://pan.baidu.com/share/link?shareid=546993&uk=3423845838
 
 Pho和Pit是用来定位数据的。VOT的用途是在生成音素过渡长度时,第一个过渡的长度一定要大于VOT(如果第一个是辅音的话,第一个过渡时长短于VOT会导致爆音)。PSnk会通过CVS被递交给CVE的Shrink效果器。
 
 
 
 | 
 |