diff --git a/OpenUtau.Core/Api/Phonemizer.cs b/OpenUtau.Core/Api/Phonemizer.cs
index 6f283c360..d1f7678ab 100644
--- a/OpenUtau.Core/Api/Phonemizer.cs
+++ b/OpenUtau.Core/Api/Phonemizer.cs
@@ -14,16 +14,19 @@ public class PhonemizerAttribute : Attribute {
public string Tag { get; private set; }
public string Author { get; private set; }
public string Language { get; private set; }
+ public string Engine { get; private set; }
/// Name of phonemizer. Required.
/// Use IETF language code + phonetic type as tag, e.g., "EN ARPA", "JA VCV", etc. Required.
/// Author of this phonemizer.
/// IETF language code of this phonemizer's singing language, e.g., "EN", "JA"
- public PhonemizerAttribute(string name, string tag, string author = null, string language = null) {
+ /// Engine of the phonemizer to categorize them.
+ public PhonemizerAttribute(string name, string tag, string author = null, string language = null, string engine = null) {
Name = name;
Tag = tag;
Author = author;
Language = language;
+ Engine = engine;
}
}
@@ -152,6 +155,7 @@ public struct Result {
public string Name { get; set; }
public string Tag { get; set; }
public string Language { get; set; }
+ public string Engine { get; set; }
internal Exception? SetUpException { get; set; }
protected double bpm;
diff --git a/OpenUtau.Core/Api/PhonemizerFactory.cs b/OpenUtau.Core/Api/PhonemizerFactory.cs
index 04a3fa44c..4036b6322 100644
--- a/OpenUtau.Core/Api/PhonemizerFactory.cs
+++ b/OpenUtau.Core/Api/PhonemizerFactory.cs
@@ -10,12 +10,14 @@ public class PhonemizerFactory {
public string tag;
public string author;
public string language;
+ public string engine;
public Phonemizer Create() {
var phonemizer = Activator.CreateInstance(type) as Phonemizer;
phonemizer.Name = name;
phonemizer.Tag = tag;
phonemizer.Language = language;
+ phonemizer.Engine = engine;
return phonemizer;
}
@@ -37,6 +39,7 @@ public static PhonemizerFactory Get(Type type) {
tag = attr.Tag,
author = attr.Author,
language = attr.Language,
+ engine = attr.Engine,
};
factories[type] = factory;
}
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerARPAPlusEnglishPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerARPAPlusEnglishPhonemizer.cs
index 0777a5b1d..a986fcfe7 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerARPAPlusEnglishPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerARPAPlusEnglishPhonemizer.cs
@@ -10,7 +10,7 @@
using Serilog;
namespace OpenUtau.Core.DiffSinger {
- [Phonemizer("DiffSinger English+ Phonemizer", "DIFFS EN+", language: "EN", author: "Cadlaxa")]
+ [Phonemizer("DiffSinger English+ Phonemizer", "DIFFS EN+", language: "EN", author: "Cadlaxa", engine: "Diffsinger")]
public class DiffSingerARPAPlusEnglishPhonemizer : DiffSingerG2pPhonemizer
// cadlaxa here, this diffsinger english phonemizer just uses the ARPA+ G2p so arpasing+ and this phonemizer
// have same g2p mechanics such as triggering of glottal stop with ('), manual relaxed consonants
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerChinesePhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerChinesePhonemizer.cs
index 42a013619..63bbde45e 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerChinesePhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerChinesePhonemizer.cs
@@ -3,7 +3,7 @@
using OpenUtau.Api;
namespace OpenUtau.Core.DiffSinger {
- [Phonemizer("DiffSinger Chinese Phonemizer", "DIFFS ZH", language: "ZH")]
+ [Phonemizer("DiffSinger Chinese Phonemizer", "DIFFS ZH", language: "ZH", engine: "Diffsinger")]
public class DiffSingerChinesePhonemizer : DiffSingerBasePhonemizer {
protected override string GetDictionaryName()=>"dsdict-zh.yaml";
public override string GetLangCode()=>"zh";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerEnglishPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerEnglishPhonemizer.cs
index de968c363..c1beaf8fc 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerEnglishPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerEnglishPhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger English Phonemizer", "DIFFS EN", language: "EN")]
+ [Phonemizer("DiffSinger English Phonemizer", "DIFFS EN", language: "EN", engine: "Diffsinger")]
public class DiffSingerEnglishPhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=>"dsdict-en.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFilipinoPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFilipinoPhonemizer.cs
index 4fed84789..9d67b5049 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFilipinoPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFilipinoPhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger Filipino Phonemizer", "DIFFS FIL", language: "FIL", author: "julieraptor")]
+ [Phonemizer("DiffSinger Filipino Phonemizer", "DIFFS FIL", language: "FIL", author: "julieraptor", engine: "Diffsinger")]
public class DiffSingerFilipinoPhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=>"dsdict-fil.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFrenchMillefeuillePhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFrenchMillefeuillePhonemizer.cs
index a82c9b649..3511d01b8 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFrenchMillefeuillePhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerFrenchMillefeuillePhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger French Millefeuille Phonemizer", "DIFFS FR MILLE", language: "FR")]
+ [Phonemizer("DiffSinger French Millefeuille Phonemizer", "DIFFS FR MILLE", language: "FR", engine: "Diffsinger")]
public class DiffSingerFrenchMillfeuillePhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=> "dsdict-fr-millefeuille.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanMarzipanPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanMarzipanPhonemizer.cs
index 1cf229a68..50910fb05 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanMarzipanPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanMarzipanPhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger German Marzipan Phonemizer", "DIFFS DE MARZ", language: "DE")]
+ [Phonemizer("DiffSinger German Marzipan Phonemizer", "DIFFS DE MARZ", language: "DE", engine: "Diffsinger")]
public class DiDiffSingerGermanMarzipanPhonemizerr : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=> "dsdict-de-marzipan.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanPhonemizer.cs
index 3b1b531d0..9a945867a 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerGermanPhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger German Phonemizer", "DIFFS DE", language: "DE")]
+ [Phonemizer("DiffSinger German Phonemizer", "DIFFS DE", language: "DE", engine: "Diffsinger")]
public class DiffSingerGermanPhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=>"dsdict-de.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerItalianPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerItalianPhonemizer.cs
index 36ecf7cfb..c57eaf8f3 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerItalianPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerItalianPhonemizer.cs
@@ -2,7 +2,7 @@
using OpenUtau.Core.G2p;
namespace OpenUtau.Core.DiffSinger {
- [Phonemizer("DiffSinger Italian Phonemizer", "DIFFS IT", language: "IT")]
+ [Phonemizer("DiffSinger Italian Phonemizer", "DIFFS IT", language: "IT", engine: "Diffsinger")]
public class DiffSingerItalianPhonemizer : DiffSingerG2pPhonemizer {
protected override string GetDictionaryName() => "dsdict-it.yaml";
public override string GetLangCode()=>"it";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJapanesePhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJapanesePhonemizer.cs
index e6064a441..55abe260f 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJapanesePhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJapanesePhonemizer.cs
@@ -3,7 +3,7 @@
using OpenUtau.Api;
namespace OpenUtau.Core.DiffSinger {
- [Phonemizer("DiffSinger Japanese Phonemizer", "DIFFS JA", language: "JA")]
+ [Phonemizer("DiffSinger Japanese Phonemizer", "DIFFS JA", language: "JA", engine: "Diffsinger")]
public class DiffSingerJapanesePhonemizer : DiffSingerBasePhonemizer {
protected override string GetDictionaryName() => "dsdict-ja.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJyutpingPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJyutpingPhonemizer.cs
index 427a7e2b1..5d6b6c55a 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJyutpingPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerJyutpingPhonemizer.cs
@@ -4,7 +4,7 @@
using Pinyin;
namespace OpenUtau.Core.DiffSinger {
- [Phonemizer("DiffSinger Jyutping Phonemizer", "DIFFS ZH-YUE", language: "ZH-YUE")]
+ [Phonemizer("DiffSinger Jyutping Phonemizer", "DIFFS ZH-YUE", language: "ZH-YUE", engine: "Diffsinger")]
public class DiffSingerJyutpingPhonemizer : DiffSingerBasePhonemizer {
protected override string GetDictionaryName() => "dsdict-zh-yue.yaml";
public override string GetLangCode() => "yue";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanG2PPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanG2PPhonemizer.cs
index 6ab2d8b5c..c0cdcde8c 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanG2PPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanG2PPhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger Korean G2P Phonemizer", "DIFFS KO", language: "KO", author: "Cardroid6")]
+ [Phonemizer("DiffSinger Korean G2P Phonemizer", "DIFFS KO", language: "KO", author: "Cardroid6", engine: "Diffsinger")]
public class DiffSingerKoreanG2PPhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName() => "dsdict-ko.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanPhonemizer.cs
index e28cd1d46..57db1e6cf 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerKoreanPhonemizer.cs
@@ -5,7 +5,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger Korean Phonemizer", "DIFFS KO","EX3", language:"KO")]
+ [Phonemizer("DiffSinger Korean Phonemizer", "DIFFS KO","EX3", language:"KO", engine: "Diffsinger")]
public class DiffSingerKoreanPhonemizer : DiffSingerBasePhonemizer
{
protected override string GetDictionaryName()=>"dsdict-ko.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPhonemizer.cs
index 762dd7b2a..593639fa8 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPhonemizer.cs
@@ -2,7 +2,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger Phonemizer", "DIFFS")]
+ [Phonemizer("DiffSinger Phonemizer", "DIFFS", engine: "Diffsinger")]
public class DiffSingerPhonemizer : DiffSingerBasePhonemizer
{
}
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPortuguesePhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPortuguesePhonemizer.cs
index 8d5a148ee..d1126c10c 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPortuguesePhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerPortuguesePhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger Portuguese Phonemizer", "DIFFS PT", language: "PT")]
+ [Phonemizer("DiffSinger Portuguese Phonemizer", "DIFFS PT", language: "PT", engine: "Diffsinger")]
public class DiffSingerPortuguesePhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=>"dsdict-pt.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRhythmizerPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRhythmizerPhonemizer.cs
index 3bc7c77d2..a4f97e8b4 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRhythmizerPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRhythmizerPhonemizer.cs
@@ -64,7 +64,7 @@ public DsRhythmizer(string path) {
}
}
- [Phonemizer("DiffSinger Rhythmizer Phonemizer", "DIFFS RHY", language: "ZH")]
+ [Phonemizer("DiffSinger Rhythmizer Phonemizer", "DIFFS RHY", language: "ZH", engine: "Diffsinger")]
public class DiffSingerRhythmizerPhonemizer : MachineLearningPhonemizer {
USinger singer;
DsRhythmizer rhythmizer;
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRuleBasedFilipinoPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRuleBasedFilipinoPhonemizer.cs
index 7b284ae89..f428c56e5 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRuleBasedFilipinoPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRuleBasedFilipinoPhonemizer.cs
@@ -124,7 +124,7 @@ public string[] Query(string grapheme) {
}
namespace OpenUtau.Core.DiffSinger {
- [Phonemizer("DiffSinger Rule-based Filipino Phonemizer", "DIFFS FIL", "UtaUtaUtau", "FIL")]
+ [Phonemizer("DiffSinger Rule-based Filipino Phonemizer", "DIFFS FIL", "UtaUtaUtau", "FIL", engine: "Diffsinger")]
public class DiffSingerRuleBasedFilipinoPhonemizer : DiffSingerG2pPhonemizer {
protected override string GetDictionaryName() => "dsdict-fil.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRussianPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRussianPhonemizer.cs
index 788a8ac3a..b817369cd 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRussianPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerRussianPhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger Russian Phonemizer", "DIFFS RU", language: "RU")]
+ [Phonemizer("DiffSinger Russian Phonemizer", "DIFFS RU", language: "RU", engine: "Diffsinger")]
public class DiffSingerRussianPhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=>"dsdict-ru.yaml";
diff --git a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerSpanishPhonemizer.cs b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerSpanishPhonemizer.cs
index 7ec68e3cb..58a003f89 100644
--- a/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerSpanishPhonemizer.cs
+++ b/OpenUtau.Core/DiffSinger/Phonemizers/DiffSingerSpanishPhonemizer.cs
@@ -3,7 +3,7 @@
namespace OpenUtau.Core.DiffSinger
{
- [Phonemizer("DiffSinger Spanish Phonemizer", "DIFFS ES", language: "ES")]
+ [Phonemizer("DiffSinger Spanish Phonemizer", "DIFFS ES", language: "ES", engine: "Diffsinger")]
public class DiffSingerSpanishPhonemizer : DiffSingerG2pPhonemizer
{
protected override string GetDictionaryName()=>"dsdict-es.yaml";
diff --git a/OpenUtau.Core/Vogen/VogenMandarinPhonemizer.cs b/OpenUtau.Core/Vogen/VogenMandarinPhonemizer.cs
index 6f1287cb9..189e0fd48 100644
--- a/OpenUtau.Core/Vogen/VogenMandarinPhonemizer.cs
+++ b/OpenUtau.Core/Vogen/VogenMandarinPhonemizer.cs
@@ -2,7 +2,7 @@
using OpenUtau.Api;
namespace OpenUtau.Core.Vogen {
- [Phonemizer("Vogen Chinese Mandarin Phonemizer", "VOGEN ZH", language: "ZH")]
+ [Phonemizer("Vogen Chinese Mandarin Phonemizer", "VOGEN ZH", language: "ZH", engine: "Vogen")]
public class VogenMandarinPhonemizer : VogenBasePhonemizer {
private static InferenceSession? g2p;
private static InferenceSession? prosody;
diff --git a/OpenUtau.Core/Vogen/VogenYuePhonemizer.cs b/OpenUtau.Core/Vogen/VogenYuePhonemizer.cs
index bb2d1c954..866372e78 100644
--- a/OpenUtau.Core/Vogen/VogenYuePhonemizer.cs
+++ b/OpenUtau.Core/Vogen/VogenYuePhonemizer.cs
@@ -3,7 +3,7 @@
using System;
namespace OpenUtau.Core.Vogen {
- [Phonemizer("Vogen Chinese Yue Phonemizer", "VOGEN ZH-YUE", language: "ZH-YUE")]
+ [Phonemizer("Vogen Chinese Yue Phonemizer", "VOGEN ZH-YUE", language: "ZH-YUE", engine: "Vogen")]
public class VogenYuePhonemizer : VogenBasePhonemizer {
private static TrieNode? trie;
private static InferenceSession? g2p;
diff --git a/OpenUtau.Core/Voicevox/Phonemizers/SimpleVoicevoxPhonemizer.cs b/OpenUtau.Core/Voicevox/Phonemizers/SimpleVoicevoxPhonemizer.cs
index 60a8d8823..955b61ec7 100644
--- a/OpenUtau.Core/Voicevox/Phonemizers/SimpleVoicevoxPhonemizer.cs
+++ b/OpenUtau.Core/Voicevox/Phonemizers/SimpleVoicevoxPhonemizer.cs
@@ -5,7 +5,7 @@
using OpenUtau.Core.Voicevox;
namespace Voicevox {
- [Phonemizer("Simple Voicevox Japanese Phonemizer", "S-VOICEVOX JA", language: "JA")]
+ [Phonemizer("Simple Voicevox Japanese Phonemizer", "S-VOICEVOX JA", language: "JA", engine: "Voicevox")]
public class SimpleVoicevoxPhonemizer : Phonemizer {
protected VoicevoxSinger singer;
diff --git a/OpenUtau.Core/Voicevox/Phonemizers/VoicevoxPhonemizer.cs b/OpenUtau.Core/Voicevox/Phonemizers/VoicevoxPhonemizer.cs
index 2360fd669..c5d2ae9b9 100644
--- a/OpenUtau.Core/Voicevox/Phonemizers/VoicevoxPhonemizer.cs
+++ b/OpenUtau.Core/Voicevox/Phonemizers/VoicevoxPhonemizer.cs
@@ -6,7 +6,7 @@
using OpenUtau.Core.Ustx;
namespace OpenUtau.Core.Voicevox {
- [Phonemizer("Voicevox Japanese Phonemizer", "VOICEVOX JA", language: "JA")]
+ [Phonemizer("Voicevox Japanese Phonemizer", "VOICEVOX JA", language: "JA", engine: "Voicevox")]
public class VoicevoxPhonemizer : Phonemizer {
protected VoicevoxSinger singer;
diff --git a/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxEnglishPhonemizer.cs b/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxEnglishPhonemizer.cs
index 8614f8968..c95805ae2 100644
--- a/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxEnglishPhonemizer.cs
+++ b/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxEnglishPhonemizer.cs
@@ -7,7 +7,7 @@
using Serilog;
namespace OpenUtau.Plugin.Builtin {
- [Phonemizer("Enunu Onnx English Phonemizer", "ENUNU X EN", language:"EN")]
+ [Phonemizer("Enunu Onnx English Phonemizer", "ENUNU X EN", language:"EN", engine: "Enunu")]
public class EnunuOnnxEnglishPhonemizer : EnunuOnnxPhonemizer {
protected override IG2p LoadG2p(string rootPath) {
var g2ps = new List();
diff --git a/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxPhonemizer.cs b/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxPhonemizer.cs
index 8c3b74a07..b1d5a712d 100644
--- a/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxPhonemizer.cs
+++ b/OpenUtau.Plugin.Builtin/EnunuOnnx/EnunuOnnxPhonemizer.cs
@@ -19,7 +19,7 @@
//This phonemizer uses onnxruntime to run ML models. No Python needed.
namespace OpenUtau.Plugin.Builtin {
- [Phonemizer("Enunu Onnx Phonemizer", "ENUNU X")]
+ [Phonemizer("Enunu Onnx Phonemizer", "ENUNU X", engine: "Enunu")]
public class EnunuOnnxPhonemizer : Phonemizer {
readonly string PhonemizerType = "ENUNU X";
diff --git a/OpenUtau/Strings/Strings.axaml b/OpenUtau/Strings/Strings.axaml
index 4aa620c1e..864ea1484 100644
--- a/OpenUtau/Strings/Strings.axaml
+++ b/OpenUtau/Strings/Strings.axaml
@@ -98,6 +98,8 @@ OpenUtau aims to be an open source editing environment for UTAU community, with
Installing dependency
Installing
Installing phonemizer
+ Phonemizer Mismatched
+ The singer type ({0}) does not match the phonemizer type ({1}). This may result in missing phonemes or errors. Do you want to use this phonemizer anyway?
Installing
Merging Parts
Parts on different tracks cannot be merged.
diff --git a/OpenUtau/ViewModels/NotePropertiesViewModel.cs b/OpenUtau/ViewModels/NotePropertiesViewModel.cs
index fc8749bc4..2bc70404a 100644
--- a/OpenUtau/ViewModels/NotePropertiesViewModel.cs
+++ b/OpenUtau/ViewModels/NotePropertiesViewModel.cs
@@ -12,7 +12,10 @@
using ReactiveUI.Fody.Helpers;
using SharpCompress;
using OpenUtau.Api;
-
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using OpenUtau.App.Views;
+using Serilog;
namespace OpenUtau.App.ViewModels {
public class NotePropertiesViewModel : ViewModelBase, ICmdSubscriber {
public string Title { get => ThemeManager.GetString("noteproperty") + " (" + selectedNotes.Count + " notes)"; }
@@ -134,7 +137,43 @@ public NotePropertiesViewModel() {
DocManager.Inst.EndUndoGroup();
}
});
- SelectPhonemizerCommand = ReactiveCommand.Create(name => {
+ SelectPhonemizerCommand = ReactiveCommand.Create(async name => {
+ if (!string.IsNullOrEmpty(name) && Part != null) {
+ var currentTrack = DocManager.Inst.Project.tracks[Part.trackNo];
+
+ var factory = OpenUtau.Api.PhonemizerFactory.GetAll().FirstOrDefault(f =>
+ f.name == name || f.type.FullName == name || f.type.Name == name);
+
+ if (factory != null && currentTrack.Singer != null && currentTrack.Singer.Found) {
+ string singerEngine = currentTrack.Singer.SingerType.ToString().ToLowerInvariant();
+ string phonemizerEngine = factory.engine?.ToLowerInvariant() ?? "classic";
+ if (phonemizerEngine == "utau") {
+ phonemizerEngine = "classic";
+ }
+
+ if (singerEngine != phonemizerEngine) {
+ var mainWindow = (Application.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow;
+ if (mainWindow != null) {
+ string popupTitle = ThemeManager.GetString("warning.enginemismatch.title");
+ string popupMsgTemplate = ThemeManager.GetString("warning.enginemismatch.msg");
+ string formattedMsg = string.Format(popupMsgTemplate, singerEngine.ToUpper(), phonemizerEngine.ToUpper());
+ Log.Information($"Phonemizer mismatch detected for note override: Voicebank is '{singerEngine}', Phonemizer is '{phonemizerEngine}'.");
+
+ var result = await MessageBox.Show(
+ mainWindow,
+ formattedMsg,
+ popupTitle,
+ MessageBox.MessageBoxButtons.YesNo
+ );
+
+ if (result != MessageBox.MessageBoxResult.Yes) {
+ return;
+ }
+ }
+ }
+ }
+ }
+
DocManager.Inst.StartUndoGroup("command.property.edit");
PanelControlPressed = true;
SetNoteParams("PhonemizerOverride", name);
@@ -272,31 +311,47 @@ public void RefreshPhonemizers() {
CommandParameter = null
});
- items.Add(new MenuItemViewModel() { Header = "-", Height = 1 });
- items.AddRange(Preferences.Default.RecentPhonemizers
- .Select(name => PhonemizerFactory.Get(name))
- .OfType()
- .OrderBy(factory => factory.tag)
- .Select(factory => new MenuItemViewModel() {
- Header = factory.ToString(),
- Command = SelectPhonemizerCommand,
- CommandParameter = factory.name,
- }));
-
- items.Add(new MenuItemViewModel() {
- Header = $"{ThemeManager.GetString("tracks.more")} ...",
- Items = PhonemizerFactory.GetAll().GroupBy(factory => factory.language)
- .OrderBy(group => group.Key)
- .Select(group => new MenuItemViewModel() {
- Header = GetPhonemizerGroupHeader(group.Key),
- Items = group.Select(factory => new MenuItemViewModel() {
+ if (Preferences.Default.RecentPhonemizers.Count > 0) {
+ items.Add(new MenuItemViewModel() { Header = "-", Height = 1 });
+
+ items.AddRange(Preferences.Default.RecentPhonemizers
+ .Select(name => PhonemizerFactory.Get(name))
+ .OfType()
+ .OrderBy(factory => factory.tag)
+ .Select(factory => new MenuItemViewModel() {
Header = factory.ToString(),
Command = SelectPhonemizerCommand,
CommandParameter = factory.name,
- }).ToArray(),
- }).ToArray()
- });
+ }));
+ }
+
+ // Visual separator before the full list
+ items.Add(new MenuItemViewModel() { Header = "-", Height = 1 });
+ // Get all phonemizers grouped by Engine, then by Language
+ var engineGroups = PhonemizerFactory.GetAll()
+ // Group by Engine (e.g., Utau, Vogen, etc.)
+ .GroupBy(factory => factory.engine ?? "Utau")
+ .OrderBy(typeGroup => typeGroup.Key)
+ .Select(typeGroup => new MenuItemViewModel() {
+ Header = typeGroup.Key,
+
+ // Group by Language within that Engine
+ Items = typeGroup.GroupBy(factory => factory.language)
+ .OrderBy(langGroup => langGroup.Key)
+ .Select(langGroup => new MenuItemViewModel() {
+ Header = GetPhonemizerGroupHeader(langGroup.Key),
+
+ // The actual phonemizers
+ Items = langGroup.Select(factory => new MenuItemViewModel() {
+ Header = factory.ToString(),
+ Command = SelectPhonemizerCommand,
+ CommandParameter = factory.name,
+ }).ToArray(),
+ }).ToArray()
+ }).ToArray();
+
+ items.AddRange(engineGroups);
PhonemizerMenuItems = items;
}
diff --git a/OpenUtau/ViewModels/TrackHeaderViewModel.cs b/OpenUtau/ViewModels/TrackHeaderViewModel.cs
index 34fb0d4b9..b56ea2fd7 100644
--- a/OpenUtau/ViewModels/TrackHeaderViewModel.cs
+++ b/OpenUtau/ViewModels/TrackHeaderViewModel.cs
@@ -79,8 +79,36 @@ public TrackHeaderViewModel(UTrack track) {
this.RaisePropertyChanged(nameof(Renderer));
RefreshAvatar();
});
- SelectPhonemizerCommand = ReactiveCommand.Create(factory => {
+ SelectPhonemizerCommand = ReactiveCommand.Create(async factory => {
if (track.Phonemizer.GetType() != factory.type) {
+ if (track.Singer != null && track.Singer.Found) {
+ string singerEngine = track.Singer.SingerType.ToString().ToLowerInvariant();
+ string phonemizerEngine = factory.engine?.ToLowerInvariant() ?? "classic";
+ if (phonemizerEngine == "utau") {
+ phonemizerEngine = "classic";
+ }
+
+ if (singerEngine != phonemizerEngine) {
+ var mainWindow = (Application.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow;
+ if (mainWindow != null) {
+
+ string popupTitle = ThemeManager.GetString("warning.enginemismatch.title");
+ string popupMsgTemplate = ThemeManager.GetString("warning.enginemismatch.msg");
+ string formattedMsg = string.Format(popupMsgTemplate, singerEngine.ToUpper(), phonemizerEngine.ToUpper());
+ Log.Information($"Phonemizer mismatch detected: Voicebank is '{singerEngine}', Phonemizer is '{phonemizerEngine}'.");
+
+ var result = await MessageBox.Show(
+ mainWindow,
+ formattedMsg,
+ popupTitle,
+ MessageBox.MessageBoxButtons.YesNo
+ );
+ if (result != MessageBox.MessageBoxResult.Yes) {
+ return;
+ }
+ }
+ }
+ }
DocManager.Inst.StartUndoGroup("command.track.setting");
var phonemizer = factory.Create();
Log.Information($"Loading Phonemizer: {phonemizer.ToString()}");
@@ -421,20 +449,40 @@ public void RefreshPhonemizers() {
Command = SelectPhonemizerCommand,
CommandParameter = factory,
}));
- //more phonemizers grouped by singing language
- items.Add(new MenuItemViewModel() {
- Header = $"{ThemeManager.GetString("tracks.more")} ...",
- Items = PhonemizerFactory.GetAll().GroupBy(factory => factory.language)
- .OrderBy(group => group.Key)
- .Select(group => new MenuItemViewModel() {
- Header = GetPhonemizerGroupHeader(group.Key),
- Items = group.Select(factory => new MenuItemViewModel() {
- Header = factory.ToString(),
- Command = SelectPhonemizerCommand,
- CommandParameter = factory,
- }).ToArray(),
- }).ToArray()
- });
+
+ if (items.Count > 0) {
+ items.Add(new MenuItemViewModel() {
+ Header = "-",
+ Height = 1
+ });
+ }
+
+ // Get all phonemizers grouped by Engine, then by Language
+ var engineGroups = PhonemizerFactory.GetAll()
+ // Engine type (First Level)
+ .GroupBy(factory => factory.engine ?? "Utau")
+ .OrderBy(typeGroup => typeGroup.Key)
+ .Select(typeGroup => new MenuItemViewModel() {
+ Header = typeGroup.Key,
+
+ // Language specific to the engine (Second Level)
+ Items = typeGroup.GroupBy(factory => factory.language)
+ .OrderBy(langGroup => langGroup.Key)
+ .Select(langGroup => new MenuItemViewModel() {
+ Header = GetPhonemizerGroupHeader(langGroup.Key),
+
+ // Actual phonemizers in that language folder (Third Level)
+ Items = langGroup.Select(factory => new MenuItemViewModel() {
+ Header = factory.ToString(),
+ Command = SelectPhonemizerCommand,
+ CommandParameter = factory,
+ }).ToArray(),
+ }).ToArray()
+ }).ToArray();
+
+ // Add the engine groups directly to the main items list, bypassing the "More..." wrapper
+ items.AddRange(engineGroups);
+
PhonemizerMenuItems = items.ToArray();
this.RaisePropertyChanged(nameof(PhonemizerMenuItems));
}