Skip to content

Commit f1b3f9d

Browse files
authored
Merge pull request #686 from oxygen-dioxide/expression-recommand
Flag filter based on resampler manifests
2 parents 514efa6 + aabc3ee commit f1b3f9d

File tree

9 files changed

+71
-24
lines changed

9 files changed

+71
-24
lines changed

OpenUtau.Core/Classic/ClassicRenderer.cs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -134,25 +134,13 @@ public RenderPitchResult LoadRenderedPitch(RenderPhrase phrase) {
134134
}
135135

136136
public UExpressionDescriptor[] GetSuggestedExpressions(USinger singer, URenderSettings renderSettings) {
137-
var resamplerPath = renderSettings.Resampler.FilePath;
138-
if (resamplerPath == null) {
137+
var manifest= renderSettings.Resampler.Manifest;
138+
if (manifest == null) {
139139
return new UExpressionDescriptor[] { };
140140
}
141-
var resamplerManifestPath = Path.ChangeExtension(resamplerPath, ".yaml");
142-
try {
143-
return Yaml.DefaultDeserializer.Deserialize<ResamplerManifest>(
144-
File.ReadAllText(resamplerManifestPath, encoding:Encoding.UTF8)
145-
).expressions.Values.ToArray();
146-
} catch (Exception ex) {
147-
Log.Error($"Failed loading suggested expressions from {resamplerManifestPath}: {ex}");
148-
}
149-
return new UExpressionDescriptor[] { };
141+
return manifest.expressions.Values.ToArray();
150142
}
151143

152144
public override string ToString() => Renderers.CLASSIC;
153145
}
154-
155-
public class ResamplerManifest {
156-
public Dictionary<string,UExpressionDescriptor> expressions = new Dictionary<string, UExpressionDescriptor> { };
157-
}
158146
}

OpenUtau.Core/Classic/ExeResampler.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,41 @@
77
using OpenUtau.Core;
88
using OpenUtau.Core.Format;
99
using OpenUtau.Core.Util;
10+
using OpenUtau.Core.Ustx;
1011
using Serilog;
1112

1213
namespace OpenUtau.Classic {
1314
internal class ExeResampler : IResampler {
1415
public string Name { get; private set; }
1516
public string FilePath { get; private set; }
1617
public bool isLegalPlugin => _isLegalPlugin;
18+
public ResamplerManifest Manifest { get; private set; }
1719
readonly string _name;
1820
readonly bool _isLegalPlugin = false;
1921

22+
23+
public ResamplerManifest LoadManifest() {
24+
try {
25+
var ManifestPath = Path.ChangeExtension(FilePath, ".yaml");
26+
if (!File.Exists(ManifestPath)) {
27+
//TODO: Write Resampler Manifests shipped by OpenUtau
28+
return new ResamplerManifest();
29+
}
30+
return ResamplerManifest.Load(ManifestPath);
31+
} catch (Exception ex) {
32+
Log.Error($"Failed loading resampler manifest for {_name}: {ex}");
33+
return new ResamplerManifest();
34+
}
35+
}
36+
2037
public ExeResampler(string filePath, string basePath) {
2138
if (File.Exists(filePath)) {
2239
FilePath = filePath;
2340
_name = Path.GetRelativePath(basePath, filePath);
2441
_isLegalPlugin = true;
2542
}
43+
//Load Resampler Manifest
44+
Manifest = LoadManifest();
2645
}
2746

2847
public float[] DoResampler(ResamplerItem args, ILogger logger) {
@@ -59,6 +78,13 @@ public void CheckPermissions() {
5978
chmod(FilePath, mode);
6079
}
6180

81+
public bool SupportsFlag(string abbr) {
82+
if(Manifest == null || !Manifest.expressionFilter){
83+
return true;
84+
}
85+
return Manifest.expressions.ContainsKey(abbr);
86+
}
87+
6288
public override string ToString() => _name;
6389
}
6490
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
using Serilog;
1+
using OpenUtau.Core.Ustx;
2+
using Serilog;
23

34
namespace OpenUtau.Classic {
45
public interface IResampler {
56
string FilePath { get; }
67
float[] DoResampler(ResamplerItem args, ILogger logger);
78
string DoResamplerReturnsFile(ResamplerItem args, ILogger logger);
89
void CheckPermissions();
10+
ResamplerManifest Manifest { get; }
11+
bool SupportsFlag(string abbr);
912
}
1013
}

OpenUtau.Core/Classic/ResamplerItem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class ResamplerItem {
2121
public string outputFile;
2222
public int tone;
2323

24-
public Tuple<string, int?>[] flags;
24+
public Tuple<string, int?, string>[] flags;//flag, value, abbr
2525
public int velocity;
2626
public int volume;
2727
public int modulation;
@@ -49,7 +49,7 @@ public ResamplerItem(RenderPhrase phrase, RenderPhone phone) {
4949
inputTemp = VoicebankFiles.Inst.GetSourceTempPath(phrase.singer.Id, phone.oto, ".wav");
5050
tone = phone.tone;
5151

52-
flags = phone.flags;
52+
flags = phone.flags.Where(flag=>resampler.SupportsFlag(flag.Item3)).ToArray();
5353
velocity = (int)(phone.velocity * 100);
5454
volume = (int)(phone.volume * 100);
5555
modulation = (int)(phone.modulation * 100);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Text;
5+
using OpenUtau.Core;
6+
using OpenUtau.Core.Ustx;
7+
8+
namespace OpenUtau.Classic {
9+
public class ResamplerManifest {
10+
public Dictionary<string, UExpressionDescriptor> expressions = new Dictionary<string, UExpressionDescriptor> { };
11+
public bool expressionFilter = false;
12+
13+
public ResamplerManifest() { }
14+
15+
public static ResamplerManifest Load(string path) {
16+
return Yaml.DefaultDeserializer.Deserialize<ResamplerManifest>(
17+
File.ReadAllText(path, encoding: Encoding.UTF8)
18+
);
19+
}
20+
}
21+
}

OpenUtau.Core/Classic/UstNote.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ void WriteVibrato(StreamWriter writer) {
141141
}
142142
}
143143

144-
string FlagsToString(Tuple<string, int?>[] flags) {
144+
string FlagsToString(Tuple<string, int?, string>[] flags) {
145145
var builder = new StringBuilder();
146146
foreach (var flag in flags) {
147147
builder.Append(flag.Item1);

OpenUtau.Core/Classic/WorldlineResampler.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using OpenUtau.Core;
44
using OpenUtau.Core.Render;
55
using OpenUtau.Core.SignalChain;
6+
using OpenUtau.Core.Ustx;
67
using Serilog;
78

89
namespace OpenUtau.Classic {
@@ -31,6 +32,13 @@ public string DoResamplerReturnsFile(ResamplerItem item, ILogger logger) {
3132

3233
public void CheckPermissions() { }
3334

35+
//TODO: A list of flags supported by worldline resampler
36+
public ResamplerManifest Manifest { get; } = new ResamplerManifest();
37+
38+
public bool SupportsFlag(string abbr) {
39+
return true;
40+
}
41+
3442
public override string ToString() => name;
3543
}
3644
}

OpenUtau.Core/Render/RenderPhrase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public class RenderPhone {
5858
public readonly double durCorrectionMs;
5959
public readonly string resampler;
6060
public readonly double adjustedTempo;
61-
public readonly Tuple<string, int?>[] flags;
61+
public readonly Tuple<string, int?, string>[] flags;// flag, value, abbr. Abbr is kept here for flag filtering.
6262
public readonly string suffix;
6363
public readonly float volume;
6464
public readonly float velocity;

OpenUtau.Core/Ustx/UPhoneme.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Numerics;
55
using YamlDotNet.Serialization;
6+
using OpenUtau.Core.Render;
67

78
namespace OpenUtau.Core.Ustx {
89
public class UPhoneme {
@@ -199,19 +200,19 @@ public void SetExpression(UProject project, UTrack track, string abbr, float val
199200
}
200201
}
201202

202-
public Tuple<string, int?>[] GetResamplerFlags(UProject project, UTrack track) {
203-
var flags = new List<Tuple<string, int?>>();
203+
public Tuple<string, int?, string>[] GetResamplerFlags(UProject project, UTrack track) {
204+
var flags = new List<Tuple<string, int?, string>>();
204205
foreach (var descriptor in project.expressions.Values) {
205206
if (descriptor.type == UExpressionType.Numerical) {
206207
if (!string.IsNullOrEmpty(descriptor.flag)) {
207208
int value = (int)GetExpression(project, track, descriptor.abbr).Item1;
208-
flags.Add(Tuple.Create<string, int?>(descriptor.flag, value));
209+
flags.Add(Tuple.Create<string, int?, string>(descriptor.flag, value, descriptor.abbr));
209210
}
210211
}
211212
if (descriptor.type == UExpressionType.Options) {
212213
if (descriptor.isFlag) {
213214
int value = (int)GetExpression(project, track, descriptor.abbr).Item1;
214-
flags.Add(Tuple.Create<string, int?>(descriptor.options[value], null));
215+
flags.Add(Tuple.Create<string, int?, string>(descriptor.options[value], null, descriptor.abbr));
215216
}
216217
}
217218
}

0 commit comments

Comments
 (0)