- 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属性是对拼音(音节)类型的定义,有以下几种:
种类 | 定义 | 例子 | V | 元 | a | VV | 元 + 元 | an | VVV | 元 + 元 + 元 | yao | CV | 辅 + 元 | ba | CVV | 辅 + 元 + 元 | ban | CAV | 辅 + 介 + 元 | kua | CAVV | 辅 + 介 + 元 | juan | C即代表辅音,A代表介母,V代表元音和尾音。
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提供如下的数据:
属性 | 全称 | 说明 | Pho | Phone | 发音记号 | Pit | Pitch | 音高 | VOT | Voice Onset Time | 周期性开始时间(单位:采样数) | PSnk | Pre Shrink | 预先缩短辅音的长度(单位:采样数) | 之所以把这些属性名缩写是因为DBList太长了,全称写上去又占空又拖慢读取速度。
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效果器。
|
|