OpenUTAU/添加新引擎支持

来自自制歌声合成引擎wiki

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。

OpenUtau.Core文件夹下新建一个子文件夹,把合成引擎使用的代码放在这个文件夹内。

渲染器应实现IRenderer接口。以下是渲染器主要需要实现的功能:

  • Render:基于RenderPhrase类型的乐谱与参数输入,合成音频。
  • LoadRenderedPitch:基于RenderPhrase类型的乐谱与参数输入,生成自动音高曲线(可选,通过SupportsRenderPitch声明)。
  • SupportsExpression:声明引擎支持的参数。
  • GetSuggestedExpressions:如果你的引擎支持自定义参数,使用这个API将它们提供给用户。

一个例子是DiffSingerRenderer

添加音素器[编辑 | 编辑源代码]

OpenUtau的音素器与渲染器无关。如果现有的音素器已经符合你的要求,则无需另行开发音素器。

如果想开发音素器,请参考OpenUTAU/扩展开发#音素器开发

如果你的音素器基于机器学习模型,可以继承MachineLearningPhonemizer。其中你需要实现ProcessPart 函数,输入乐句中的音符信息,并将每个音符对应的输出音素及其相对位置写入partResult。一个例子是DiffSingerBasePhonemizer

在开发音素器时,请尽可能使你的音素器可被复用。例如,你的音素器所需的所有文件存放在音源下面的一个子文件夹内。