OpenUtau 工程文件 (.ustx) 格式描述
.ustx 文件是一个使用 YAML 格式 存储的文本文件,它完整地描述了一个 OpenUtau 音乐工程的所有信息。该文件包含
了项目设置、轨道、声部、音符、以及详细的合成参数。其结构是分层且高度结构化的。
以下是 .ustx 文件的核心组成部分:
1. 根对象 (Root Object)
这是 YAML 的顶层对象,包含整个工程的元数据和主要数据集合。
- ustx_version: (字符串) USTX 格式的版本号,例如 “0.6”。
- 轨道 (UTrack)
轨道类似于混音台上的一个通道,它本身不包含音符,但定义了声音的来源和处理方式。
3.2. 音频声部 (UWavePart)
用于放置音频文件,如背景音乐。
- 音符 (UNote)
- position: (整数) 音符相对于声部开头的起始位置,单位是 ticks。
- phoneme: (字符串) 音素的名称 (例如 “a”, “ka”, “shi”)。
总结与生成逻辑:
要生成一个有效的 .ustx 文件,你需要:
- 定义项目基础信息: 设置 bpm, resolution 等。
- 创建轨道: 至少创建一个 UTrack,并为其指定歌手。
- 创建声部: 创建一个 UVoicePart,并将其 track_no 指向已创建的轨道,设置其在时间轴上的 position。
- 添加音符: 在 UVoicePart 的 notes 数组中添加 UNote 对象,定义每个音符的 position, duration, tone 和
lyric。
- (可选)精细编辑: 如果需要高级控制,可以为每个 UNote 手动生成 phonemes
数组并编辑其中的参数曲线。如果留空,OpenUtau 会在加载时自动运行声素器来生成它们。
- 组合成最终 JSON: 将所有对象按照上述结构组织起来,并序列化为 JSON 字符串。
以下为 UProject 的 类型
// Type definitions for OpenUtau Ustx Project format
// Based on the C# source code of OpenUtau
// ustx.d.ts
// From: OpenUtau.Core.Ustx.UCurve.cs
export interface UCurve {
abbr: string;
xs: number[];
ys: number[];
}
// From: OpenUtau.Core.Ustx.UExpression.cs
export enum UExpressionType {
Numerical = 0,
Options = 1,
Curve = 2,
}
export interface UExpressionDescriptor {
name: string;
abbr: string;
type: UExpressionType;
min: number;
max: number;
defaultValue: number;
isFlag: boolean;
flag: string;
options: string[];
}
export interface UExpression {
abbr: string;
index?: number;
value: number;
}
// From: OpenUtau.Core.Ustx.UNote.cs
export enum PitchPointShape {
io = "io", // SineInOut
l = "l", // Linear
i = "i", // SineIn
o = "o", // SineOut
}
export interface PitchPoint {
X: number;
Y: number;
shape: PitchPointShape;
}
export interface UPitch {
data: PitchPoint[];
snapFirst: boolean;
}
export interface UVibrato {
length: number;
period: number;
depth: number;
in: number;
out: number;
shift: number;
drift: number;
volLink: number;
}
export interface UPhonemeOverride {
index: number;
phoneme?: string;
offset?: number;
preutterDelta?: number;
overlapDelta?: number;
}
export interface UNote {
position: number;
duration: number;
tone: number;
lyric: string;
pitch: UPitch;
vibrato: UVibrato;
phonemeExpressions: UExpression[];
phonemeOverrides: UPhonemeOverride[];
}
// From: OpenUtau.Core.Ustx.UPart.cs
export interface UPart {
name: string;
comment: string;
trackNo: number;
position: number;
}
export interface UVoicePart extends UPart {
duration: number;
notes: UNote[];
curves: UCurve[];
}
export interface UWavePart extends UPart {
relativePath: string;
fileDurationMs: number;
skipMs: number;
trimMs: number;
}
// From: OpenUtau.Core.Ustx.UTrack.cs
export interface URenderSettings {
renderer: string;
resampler: string;
wavtool: string;
}
export interface UTrack {
singer: string;
phonemizer: string;
RendererSettings: URenderSettings;
TrackName: string;
TrackColor: string;
Mute: boolean;
Solo: boolean;
Volume: number;
Pan: number;
TrackExpressions: UExpression[];
VoiceColorNames: string[];
}
// From: OpenUtau.Core.Ustx.UProject.cs
export interface UTempo {
position: number;
bpm: number;
}
export interface UTimeSignature {
barPosition: number;
beatPerBar: number;
beatUnit: number;
}
export interface UProject {
name: string;
comment: string;
outputDir: string;
cacheDir: string;
ustxVersion: string;
resolution: number;
/**
* @deprecated Since ustx v0.6
*/
bpm?: number;
/**
* @deprecated Since ustx v0.6
*/
beatPerBar?: number;
/**
* @deprecated Since ustx v0.6
*/
beatUnit?: number;
expressions: { [key: string]: UExpressionDescriptor };
expSelectors: string[];
expPrimary: number;
expSecondary: number;
key: number;
timeSignatures: UTimeSignature[];
tempos: UTempo[];
tracks: UTrack[];
voiceParts?: UVoicePart[];
waveParts?: UWavePart[];
}
以下为 ustx 文件的示例:
name: New Project
comment: ""
output_dir: Vocal
cache_dir: UCache
ustx_version: "0.7"
resolution: 480
bpm: 120
beat_per_bar: 4
beat_unit: 4
expressions:
dyn:
name: dynamics (curve)
abbr: dyn
type: Curve
min: -240
max: 120
default_value: 0
is_flag: false
flag: ""
pitd:
name: pitch deviation (curve)
abbr: pitd
type: Curve
min: -1200
max: 1200
default_value: 0
is_flag: false
flag: ""
clr:
name: voice color
abbr: clr
type: Options
min: 0
max: 0
default_value: 0
is_flag: false
options:
- ""
eng:
name: resampler engine
abbr: eng
type: Options
min: 0
max: 1
default_value: 0
is_flag: false
options:
- ""
- worldline
vel:
name: velocity
abbr: vel
type: Numerical
min: 0
max: 200
default_value: 100
is_flag: false
flag: ""
vol:
name: volume
abbr: vol
type: Numerical
min: 0
max: 200
default_value: 100
is_flag: false
flag: ""
atk:
name: attack
abbr: atk
type: Numerical
min: 0
max: 200
default_value: 100
is_flag: false
flag: ""
dec:
name: decay
abbr: dec
type: Numerical
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
gen:
name: gender
abbr: gen
type: Numerical
min: -100
max: 100
default_value: 0
is_flag: true
flag: g
genc:
name: gender (curve)
abbr: genc
type: Curve
min: -100
max: 100
default_value: 0
is_flag: false
flag: ""
bre:
name: breath
abbr: bre
type: Numerical
min: 0
max: 100
default_value: 0
is_flag: true
flag: B
brec:
name: breathiness (curve)
abbr: brec
type: Curve
min: -100
max: 100
default_value: 0
is_flag: false
flag: ""
lpf:
name: lowpass
abbr: lpf
type: Numerical
min: 0
max: 100
default_value: 0
is_flag: true
flag: H
norm:
name: normalize
abbr: norm
type: Numerical
min: 0
max: 100
default_value: 86
is_flag: true
flag: P
mod:
name: modulation
abbr: mod
type: Numerical
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
mod+:
name: modulation plus
abbr: mod+
type: Numerical
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
alt:
name: alternate
abbr: alt
type: Numerical
min: 0
max: 16
default_value: 0
is_flag: false
flag: ""
dir:
name: direct
abbr: dir
type: Options
min: 0
max: 1
default_value: 0
is_flag: false
options:
- off
- on
shft:
name: tone shift
abbr: shft
type: Numerical
min: -36
max: 36
default_value: 0
is_flag: false
flag: ""
shfc:
name: tone shift (curve)
abbr: shfc
type: Curve
min: -1200
max: 1200
default_value: 0
is_flag: false
flag: ""
tenc:
name: tension (curve)
abbr: tenc
type: Curve
min: -100
max: 100
default_value: 0
is_flag: false
flag: ""
voic:
name: voicing (curve)
abbr: voic
type: Curve
min: 0
max: 100
default_value: 100
is_flag: false
flag: ""
velc:
name: velocity (curve)
abbr: velc
type: Curve
min: 0
max: 200
default_value: 100
is_flag: false
flag: ""
ene:
name: energy (curve)
abbr: ene
type: Curve
min: -100
max: 100
default_value: 0
is_flag: false
flag: ""
pexp:
name: pitch expressiveness (curve)
abbr: pexp
type: Curve
min: 0
max: 100
default_value: 100
is_flag: false
flag: ""
falc:
name: falsetto (curve)
abbr: falc
type: Curve
min: 0
max: 200
default_value: 100
is_flag: false
flag: ""
cl01:
name: voice color 01:Bright
abbr: cl01
type: Curve
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
cl02:
name: voice color 02:Cute
abbr: cl02
type: Curve
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
cl03:
name: voice color 03:Normal
abbr: cl03
type: Curve
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
cl04:
name: voice color 04:Whisper
abbr: cl04
type: Curve
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
cl05:
name: voice color 05:Classic
abbr: cl05
type: Curve
min: 0
max: 100
default_value: 0
is_flag: false
flag: ""
exp_selectors:
- dyn
- pitd
- clr
- alt
- vel
- vol
- atk
- dec
- gen
- bre
exp_primary: 0
exp_secondary: 1
key: 0
time_signatures:
- bar_position: 0
beat_per_bar: 4
beat_unit: 4
tempos:
- position: 0
bpm: 120
tracks:
- singer: yousaV1.61
phonemizer: OpenUtau.Core.DiffSinger.DiffSingerChinesePhonemizer
renderer_settings:
renderer: DIFFSINGER
track_name: Track1
track_color: Blue
mute: false
solo: false
volume: 0
pan: 0
track_expressions: []
voice_color_names:
- 01:Bright
- 02:Cute
- 03:Normal
- 04:Whisper
- 05:Classic
voice_parts:
- duration: 7680
name: New Part
comment: ""
track_no: 0
position: 0
notes:
- position: 2100
duration: 660
tone: 56
lyric: a
pitch:
data:
- { x: -40, y: 0, shape: io }
- { x: 40, y: 0, shape: io }
snap_first: true
vibrato:
{
length: 0,
period: 175,
depth: 25,
in: 10,
out: 10,
shift: 0,
drift: 0,
vol_link: 0,
}
phoneme_expressions: []
phoneme_overrides: []
- position: 2760
duration: 420
tone: 57
lyric: la
pitch:
data:
- { x: -40, y: -10, shape: io }
- { x: 40, y: 0, shape: io }
snap_first: true
vibrato:
{
length: 0,
period: 175,
depth: 25,
in: 10,
out: 10,
shift: 0,
drift: 0,
vol_link: 0,
}
phoneme_expressions: []
phoneme_overrides: []
- position: 3180
duration: 420
tone: 58
lyric: a
pitch:
data:
- { x: -40, y: -10, shape: io }
- { x: 40, y: 0, shape: io }
snap_first: true
vibrato:
{
length: 0,
period: 175,
depth: 25,
in: 10,
out: 10,
shift: 0,
drift: 0,
vol_link: 0,
}
phoneme_expressions: []
phoneme_overrides: []
curves: []
wave_parts: []
要求:
- 示例中的 expressions、singer、phonemizer、renderer_settings、track_color 不允许动,必须保持一致。
- 每个 notes 的信息必须完整
- lyric 只能是一个字/一个字对应的音素,比如
a/啊/ni/你,不能是你好/nihao,对于中文,请使用无注音汉语拼音(shi),而不是 shì,对于日文,请使用罗马音(shi)。
- 在撰写工程前,请先思考你对歌词的理解,设计好音符的节奏和旋律,再生成工程文件
- 音符长度可以变化,但要符合音乐常识,不能太长或太短,要足够表达
- 注意长音时对颤音的处理
现在要求你生成一个工程文件,演唱以下歌词,调子由你生成: