using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CloudBuilder.AI.Policy { public enum ChineseTtsVoice { /// /// 普通话(中国大陆) 娇柔(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 喜佳(女性)-0")] Sherpa0, /// /// 普通话(中国大陆)- 柔美(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 柔美(女性)-2")] Sherpa2, /// /// 普通话(中国大陆)- 知性(男性) /// [System.ComponentModel.Description("普通话(中国大陆) 知性(男性)-4")] Sherpa4, /// /// 普通话(中国大陆)- 知青(男性) /// [System.ComponentModel.Description("普通话(中国大陆) 知青(男性)-3")] Sherpa3, /// /// 普通话(中国大陆)- 中青(男性) /// [System.ComponentModel.Description("普通话(中国大陆) 中青(男性)-1")] Sherpa1, /// /// 普通话(中国大陆)- 爱莎(女性)- 文件小速度快 /// [System.ComponentModel.Description("普通话(中国大陆) 爱莎(女性)-6")] Aaishe6, /// /// 普通话(中国大陆)- 爱莎(女性)- 文件小速度快 /// [System.ComponentModel.Description("普通话(中国大陆) 爱莎(女性)-14")] Aaishe14, /// /// 普通话(中国大陆)- 爱莎(女性)- 文件小速度快 /// [System.ComponentModel.Description("普通话(中国大陆) 爱莎(女性)-18")] Aaishe18, /// /// 普通话(中国大陆)- 云健(男性)- 文件小速度快 /// [System.ComponentModel.Description("普通话(中国大陆) 云健(男性)-10")] Aaishe10, /// /// 普通话(中国大陆)- 爱莎(女性)- 文件小速度快 /// [System.ComponentModel.Description("普通话(中国大陆) 爱莎(女性)-1")] Aaishe1, /// /// 普通话(中国大陆)- 云健(男性)- 文件小速度快 /// [System.ComponentModel.Description("普通话(中国大陆) 云健(男性)-15")] Aaishe15, /// 普通话(中国大陆) 云阳(男性) /// [System.ComponentModel.Description("普通话(中国大陆) 云阳(男性)-10")] Fanchen10, /// /// 普通话(中国大陆) 云阳(男性) /// [System.ComponentModel.Description("普通话(中国大陆) 云阳(男性)-110")] Fanchen110, /// 普通话(中国大陆) 喜佳(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 云夏(女性)-6")] Fanchen6, /// /// 普通话(中国大陆) 云阳(男性) /// [System.ComponentModel.Description("普通话(中国大陆) 云阳(男性)-15")] Fanchen15, /// /// 普通话(中国大陆) 喜佳(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 喜佳(女性)-2")] Fanchen2, /// /// 普通话(中国大陆) 喜佳(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 喜佳(女性)-14")] Fanchen14, /// /// 普通话(中国大陆) 喜佳(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 喜佳(女性)-20")] Fanchen20, /// /// 普通话(中国大陆) 喜佳(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 喜佳(女性)-36")] Fanchen36, /// /// 粤语(香港)- 女性(男性)- 文件大 /// [System.ComponentModel.Description("粤语(香港) 梅隆 (女性)-0")] Melo, /// /// 普通话(中国大陆)- 神精女(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 神精女(女性)-0")] Eula, /// /// 普通话(中国大陆)- 小神精女(女性) /// [System.ComponentModel.Description("普通话(中国大陆) 小神精女(女性)-27")] Theresa, } public static class ChineseTtsVoiceRandom { private static readonly Random _random = new Random(); private static ChineseTtsVoice Default = ChineseTtsVoice.Sherpa2; private static ChineseTtsVoice DefaultFemale = ChineseTtsVoice.Sherpa0; private static ChineseTtsVoice DefaultMale = ChineseTtsVoice.Sherpa4; // 所有男性列表(只定义一次) private static readonly List _allMales = new() { ChineseTtsVoice.Sherpa4, ChineseTtsVoice.Sherpa3, ChineseTtsVoice.Sherpa1, ChineseTtsVoice.Aaishe10, ChineseTtsVoice.Aaishe15, ChineseTtsVoice.Fanchen10, ChineseTtsVoice.Fanchen110, ChineseTtsVoice.Fanchen15 }; // 所有女性列表 private static readonly List _allFemales = new() { ChineseTtsVoice.Sherpa0, ChineseTtsVoice.Sherpa2, ChineseTtsVoice.Aaishe6, ChineseTtsVoice.Aaishe14, ChineseTtsVoice.Aaishe18, ChineseTtsVoice.Aaishe1, ChineseTtsVoice.Fanchen6, ChineseTtsVoice.Fanchen2, ChineseTtsVoice.Fanchen14, ChineseTtsVoice.Fanchen20, ChineseTtsVoice.Fanchen36, ChineseTtsVoice.Melo, ChineseTtsVoice.Eula, ChineseTtsVoice.Theresa }; /// /// 百分比越大,取前面5个的机会越大 /// /// 0~100,推荐 50~100 /// /// 百分比越大,取前面5个的机会越大 /// /// 0~100,越大越容易选前5个 public static ChineseTtsVoice GetRandom(int percentage = 80) { var all = Enum.GetValues(typeof(ChineseTtsVoice)).Cast().ToList(); int totalCount = all.Count; // 安全限制 percentage = Math.Clamp(percentage, 0, 100); if (totalCount == 0) return default; // 前5个 int topCount = 5; var topItems = all.Take(topCount).ToList(); // 百分比越高,前5个被选中的概率越高 double topChance = percentage / 100.0; // 随机决定是否从前5个拿 if (_random.NextDouble() < topChance && topItems.Any()) { return topItems[_random.Next(topItems.Count)]; } else { // 否则全量随机 return all[_random.Next(all.Count)]; } } // 2. 随机女性 + 百分比权重(越高越容易选前5个) public static ChineseTtsVoice GetRandomFemale(int weightPercentage = 80) { return GetWeightedRandom(_allFemales, weightPercentage); } // 3. 随机男性 + 百分比权重 public static ChineseTtsVoice GetRandomMale(int weightPercentage = 80) { return GetWeightedRandom(_allMales, weightPercentage); } // 4. 随机男性(排除指定)+ 百分比权重 public static ChineseTtsVoice GetRandomMaleExclude(int weightPercentage = 80, ChineseTtsVoice excludeVoice = ChineseTtsVoice.Sherpa4) { var filtered = _allMales.Where(m => m != excludeVoice).ToList(); return GetWeightedRandom(filtered, weightPercentage); } // 5. 随机女性(排除指定)+ 百分比权重 public static ChineseTtsVoice GetRandomFemaleExclude(int weightPercentage = 80, ChineseTtsVoice excludeVoice = ChineseTtsVoice.Sherpa0) { var filtered = _allFemales.Where(f => f != excludeVoice).ToList(); return GetWeightedRandom(filtered, weightPercentage); } // 1. 随机任意一个(排除默认)+ 百分比权重 public static ChineseTtsVoice GetRandomExclude(int weightPercentage = 80) { var all = Enum.GetValues(typeof(ChineseTtsVoice)).Cast().ToList(); all = all.Where(f => f != DefaultFemale && f != DefaultMale).ToList(); return GetWeightedRandom(all, weightPercentage); } /// /// 加权随机:百分比越高,前5个概率越大 /// private static ChineseTtsVoice GetWeightedRandom(List list, int percentage) { if (list == null || list.Count == 0) return default; // 确保 0~100 之间 percentage = Math.Clamp(percentage, 0, 100); const int topCount = 5; // 固定前5个 var topItems = list.Take(topCount).ToList(); // 百分比越高,越容易选前5个 if (_random.NextDouble() < percentage / 100.0 && topItems.Any()) { return topItems[_random.Next(topItems.Count)]; } // 否则全列表随机 return list[_random.Next(list.Count)]; } } }