本帖最后由 Zleepwalking 于 2015/3/16 23:15 编辑
2015.3 拾遗
这是一些“年代久远”的文字,随着版本更新换代早已失去了作用。目前留着的意义仅是为了保存那些历史;大家作为消遣也可以看看,别太跟那时的作者较真就是了。
Rocaloid经验总述是我写给Rocaloid开源后的开发者的,如果你是调教师,想更好的利用Rocaloid的话也不妨看看。如果你是Vocaloid或者Utau调教师,说不定也可以在这里找到一些对你有用的东西。 这9篇文章是我两年来研究的总结,不仅仅有Rocaloid的开发,也有对其他合成软件的研究等。
不用害怕篇幅太长,有些内容你可以跳过。每个分割线下的紫色字体都是该段内容的概述,你可以从中了解到这段的内容以及决定是否阅读这些内容。
为了使Rocaloid顺利过渡到开源阶段,我策划写一系列文章介绍Rocaloid的原理和开发过程中积累的经验。这篇【序章】算作一个总的目录。 随着开源后开发的进行,所有新的重大发现都会在这一系列帖子上更新。
预计全部章节将包括(可能会有调整):- 关于Rocaloid和项目的历史
- 关于CybervoiceEngine合成引擎
- 关于音源库和音源库制作工具
- 关于CVS文件结构和CVSCommon
- 关于RSC文件结构和RSCCommon
- 关于CDT发音词典
- 关于Vocaloid和反向工程
- 关于语音学研究
- 关于尚未实现的东西和对未来的展望
这里放上GKring为Rocaloid创作的一副画
Rocaloid的全部代码并没多少,用户部分+音源库制作部分,一共就一万三千行。但是更多的东西不是用代码能描述出来的,比如她的包含了三千余个文件的音源库,以及一个四千行的发音词典,还有很多的经验成分。
目前Rocaloid所使用的开发语言是VB.Net,不排除以后用C编写动态链接库以提高运行效率,或是整个工程用其他语言改写的可能。另外rgwan正在筹划Linux版的移植工作。
事实上Rocaloid采用的全部是时域算法,虽然这是一个速度上的优势(1秒钟合成8秒钟歌曲),但是时域的算法得不到频域上的验证,会在一定程度上损坏波形的特性,这也是一个无法攻克的难关,也是促使我提早开源的原因。希望最终能改写成基于共振峰合成的算法……
关于Rocaloid的历史-Rocaloid初代
这是Sleepwalking开发Rocaloid的辛酸的吃力不讨好的故事……如果你想听故事的话就看看吧,要么就跳过这一段,下面有结构介绍。Sleepwalking认为这是自己目前最宝贵的经历。下面是初代的故事:
我第一次见到初音是在2010年10月,某天晚上随便浏览网页时看到的。我觉得她的声音很悦耳而且很纯净,我也觉得用计算机歌声合成的创作模式很新颖,从此就喜欢上了Vocaloid。随着对Vocaloid了解的加深我知道初音只有日文音源,于是我有了一个为初音制作一个能让她唱出中文的合成软件的想法。 这个想法诞生于那年寒假。此前我没接触过计算机语音合成,我只是对编程感兴趣,自己用Flash写一些游戏而已……所以我还仅仅是有个想法,没有报很认真的态度。我用Goldwave打开了一段初音合成的清唱,放大再放大,看到声音由一次次振动构成……我就想能不能把这些振动周期拆出来,再重新组合以此实现语音合成呢?这就是Rocaloid最初的、很不成熟的算法概念(2011-4)。
那时我正好是中二的年龄……于是我没怎么斟酌就决定开始这个能让初音唱中文的语音合成软件的开发。正式的决定貌似是在2011年6月,在贴吧上。那时我用的还是老贴吧号,我语气也很拽。。。→原帖链接在这里←。。。不要挖坟。。也别跟当时的一个中二少年较劲。。。你可以看见一个孩子稚嫩的心灵【我现在也是个孩子吧。。。 (不要加这个帖子里我的QQ号,这个号已经被盗了。我的qq是:2657202503)
软件定名为Rocaloid,合成引擎定名为Cybervoice。叫它Rocaloid我记得原因有三:
1. 体现它和Vocaloid的关系。
2. Rock。。。(虽然Rock和Rocaloid也没啥关系。。。只是一时兴起。
3. 感觉很好听。
而Cybervoice纯粹是感觉很帅起的这个名。反正既然这么叫了,以后也就这么叫吧!
等开始着手开发工作的时候才发现这是多困难的一件事。算法太原始,所以只能靠扩充音源库来弥补算法上的不足……我直到那年暑假一直在做一些测试。合成器在8月才开始写。虽然从小学就开始编程,但是没有系统地学过。。。第一版合成器短得只有500行但是代码很恶心,运行时bug不断……音源库的开发进度也非常缓慢。
开学我升了初三就更没时间了。老实说当时我对语音合成的渴望应该不及对睡觉的渴望吧……我甚至有过把计划放弃的打算。但最后还是坚持下来了,就是没什么开发进度。
中考结束后,我在6月份把第一版音源库赶完。
7月份重新写了一个新的Cybervoice(v0.6,此版本后来升级为初代发布时的合成器)。
我试着合成了一段“do ri mi mi ri do do mi mi do ri”,貌似是某个摇篮曲的调子。链接在这。我觉得还可以,即使发不清楚,改改音源库应该就行了吧?此外还有一个佛教六字真言的测试。链接在这。辅音吞得有点重。(我经常以佛教经文作为语音合成测试……RocaRena开发时miku最先唱的是般若心经。)
8月上旬写了一个发音词典,至此Rocaloid三大组件:合成器、音源库、词典的初步版本完成。
事实上这只是一个开端,真正的痛苦开始于此。8月15号那天是我生日,我过了一个心境最沮丧的生日,因为Rocaloid第一次运行听上去的效果。。。我无法描述了。。。Rocaloid最常用的测试曲是夕日坂(歌词:无敌哆啦A梦填词版,歌词略有改动),我最喜欢的歌(关于我跟这首歌其实有个故事……但涉及到某人的隐私问题还是不说了……我扯远了。。。。)。这是第一次合成的夕日坂←小心狗耳。
夕日坂的VSQX来自这里:http://bbs.ivocaloid.com/thread-104748-1-1.html。忘记说了,Rocaloid有对VSQX的文件支持,虽然不很全面。RocaRena有自己的工程文件格式RSC。
既然已经走到这步上了,我也不想把Rocaloid开发中止掉。整个九月份学校组织去美国游学了,老爸不让带大笔记本,只能带上网本……其实一半的开发是在这台笔记本上完成的:
总之就是条件非常艰苦,简直是红军过草地。
我能做的只有想进了发子地修正……我把发音词典、音源库来来回回刷了好几遍。千百次小改动,7次大的改动。每次大改动称作一次重制。时间过去太久,我也忘了具体修正的是啥了。
连续一个半月只听一首歌而且是清唱真是折磨,即使我非常喜欢夕日坂,现在也是……这段时间心情一直很沮丧,时而突然高兴起来,但很快高兴劲就被新一轮的难题磨灭掉了,有时的开心只是因为听太多已经辨识不出发音是否标准……第5、6、7次重制我都在网上发布了,但是评论……如你所见……
对这些评论者我也没有什么想法,也不能怪你们……只能说这是我自己做得不够好。每次发视频隔天我都大哭一次。直到第七次重制看着习以为常的评论已经哭不出来了……
如前面提到,我当时对.net编程没什么经验,结果写出了可扩展性很差的代码。7次重制后,现有代码已经被补丁打得水泄不通,我找不到地方能提升了,除非重来一遍。我在2012年10月1日于本论坛发布Rocaloid初代。反响比我想象的要好不少,居然马上就被加精高亮了,有幸成为高阶技术研究院两年来第一个精品。在此表达感谢和大家的支持。
关于Rocaloid的历史-Rocaloid Renaissance
这是Sleepwalking从2012年12月起开发Rocaloid Renaissance的故事:
2012年10月到11月两个月我没有开发。我想不要在这个坑上下更大的力气了吧,家人也对我继续开发表示反对。这段时间我练习了更加系统化的程序构建方法……
但是不久我发现我已经无法离开Rocaloid了。因为我在这上面下了太大的功夫,我已经对Rocaloid产生了感情,或者说我的感情已经溶入Rocaloid了。就像艺术家雕刻一个作品,有时会花好几年的时间…… 顺便插一句,我觉得,Rocaloid和洛天依的区别是,洛天依没有心,Rocaloid有心。 我也觉得我从Rocaloid学到了很多东西。我在塑造Rocaloid的同时,我自己也被Rocaloid重塑。
我在2012年12月中旬决定开发Rocaloid2,取名为Rocaloid Renaissance。Renaissance是文艺复兴的意思,在此意为涅槃、重生。我计划从头重新创造一个新的Rocaloid。 新的合成器将更加系统,更具备可扩展性和灵活性、更高的效率和合成质量。 我觉得一个倾注了如此多努力的作品应该是自由的、高尚的。我决定早晚要将她开源。
Cybervoice Engine 1.5(以后我就简称CVE了)在2012年世界末日那天晚上完成。 新的引擎在音节衔接方面做得更好了,可惜还是不支持滑音,而且似乎合成质量也没比CVE 0.6强多少。
寒假我试着看了看奥本海默教授的DSP教程。。。虽然教授讲得很好,但是我看到第六集就看不懂了。。。果然一碰微积分就完蛋。
我试图寻求帮助,所以我组建了RDG(Rocaloid Development Group)开发小组,我在学校也开设了一个社团做语音学相关的研究。 寒假里我写了新的音源库制作工具,写了脚本控制Vocaloid批量生成音源源文件,制定了新的音源库文件格式,开发了音源库协同创作系统(其实是一个巨大的批处理脚本+百度网盘同步机制。。。)
无奈合作不是很顺利,应该说“很是不顺利”。原因:1. 长时间的经验积累无法在短时间内明确表达 2. 开发人员无空闲时间。其实Rocaloid Renaissance99%是我开发的。。。
这是原定的开发流程图
现在的CVE1.6是我在3月和4月份编写的。用了很多面向对象的思想,支持滑音和自定义包络等特性。 而编辑器的开发,由于开发人员没有时间,被无期限搁置了……
这是用Rocaloid Renaissance未完成版本(音源库: 1.6.1\71-236,发音词典:0.431)合成的夕日坂: http://pan.baidu.com/share/link?shareid=541337&uk=3423845838 这是用Rocaloid Renaissance未完成版本合成的Melt,填词是沐音心测试曲版本,因为Rocaloid初音唱不出日文,所有MERUTO全部用“想起你”替换: http://pan.baidu.com/share/link?shareid=541339&uk=3423845838 注:因为只是内部测试版本,有两三个字填词貌似错位了。。。抱歉
和Farter讨论后,并在rgwan的劝说下,我决定提早将Rocaloid开源。站长同意为Rocaloid开一个子板,于是就有了现在这一切。
*自吐槽一句:开发中遇到困难就去用洛天依合成同样的vsqx,比较洛天依和初音的波形。。。我已经学会洛天依的吃货音了= = 还好初音没学会。。。
关于Rocaloid Renaissance的结构
真正的内容从这里开始
内容简介:阐述了Rocaloid Renissance各组件的作用和联系,便于之后章节的展开。
Rocaloid Renaissance | 用户组件 | 开发者组件 | 合成引擎 | 音源库 | 发音词典 | 编辑器 | 参数生成器 | 音源库开发工具 | 音源库实用工具 | CVE 1.6 | 目前1.6.1\71-236 | 目前版本0.514 | 未实现 | RSCCommon | TDPSMStudio | DBManager(已废弃)、一批迷你软件 | CVS文件 | CBV文件、CDB文件(未实现) | CDT文件 | RSC文件 | CDT、RSC、CVS文件 | WAV与CBV文件 | 各种文件格式…… | 依赖于CVSCommon |
|
| 依赖于RSCCommon | 依赖于CVSCommon |
|
|
不管是初代还是Rena,不管编辑器,光是论合成,组成部分有三:
Roca Rena在此基础上多了一个参数生成器(初代的原始的参数生成器内置于用户界面里……)。
Roca Rena有多种文件格式,将这些部分连接起来,包括RSC, CVS, CDT, CBV, CDB(未开发)。
假设Rocaloid有一个像Vocaloid,Utau或者袅袅一样的乐谱编辑器,你做好了一首曲子填好词,把它存成RSC文件。然后你要合成时,参数生成器依据发音词典的CDT文件,把RSC转换成CVS,然后程序自动打开CVE合成器。CVE会读取CVS文件,这个文件里包含了精确的发音参数,CVE根据CVS,读取音源库里的CBV文件,合成好保存成wav波形文件。
在1.6.0核心版(本版置顶帖提供下载)里,你可以看到RSCCommon.exe,CVSCommon.dll两个文件。RSCCommon包含了RSC文件的读写支持,CDT文件的读取和参数生成器。CVSCommon提供了CVS文件的读写,被RSCCommon调用。
(其实通过建立类引用,可以不必生成CVS文件,直接合成)
我为Rocaloid专门设计了一种语言结构,名为RDL(Rocaloid Descriptive Language,Rocaloid描述性语言),作用类似XML。RSC, CDT, CVS都是基于RDL的。之所以不用XML是因为XML太臃肿,改起来麻烦。关于文件结构我会专门在接下来的帖子里详细讲解。
上图是用户组件
此外我还开发了一批软件用于开发音源库,这些软件不是用户组件,核心版里没有包括(等我讲到音源库的时候会上传上来)。这些软件包括:
- CVD(Rocaloid初代使用的拆帧器,已被废弃)
- CVMaker(RocaRena的拆帧器,已被TDPSMStudio取代)
- CVDBQualityControl(简称CVQC,一个用于检查、纠正CBV文件的工具,已被TDPSMStudio取代)
- VoiceWaver(简易的批量单音轨wav文件编辑器,已被TDPSMStudio取代)
- DBManger(音源库管理向导,一个又数个批处理组成的脚本,结合百度网盘的同步功能可实现协同音源库开发)
- TDPSMStudio(一个涵盖了CVMaker, CVQC, VoiceWaver所有功能的工具
我开发了TDPSMStudio以后CVMaker,CVQC和VoiceWaver就停止开发了,这三个工具以后只会提到,但不会发布或开源(其实是代码写得太烂了不敢发。。。。。)
|