OpenUTAU/添加新引擎支持
OpenUtau是一款开源的歌声合成平台。任何歌声合成引擎的开发者都能将OpenUtau作为其用户界面(UI)。本文将以DiffSinger的接入为例,介绍如何让OpenUtau支持你的引擎。
设计音源打包格式[编辑 | 编辑源代码]
音源打包格式,指用户构建和打包音源的方式。我们建议使用传统打包格式,即目前UTAU,ENUNU和DiffSinger所使用的格式。这样可以让你的音源在未来的更新中支持OpenUtau新增的通用功能。
以下是传统打包格式的音源文件结构:
your_singer
├─ character.txt
├─ character.yaml
├─ .....包含声音数据的其他文件与文件夹
character.txt和character.yaml包含有关你的音源的基本信息,包括名称,类型和所使用的音素器。 以下是character.txt的示例:
name=Zhibin Diffsinger
image=zhibin.png
author=Chisong
voice=Chisong
web=http://zhibin.club/
以下是character.yaml的示例:
text_file_encoding: utf-8 #音源所使用的文本编码。新开发的音源请尽可能使用utf-8
default_phonemizer: OpenUtau.Core.DiffSinger.DiffSingerPhonemizer #音源默认使用的音素器
singer_type: diffsinger #音源类型,即音源所基于的引擎,目前包括utau, enunu和diffsinger。软件开发者可定义新的类型。
音源开发者分发音源时,将文件夹压缩为zip文件。用户可通过“工具→安装歌手”导入音源。
设计打包格式的建议:
- 文件名请尽可能只使用小写ascii字符,因为ascii字符在不同语言的系统间迁移时不会乱码。
- 音源内的其他文件和文件名可使用独特的前缀。例如,在DiffSinger音源中,dsdur, dspitch, dsconfig和dsvocoder均以ds开头。这样可声明这些文件用于DiffSinger,并防止未来潜在的文件名冲突。
定义音源类型[编辑 | 编辑源代码]
首先创建一个继承自USinger的歌手类。在该类中,你需要实现以下功能
- 加载音源数据并提供给合成引擎。
- 初始化函数:加载图标,子音源(即音色),音素列表
FreeMemory
:如果你的歌手类需要将大体积资源加载到内存中,使用此函数释放内存。OpenUtau将会在该歌手切换至其他歌手并不再使用时调用此函数。注意:调用了此函数后,歌手仍然可能被重新加载并使用;即使歌手尚未被使用过,也可能调用此函数。请确保函数能正常处理这些情况。
一个例子是DiffSingerSinger
你还需要将音源类型注册到OpenUtau代码仓库的其他位置,包括:
- OpenUtau.Core/Ustx/USinger.cs
- OpenUtau.Core/Classic/ClassicSingerLoader.cs
- OpenUtau.Core/Render/Renderers.cs(将音源类型与渲染器关联)
- OpenUtau/ViewModels/SingerSetupViewModel.cs
添加渲染器[编辑 | 编辑源代码]
下面我们把合成代码添加到OpenUtau。
在OpenUtau.Core文件夹下新建一个子文件夹,把合成引擎使用的代码放在这个文件夹内。
渲染器应实现IRenderer接口。以下是渲染器主要需要实现的功能:
Render
:基于RenderPhrase
类型的乐谱与参数输入,合成音频。LoadRenderedPitch
:基于RenderPhrase
类型的乐谱与参数输入,生成自动音高曲线(可选,通过SupportsRenderPitch
声明)。SupportsExpression
:声明引擎支持的参数。GetSuggestedExpressions
:如果你的引擎支持自定义参数,使用这个API将它们提供给用户。
一个例子是DiffSingerRenderer
添加音素器[编辑 | 编辑源代码]
OpenUtau的音素器与渲染器无关。如果现有的音素器已经符合你的要求,则无需另行开发音素器。
如果想开发音素器,请参考OpenUTAU/扩展开发#音素器开发
如果你的音素器基于机器学习模型,可以继承MachineLearningPhonemizer。其中你需要实现ProcessPart
函数,输入乐句中的音符信息,并将每个音符对应的输出音素及其相对位置写入partResult
。一个例子是DiffSingerBasePhonemizer
在开发音素器时,请尽可能使你的音素器可被复用。例如,你的音素器所需的所有文件存放在音源下面的一个子文件夹内。