搜索

iVocaloid论坛

查看: 1582|回复: 0
打印 上一主题 下一主题

【Rocaloid经验总述】【五】关于CDT发音词典 [复制链接]

Sleepwalking

我不是技术宅!

Lv.5-章鱼须

Rank: 5Rank: 5Rank: 5

0
9
0


UID: 111156
权限: 40
属性: 宇宙人
发帖: 201 (1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
跳转到指定楼层
[1L]楼主
Zleepwalking 发表于 2013/5/29 14:24:04 |只看该作者 |倒序浏览
本帖最后由 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属性是对拼音(音节)类型的定义,有以下几种:
种类定义例子
Va
VV元 + 元an
VVV元 + 元 + 元yao
CV辅 + 元ba
CVV辅 + 元 + 元ban
CAV辅 + 介 + 元kua
CAVV辅 + 介 + 元juan
        C即代表辅音,A代表介母,V代表元音和尾音。
        Rocaloid中将尾音(如an中的n)当作一种元音。


        受音源库特性的影响(Diphone自带元音不一定合适),有时上述7种种类对应的TList长度可能会发生变化。下面给出一张所有变化形式(11种)的表格,这张表格仅供参考,不用记下来:
V
1

TVV

VV
1

TV1V2

Tp1p2

Tp1p2
2

TV1V2

Tp1p2

VVV
1

TV1V2

Tp2V3

Tp1p2

Tp1p2




CV
1

TCV

Tp1p2

CVV
1

TC+VV

Tp1p2

Tp1p2
2(Extended Form)

TCV1

Tp2V2

Tp1p2

Tp1p2

CAV
1

TC+AV

Tp1p2
2(Extended Form)

TCA

Tp2V

Tp1p2

CAVV
1

TC+AV1

Tp2V2

Tp1p2

Tp1p2
2(Extended Form)

TCA

Tp2V1

Tp2V2

Tp1p2

Tp1p2


辅音泛型

        这个功能是用来批量声明相同韵母的音节的。
        对于如何称呼这个功能我没啥想法,感觉很像编程里的“泛型”或者“模板”的概念,于是就这么叫了。        即使不懂泛型也没必要纠结……这只是个称呼。

        使用/代替一个辅音的发音记号,在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解释例子
PLOPlosive,爆破音b k t
FRCFricative,擦音s ^ & c
SEMSemi-Vowel,半元音l m n w
VOWVowel,元音,这个表述没被启用


        #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.0930.0260.048

0.0810.0220.047

0.0760.0230.043

0.0660.0190.041

0.0550.0150.037

0.0460.0110.032

0.0320.0060.025

0.0260.0080.025

0.014-0.0020.023

0.0090.0010.024



DBInfo结构



        这是一张音源库的信息表,提供RSCCommon一些音源库信息以转换RSC->CVS。
        DBInfo包含一个长度为2997的DBList结构数组。你可能注意到了:音源库有3441个文件为什么DBList长度是2997?因为还有444个文件是元音,元音不需要提供数据。
        每个DBSet提供如下的数据:
属性全称说明
PhoPhone发音记号
PitPitch音高
VOTVoice Onset Time周期性开始时间(单位:采样数)
PSnkPre 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效果器。



知识共享许可协议 除非另有声明,本帖内容采用 署名-非商业-相同方式共享 3.0 许可协议 授权,且需注明出处,所有权利归发帖人。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册/sign up

申请友链|Archiver|iVocaloid - 自由,开放,合作,共享    | 版权持有者点击这里进行举报

GMT+8, 2025/6/8 09:19

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部