Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
40171cb
Add HTS label support infrastructure
rokujyushi May 18, 2026
92c1f73
Fix expected values for test assertions
rokujyushi May 18, 2026
ebfe4e4
Addressing Copilot AI review comments
rokujyushi May 18, 2026
53cac3f
Addressing Copilot AI review comments
rokujyushi May 18, 2026
54f77a3
Changing from a design that shares logic in the base class to impleme…
rokujyushi May 18, 2026
536ccd5
Address review comments from Copilot
rokujyushi May 20, 2026
0adbd7b
Improvements to Vowel Extension Note Processing and Timing Calculations
rokujyushi May 21, 2026
b97e102
Improvement of lyric processing and modification of vowel extension n…
rokujyushi May 21, 2026
934cb92
Merge branch 'stakira:master' into hts-label
rokujyushi May 22, 2026
36be00a
Fixing dictionary loading order and adding tests
rokujyushi Jun 7, 2026
623e85f
Remove unused using directives
rokujyushi Jun 7, 2026
623f183
The processing in HTSNoteToPhonemes was outdated, so I aligned it wit…
rokujyushi Jun 7, 2026
3389366
Merge branch 'hts-label' of https://github.com/rokujyushi/OpenUtau in…
rokujyushi Jun 7, 2026
4ff3b51
Merge branch 'openutau:master' into hts-label
rokujyushi Jun 7, 2026
7446cc0
Merge branch 'hts-label' of https://github.com/rokujyushi/OpenUtau in…
rokujyushi Jun 7, 2026
c30da40
Merge branch 'openutau:master' into hts-label
rokujyushi Aug 15, 2026
5ddc0ad
Added default value handling for `attr.toneShift`
rokujyushi Aug 15, 2026
5ff6fd0
Merge with the latest environment
rokujyushi Sep 9, 2026
14e6689
HTSLabelRenderer Feature Additions and Signature Changes
rokujyushi Sep 9, 2026
80cf7e5
Removed unused using for Xunit.Abstractions
rokujyushi Sep 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
676 changes: 676 additions & 0 deletions OpenUtau.Core/Hts/HTSLabelPhonemizer.cs

Large diffs are not rendered by default.

525 changes: 525 additions & 0 deletions OpenUtau.Core/Hts/HTSLabelRenderer.cs

Large diffs are not rendered by default.

17 changes: 8 additions & 9 deletions OpenUtau.Core/Render/RenderPhrase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,14 @@ public class RenderPhone {
public readonly bool direct;
public readonly Vector2[] envelope;

// voicevox & enunu args
// voicevox & enunu & neutrino args
public readonly int toneShift;

public readonly UOto oto;
public readonly UOto oto2;
public readonly ulong hash;

internal RenderPhone(UProject project, UTrack track, UVoicePart part, UNote note, UPhoneme phoneme, int phrasePosition, bool xsyAvailable) {
internal RenderPhone(UProject project, UTrack track, UVoicePart part, UNote note, UPhoneme phoneme, int phrasePosition, bool xsyAvailable, int noteIndex) {
position = part.position + phoneme.position - phrasePosition;
duration = phoneme.Duration;
end = position + duration;
Expand All @@ -92,6 +92,7 @@ internal RenderPhone(UProject project, UTrack track, UVoicePart part, UNote note

this.phoneme = phoneme.phoneme;
tone = note.tone;
this.noteIndex = noteIndex;
tempos = project.timeAxis.TemposBetweenTicks(part.position + phoneme.position - leading, part.position + phoneme.End);
UTempo[] noteTempos = project.timeAxis.TemposBetweenTicks(part.position + phoneme.position, part.position + phoneme.End);
tempo = noteTempos.Length > 0 ? noteTempos[0].bpm : project.tempos[0].bpm;
Expand Down Expand Up @@ -247,12 +248,10 @@ internal RenderPhrase(UProject project, UTrack track, UVoicePart part, IEnumerab
uNotes.Add(next);
next = next.Next;
}
if (uNotes.First().Prev != null && uNotes.First().Prev.End == uNotes.First().position) {
uNotes.Insert(0, uNotes.First().Prev);
}
if (uNotes.Last().Next != null && uNotes.Last().End == uNotes.Last().Next.position) {
uNotes.Add(uNotes.Last().Next);
}

var noteIndexes = uNotes
.Select((note, index) => new { note, index })
.ToDictionary(x => x.note, x => x.index);

singer = track.Singer;
renderer = track.RendererSettings.Renderer;
Expand All @@ -270,7 +269,7 @@ internal RenderPhrase(UProject project, UTrack track, UVoicePart part, IEnumerab
// actually carries an xsy curve, so default renders pay nothing.
bool xsyAvailable = part.curves.Any(c => c.abbr == Format.Ustx.XSY);
phones = phonemes
.Select(p => new RenderPhone(project, track, part, p.Parent, p, position, xsyAvailable))
.Select(p => new RenderPhone(project, track, part, p.Parent, p, position, xsyAvailable, noteIndexes[p.Parent]))
.ToArray();

leading = phones.First().leading;
Expand Down
Loading
Loading