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)); }