From 597b88d075398e04177155fc14ae198203c1078b Mon Sep 17 00:00:00 2001 From: owenchen Date: Thu, 28 May 2026 15:49:25 +0800 Subject: [PATCH] ow --- .gitignore | 7 + CloudBuilder.Topshelf.csproj | 93 ++ CloudBuilder.Topshelf.sln | 25 + Lib/CloudBuilder.AI.Service.dll | Bin 0 -> 60416 bytes Lib/CloudBuilder.AI.dll | Bin 0 -> 82432 bytes Lib/CloudBuilder.Core.dll | Bin 0 -> 225792 bytes Lib/CloudBuilder.Request.dll | Bin 0 -> 60416 bytes Lib/CloudBuilder.Security.Service.dll | Bin 0 -> 89088 bytes Lib/CloudBuilder.Security.dll | Bin 0 -> 218624 bytes Program.cs | 156 ++++ Properties/launchSettings.json | 8 + Python/Hanlp2.cs | 167 ++++ Python/NamedEntity.cs | 954 ++++++++++++++++++++ Python/PythonCommand.cs | 88 ++ Task/AI/Character.md | 25 + Task/AI/CharacterInsertTask.cs | 65 ++ Task/AI/CharacterTtsTask.cs | 86 ++ Task/AI/ChineseNameExtractorTask.cs | 102 +++ Task/AI/NovelCutWordTask.cs | 182 ++++ Task/AI/WordInsertTask.cs | 64 ++ Task/Novel/ImportBookTask.cs | 136 +++ Task/Novel/ParagraphSplitterTask.cs | 96 ++ Task/Novel/Process/ChapterSplitter.cs | 156 ++++ Task/Novel/Process/ParagraphSplitter.cs | 63 ++ Task/Novel/Process/SentenceSplitter.cs | 199 ++++ Task/Novel/Process/SpeakerAnalysisHelper.cs | 102 +++ Task/Novel/Process/SpeakerFeatureLearner.cs | 148 +++ Task/Novel/SpeakerTask.cs | 239 +++++ Task/Novel/SplitFileChapterTask.cs | 133 +++ Task/Novel/readme.md | 19 + Task/Python/PythonRunTask.cs | 59 ++ Task/RunTask.cs | 21 + Task/SplitFileSaveUTF8Task.cs | 135 +++ Task/TTS/TtsTask.cs | 42 + Utility/SaveAudioToFileHelper.cs | 317 +++++++ Utility/SegmenterHelper.cs | 18 + appsettings.json | 38 + 37 files changed, 3943 insertions(+) create mode 100644 .gitignore create mode 100644 CloudBuilder.Topshelf.csproj create mode 100644 CloudBuilder.Topshelf.sln create mode 100644 Lib/CloudBuilder.AI.Service.dll create mode 100644 Lib/CloudBuilder.AI.dll create mode 100644 Lib/CloudBuilder.Core.dll create mode 100644 Lib/CloudBuilder.Request.dll create mode 100644 Lib/CloudBuilder.Security.Service.dll create mode 100644 Lib/CloudBuilder.Security.dll create mode 100644 Program.cs create mode 100644 Properties/launchSettings.json create mode 100644 Python/Hanlp2.cs create mode 100644 Python/NamedEntity.cs create mode 100644 Python/PythonCommand.cs create mode 100644 Task/AI/Character.md create mode 100644 Task/AI/CharacterInsertTask.cs create mode 100644 Task/AI/CharacterTtsTask.cs create mode 100644 Task/AI/ChineseNameExtractorTask.cs create mode 100644 Task/AI/NovelCutWordTask.cs create mode 100644 Task/AI/WordInsertTask.cs create mode 100644 Task/Novel/ImportBookTask.cs create mode 100644 Task/Novel/ParagraphSplitterTask.cs create mode 100644 Task/Novel/Process/ChapterSplitter.cs create mode 100644 Task/Novel/Process/ParagraphSplitter.cs create mode 100644 Task/Novel/Process/SentenceSplitter.cs create mode 100644 Task/Novel/Process/SpeakerAnalysisHelper.cs create mode 100644 Task/Novel/Process/SpeakerFeatureLearner.cs create mode 100644 Task/Novel/SpeakerTask.cs create mode 100644 Task/Novel/SplitFileChapterTask.cs create mode 100644 Task/Novel/readme.md create mode 100644 Task/Python/PythonRunTask.cs create mode 100644 Task/RunTask.cs create mode 100644 Task/SplitFileSaveUTF8Task.cs create mode 100644 Task/TTS/TtsTask.cs create mode 100644 Utility/SaveAudioToFileHelper.cs create mode 100644 Utility/SegmenterHelper.cs create mode 100644 appsettings.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fb70c0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +################################################################################ +# 這個 .gitignore 檔案由 Microsoft(R) Visual Studio 自動建立。 +################################################################################ + +/.vs +/bin/Debug/net8.0 +/obj diff --git a/CloudBuilder.Topshelf.csproj b/CloudBuilder.Topshelf.csproj new file mode 100644 index 0000000..1c642a8 --- /dev/null +++ b/CloudBuilder.Topshelf.csproj @@ -0,0 +1,93 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lib\CloudBuilder.AI.dll + + + Lib\CloudBuilder.AI.Service.dll + + + Lib\CloudBuilder.Core.dll + + + Lib\CloudBuilder.Request.dll + + + Lib\CloudBuilder.Security.dll + + + Lib\CloudBuilder.Security.Service.dll + + + + diff --git a/CloudBuilder.Topshelf.sln b/CloudBuilder.Topshelf.sln new file mode 100644 index 0000000..649aae5 --- /dev/null +++ b/CloudBuilder.Topshelf.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34316.72 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudBuilder.Topshelf", "CloudBuilder.Topshelf.csproj", "{63EB47F6-A616-4C64-B850-85ED294E2524}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {63EB47F6-A616-4C64-B850-85ED294E2524}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63EB47F6-A616-4C64-B850-85ED294E2524}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63EB47F6-A616-4C64-B850-85ED294E2524}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63EB47F6-A616-4C64-B850-85ED294E2524}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {24F7770A-0647-4A47-B147-80AFD34ACB87} + EndGlobalSection +EndGlobal diff --git a/Lib/CloudBuilder.AI.Service.dll b/Lib/CloudBuilder.AI.Service.dll new file mode 100644 index 0000000000000000000000000000000000000000..114cd3e91964d5939bd86ebd306719145923d7f5 GIT binary patch literal 60416 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 hI1Y*6 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

PE5c^oMVaKGeI z(NENq@p*Kr{9H!KZ;|VENyj(S1m!{8L;Eo9t^JdXkwg!^14$`y6{G+mJ;pV+rRI-B#T< zq@yqU>V;c^d#qb;d)$vd%8ki)_t$N$+dDVE+XgoRZcC12FWi>6eTj^%+s=LYZpmH8 z*R40Q3Ku7W6*Kc91B4RcOqU5T8rrQ}nG=xltKN9`W2JhCN`@o`(_me92gZjEkVy4LHq z+^x53jgc+iSM594BVpg&mhUTPqA^Fls&HvI!&H2*E7&za=_X2*wo#bKeHb*mVFO3`sKRtN_@Yz5LuqrTm zl)EQ7c)leX|6=f;!IK3s;BolR;HiQ*@M)3&J{{=D5z-U-U!Tse!!RG=Ud<*Gt@B*NNJI+Uf z9}RTmIPA%I{u}7vzVj6D6M&AKi2d2%yEaFGmtc=J5(47yNn@WjQVMi%Z~7SUa-bt8 zVZS!A4Cvr)b^Uu?6+j1n1x^1x*9xG6ClMxsuLL?$#lOE*4RmA`|K8RqKu1pJ-`6?= z=*XG4lgh|Cpd)7?P6mHPYdUy6;$)-&=*T&Ulacj62lvEhgP#X<@C{SB;1>WL+$BE? zd;`$IHx%Z9Ukr3`-~1f#OMwo)^=~ftFMtm2o-Y8u4(P})5hwi~zN5i6N)h<=KnLHV zw*dUtKt~$o81N>bBR7iv)vrxJ2lw0`4}KHSk>4P$_#SYegS+sTfNudh@;k&8f6WN! z;9h*3-*Gl91^*-Bif^|EI=DN38TkD`M;<_24bGMo;140L24~F`;D16~4bGe^!JDNT zyanjUqj<{1$YVeU_w?6-Zv{H?XFSVdcYm-Nmtc^QZ& zk1-B-W((-xy5Vf_*MW|_fpIYSF0BUeH!%+QMs=Wr@5MR~{B59vZ@0Ptybb8c2N(w< ze+N49A;!VTM?gpZfpIYSTYZ;;eqtBVS?MjC>7rx6W6rh8rDINqL1#~3MJPe)=bntw|Bj6c8 z2jBkE0zL-l;E9XJzz+mE_!g6`;D-VoJa_Q~_*9^SZyVVTemD^Ok9it=IuQGhc?SGQ zAod^gEO-_W`;U1ZJR6Ap$Gixh3&j3oUIw29#QtMm1_6rs@MS>kKjvfb3Ly3$^H1;_28Vcs0yxE;k2&UjcORSN(c}UkP;Z^h;mxtAW_BOn>lS0I^@0 zf#BBxv0vdSE9_T5>{n(e`1L^SS7tc)uYuUF%t-JiAoeR<|6{)bV!tve;5PvsxzmgS zzYB`UfA@CSj|m&`%n4+F6;nS;R}0b*Y=6Tw@6 z*q88%1N#yX`;s{nd@InAZDuO?6F>*g=Nt~c9q7nYW;*!OKnG9k90~pm5c` z9S!~-(82RRMd0l~>|J z2R;huNV;=2co2yF$7ui`19apdXFd3Mpd$x6=YdZEIx^9@0DKbAkwcsf;FE!l9O_&Q zJ_YE=ROeFg!+_YAoXfzc1FKx*m?K|3ctS_owpE8a7IV4JOCD!p1^4*RnkoV3t8Q=D>cfRJN zy}grtrCq#`@3k)8$-dRyl$R9H^2Xz8OMjx|+!5N+C|Nn80=wTjNpa3b%&w4|oOSXS z{QC#~;bpe|Ogm!gk|h(CjF)Ni%a>Ku*3BtjTYJP(*P6GwvNE)^vb^MA$;+);y|TQ< zQ*%SLb>%hg5xG@$6?JQi*RIlhu9y+3rC777ro6VcqPhwxS*3L@>Bv80bwy=ad5s=+ z%IZ)hO3AKXxhhmc%QkF6*M`A5;-n=@vZ|`9)~>8xU8_}(FPR`SS67wdmpyP|*8?X? zUQv0?sTHN=Y#?&DouAY-D=atdkgjR4+_cGE(_p!2hjvYab;MMeHn+NLb!GVxvM{f> zXvuN2m&~5Iq1l* zIYrr7g&mHYEhjfWx46U1$;-+wn6;q8$SYcspEqw#xNzv4y!pA=#Rc<^bal5E6nNfAoUF3!!7?1H(4T1k#JZkGOOX#6hBnx8dmepcb^urs5eU`|+M&(10= z&Yd6DGxPG%CLXEH$<0|3;mj<^&p}={x!{;EWdO4B(2{w@x%0AfwO)ETbBlO<*kIj} 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

  • SJ97W*K(-H*AA#cDh|<0N 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%0A5>3ZZ{VML->f`#UopM% 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 literal 0 HcmV?d00001 diff --git a/Lib/CloudBuilder.Security.Service.dll b/Lib/CloudBuilder.Security.Service.dll new file mode 100644 index 0000000000000000000000000000000000000000..dc2f30218a8c7f8b29b82ffc921a5468d42e2bd3 GIT binary patch literal 89088 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 literal 0 HcmV?d00001 diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..1b1bfd5 --- /dev/null +++ b/Program.cs @@ -0,0 +1,156 @@ +using CloudBuilder; +using CloudBuilder.Core.Authorization; +using CloudBuilder.Core.DatabaseAccessor; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Form; +using CloudBuilder.Core.DependencyInjection.Request; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Core.Policy; +using CloudBuilder.Core.Service; +using CloudBuilder.Request.Security; +using CloudBuilder.Security.Data; +using CloudBuilder.Security.Policy; +using CloudBuilder.Topshelf.Task; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; +using System.Text; + +public partial class Program +{ + ///

    + /// request:Y 要求调用webApi参数 + /// + /// + static void Main(string[] args) + { + try + { + // 设置控制台编码为UTF-8,解决中文乱码问题 + Console.OutputEncoding = Encoding.UTF8; + Console.InputEncoding = Encoding.UTF8; + + string taskName = null; + Dictionary bodyDict = new Dictionary(); + + + if (args != null && args.Length > 0) + { + var services = new ServiceCollection(); + + services.Initialize(); + + var serviceProvider = services.BuildServiceProvider(); + + ApplicationServiceContext applicationServiceContext = serviceProvider.GetService()!; + + string key = null; + string[] temp = null; + + foreach (string s in args) + { + temp = s.Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries); + if (temp.Length <= 1) continue; + if (temp[1] == null || temp[1].Trim() == string.Empty) continue; + + key = temp[0].Trim(); + + if (key == "task") + { + taskName = temp[1];// config.TaskMappings.Where(x => x.Task == temp[1]).FirstOrDefault(); + if (taskName == null) continue; + + continue; + } + + if (bodyDict.ContainsKey(key)) continue; + + bodyDict.Add(key, temp[1]); + } + + if (string.IsNullOrEmpty(taskName)) return; + + try + { + + IApplicationService applicationService = serviceProvider.GetService(); + applicationService.UserId = applicationService.Configuration["IApplicationService:UserId"]; + //如果有传入用户ID,则使用传入的用户ID + if (bodyDict.ContainsKey("user_id")) + { + applicationService.UserId = bodyDict["user_id"]; + } + + IEnumerable tasks = serviceProvider.GetServices(); + + foreach (var task in tasks) + { + if (task.GetType().Name.ToLower() != taskName.ToLower()) continue; + + if (bodyDict.ContainsKey("request") && bodyDict["request"].ToUpper().Trim() == "Y") Login(applicationService); + + task.Run(bodyDict); + } + + } + catch (Exception ex) + { + Console.WriteLine($"[{ex.Message}]"); + } + finally + { + Environment.Exit(0); + } + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } + + static void Login(IApplicationService applicationService) + { + #region 系统用户登录 + try + { + LoginData loginData = new LoginData(); + //从容器获取请求对象 + AuthRequest authRequest = ServiceHelper.GetTypeService(); + //获取RSA公钥 + string pubKey = authRequest.GetRsaPublicKey(); + //加密用户密码 + string psw = applicationService.Configuration["CloudBuilder:SecurityUser:UserPassword"]!; + loginData.Guid = psw.Substring(0, 36); + var rsa = new RSA(pubKey, true); + loginData.UserMobile = applicationService.Configuration["CloudBuilder:SecurityUser:UserMobile"]!; + loginData.RsaUserPassword = rsa.Encode(psw); + //设置当前文化 + loginData.Culture = CulturePolicy.ZH_CN; + + LoginProfile loginProfile; + + loginProfile = authRequest.Login(loginData); + + IContext loginContext = ServiceHelper.GetInterfaceService()!; + //登录成功后设置登录上下文 + loginContext.Requestor = loginProfile.Username; + loginContext.SetPermissionInfo(loginProfile.PermissionInfo); + loginContext.SetToken(loginProfile.Token.AccessToken); + loginContext.LoginDate = DateTime.Now; + } + catch (Exception ex) + { + throw ex; + } + + //ISecurityMasterService securityMasterService = service.ServiceProvider.GetService(); + + //SecurityMasterEntityKey key = new SecurityMasterEntityKey(); + //key.MasterCodeItem = "default_work_shift"; + //key.MasterCategory = "CloudBuilder.Hr.Policy.Master"; + //key.MasterSubcategory = "StaffWorkShiftPolicy"; + //SecurityMasterEntity securityMaster = securityMasterService.FindByKey(key); + #endregion + } +} \ No newline at end of file diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json new file mode 100644 index 0000000..cbfd429 --- /dev/null +++ b/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "CloudBuilder.Topshelf": { + "commandName": "Project", + "commandLineArgs": "task:TtsTask voice:Sherpa2 save_path:D:\\\\Net8\\\\FileServer\\\\Backup\\\\DmsFile\\\\voice\\\\20260528112739.mp3 text:二愣子睁大着双眼,直直望着茅草和烂泥糊成的黑屋顶,身上盖着的旧棉被,已呈深黄色,看不出原来的本来面目,还若有若无的散发着淡淡的霉味。" + } + } +} \ No newline at end of file diff --git a/Python/Hanlp2.cs b/Python/Hanlp2.cs new file mode 100644 index 0000000..103e8fa --- /dev/null +++ b/Python/Hanlp2.cs @@ -0,0 +1,167 @@ +using Python.Runtime; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Python +{ + public class Hanlp2 + { + public readonly PythonCommand python; + + public Hanlp2(PythonCommand python) + { + this.python = python; + string file = python.ApplicationService.Configuration["Python:PythonFile"]!; + + if (!File.Exists(file)) return; + + string init = File.ReadAllText(file, Encoding.UTF8); + + using (Py.GIL()) + { + python.Exec(init); + } + } + + public List GetHanlpNer(string text) + { + try + { + //必须定义方法的方式使用 + using (Py.GIL()) + { + string json = python.GetValueExec($"processor.get_ner_json('{text}')"); + // 反序列化 + if (json == "[]") return null; + return JsonSerializer.Deserialize>(json); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + return null; + } + + public List> GetHanlpSrl(string text) + { + try + { + //必须定义方法的方式使用 + using (Py.GIL()) + { + string json = python.GetValueExec($"processor.get_srl_json('{text}')"); + var options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true // 忽略属性名大小写 + }; + // 反序列化 + return JsonSerializer.Deserialize>>(json, options); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + return null; + } + + public string GetDepRoot(string text) + { + try + { + //必须定义方法的方式使用 + using (Py.GIL()) + { + string json = python.GetValueExec($"processor.get_root('{text}')"); + var options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true // 忽略属性名大小写 + }; + // 反序列化 + return json; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + return null; + } + + + + public List GetHanlpCon(string text) + { + if (string.IsNullOrEmpty(text) || text.Length < 3) return null; + + try + { + //必须定义方法的方式使用 + using (Py.GIL()) + { + string json = python.GetValueExec($"processor.get_con_json('{text}')"); + + if (json == "[]") return null; + + return HanlpConstituencyNode.FromJsonString(json); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + return null; + } + + public List GetTokFine(string text) + { + try + { + //必须定义方法的方式使用 + using (Py.GIL()) + { + string json = python.GetValueExec($"processor.get_tok_fine('{text}')"); + // 反序列化 + if (json == "[]") return null; + return JsonSerializer.Deserialize>(json); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + return null; + } + + + public List GetTokCoarse(string text) + { + try + { + //必须定义方法的方式使用 + using (Py.GIL()) + { + string json = python.GetValueExec($"processor.get_tok_coarse('{text}')"); + // 反序列化 + if (json == "[]") return null; + return JsonSerializer.Deserialize>(json); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + return null; + } + + public string Get(string arg) + { + return python.GetValueExec(arg); + } + } +} diff --git a/Python/NamedEntity.cs b/Python/NamedEntity.cs new file mode 100644 index 0000000..e63b7d7 --- /dev/null +++ b/Python/NamedEntity.cs @@ -0,0 +1,954 @@ +using Microsoft.Extensions.FileSystemGlobbing; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Python +{ + public class SentenceInfo + { + public List Subjects { get; set; } = new(); + public List Predicates { get; set; } = new(); + public List Objects { get; set; } = new(); + public List PersonRoles { get; set; } = new(); + } + + public class NamedEntity + { + public string Text { get; set; } // 實體文本 (如 "王小明") + public string Type { get; set; } // 實體類型 (如 "PERSON") + public int Start { get; set; } // 起始位置 (索引) + public int End { get; set; } // 結束位置 (索引) + + public override string ToString() => $"{Text} ({Type}) [{Start}-{End}]"; + } + + public class MeaningRepresentationParsingEntity + { + public string Text { get; set; } + public string Type { get; set; } + public int Start { get; set; } + public int End { get; set; } + } + + public class HanlpConstituencyNode + { + /// + /// 节点ID + /// + [JsonProperty("ItemId")] + public int ItemId { get; set; } + + /// + /// 父节点ID + /// + [JsonProperty("FatherId")] + public int FatherId { get; set; } + + /// + /// 节点标签(如TOP、IP、NP、VP等) + /// + [JsonProperty("Label")] + public string Label { get; set; } + + /// + /// 节点层级 + /// + [JsonProperty("Level")] + public int Level { get; set; } + + /// + /// 子节点数量 + /// + [JsonProperty("Children")] + public int Children { get; set; } + + /// + /// 从JSON字符串解析节点列表 + /// + /// Python HanLP返回的JSON字符串 + /// 节点列表 + public static List FromJsonString(string jsonString) + { + if (string.IsNullOrEmpty(jsonString)) + return new List(); + + try + { + return JsonConvert.DeserializeObject>(jsonString); + } + catch (Exception ex) + { + Console.WriteLine($"JSON解析错误: {ex.Message}"); + return new List(); + } + } + + /// + /// 将节点列表转换为JSON字符串 + /// + /// 节点列表 + /// JSON字符串 + public static string ToJsonString(List nodes) + { + if (nodes == null) + return "[]"; + + return JsonConvert.SerializeObject(nodes, + Formatting.Indented, + new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.Default }); + } + + /// + /// 重写ToString方法,返回节点的详细信息 + /// + /// 节点信息字符串 + public override string ToString() + { + return $"ItemId: {ItemId}, FatherId: {FatherId}, Label: {Label}, Level: {Level}, Children: {Children}"; + } + } + + /// + /// HanLP处理结果工具类 + /// 用于与Python HanLP服务交互 + /// + public class HanlpResultHelper + { + /// + /// 解析句法分析结果 + /// + /// Python程序输出的JSON字符串 + /// 节点列表 + public static List ParseConstituencyResult(string pythonOutput) + { + return HanlpConstituencyNode.FromJsonString(pythonOutput); + } + + /// + /// 根据父节点ID查找子节点 + /// + /// 所有节点 + /// 父节点ID + /// 子节点列表 + public static List GetChildrenNodes(List nodes, int fatherId) + { + return nodes?.FindAll(node => node.FatherId == fatherId) ?? new List(); + } + + /// + /// 根据ID查找节点 + /// + /// 所有节点 + /// 节点ID + /// 节点对象,如果未找到则返回null + public static HanlpConstituencyNode GetNodeById(List nodes, int itemId) + { + return nodes?.Find(node => node.ItemId == itemId); + } + + /// + /// 根据Label查找节点 + /// + /// 所有节点 + /// 节点ID + /// 节点对象,如果未找到则返回null + public static HanlpConstituencyNode[] GetNodeByLabel(List nodes, string label) + { + return nodes?.Where(node => node.Label == label).ToArray(); + } + + /// + /// 根据ID查找父节点 + /// + /// 所有节点 + /// 节点ID + /// 节点对象,如果未找到则返回null + public static HanlpConstituencyNode GetNodeFatherById(List nodes, int itemId) + { + HanlpConstituencyNode self = GetNodeById(nodes, itemId); + return nodes?.Find(node => node.ItemId == self.FatherId); + } + + /// + /// 根据ID查找等于label父节点 + /// + /// 所有节点 + /// 节点ID + /// 节点对象,如果未找到则返回null + public static HanlpConstituencyNode GetNodeTopLabelById(List nodes, int itemId, string label) + { + HanlpConstituencyNode nd = GetNodeFatherById(nodes, itemId); + + if (label == nd.Label && nd.Children > 0) return nd; + + while (nd.FatherId > 0) + { + return GetNodeTopLabelById(nodes, nd.ItemId, label); + } + + return null; + } + + /// + /// 根据ID查找等于label子节点 + /// + /// 所有节点 + /// 节点ID + /// 节点对象,如果未找到则返回null + public static string GetNodeBottomLabelById(List nodes, int itemId, string label) + { + HanlpConstituencyNode[] nds = nodes?.Where(node => node.FatherId == itemId && node.Label == label && node.Children > 0).ToArray(); + if (nds == null || nds.Length == 0) return null; + HanlpConstituencyNode father; + List list = new List(); + foreach (HanlpConstituencyNode nd in nds) + { + List sons = GetChildrenNodes(nodes, nd.ItemId); + if (sons == null || sons.Count() == 0) continue; + return string.Join("", sons.Select(x => x.Label).ToArray()); + } + + return null; + } + + /// + /// 根据ID查找所有兄弟节点(同父且不同ID的节点) + /// + /// 所有节点列表 + /// 目标节点ID + /// 兄弟节点列表,如果无兄弟节点/节点不存在则返回空列表 + public static List GetNodeBrothersById(List nodes, int itemId) + { + // 空值保护:如果节点列表为空,直接返回空列表 + if (nodes == null || nodes.Count == 0) + { + return new List(); + } + + // 第一步:找到目标节点(根据ID) + var targetNode = nodes.Find(node => node.ItemId == itemId); + // 如果目标节点不存在,返回空列表 + if (targetNode == null) + { + return new List(); + } + + // 第二步:获取目标节点的父ID,筛选所有同父且ID不等于目标节点的节点 + int fatherId = targetNode.FatherId; + var brotherNodes = nodes.FindAll(node => + node.FatherId == fatherId && // 同父节点 + node.ItemId != itemId // 排除自身 + ); + + // 返回兄弟节点列表(无兄弟则返回空列表) + return brotherNodes ?? new List(); + } + } +} + + +/* +import os +import json +import logging + +# 配置日志 +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +try: + import hanlp + from hanlp.components.mtl.multi_task_learning import MultiTaskLearning + from hanlp.components.mtl.tasks.tok.tag_tok import TaggingTokenization + from hanlp.components.mtl.tasks.ner.tag_ner import TaggingNamedEntityRecognition + + # 尝试导入tqdm,如果不存在则使用替代 + try: + from tqdm import tqdm + HAS_TQDM = True + except ImportError: + logger.warning("tqdm未安装,将不显示进度条") + HAS_TQDM = False + + # 创建一个简单的tqdm替代 + class tqdm: + def __init__(self, iterable, desc=None): + self.iterable = iterable + self.desc = desc + def __iter__(self): + return iter(self.iterable) +except ImportError as e: + logger.error(f"导入HanLP失败: {e}") + +class HanLPProcessor: + """HanLP自然语言处理工具类""" + + def __init__(self, + hanlp_home='D:/Python38/hanlp/', + hf_home='D:/Python38/models/', + hf_endpoint='https://hf-mirror.com', + hanlp_url='https://ftp.hankcs.com/hanlp/', + surnames_path='D:/Python38/hanlp/dictionary/surnames.txt', + titles_path='D:/Python38/hanlp/dictionary/titles.txt', + words_path='D:/Python38/hanlp/dictionary/words.txt', + salutations_path='D:/Python38/hanlp/dictionary/salutations.txt'): + # 初始化ID计数器和父ID跟踪 + self.item_id_counter = 1 + self.current_father_id = 0 + """ + 初始化HanLP处理器 + + 参数: + hanlp_home: HanLP资源缓存目录 + hf_home: HuggingFace模型缓存目录 + hf_endpoint: HuggingFace下载端点 + hanlp_url: HanLP下载URL + surnames_path: 姓氏词典路径 + titles_path: 头衔词典路径 + words_path: 专有名词词典路径 + salutations_path: 称呼词典路径 + """ + # 存储配置信息 + self.hanlp_home = hanlp_home + self.hf_home = hf_home + self.hf_endpoint = hf_endpoint + self.hanlp_url = hanlp_url + self.surnames_path = surnames_path + self.titles_path = titles_path + self.words_path = words_path + self.salutations_path = salutations_path + + # 初始化组件 + self.mtl = None + self.tok = None + self.ner = None + + # 设置环境变量 + self._set_environment_variables() + + # 加载模型和词典 + self._load_model() + self._load_dictionaries() + + def _set_environment_variables(self): + """设置必要的环境变量""" + try: + os.environ['HANLP_HOME'] = self.hanlp_home + os.environ['HF_HOME'] = self.hf_home + os.environ['HF_ENDPOINT'] = self.hf_endpoint + os.environ['HANLP_URL'] = self.hanlp_url + logger.info("环境变量设置成功") + except Exception as e: + logger.error(f"设置环境变量失败: {e}") + + def _load_dict_from_file(self, file_path, default_tag='S-PERSON'): + """从文件加载词典""" + dict_tags = {} + try: + with open(file_path, 'r', encoding='utf-8') as f: + for word in f: + word = word.strip() + if word: # 跳过空行 + dict_tags[(word,)] = (default_tag,) # 保持元组形式 + except Exception as e: + print(f"加载词典文件{file_path}失败: {e}") + return dict_tags + + def _load_names(self, surnames_path, titles_path): + """加载姓氏和头衔,生成姓名组合""" + try: + with open(surnames_path, 'r', encoding='utf-8') as f: + surnames = [line.strip() for line in f if line.strip()] + + with open(titles_path, 'r', encoding='utf-8') as f: + titles = [line.strip() for line in f if line.strip()] + + # 使用生成器表达式(节省内存) + full_names = (f'{surname}{title}' for surname in surnames for title in titles) + return full_names + except Exception as e: + print(f"加载姓名文件失败: {e}") + return [] + + def _load_model(self): + """加载HanLP模型""" + try: + # CLOSE是自然语义标注的闭源语料库,BASE是中号模型,ZH中文 + logger.info("开始加载HanLP模型...") + self.mtl = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH) + self.tok = self.mtl['tok/coarse'] + self.tok.dict_force = self.tok.dict_combine = None + self.ner = self.mtl['ner/msra'] + logger.info("模型加载成功") + except Exception as e: + logger.error(f"加载模型失败: {e}") + self.mtl = None + self.tok = None + self.ner = None + + def _load_dictionaries(self): + """加载各种词典""" + try: + # 加载称呼词典 + self.ner.dict_tags = self._load_dict_from_file(self.salutations_path) + + # 读取专有名词词典 + with open(self.words_path, 'r', encoding='utf-8') as f: + names = [line.strip() for line in f if line.strip()] + + # 生成所有姓名组合 + full_names = self._load_names(self.surnames_path, self.titles_path) + + # 构建强制分词词典(使用进度条) + dict_force = {} + for name in tqdm(full_names, desc='读取人名词典'): + dict_force[name] = [name] + + for name in names: + dict_force[name] = [name] + + self.tok.dict_force = dict_force + except Exception as e: + print(f"加载词典失败: {e}") + + def get_ner_json(self, text): + """识别文本中的实体并返回JSON格式""" + if not text or not isinstance(text, str): + logger.warning("无效的输入文本") + return json.dumps([]) + + try: + if not self.mtl: + raise RuntimeError("模型未加载") + + result = self.mtl(text, tasks=['tok/coarse', 'ner/msra'], skip_tasks=['tok/fine']) + + # 检查结果格式 + if 'ner/msra' not in result or not isinstance(result['ner/msra'], (list, tuple)): + logger.warning("模型返回结果格式异常") + return json.dumps([]) + + json_data = [] + for item in result['ner/msra']: + # 确保item是正确的格式 + if isinstance(item, (list, tuple)) and len(item) >= 4: + json_data.append({ + 'Text': str(item[0]), + 'Type': str(item[1]), + 'Start': int(item[2]), + 'End': int(item[3]) + }) + + return json.dumps(json_data, ensure_ascii=False) + except Exception as e: + logger.error(f"实体识别失败: {e}") + return json.dumps([]) + + def get_srl_json(self, text): + """识别文本中的人物角色并返回JSON格式""" + if not text or not isinstance(text, str): + logger.warning("无效的输入文本") + return json.dumps([]) + + try: + if not self.mtl: + raise RuntimeError("模型未加载") + + results = self.mtl(text, tasks=['tok/coarse', 'srl'], skip_tasks=['tok/fine']) + result = [] + + # 检查结果格式 + if 'srl' not in results: + logger.warning("模型返回结果中未找到SRL数据") + return json.dumps([]) + + data = results['srl'] + if not data: + return json.dumps(result) + + for sentence in data: + if not isinstance(sentence, (list, tuple)): + continue + + sentence_data = [] + for item in sentence: + if not isinstance(item, (list, tuple)): + continue + + # 确保至少有2个元素 + if len(item) < 2: + continue + + entry = { + 'Text': str(item[0]), + 'Type': str(item[1]), + 'Start': int(item[2]) if len(item) > 2 else -1, + 'End': int(item[3]) if len(item) > 3 else -1 + } + sentence_data.append(entry) + + if sentence_data: # 只添加非空的句子数据 + result.append(sentence_data) + + return json.dumps(result, ensure_ascii=False, indent=2) + except Exception as e: + logger.error(f"人物角色识别失败: {e}") + return json.dumps([]) + + def get_con(self, text): + """解析文本的句法结构并返回结果""" + if not text or not isinstance(text, str): + logger.warning("无效的输入文本") + return None + + try: + if not self.mtl: + raise RuntimeError("模型未加载") + + logger.info("开始句法分析...") + result = self.mtl(text, tasks=['con']) + logger.info("句法分析完成") + return result + except Exception as e: + logger.error(f"句法分析失败: {e}") + return None + + def get_all(self,text): + result = self.mtl(text) + return result; + + def get_con_json(self, text): + """解析文本的句法结构并返回JSON格式字符串,便于C#对象处理""" + # 重置ID计数器和父ID,确保每次调用都从1开始 + self.item_id_counter = 0 + self.current_father_id = 0 + + # 初始化JSON数组用于存储所有解析结果元素 + result_array = [] + # 保存结果数组的引用,供packLabel方法使用 + self.result_array = result_array + + if not text or not isinstance(text, str): + logger.warning("无效的输入文本") + return json.dumps([]) + + if not self.mtl: + raise RuntimeError("模型未加载") + + logger.info("开始句法分析...") + results = self.mtl(text, tasks=['con']) + logger.info("句法分析完成") + + # 检查结果格式 + if 'con' not in results: + logger.warning("模型返回结果中未找到CON数据") + return json.dumps([]) + + #从results中截取"con": [截取字符串]} + # 将results转为字符串并提取con字段值 + results_str = str(results) + # logger.info(results_str) + # 只取出top的内容 + new_results = self.get_con_top('"con": [',results_str) + level=0 + + self.item_id_counter += 1 + + # 调用pack_childen处理所有节点,所有生成的元素将通过packLabel方法添加到result_array + try: + self.pack_childen(new_results, level) + except Exception as e: + logger.warning(f"pack_childen处理时出错: {e}") + + # 清理引用,避免内存泄漏 + delattr(self, 'result_array') + + # 将结果数组转换为JSON字符串返回,便于C#交互 + return json.dumps(result_array, ensure_ascii=False) + + def pack_childen(self, text, level, father_id=None): + # 如果没有提供father_id,则使用当前类的current_father_id + if father_id is None: + father_id = self.current_father_id + + childen_json = [] + json_temp = self.split(text, ',') + # 去除前后的[] + childen = self.substring_before_after_one(json_temp[1]) + # 分隔元素 + childens = self.split(childen, ',') + label = json_temp[0] + + if json_temp[0] == '_': + # "_", ["二愣子"] - 提取列表中的值 + # 当标签为"_"时,提取childen中的值并直接返回值字符串 + label = self.substring_before_after_one(childen) + # 保存当前的current_father_id + current_father = self.current_father_id + # 设置当前元素的父ID + self.current_father_id = father_id + # 创建节点 + top_json = self.packLabel(label, level, 0) + # 恢复原来的current_father_id + self.current_father_id = current_father + # logger.info(top_json) + return + + # 保存当前的current_father_id + current_father = self.current_father_id + # 设置当前元素的父ID + self.current_father_id = father_id + # 创建当前节点 + top_json = self.packLabel(label, level, len(childens)) + # 获取当前节点的ID作为子节点的父ID + current_node_id = top_json['ItemId'] + # 恢复原来的current_father_id + self.current_father_id = current_father + + # logger.info(top_json) + + # 递归处理子节点,传递当前节点的ID作为父ID + for i, item in enumerate(childens): + childen_temp = self.substring_before_after_one(item) + childen_json.append(self.pack_childen(childen_temp, level + 1, current_node_id)) + + + def get_task(self, text, task): + ''' + 执行指定的任务并跳过fine分词 + + 参数: + text: 输入文本 + task: 要执行的任务名称 + + 返回: + 任务执行结果 + ''' + if not text or not isinstance(text, str): + logger.warning('无效的输入文本') + return None + + try: + if not self.mtl: + raise RuntimeError('模型未加载') + + # 跳过tok/fine任务 + result = self.mtl(text, tasks=[task]) + return result + except Exception as e: + logger.error(f'执行任务{task}失败: {e}') + return None + + def get_con_top(self,from_text,text): + if '"con": [' in text: + start = text.find(from_text) + len(from_text) + # 寻找对应的结束括号 + end = start + bracket_count = 1 + while end < len(text) and bracket_count > 0: + if text[end] == '[': + bracket_count += 1 + elif text[end] == ']': + bracket_count -= 1 + end += 1 + new_results = text[start:end-1] # -1 是为了去掉最后的']' + else: + new_results = '' + return new_results + + def substring_before_after_one(self, text): + if not text or not isinstance(text, str): + return text + if len(text) < 2: + return text + return text[1:-1] + + def split(self, text, char): + if not text: + return [] + + result = [] + current = [] + in_quotes = False # 是否在引号内 + bracket_level = 0 # 括号嵌套级别 + + i = 0 + while i < len(text): + c = text[i] + + # 处理引号 + if c == '"': + in_quotes = not in_quotes + current.append(c) + + # 处理括号 + elif c == '[' and not in_quotes: + bracket_level += 1 + current.append(c) + elif c == ']' and not in_quotes: + if bracket_level > 0: + bracket_level -= 1 + current.append(c) + + # 遇到分隔符且不在括号内和引号内 + elif c == char and bracket_level == 0 and not in_quotes: + # 添加当前部分到结果 + part = ''.join(current).strip() + # 清理引号(如果有) + if part.startswith('"') and part.endswith('"'): + part = part[1:-1] + result.append(part) + current = [] + + # 处理转义字符 + elif c == '\\' and i + 1 < len(text): + current.append(c) + current.append(text[i + 1]) + i += 1 + + else: + current.append(c) + + i += 1 + + # 处理最后一个元素 + if current: + part = ''.join(current).strip() + # 清理引号(如果有) + if part.startswith('"') and part.endswith('"'): + part = part[1:-1] + result.append(part) + + return result + + def packLabel(self, label, level, children): + # 保存当前ID作为返回值 + current_id = self.item_id_counter + + # 创建包含ID和父ID的字典 + result = { + "ItemId": current_id, + "FatherId": self.current_father_id, + "Label": label, + "Level": level, + "Children": children + } + + # 将生成的元素添加到result_array(如果存在) + if hasattr(self, 'result_array'): + self.result_array.append(result) + + # 更新计数器 + self.item_id_counter += 1 + + return result + + def extract_underscore_value(self, text): + """ + 从"_", ["值"]格式的文本中提取值,并直接返回字符串值 + + Args: + text: 格式为"_", ["值"]的字符串 + + Returns: + 提取的字符串值 + """ + # 分割文本以获取值部分 + parts = self.split(text, ',') + if len(parts) < 2: + return "" + + # 获取第二个部分(包含值的列表) + value_part = parts[1] + # 去除前后的[]和可能的引号 + value = self.substring_before_after_one(value_part).strip('"') + + # 直接返回提取的值 + return value + +processor=HanLPProcessor() + +# 测试split函数 +def test_split_function(): + # 测试用例1: 简单的逗号分隔 + text1 = ' "TOP",[["IP", [["NP", [["_", ["二愣子"]]]], ["VP", [["VP", [["_", ["姓"]], ["NP", [["_", ["韩"]]]]]], ["VP", [["_", ["名"]], ["NP", [["_", ["立"]]]]]]]], ["_", ["。"]]]]]' + result1 = processor.split(text1, ',') + print("测试用例1结果:") + for i, item in enumerate(result1): + print(f" {i}: {item}") + + text1='二愣子姓韩名立。' + print(processor.get_con_json(text1)) + # 测试用例2: 括号内包含逗号 + # text2 = '"NP",[["NN",["_", "张三"]],["NN",["_", "李四"]]]' + # result2 = processor.split(text2, ',') + # print("\n测试用例2结果:") + +def test_extract_underscore_value(): + """ + 测试新添加的extract_underscore_value函数 + """ + print("\n测试extract_underscore_value函数:") + + # 测试用例1: 基本格式 + test_text1 = '"_", ["二愣子"]' + result1 = processor.extract_underscore_value(test_text1) + print(f"输入: {test_text1}") + print(f"输出: {result1}") + + # 测试用例2: 其他值 + test_text2 = '"_", ["张三"]' + result2 = processor.extract_underscore_value(test_text2) + print(f"\n输入: {test_text2}") + print(f"输出: {result2}") + + # 测试用例3: 空值情况 + test_text3 = '"_", []' + result3 = processor.extract_underscore_value(test_text3) + print(f"\n输入: {test_text3}") + print(f"输出: {result3}") + +# 测试修复后的pack_childen方法对"_", ["二愣子"]格式的处理 +def test_pack_childen_with_underscore(): + """ + 测试pack_childen方法对"_", ["值"]格式的处理 + """ + print("\n测试pack_childen方法对'_', ['二愣子']格式的处理:") + # 测试用例:直接调用pack_childen处理"_", ["二愣子"]格式 + test_input = '"_", ["二愣子"]' + print(f"输入: {test_input}") + try: + # 调用pack_childen方法,使用level=0 + result = processor.pack_childen(test_input, 0) + # 由于pack_childen在处理"_"标签时会直接返回,我们需要查看logger输出 + print("测试完成,请检查日志输出") + except Exception as e: + print(f"测试出错: {e}") + # for i, item in enumerate(result2): + # print(f" {i}: {item}") + +# 如果直接运行此文件,则执行测试 +def test_id_generation(): + """ + 测试ItemId和FatherId的生成逻辑 + """ + print("开始测试ID生成...") + # 创建处理器实例 + processor = HanLPProcessor() + + # 测试基本的packLabel方法 + print("\n测试基本的packLabel方法:") + result1 = processor.packLabel("TOP", 0, 1) + print(result1) + + # 测试生成第二个节点,应该有正确的父子关系 + print("\n测试生成第二个节点:") + # 对于第二个节点,我们手动设置它的父ID为第一个节点的ID + processor.current_father_id = result1['ItemId'] + result2 = processor.packLabel("TOP", 0, 1) + print(result2) + + # 测试pack_childen方法 + print("\n测试pack_childen方法:") + # 重置处理器的ID计数器 + processor.item_id_counter = 1 + processor.current_father_id = 0 + + # 使用一个简单的测试字符串来模拟解析结果,确保格式正确 + test_input = "TOP, [IP, [NP, [NN, 你]], [VP, [VV, 好]]]" + try: + processor.pack_childen(test_input, 0) + print("pack_childen测试成功") + except Exception as e: + print(f"pack_childen测试失败: {e}") + # 为了演示,我们可以直接测试packLabel的组合 + print("\n直接测试ID和父子关系:") + processor.item_id_counter = 1 + processor.current_father_id = 0 + + # 模拟用户要求的输出格式 + result1 = processor.packLabel("TOP", 0, 1) + print(f"{{'ItemId':{result1['ItemId']},'FatherId':{result1['FatherId']},'Label': '{result1['Label']}', 'Level': {result1['Level']}, 'Children': {result1['Children']}}}") + + # 第二个节点的父ID是第一个节点的ID + processor.current_father_id = result1['ItemId'] + result2 = processor.packLabel("TOP", 0, 1) + print(f"{{'ItemId':{result2['ItemId']},'FatherId':{result2['FatherId']},'Label': '{result2['Label']}', 'Level': {result2['Level']}, 'Children': {result2['Children']}}}") + + print("\nID生成测试完成") + +def test_con_json(): + """ + 测试get_con_json方法返回的JSON格式字符串 + """ + print("\n开始测试get_con_json方法...") + processor = HanLPProcessor() + + # 测试空输入 + empty_result = processor.get_con_json("") + print(f"空输入测试: {empty_result}") + print(f"空输入结果类型: {type(empty_result)}") + # 验证可以解析为空数组 + try: + parsed_empty = json.loads(empty_result) + print(f"空输入解析结果: {parsed_empty}, 类型: {type(parsed_empty)}") + except json.JSONDecodeError as e: + print(f"空输入JSON解析失败: {e}") + + # 测试None输入 + none_result = processor.get_con_json(None) + print(f"None输入测试: {none_result}") + print(f"None输入结果类型: {type(none_result)}") + # 验证可以解析为空数组 + try: + parsed_none = json.loads(none_result) + print(f"None输入解析结果: {parsed_none}, 类型: {type(parsed_none)}") + except json.JSONDecodeError as e: + print(f"None输入JSON解析失败: {e}") + + # 尝试测试有效输入(注意:由于可能没有加载模型,这里可能会抛出异常) + try: + # 尝试简单的中文文本 + text = "二愣子姓韩名立。" + print(f"测试有效输入: {text}") + result = processor.get_con_json(text) + print(f"返回结果类型: {type(result)}") + print(f"返回结果字符串长度: {len(result)}") + + # 验证返回的是字符串 + assert isinstance(result, str), "返回结果应该是字符串类型" + print("✓ 验证通过:返回结果是字符串类型") + + # 尝试解析JSON字符串 + try: + parsed_result = json.loads(result) + print(f"✓ JSON解析成功,解析后类型: {type(parsed_result)}") + print(f"解析后数组长度: {len(parsed_result)}") + + # 如果解析成功且有元素,显示部分内容 + if parsed_result: + print(f"解析后第一个元素: {parsed_result[0]}") + if len(parsed_result) > 1: + print(f"解析后第二个元素: {parsed_result[1]}") + except json.JSONDecodeError as e: + print(f"✗ JSON解析失败: {e}") + + print(f"完整返回结果: {result}") + except Exception as e: + print(f"有效输入测试出错(可能是模型未加载): {e}") + + print("get_con_json方法测试完成") + +if __name__ == "__main__": + # test_split_function() + # test_id_generation() + # test_extract_underscore_value() + # test_pack_childen_with_underscore() + test_con_json() + # processor=HanLPProcessor() + +*/ \ No newline at end of file diff --git a/Python/PythonCommand.cs b/Python/PythonCommand.cs new file mode 100644 index 0000000..ac1f3b9 --- /dev/null +++ b/Python/PythonCommand.cs @@ -0,0 +1,88 @@ +using CloudBuilder.Core.DatabaseAccessor.Entity; +using Python.Runtime; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Python +{ + public class PythonCommand + { + private bool _disposed = false; // 释放标记 + public dynamic PythonCreateScope { get; set; } + public IApplicationService ApplicationService; + public PythonCommand(IApplicationService applicationService) + { + ApplicationService = applicationService; + + Runtime.PythonDLL = applicationService.Configuration["Python:PythonCommand"]; + PythonEngine.PythonHome = Path.GetDirectoryName(Runtime.PythonDLL); + PythonEngine.Initialize(); + + PythonCreateScope = Py.CreateScope(); + } + + public void Exec(string arg) + { + using (Py.GIL()) + { + PythonCreateScope.Exec(arg);//"from pyhanlp import HanLP" + } + } + + public string GetValueExec(string arg) + { + using (Py.GIL()) + { + PythonCreateScope.Exec(string.Format("s_value={0}", arg)); + + var value = PythonCreateScope.Eval("s_value"); + + return value.ToString(); + } + } + + public string[] GetValuesExec(string arg) + { + using (Py.GIL()) + { + PythonCreateScope.Exec(string.Format("s_list={0}", arg)); + + var value = PythonCreateScope.Eval("s_list"); + + string[] st = value.As(); + + return st; + } + } + + // 核心:释放 Python.NET 资源 + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); // 阻止析构函数重复执行 + } + + protected virtual void Dispose(bool disposing) + { + if (_disposed) return; + + // 1. 释放 Python 作用域 + if (PythonCreateScope != null) + { + PythonCreateScope.Dispose(); + PythonCreateScope = null; + } + + // 2. 关闭 Python 运行时(关键!) + if (PythonEngine.IsInitialized) + { + PythonEngine.Shutdown(); // 销毁 Python 解释器 + } + + _disposed = true; + } + } +} diff --git a/Task/AI/Character.md b/Task/AI/Character.md new file mode 100644 index 0000000..4730313 --- /dev/null +++ b/Task/AI/Character.md @@ -0,0 +1,25 @@ + static void Main() + { + // 1. 生成 U+4E00 ~ U+9FA5 完整汉字合集 + List cjkBasicChars = new List(); + for (int code = 0x4E00; code <= 0x9FA5; code++) + { + cjkBasicChars.Add((char)code); + } + + // 验证数量(应输出 20976) + Console.WriteLine($"基础区汉字总数:{cjkBasicChars.Count}"); + + // 2. 输出前 10 个汉字(验证生成结果) + Console.WriteLine("前 10 个汉字:"); + for (int i = 0; i < 10; i++) + { + Console.Write(cjkBasicChars[i] + " "); + } + // 输出:一 丁 丂 七 丄 丅 丆 万 丈 三 + + // 3. 导出为文本文件(UTF-8 编码,便于查看/使用) + string allChars = new string(cjkBasicChars.ToArray()); + File.WriteAllText("CJK_Basic_Chars.txt", allChars, System.Text.Encoding.UTF8); + Console.WriteLine("\n已导出完整汉字集到 CJK_Basic_Chars.txt"); + } \ No newline at end of file diff --git a/Task/AI/CharacterInsertTask.cs b/Task/AI/CharacterInsertTask.cs new file mode 100644 index 0000000..fefac25 --- /dev/null +++ b/Task/AI/CharacterInsertTask.cs @@ -0,0 +1,65 @@ +using CloudBuilder.AI.Service; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; +using static System.Runtime.InteropServices.JavaScript.JSType; + +namespace CloudBuilder.Topshelf.Task.AI +{ + //task:CharacterInsertTask encoding:GB2312 file_path:D:\NET8\AI\Novel.txt + public class CharacterInsertTask : IScheduleTask + { + private readonly IApplicationService service; + + public CharacterInsertTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + IAiCharacterService aiCharacterService = service.ServiceProvider.GetService(); + + string encoding = "utf-8"; + + if (bodyDict.ContainsKey("encoding")) + encoding = bodyDict["encoding"]; + else + Console.WriteLine("文件字符集"+ encoding); + + string fileName = null; + if (bodyDict.ContainsKey("encoding")) + fileName = bodyDict["file_path"]; + else + Console.WriteLine("文件路径不存在"); + + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); + + string content = File.ReadAllText(fileName, Encoding.GetEncoding(encoding)); + + var transactionOptions = new TransactionOptions + { + IsolationLevel = IsolationLevel.ReadCommitted, + Timeout = TimeSpan.FromSeconds(60 * 10) + }; + + using (TransactionScope _transactionScope = new TransactionScope( + TransactionScopeOption.Required, + transactionOptions, + TransactionScopeAsyncFlowOption.Enabled)) + { + aiCharacterService.Insert(content); + + _transactionScope.Complete(); + } + + + } + } +} diff --git a/Task/AI/CharacterTtsTask.cs b/Task/AI/CharacterTtsTask.cs new file mode 100644 index 0000000..5b12b0f --- /dev/null +++ b/Task/AI/CharacterTtsTask.cs @@ -0,0 +1,86 @@ +using CloudBuilder.AI.Entity; +using CloudBuilder.AI.Service; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using EdgeTtsSharp; +using EdgeTtsSharp.NAudio; +using EdgeTtsSharp.Structures; +using Microsoft.EntityFrameworkCore.Query.Internal; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Task.AI +{ + //task:CharacterTtsTask save_path:D:\NET8\CloudBuilder.Topshelf\mp3 short_name:zh-CN-XiaoxiaoNeural + public class CharacterTtsTask : IScheduleTask + { + private readonly IApplicationService service; + + public CharacterTtsTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + IAiCharacterService aiService = service.ServiceProvider.GetService(); + AiCharacterEntity[] aiCharacters = aiService.FindAll(); + string shortName = "zh-CN-XiaoxiaoNeural"; + string savePath = string.Empty; + if (bodyDict.ContainsKey("short_name")) + shortName = bodyDict["short_name"]; + + if (bodyDict.ContainsKey("save_path")) + savePath = bodyDict["save_path"]; + + int totalLines = aiCharacters.Length; + int processedLines = 0; // 已处理行数计数器 + int totalValidWords = 0; // 可选:统计有效词总数,用于进度详情 + + foreach (var c in aiCharacters) + { + try + { + processedLines++; + TtsAsync(shortName, savePath, c).GetAwaiter().GetResult(); + + UpdateProgress(processedLines, totalLines, totalValidWords); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + + } + } + + public async System.Threading.Tasks.Task TtsAsync(string shortName, string savePath, AiCharacterEntity aiCharacter) + { + savePath = Path.Combine(savePath, string.Format("{0}.mp3", aiCharacter.Content)); + + if (File.Exists(savePath)) return; + + var voice = await EdgeTts.GetVoice(shortName); + await voice.SaveAudioToFile(aiCharacter.Content, savePath); + } + + private static void UpdateProgress(int processed, int total, int validWords) + { + double progressPercent = (double)processed / total * 100; + int progressBarLength = 50; // 进度条总长度 + int filledLength = (int)(progressPercent / 100 * progressBarLength); + + // 构建进度条(如:[██████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░]) + string progressBar = "[" + new string('█', filledLength) + new string('░', progressBarLength - filledLength) + "]"; + + string progressInfo = $"{progressBar} {progressPercent:F2}% | 已处理:{processed}/{total} "; + Console.Write($"\r{progressInfo}"); + Console.Out.Flush(); + } + } +} diff --git a/Task/AI/ChineseNameExtractorTask.cs b/Task/AI/ChineseNameExtractorTask.cs new file mode 100644 index 0000000..41f01c5 --- /dev/null +++ b/Task/AI/ChineseNameExtractorTask.cs @@ -0,0 +1,102 @@ +using CloudBuilder.AI.Entity; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Topshelf.Python; +using CloudBuilder.Topshelf.Task.Novel.Process; +using static System.Net.Mime.MediaTypeNames; + +namespace CloudBuilder.Topshelf.Task +{ + //task:ChineseNameExtractorTask guid:B000006 + public class ChineseNameExtractorTask : IScheduleTask + { + private readonly IApplicationService service; + + public ChineseNameExtractorTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + if (!bodyDict.ContainsKey("guid")) return; + + string guid = bodyDict["guid"]; + + PythonCommand python = new PythonCommand(service); + try + { + Hanlp2 hanlp = new Hanlp2(python); + + IRepository repository = service.GetRepository>(); + + IRepository repositoryAiSentenceEntity = service.GetRepository>(); + + string depRoot; + + List ners; + + List> srls; + + List cons = null; + + SpeakerAnalysisHelper speakerFeatureLearner = new SpeakerAnalysisHelper(); + + AiSentenceDialogueViewEntity[] ents = repository.DetachedEntities.Where(x => x.BookGuid == guid).OrderBy(x => x.ChapterIndex).ThenBy(x => x.ParagraphIndex).ThenBy(x => x.DialogueIndc).ToArray(); + AiSentenceEntity aiSentenceEntity; + string person = null; + int paragraphIndex = 0; + + int totalLines = ents.Length; + int processedLines = 0; // 已处理行数计数器 + + foreach (var ent in ents) + { + processedLines++; + + if (!string.IsNullOrEmpty(person) && paragraphIndex == ent.ParagraphIndex) + { + paragraphIndex = 0; + aiSentenceEntity = repositoryAiSentenceEntity.Entities.Where(x => x.Guid == ent.Guid).FirstOrDefault(); + aiSentenceEntity.PersonName = person; + + repositoryAiSentenceEntity.UpdateNow(aiSentenceEntity); + continue; + } + + depRoot = hanlp.GetDepRoot(ent.Content); + ners = hanlp.GetHanlpNer(ent.Content); + srls = hanlp.GetHanlpSrl(ent.Content); + + person = speakerFeatureLearner.GetPerson(depRoot, ners, srls, cons); + paragraphIndex = ent.ParagraphIndex; + + UpdateProgress(processedLines, totalLines); + } + + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + finally + { + python.Dispose(); + } + } + + private static void UpdateProgress(int processed, int total) + { + double progressPercent = (double)processed / total * 100; + int progressBarLength = 50; // 进度条总长度 + int filledLength = (int)(progressPercent / 100 * progressBarLength); + + // 构建进度条(如:[██████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░]) + string progressBar = "[" + new string('█', filledLength) + new string('░', progressBarLength - filledLength) + "]"; + + string progressInfo = $"{progressBar} {progressPercent:F2}% | 已处理:{processed}/{total} "; + Console.Write($"\r{progressInfo}"); + Console.Out.Flush(); + } + } +} diff --git a/Task/AI/NovelCutWordTask.cs b/Task/AI/NovelCutWordTask.cs new file mode 100644 index 0000000..fb8a7ee --- /dev/null +++ b/Task/AI/NovelCutWordTask.cs @@ -0,0 +1,182 @@ +using CloudBuilder.AI.Entity; +using CloudBuilder.AI.Service; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Topshelf.Python; +using CloudBuilder.Topshelf.Utility; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Transactions; + +namespace CloudBuilder.Topshelf.Task.AI +{ + //task:NovelCutWordTask encoding:gb2312 file_path:D:\NET8\AI\12Novel.txt + public class NovelCutWordTask : IScheduleTask + { + private static readonly Regex _noNumberLetterRegex = new Regex(@"^(?!.*[0-9a-zA-Z]).+$", RegexOptions.Compiled); + private readonly Regex _hasPunctuationRegex = new Regex(@"[,。!?;:""''()()【】《》、·¥…—\+\-*/<>==~@#¥%&*()_+{}|:<>?`\-=[\];\\,./{}~!@#¥%……&*()——+|{}】‘;:”“’。,、?·。"'`|〃〔〕〈〉「」『』.〖〗[]{}]", + RegexOptions.Compiled); + + private readonly IApplicationService service; + + public NovelCutWordTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + PythonCommand python = new PythonCommand(service); + + Hanlp2 hanlp = new Hanlp2(python); + + IAiWordService aiService = service.ServiceProvider.GetService(); + AiWordEntity[] aiWords = aiService.FindAll(); + + string encoding = "utf-8"; + + if (bodyDict.ContainsKey("encoding")) + encoding = bodyDict["encoding"]; + else + Console.WriteLine("文件字符集" + encoding); + + string fileName = null; + if (bodyDict.ContainsKey("encoding")) + fileName = bodyDict["file_path"]; + else + Console.WriteLine("文件路径不存在"); + + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); + + string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding(encoding)); + + int totalLines = lines.Length; + int processedLines = 0; // 已处理行数计数器 + int totalValidWords = 0; // 可选:统计有效词总数,用于进度详情 + + Console.WriteLine($"开始处理文件:{fileName}"); + Console.WriteLine($"文件总行数:{totalLines}\n"); + + SegmenterHelper segmenterHelper = new SegmenterHelper(); + + IEnumerable words; + List contents = new List(); + + List existingContents = new List(); + + if (aiWords != null && aiWords.Length > 0) + existingContents = aiWords.Select(x => x.Content).ToList(); + + foreach (string line in lines) + { + processedLines++; // 已处理行数+1 + + if (string.IsNullOrEmpty(line.Trim())) + { + // 空行也计入进度,更新进度显示 + UpdateProgress(processedLines, totalLines, totalValidWords); + continue; + } + + if (string.IsNullOrEmpty(line.Trim())) continue; + + try + { + words = segmenterHelper.Cut(line, hanlp); + } + catch (Exception ex) + { + Console.Write($"\r{ex.Message}"); + continue; + } + + if (words == null || words.Count() == 0) continue; + + var validDatas = words + .Where(str => + !string.IsNullOrWhiteSpace(str) // 过滤空/空白字符串 + && str.Length > 1 // 过滤长度≤1的字符串 + && _noNumberLetterRegex.IsMatch(str) // 过滤含数字/字母的字符串 + && !str.StartsWith("第") // 过滤以“第”开头的字符串 + && !_hasPunctuationRegex.IsMatch(str) // 核心新增:过滤含任意标点的字符串 + ) + .Distinct(StringComparer.OrdinalIgnoreCase) // 数组内去重(不区分大小写) + .ToList(); + + + // 无有效数据则直接返回 + if (!validDatas.Any()) continue; + + var newDatas = validDatas + .Where(str => !existingContents.Contains(str)) + .ToList(); + + // 6. 批量插入(仅当有新数据时执行) + if (!newDatas.Any()) + { + UpdateProgress(processedLines, totalLines, totalValidWords); + continue; + } + + contents.AddRange(newDatas); + + contents = contents + .Where(str => !string.IsNullOrWhiteSpace(str)) // 过滤无效字符串 + .Distinct(StringComparer.OrdinalIgnoreCase) // 数组内去重(不区分大小写) + .ToList(); + + totalValidWords = contents.Count; // 更新有效词总数 + + // 3. 实时更新进度(每行处理完后刷新) + UpdateProgress(processedLines, totalLines, totalValidWords); + } + + var transactionOptions = new TransactionOptions + { + IsolationLevel = IsolationLevel.ReadCommitted, + Timeout = TimeSpan.FromSeconds(60 * 10) + }; + + try + { + python.Dispose(); + } + catch (Exception) + { + + } + + + if (contents.Count() == 0) return; + + using (TransactionScope _transactionScope = new TransactionScope( + TransactionScopeOption.Required, + transactionOptions, + TransactionScopeAsyncFlowOption.Enabled)) + { + aiService.Insert(contents.ToArray()); + + _transactionScope.Complete(); + } + } + + private static void UpdateProgress(int processed, int total, int validWords) + { + double progressPercent = (double)processed / total * 100; + int progressBarLength = 50; // 进度条总长度 + int filledLength = (int)(progressPercent / 100 * progressBarLength); + + // 构建进度条(如:[██████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░]) + string progressBar = "[" + new string('█', filledLength) + new string('░', progressBarLength - filledLength) + "]"; + + string progressInfo = $"{progressBar} {progressPercent:F2}% | 已处理:{processed}/{total} 行 | 有效词数:{validWords}"; + Console.Write($"\r{progressInfo}"); + Console.Out.Flush(); + } + } +} diff --git a/Task/AI/WordInsertTask.cs b/Task/AI/WordInsertTask.cs new file mode 100644 index 0000000..3efacf8 --- /dev/null +++ b/Task/AI/WordInsertTask.cs @@ -0,0 +1,64 @@ +using CloudBuilder.AI.Service; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; + +namespace CloudBuilder.Topshelf.Task.AI +{ + //task:WordInsertTask encoding:utf-8 file_path:D:\NET8\AI\Novel.txt + public class WordInsertTask : IScheduleTask + { + private readonly IApplicationService service; + + public WordInsertTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + IAiWordService aiService = service.ServiceProvider.GetService(); + + string encoding = "utf-8"; + + if (bodyDict.ContainsKey("encoding")) + encoding = bodyDict["encoding"]; + else + Console.WriteLine("文件字符集" + encoding); + + string fileName = null; + if (bodyDict.ContainsKey("encoding")) + fileName = bodyDict["file_path"]; + else + Console.WriteLine("文件路径不存在"); + + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); + + string[] contents = File.ReadAllLines(fileName, Encoding.GetEncoding(encoding)); + + var transactionOptions = new TransactionOptions + { + IsolationLevel = IsolationLevel.ReadCommitted, + Timeout = TimeSpan.FromSeconds(60 * 10) + }; + + using (TransactionScope _transactionScope = new TransactionScope( + TransactionScopeOption.Required, + transactionOptions, + TransactionScopeAsyncFlowOption.Enabled)) + { + aiService.Insert(contents); + + _transactionScope.Complete(); + } + + + } + } +} diff --git a/Task/Novel/ImportBookTask.cs b/Task/Novel/ImportBookTask.cs new file mode 100644 index 0000000..a4807e5 --- /dev/null +++ b/Task/Novel/ImportBookTask.cs @@ -0,0 +1,136 @@ +using CloudBuilder.AI.Data; +using CloudBuilder.AI.Entity; +using CloudBuilder.AI.Policy; +using CloudBuilder.AI.Service; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Topshelf.Task.Novel.Process; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; +using static System.Runtime.InteropServices.JavaScript.JSType; + +namespace CloudBuilder.Topshelf.Task.Novel +{ + //task:ImportBookTask encoding:GB2312 pattern: @"第([^】]+)章" input:D:\NET8\AI\仙侠\凡人修仙传_忘语.txt + //input可以是文件名:D:\NET8\AI\仙侠\书名_作者.txt + //input也可以是目錄名:D:\NET8\AI\仙侠,必须是小说类型为结尾 + //output輸出目錄 + //pattern可能自定義分割表達式 + public class ImportBookTask : IScheduleTask + { + private readonly IApplicationService service; + + public ImportBookTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + if (!bodyDict.ContainsKey("input") || string.IsNullOrEmpty(bodyDict["input"])) return; + + string input = bodyDict["input"]; + + string pattern = @"第([^】]+)章"; + if (bodyDict.ContainsKey("pattern") && !string.IsNullOrEmpty(bodyDict["pattern"])) + pattern = bodyDict["pattern"]; + + string encoding = "UTF-8"; + + if (bodyDict.ContainsKey("encoding") && !string.IsNullOrEmpty(bodyDict["encoding"])) encoding = bodyDict["encoding"]; + + List files = PackFiles(input); + + foreach (string file in files) + { + ProcessBook(file, encoding, pattern); + } + } + + public void ProcessBook(string file, string encoding, string pattern) + { + AiBookData data = new AiBookData(); + AiBookEntity book = new AiBookEntity(); + book.Guid = Guid.NewGuid().ToString(); + string[] temps = Path.GetFileNameWithoutExtension(file).Split('_'); + if (temps == null || temps.Length != 2) + { + Console.WriteLine("文件格式要求:书名_作者.txt"); + return; + } + + book.Title = temps[0]; + book.Author = temps[1]; + + temps = file.Split('\\'); + book.BookType = temps[temps.Length - 2]; + + //book.FilePath = file; + book.Status = BookStatusPolicy.SUBMIT;//S-待提交 + + ChapterSplitter chapterSplitter = new ChapterSplitter(); + data.AiBook = book; + + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); + + string context = File.ReadAllText(file, Encoding.GetEncoding(encoding)); + + List aiChapterEntities = chapterSplitter.SplitNovelIntoChapters(context, pattern); + + if (aiChapterEntities == null || aiChapterEntities.Count() == 0) return; + + aiChapterEntities.ToLookup(x => x.BookGuid = book.Guid); + aiChapterEntities.ToLookup(x => x.Status = ChapterStatusPolicy.PROCESS); + + data.AiChapters = aiChapterEntities.ToArray(); + + var transactionOptions = new TransactionOptions + { + IsolationLevel = IsolationLevel.ReadCommitted, + Timeout = TimeSpan.FromSeconds(60 * 10) + }; + + using (TransactionScope _transactionScope = new TransactionScope( + TransactionScopeOption.Required, + transactionOptions, + TransactionScopeAsyncFlowOption.Enabled)) + { + if (data.AiBook != null) + service.ServiceProvider.GetService().Insert(data); + + _transactionScope.Complete(); + } + } + + private List PackFiles(string input) + { + List files = new List(); + if (Path.HasExtension(input) && !string.IsNullOrEmpty(input)) + { + if (File.Exists(input)) + { + files.Add(input); + } + } + else if (!string.IsNullOrEmpty(input)) + { + if (Directory.Exists(input)) + { + string[] tempFiles = Directory.GetFiles(input); + if (tempFiles != null && tempFiles.Length > 0) + { + files.AddRange(tempFiles); + } + } + } + + return files; + } + + } +} diff --git a/Task/Novel/ParagraphSplitterTask.cs b/Task/Novel/ParagraphSplitterTask.cs new file mode 100644 index 0000000..68a9629 --- /dev/null +++ b/Task/Novel/ParagraphSplitterTask.cs @@ -0,0 +1,96 @@ +using CloudBuilder.AI.Data; +using CloudBuilder.AI.Entity; +using CloudBuilder.AI.Service; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Topshelf.Task.Novel.Process; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; +using static System.Runtime.InteropServices.JavaScript.JSType; + +namespace CloudBuilder.Topshelf.Task.Novel +{ + //task:ParagraphSplitterTask book_title:凡人修仙传 + public class ParagraphSplitterTask : IScheduleTask + { + private readonly IApplicationService service; + + public ParagraphSplitterTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + if (!bodyDict.ContainsKey("book_title") || string.IsNullOrEmpty(bodyDict["book_title"])) return; + + string title = bodyDict["book_title"]; + + AiChapterEntity[] aiChapters = service.ServiceProvider.GetService().FindByTitle(title); + + if (aiChapters == null || aiChapters.Length == 0) return; + + ParagraphSplitter paragraphSplitter = new ParagraphSplitter(); + List aiParagraphs = new List(); + List aiSentences = new List(); + AiBookData data; + foreach (var cpt in aiChapters) + { + data = paragraphSplitter.SplitChapterIntoParagraphs(cpt); + if (data.AiParagraphs == null || data.AiParagraphs.Count() == 0) continue; + + aiParagraphs.AddRange(data.AiParagraphs); + } + + if (aiParagraphs == null || aiParagraphs.Count() == 0) return; + + SentenceSplitter sentenceSplitter = new SentenceSplitter(); + AiSentenceEntity aiSentence; + + foreach (var ph in aiParagraphs) + { + if (ph.DialogueIndc != YesNoPolicy.YES) + { + aiSentence = new AiSentenceEntity(); + aiSentence.Guid = Guid.NewGuid().ToString(); + aiSentence.Content = ph.Content; + aiSentence.DialogueIndc = YesNoPolicy.NO; + aiSentence.SentenceIndex = 1; + aiSentence.ParagraphGuid = ph.Guid; + aiSentence.Status = "G"; + //D-【待确认对话】p-【待确认人物】A-【等待分配角色】G-【生成中】C-【完成】 + aiSentences.Add(aiSentence); + continue; + } + + var s = sentenceSplitter.SplitByConfigurableQuotes(ph); + if (s == null || s.Count() == 0) continue; + + aiSentences.AddRange(s); + } + + var transactionOptions = new TransactionOptions + { + IsolationLevel = IsolationLevel.ReadCommitted, + Timeout = TimeSpan.FromSeconds(60 * 10) + }; + + using (TransactionScope _transactionScope = new TransactionScope( + TransactionScopeOption.Required, + transactionOptions, + TransactionScopeAsyncFlowOption.Enabled)) + { + service.ServiceProvider.GetService().Inserts(aiParagraphs.ToArray()); + service.ServiceProvider.GetService().Inserts(aiSentences.ToArray()); + + _transactionScope.Complete(); + } + } + } +} diff --git a/Task/Novel/Process/ChapterSplitter.cs b/Task/Novel/Process/ChapterSplitter.cs new file mode 100644 index 0000000..05470da --- /dev/null +++ b/Task/Novel/Process/ChapterSplitter.cs @@ -0,0 +1,156 @@ +using CloudBuilder.AI.Entity; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Topshelf.Python; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Task.Novel.Process +{ + /// + /// 章节分割器 + /// 不同的小说有自己的分割方法,可以传入参数 + /// + public class ChapterSplitter + { + public ChapterSplitter() + { + + } + /// + /// 按章节分割小说文本 + /// + public List SplitNovelIntoChapters(string novelText, string chapterPatterns) + { + var chapters = new List(); + var lines = novelText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + var currentAiChapterEntity = new StringBuilder(); + var currentAiChapterEntityTitle = "未命名章节"; + var chapterCount = 1; + + foreach (var line in lines) + { + // 检查是否是章节标题 + if (IsChapterTitle(line, chapterPatterns)) + { + // 如果当前章节有内容,则保存 + if (currentAiChapterEntity.Length > 0) + { + chapters.Add(new AiChapterEntity + { + Title = currentAiChapterEntityTitle, + Guid = Guid.NewGuid().ToString(), + Content = currentAiChapterEntity.ToString(), + ChapterIndex = chapterCount + }); + currentAiChapterEntity.Clear(); + chapterCount++; + } + + // 更新章节标题 + currentAiChapterEntityTitle = line.Trim(); + // 添加章节标题 + currentAiChapterEntity.AppendLine(line.Trim()); + // 添加一个空行作为分隔,确保章节标题和正文内容分离 + currentAiChapterEntity.AppendLine(); + } + else + { + // 添加到当前章节,确保每行独立 + currentAiChapterEntity.AppendLine(line); + } + } + + // 添加最后一个章节 + if (currentAiChapterEntity.Length > 0) + { + chapters.Add(new AiChapterEntity + { + Title = currentAiChapterEntityTitle, + Content = currentAiChapterEntity.ToString(), + Guid = Guid.NewGuid().ToString(), + ChapterIndex = chapterCount + }); + } + + return chapters; + } + + /// + /// 检查是否为章节标题 + /// + private bool IsChapterTitle(string line, string cptPattern) + { + // 去除首尾空白字符 + var trimmedLine = line.Trim(); + + // 常见的章节标题模式 + var chapterPatterns = new[] + { + @"^第\s*[\u4e00-\u9fa50-9]+\s*章", // 第X章, 第XX章等 + @"^第\s*[0-9]+\s*章", // 第1章, 第2章等 + }; + + if (!string.IsNullOrEmpty(cptPattern)) + { + Array.Resize(ref chapterPatterns, chapterPatterns.Length + 1); + chapterPatterns[chapterPatterns.Length - 1] = cptPattern; + } + + foreach (var pattern in chapterPatterns) + { + if (Regex.IsMatch(trimmedLine, pattern, RegexOptions.IgnoreCase)) + { + //第一章内容说明了什么,请描述一下: + if (trimmedLine.Length > 20) return false; + return true; + } + } + + return false; + } + + /// + /// 保存章节到单独的文件 + /// + public void SaveChaptersToFiles(List chapters, string outputDirectory) + { + // 确保输出目录存在 + if (!Directory.Exists(outputDirectory)) + { + Directory.CreateDirectory(outputDirectory); + } + + foreach (var chapter in chapters) + { + // 使用章节标题作为文件名,清理非法字符 + var fileName = CleanFileName(chapter.Title) + ".txt"; + var filePath = Path.Combine(outputDirectory, fileName); + File.WriteAllText(filePath, chapter.Content, Encoding.UTF8); + } + } + + /// + /// 清理文件名中的非法字符 + /// + private string CleanFileName(string fileName) + { + var invalidChars = Path.GetInvalidFileNameChars(); + foreach (var invalidChar in invalidChars) + { + fileName = fileName.Replace(invalidChar, '_'); + } + + // 限制文件名长度 + if (fileName.Length > 100) + { + fileName = fileName.Substring(0, 100); + } + + return fileName; + } + } +} diff --git a/Task/Novel/Process/ParagraphSplitter.cs b/Task/Novel/Process/ParagraphSplitter.cs new file mode 100644 index 0000000..8e6ce15 --- /dev/null +++ b/Task/Novel/Process/ParagraphSplitter.cs @@ -0,0 +1,63 @@ +using CloudBuilder.AI.Data; +using CloudBuilder.AI.Entity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Task.Novel.Process +{ + public class ParagraphSplitter + { + public ParagraphSplitter() + { + } + + public AiBookData SplitChapterIntoParagraphs(AiChapterEntity aiChapter) + { + + AiBookData data = new AiBookData(); + + var paragraphs = new List(); + var sentences = new List(); + + if (string.IsNullOrWhiteSpace(aiChapter.Content)) return data; + + // 按换行拆分段落(过滤空段落) + var paragraphTexts = aiChapter.Content.Split("\r\n") + .Select(p => p.Trim()) + .Where(p => !string.IsNullOrWhiteSpace(p)) + .ToList(); + + SentenceSplitter sentenceSplitter = new SentenceSplitter(); + + AiParagraphEntity aiParagraph; + int index = 1; + foreach (var text in paragraphTexts) + { + if (!ValidText(text)) continue; + + aiParagraph = new AiParagraphEntity(); + aiParagraph.Content = text; + aiParagraph.ChapterGuid = aiChapter.Guid; + aiParagraph.Guid = Guid.NewGuid().ToString(); + aiParagraph.ParagraphIndex = index++; + aiParagraph.DialogueIndc = sentenceSplitter.IsDialogue(text) ? YesNoPolicy.YES : YesNoPolicy.NO; + paragraphs.Add(aiParagraph); + } + + data.AiParagraphs = paragraphs.ToArray(); + data.AiSentences = sentences.ToArray(); + + return data; + } + + private bool ValidText(string text) + { + if (string.IsNullOrWhiteSpace(text.Trim())) return false; + + return true; + } + } +} diff --git a/Task/Novel/Process/SentenceSplitter.cs b/Task/Novel/Process/SentenceSplitter.cs new file mode 100644 index 0000000..fb48abd --- /dev/null +++ b/Task/Novel/Process/SentenceSplitter.cs @@ -0,0 +1,199 @@ +using CloudBuilder.AI.Entity; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using Microsoft.Extensions.FileSystemGlobbing; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Task.Novel.Process +{ + /// + /// 智能句子分割器 + /// + public class SentenceSplitter + { + // 成对引号配置数组(可自由扩展,格式:[左引号, 右引号]) + private readonly List<(string LeftQuote, string RightQuote)> _quotePairs; + // 动态生成的正则表达式(匹配所有配置的引号类型) + private Regex _dynamicQuotePattern; + // 引号内必须包含的结尾标点集合 + private readonly string _endPunctuations = "?!。,;:、……~·"; + + /// + /// 默认构造函数:初始化常用成对引号(中文、英文、直角引号) + /// + public SentenceSplitter() + { + _quotePairs = new List<(string, string)> + { + ("“", "”"), // 中文弯引号 + ("\"", "\""), // 英文双引号(需转义) + ("〝", "〞"), // 中文直角引号 + ("「", "」") // 中文方头引号(可选扩展) + }; + InitDynamicRegex(); + } + + /// + /// 自定义构造函数:允许外部传入任意成对引号配置 + /// + /// 自定义成对引号列表 + public SentenceSplitter(List<(string LeftQuote, string RightQuote)> customQuotePairs) + { + _quotePairs = customQuotePairs ?? new List<(string, string)>(); + InitDynamicRegex(); + } + + /// + /// 初始化动态正则:根据配置的成对引号生成匹配规则 + /// + private void InitDynamicRegex() + { + if (_quotePairs.Count == 0) + { + // 空配置时生成空正则,避免匹配任何内容 + _dynamicQuotePattern = new Regex(@"^$", RegexOptions.Compiled); + return; + } + + // 步骤1:转义所有引号(避免正则特殊字符冲突),拼接左/右引号匹配组 + string escapedLeftQuotes = string.Join("|", _quotePairs.Select(p => Regex.Escape(p.LeftQuote))); + string escapedRightQuotes = string.Join("|", _quotePairs.Select(p => Regex.Escape(p.RightQuote))); + // 步骤2:转义标点集合,避免正则解析错误 + string escapedPunctuations = Regex.Escape(_endPunctuations); + + // 步骤3:构建动态正则表达式 + // 分组说明: + // ?:匹配配置的任意左引号 + // ?:匹配引号内的内容(必须以指定标点结尾) + // ?:匹配配置的任意右引号 + string regexPattern = $@"(?{escapedLeftQuotes})(?.+?[{escapedPunctuations}])(?{escapedRightQuotes})"; + _dynamicQuotePattern = new Regex(regexPattern, RegexOptions.Compiled | RegexOptions.Singleline); + } + + /// + /// 核心分割方法:按配置的成对引号分割文本,结果无引号字符 + /// + /// 待分割的文本(如:“其他标点符号,如?”紫茜的秀目 或 "其他标点符号,如?"紫茜的秀目) + /// 分割后的纯文本列表 + public List SplitByConfigurableQuotes(AiParagraphEntity aiParagraphEntity) + { + AiSentenceEntity aiSentence; + int sentenceIndex = 1; + // 空值/空白校验 + if (string.IsNullOrWhiteSpace(aiParagraphEntity.Content)) + { + return new List(); + } + + List result = new List(); + string remainingText = aiParagraphEntity.Content.Trim(); + int lastMatchEnd = 0; + + // 遍历所有匹配的「引号+内容+标点+引号」文本块 + foreach (Match match in _dynamicQuotePattern.Matches(remainingText)) + { + // 1. 提取匹配的左/右引号,校验是否为成对配置 + string matchedLeft = match.Groups["left"].Value; + string matchedRight = match.Groups["right"].Value; + bool isPairMatched = _quotePairs.Any(p => p.LeftQuote == matchedLeft && p.RightQuote == matchedRight); + if (!isPairMatched) + { + continue; // 非成对引号,跳过该匹配(避免“xxx"这类混合匹配) + } + + // 2. 提取引号前的文本(过滤空值) + string prefixText = remainingText.Substring(lastMatchEnd, match.Index - lastMatchEnd).Trim(); + if (!string.IsNullOrEmpty(prefixText)) + { + aiSentence = new AiSentenceEntity(); + aiSentence.Guid = Guid.NewGuid().ToString(); + aiSentence.Content = prefixText; + aiSentence.DialogueIndc = YesNoPolicy.NO; + aiSentence.SentenceIndex = sentenceIndex++; + aiSentence.ParagraphGuid = aiParagraphEntity.Guid; + aiSentence.Status = "G"; + //D-【待确认对话】p-【待确认人物】A-【等待分配角色】G-【生成中】C-【完成】 + result.Add(aiSentence); + } + + // 3. 提取引号内的纯内容(无引号字符) + string quotedContent = match.Groups["content"].Value.Trim(); + if (!string.IsNullOrEmpty(quotedContent)) + { + aiSentence = new AiSentenceEntity(); + aiSentence.Guid = Guid.NewGuid().ToString(); + aiSentence.Content = quotedContent; + aiSentence.DialogueIndc = YesNoPolicy.YES; + aiSentence.SentenceIndex = sentenceIndex++; + aiSentence.ParagraphGuid = aiParagraphEntity.Guid; + aiSentence.Status = "P"; + //D-【待确认对话】p-【待确认人物】A-【等待分配角色】G-【生成中】C-【完成】 + result.Add(aiSentence); + } + + // 更新最后匹配位置 + lastMatchEnd = match.Index + match.Length; + } + + // 4. 提取最后一个匹配项后的剩余文本 + string suffixText = remainingText.Substring(lastMatchEnd).Trim(); + if (!string.IsNullOrEmpty(suffixText)) + { + aiSentence = new AiSentenceEntity(); + aiSentence.Guid = Guid.NewGuid().ToString(); + aiSentence.Content = suffixText; + aiSentence.DialogueIndc = YesNoPolicy.NO; + aiSentence.SentenceIndex = sentenceIndex++; + aiSentence.ParagraphGuid = aiParagraphEntity.Guid; + aiSentence.Status = "G"; + //D-【待确认对话】p-【待确认人物】A-【等待分配角色】G-【生成中】C-【完成】 + result.Add(aiSentence); + } + + return result; + } + + /// + /// 新增:判断文本是否包含对话内容 + /// + /// 待判断的文本(句子/段落) + /// true=包含对话,false=纯旁白/空文本 + public bool IsDialogue(string text) + { + // 1. 处理空文本/NULL,直接返回false + if (string.IsNullOrWhiteSpace(text)) + return false; + + // 2. 文本预处理:去空格、统一全角/半角引号 + string cleanedText = text.Trim(); + // 替换全角空格为半角,避免干扰判断 + cleanedText = Regex.Replace(cleanedText, @" ", " "); + // 统一引号格式(中文弯引号、直引号 → 标准双引号) + cleanedText = cleanedText.Replace("“", "\"") + .Replace("”", "\"") + .Replace("〝", "\"") + .Replace("〞", "\"") + .Replace("「", "\"") + .Replace("」", "\"") + .Replace("‘", "'") + .Replace("’", "'"); + + // 3. 核心判断规则: + // - 包含成对/单个双引号(排除仅含引号无内容的情况) + // - 包含冒号+引号(如:"XXX说:"XXX"" 场景) + var hasQuote = Regex.IsMatch(cleanedText, @""".+?""") || // 成对双引号(含内容) + Regex.IsMatch(cleanedText, @":\s*"""); // 冒号后接引号(说话人+对话) + var hasSingleQuote = Regex.IsMatch(cleanedText, @"'[^']+'"); // 成对单引号(英文对话) + + // 4. 排除仅含引号符号的无效情况(如 ""、''、“”) + var onlyQuote = Regex.IsMatch(cleanedText, @"^\s*[""''“”]{1,2}\s*$"); + + // 最终判断:包含有效引号且不是仅含引号 → 判定为对话 + return (hasQuote || hasSingleQuote) && !onlyQuote; + } + } +} diff --git a/Task/Novel/Process/SpeakerAnalysisHelper.cs b/Task/Novel/Process/SpeakerAnalysisHelper.cs new file mode 100644 index 0000000..4781509 --- /dev/null +++ b/Task/Novel/Process/SpeakerAnalysisHelper.cs @@ -0,0 +1,102 @@ +using CloudBuilder.AI.Entity; +using CloudBuilder.Topshelf.Python; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Task.Novel.Process +{ + public class SpeakerAnalysisHelper + { + public string GetPerson(string depRoot, List ners, List> srls, List cons) + { + string arg0 = string.Empty; + + if (!string.IsNullOrEmpty(depRoot) && srls != null && srls.Count() > 0) + { + foreach (var srl in srls) + { + if (srl.Where(x => x.Text == depRoot).Any()) + { + foreach (var mrp in srl) + { + if (mrp.Type.ToUpper() != "ARG0") continue; + + if (ners != null && ners.Where(x => mrp.Text.Contains(x.Text)).Any() && + ners.Where(x => mrp.Text.Contains(x.Text)).FirstOrDefault().Text.Length > 1) + return ners.Where(x => mrp.Text.Contains(x.Text)).FirstOrDefault().Text; + + return mrp.Text.Length > 6 ? mrp.Text.Substring(mrp.Text.Length - 6, 6) : mrp.Text; + } + } + + foreach (var mrp in srl) + { + if (mrp.Type.ToUpper() != "ARG0") continue; + arg0 = mrp.Text.Length > 6 ? mrp.Text.Substring(mrp.Text.Length - 6, 6) : mrp.Text; + } + } + } + + if (ners != null && ners.Count() > 0) + return ners.FirstOrDefault().Text; + + return arg0; + } + + public AiParagraphEntity[] AiParagraphs { get; set; } + + public AiSentenceEntity[] AiSentences { get; set; } + + public AiChapterPersonEntity[] AiChapterPersons { get; set; } + } +} +/* +“文本解析→人物提取→上下文匹配→结果输出” + +graph TD +A[对话行] --> B{规则1:文本特征匹配}; +B -->|匹配成功| C[直接赋值说话者]; +B -->|匹配失败| D{规则2:紧邻旁白匹配}; +D -->|匹配成功| C; +D -->|匹配失败| E{规则3:段落内最近人物}; +E -->|匹配成功| C; +E -->|匹配失败| F[赋值默认值+标记异常]; + +规则 1:文本特征精准匹配(最高优先级) +基于对话内容中的 “专属特征” 直接匹配说话者,避免上下文干扰: +示例规则: +对话内容特征 匹配的说话者 +包含 “第二元婴” 韩立 +包含 “银月所化” 银月 +包含 “本座 / 本尊” 反派角色 + +落地:维护一个 “特征 - 人物” 映射字典,匹配时优先使用: +规则 2:紧邻旁白匹配(次高优先级)只找对话行 “紧邻的前 1-2 行旁白”,而非整个段落的旁白,避免跨越多个人物导致匹配错误: +规则:仅检查对话行的前 1 行、前 2 行旁白(最多前 3 行),超过则停止; +落地:修改向前查找的逻辑,限制查找范围 + +规则 3:排除无效人物(避免干扰)从旁白中提取人物时,过滤掉 “非核心人物”(如 “店小二”“路人”),只保留主要人物: +落地:维护 “核心人物白名单”,提取人物时只保留白名单内的名称 + +3. 增加异常处理和人工校验(兜底保障) +即使逻辑再完善,也会有边缘场景匹配错误,需通过 “异常标记 + 人工复核” 兜底: + +步骤 1:标记可疑匹配结果对以下情况标记为 “可疑”,存入日志或单独字段: +匹配到的人物在旁白中出现次数≥2(比如同一段落有韩立和银月,无法确定); +对话行前后 3 行都没有找到人物,最终赋值为 “未知人物”; +对话内容无任何特征,且段落内人物数量≥3; +落地:为实体增加扩展字段(如IsSuspected),或生成异常日志 + +步骤 2:人工复核可疑数据 +规则:所有标记为 “可疑” 的匹配结果,必须经过人工复核后再更新到数据库; +落地:生成 “可疑数据清单”(包含Guid、Content、PersonName),供运营 / 编辑人员校验,修正错误后重新填充。 + + +收集错误案例:记录每次匹配错误的场景(如 “银月的对话匹配给韩立”),分析错误原因; +迭代特征字典:将错误案例转化为新的特征规则(如新增 “乌云”→银月,“元婴”→韩立); +A/B 测试:对优化后的规则做小范围测试,对比匹配准确率,确认有效后全量上线。 +*/ \ No newline at end of file diff --git a/Task/Novel/Process/SpeakerFeatureLearner.cs b/Task/Novel/Process/SpeakerFeatureLearner.cs new file mode 100644 index 0000000..bc09645 --- /dev/null +++ b/Task/Novel/Process/SpeakerFeatureLearner.cs @@ -0,0 +1,148 @@ +using CloudBuilder.Topshelf.Python; +using Microsoft.VisualBasic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using System.Runtime.Intrinsics.Arm; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Task.Novel.Process +{ + public class SpeakerFeatureLearner + { + private readonly List _rules; + public SpeakerFeatureLearner() + { + _rules = new List(); + InitializeDefaultRules(); + } + + private void InitializeDefaultRules() + { + //AddRule("银月", "少妇"); + } + public void AutoLearnFromText(string text) + { + + } + public void AutoLearnFromText(string depRoot, List ners, List> srls, List cons) + { + + + if (ners == null || !ners.Where(x => x.Type.Trim().ToUpper().Contains("PERSON")).Any()) return; + + HanlpConstituencyNode[] nodes; + HanlpConstituencyNode nodef; + string feature = null; + foreach (NamedEntity namedEntity in ners.Where(x => x.Type.Trim().ToUpper().Contains("PERSON")).ToArray()) + { + nodes = HanlpResultHelper.GetNodeByLabel(cons, namedEntity.Text); + if (nodes == null || nodes.Length == 0) continue; + + //如果存在,找到父节点上的NP + foreach (HanlpConstituencyNode node in nodes) + { + nodef = HanlpResultHelper.GetNodeTopLabelById(cons, node.FatherId, "NP"); + if (nodef == null) continue; + feature = HanlpResultHelper.GetNodeBottomLabelById(cons, nodef.ItemId, "NP"); + if (string.IsNullOrEmpty(feature)) continue; + if (namedEntity.Text == feature) continue; + + AddRule(namedEntity.Text, feature); + } + } + + //自学创建特征 + //NR->NP->NP->IP + //NN->NP(称呼、职业) + + //完整汉语句法树库核心标签对照表(含 TOP/ NP / IP / CLP) + //按 “核心层级 / 短语类型” 分类整理,覆盖 90 % 以上高频标注: + //1.顶层 / 句子级标签 + //标签 英文全称 中文名称 定义 示例 + //TOP Top - level Phrase 顶层短语 句法树的根节点,包含整个句子的最高层级结构 所有句子的根节点均标注为 TOP + //IP Inflectional Phrase / Simple Clause 简单从句 句子级核心短语(含主谓结构),是 TOP 的直接子节点 “我吃饭” 整体标注为 IP + //CP Complement Clause 补语从句 带补语标记(的 / 吗 / 呢)的从句 / 复句成分 “我买的书” 中 “我买的” 标注为 CP + //2.名词类短语 + //标签 英文全称 中文名称 定义 示例 + //NP Noun Phrase 名词短语 以名词为核心的短语(可含定语 / 量词) “苹果”“我的手机”“三本书” + //DNP XP+DEG Phrase “的” 字短语 由 “XP + 的” 构成的名词性短语 “红色的”“我喜欢的” + //NNP Proper Noun Phrase 专有名词短语 人名 / 地名 / 机构名等专有名词构成的短语 “北京大学”“张三”“北京市” + //3.动词类短语 + //标签 英文全称 中文名称 定义 示例 + //VP Verb Phrase 动词短语 以动词为核心的短语(可含宾语 / 状语) “吃饭”“快速跑步”“看电影” + //VV Verb Phrase(Verb Core) 动词核心短语 纯动词构成的短语(无附加成分) “跑”“思考”“购买” + //VCP Verb Complement Phrase 动补短语 动词 +补语构成的短语 “吃完”“跑快”“看明白” + //4.数量 / 量词类短语 + //标签 英文全称 中文名称 定义 示例 + //CLP Classifier Phrase 量词短语 以量词为核心的短语(数词 + 量词 / 指示词 + 量词) “三个”“这本”“那些” + //QP Quantifier Phrase 量化短语 以数量为核心的短语(涵盖数词 / 量词 / 数量整体) “三”“若干”“三本”“许多” + //DP Determiner Phrase 指示词短语 以指示词(这 / 那 / 此)为核心的短语 “这个”“那些”“此问题” + //5.介词 / 方位类短语 + //标签 英文全称 中文名称 定义 示例 + //PP Prepositional Phrase 介词短语 以介词为核心的短语 “在学校”“关于这件事”“把书” + //LCP Locative Complement Phrase 方位补语短语 含方位词的短语 “桌子上”“房间里”“马路边” + //LOC Locative Phrase 方位短语 纯方位名词构成的短语(LCP 的简化版) “上面”“左边”“内部” + //6.形容词 / 副词类短语 + //标签 英文全称 中文名称 定义 示例 + //AP Adjective Phrase 形容词短语 以形容词为核心的短语 “漂亮”“非常开心”“红色的” + //ADVP Adverb Phrase 副词短语 以副词为核心的短语 “快速地”“很”“非常” + //7.其他功能类短语 + //标签 英文全称 中文名称 定义 示例 + //INTJ Interjection Phrase 感叹语短语 感叹词 / 语气词构成的短语 “啊”“哦”“哎呀” + //CONJP Conjunction Phrase 连词短语 连词构成的短语 “和”“但是”“因为” + //PRN Parenthetical Phrase 插入语短语 插入句子的附加成分 “换句话说”“总的来说” + //总结 + //CLP 核心是量词短语,以量词为核心(如 “三本”“这本”),是数量表达的核心标注标签; + //TOP / IP 是句子层级标签(根节点 / 核心从句),NP / VP 是核心短语标签(名词 / 动词为核心); + //不同工具(CTB / HanLP / 北大树库)对标签的细分略有差异(如 CLP 是否归为 QP),但核心含义一致,优先以宾州中文树库(CTB)规范为准。 + } + + public void AddRule(string speaker, params string[] keywords) + { + if (string.IsNullOrWhiteSpace(speaker)) + throw new ArgumentException("说话者名称不能为空", nameof(speaker)); + + if (keywords == null || keywords.Length == 0) + throw new ArgumentException("至少需要提供一个关键词", nameof(keywords)); + + _rules.Add(new SpeakerRule(speaker, keywords)); + } + + public string MatchSpeaker(string dialogue) + { + if (string.IsNullOrWhiteSpace(dialogue)) + return null; + + foreach (var rule in _rules) + { + if (rule.Match(dialogue)) + { + return rule.Speaker; + } + } + + return dialogue; + } + } + + public class SpeakerRule + { + public string Speaker { get; } + public string[] Keywords { get; } + + public SpeakerRule(string speaker, string[] keywords) + { + Speaker = speaker; + Keywords = keywords; + } + + public bool Match(string dialogue) + { + return Keywords.Any(keyword => + dialogue.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0); + } + } +} diff --git a/Task/Novel/SpeakerTask.cs b/Task/Novel/SpeakerTask.cs new file mode 100644 index 0000000..246c2b0 --- /dev/null +++ b/Task/Novel/SpeakerTask.cs @@ -0,0 +1,239 @@ +using CloudBuilder.AI.Data; +using CloudBuilder.AI.Entity; +using CloudBuilder.AI.SearchCriteria; +using CloudBuilder.AI.Service; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Core.Service; +using CloudBuilder.Security.Entity; +using CloudBuilder.Topshelf.Python; +using CloudBuilder.Topshelf.Task.Novel.Process; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static System.Net.Mime.MediaTypeNames; + +namespace CloudBuilder.Topshelf.Task.Novel +{ + //task:SpeakerTask param_name:param_value + public class SpeakerTask : IScheduleTask + { + private readonly IApplicationService service; + + public SpeakerTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + AiSentenceSearchCriteria c = new AiSentenceSearchCriteria(); + c.limit = 999999; + List filters = new List(); + + SearchFilter filter = new SearchFilter(); + filter.Column = AiSentenceViewEntity.DB_CHAPTER_GUID; + filter.Type = SearchFilterTypePolicy.TEXT; + filter.Operator = SearchFilterOperatorPolicy.CONTAIN; + filter.Value = "cf34136e-d30a-4901-9109-626e412eaf57"; + filters.Add(filter); + + c.Filter = filters.ToArray(); + + AiSentenceViewResultData data = service.ServiceProvider.GetService().FindBySearchCriteria(c); + + if (data == null || data.Datas == null || data.Datas.Count() == 0) return; + + AiSentenceViewEntity[] sentenceViews = data.Datas.OrderBy(x => x.ParagraphIndex).ThenBy(x => x.DialogueIndc).ToArray(); + + if (sentenceViews == null || sentenceViews.Length == 0) return; + + PythonCommand python = new PythonCommand(service); + + Hanlp2 hanlp = new Hanlp2(python); + + List all = GetNamedSummary(hanlp, data.Datas, 0, data.Datas.Length); + + string text = string.Empty; + //@"乌云忽然凝聚变形,瞬间化为了一个身高寸许的黑绿婴儿出来,并口吐人言的说道。"; + //text = "艳美少妇打了韩立"; + //text = "银月嫣然一笑后,敛冲元婴一拜的说道。这元婴看起来除了比韩立主元婴小了一些外,模样神态全都一般无二的样子。"; + + //List sentiments = hanlp.GetSentiment(text); + + SpeakerFeatureLearner speakerFeatureLearner = new SpeakerFeatureLearner(); + BuildPersonNameRules(all.ToArray(), speakerFeatureLearner); + + AiSentenceViewEntity[] sentenceTemps; + int paragraphIndex = 1; + foreach (var sentence in sentenceViews) + { + sentence.CreatedBy = sentence.UpdatedBy = string.Empty; + if (string.IsNullOrEmpty(sentence.Content)) continue; + + text = sentence.Content; + + List ners = hanlp.GetHanlpNer(text); + List> srls = hanlp.GetHanlpSrl(text); + List cons = hanlp.GetHanlpCon(text); + + speakerFeatureLearner.AutoLearnFromText("", ners, srls, cons); + + //如果不存在人名 + if (ners == null || !ners.Where(x => x.Type.Contains("PERSON")).Any()) + { + if (sentence.DialogueIndc == YesNoPolicy.NO) + { + continue; + } + + + foreach (var p in sentenceViews.Where(x => x.ParagraphIndex == sentence.ParagraphIndex).ToArray()) + { + if (string.IsNullOrEmpty(p.PersonName)) continue; + + sentence.PersonName = p.PersonName; + } + } + + string[] persons = ners.Where(x => x.Type.Contains("PERSON")).Select(x => x.Text).Distinct().ToArray(); + if (persons == null && persons.Count() == 0) continue; + if (persons != null && persons.Count() == 1) + { + sentence.PersonName = speakerFeatureLearner.MatchSpeaker(persons.FirstOrDefault()); + continue; + } + //如果是两个,取ARG0 + sentence.PersonName = speakerFeatureLearner.MatchSpeaker(persons.FirstOrDefault()); + } + + List indexRange = GetNamedSummaryBefore(hanlp, data.Datas, 8); + + + + //3字词根据次数划分到2字词内 + python.Dispose(); + } + + public List GetNamedSummaryBefore(Hanlp2 hanlp, AiSentenceViewEntity[] datas, int paragraphIndex) + { + return GetNamedSummary(hanlp, datas, paragraphIndex - 3 > 0 ? paragraphIndex - 3 : 0, paragraphIndex); + } + + public List GetNamedSummaryAfter(Hanlp2 hanlp, AiSentenceViewEntity[] datas, int paragraphIndex) + { + return GetNamedSummary(hanlp, datas, paragraphIndex, paragraphIndex + 3); + } + + public List GetNamedSummary(Hanlp2 hanlp, AiSentenceViewEntity[] datas, int startIndex, int endIndex) + { + List nameds = new List(); + NamedSummary summary; + List temps; + AiSentenceViewEntity sentence; + for (int i = 0; i < datas.Length; i++) + { + sentence = datas[i]; + if (sentence.ParagraphIndex < startIndex) continue; + if (sentence.ParagraphIndex > endIndex) continue; + + temps = hanlp.GetHanlpNer(sentence.Content); + if (temps == null || temps.Count() == 0) continue; + + foreach (var tp in temps) + { + if (tp.Text.Length == 1) continue; + if (tp.Type != "PERSON") continue; + if (nameds.Select(x => x.Person).Contains(tp.Text)) + { + summary = nameds.Where(x => x.Person == tp.Text).FirstOrDefault(); + summary.Count++; + continue; + } + summary = new NamedSummary(); + summary.Person = tp.Text; + summary.Count = 1; + nameds.Add(summary); + } + } + + return nameds; + } + + /// + /// 处理 NamedSummary 数组:按包含关系分组,以次数多的为主名称调用 AddRule + /// + /// 人名统计数组 + public void BuildPersonNameRules(NamedSummary[] namedSummaries, SpeakerFeatureLearner speakerFeatureLearner) + { + // 空值校验 + if (namedSummaries == null || !namedSummaries.Any()) + { + Console.WriteLine("NamedSummary 数组为空,无需处理"); + return; + } + + // 1. 提取去重的人名-次数字典(确保每个人名只统计一次总次数) + var nameCountDict = namedSummaries + .Where(ns => !string.IsNullOrWhiteSpace(ns.Person)) + .GroupBy(ns => ns.Person.Trim()) + .ToDictionary(g => g.Key, g => g.Sum(ns => ns.Count)); + + if (nameCountDict.Count < 2) + { + Console.WriteLine("有效人名数量不足,无需建立映射"); + return; + } + + // 2. 标记已处理的人名,避免重复配对 + var processedNames = new HashSet(); + + // 3. 遍历查找包含关系的人名对,按次数确定主从 + foreach (var (name1, count1) in nameCountDict) + { + if (processedNames.Contains(name1)) continue; + + // 查找与当前人名存在包含关系的其他人名 + var matchedNames = nameCountDict + .Where(kv => !processedNames.Contains(kv.Key) + && kv.Key != name1 + && (kv.Key.Contains(name1) || name1.Contains(kv.Key))) // 互相包含都算匹配 + .ToList(); + + if (matchedNames.Count == 0) + { + processedNames.Add(name1); + continue; // 无匹配的包含关系人名,跳过 + } + + // 4. 合并当前人名和匹配人名,按次数选主名称 + foreach (var (name2, count2) in matchedNames) + { + // 确定主/次要名称:次数多的是主,次数相同则选长度长的(可选规则) + string mainName = count1 > count2 ? name1 : (count2 > count1 ? name2 : (name1.Length > name2.Length ? name1 : name2)); + string minorName = mainName == name1 ? name2 : name1; + + // 5. 调用 AddRule(次要名称, 主名称) + speakerFeatureLearner.AddRule(mainName, minorName); + Console.WriteLine($"已调用 AddRule:AddRule(\"{mainName}\", \"{minorName}\")"); + + // 标记为已处理,避免重复配对 + processedNames.Add(name1); + processedNames.Add(name2); + } + } + } + + public class NamedSummary + { + public int Count { get; set; } + + public string Person { get; set; } + + public decimal MinConfidence { get; set; } + } + } +} diff --git a/Task/Novel/SplitFileChapterTask.cs b/Task/Novel/SplitFileChapterTask.cs new file mode 100644 index 0000000..259fcf1 --- /dev/null +++ b/Task/Novel/SplitFileChapterTask.cs @@ -0,0 +1,133 @@ +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Task.Novel +{ + //task:SplitFileChapterTask encoding:GB2312 pattern: @"第([^】]+)章" input:D:\NET8\AI\frxxz.txt output:D:\NET8\AI\NovelSplitter + //input可以是文件名,也可以是目錄名 + //output輸出目錄 + //pattern可能自定義分割表達式 + public class SplitFileChapterTask : IScheduleTask + { + private readonly IApplicationService service; + + public SplitFileChapterTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + if (!bodyDict.ContainsKey("input") || string.IsNullOrEmpty(bodyDict["input"])) return; + + string input = bodyDict["input"]; + string output = AppDomain.CurrentDomain.BaseDirectory; + + //如果是文件名,輸出到同一目錄下 + if (File.Exists(input)) + { + output = Path.GetDirectoryName(input) + "\\"; + } + else if (Directory.Exists(input)) + { + output = input; + } + + if (bodyDict.ContainsKey("output") && !string.IsNullOrEmpty(bodyDict["output"])) + { + output = bodyDict["output"]; + //如果目錄不存在,創建目錄 + if (!Directory.Exists(output)) Directory.CreateDirectory(output); + } + + + string pattern = @"第([^】]+)章"; + if (bodyDict.ContainsKey("pattern") && !string.IsNullOrEmpty(bodyDict["pattern"])) + pattern = bodyDict["pattern"]; + + string encoding = "UTF-8"; + + if (bodyDict.ContainsKey("encoding") && !string.IsNullOrEmpty(bodyDict["encoding"])) encoding = bodyDict["encoding"]; + + List files = PackFiles(input); + + foreach (string file in files) + { + SaveFile(encoding, file, output, pattern); + } + } + + private void SaveFile(string encoding, string fileName, string output, string pattern) + { + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); + + string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding(encoding)); + + string title = string.Empty; + + int chapterIndex = 1; + StringBuilder chapter = new StringBuilder(); + foreach (string line in lines) + { + Match match = Regex.Match(line, pattern); + if (match.Success) + { + // 提取第一个分组(即括号内的内容) + //string value = match.Groups[1].Value; + + //第一次找到是空的,下次找到新的保存之前的 + if (!string.IsNullOrEmpty(title) && chapter.Length > 0) + { + File.WriteAllText(Path.Combine(output, Path.GetFileNameWithoutExtension(fileName) + string.Format("_{0}_{1}", chapterIndex++,title) + Path.GetExtension(fileName)), chapter.ToString(), Encoding.UTF8); + + chapter = new StringBuilder(); + } + + title = line; + } + + if (!string.IsNullOrEmpty(title)) + { + chapter.AppendLine(line); + } + } + //最后一章 + if (!string.IsNullOrEmpty(title) && chapter.Length > 0) + { + File.WriteAllText(Path.Combine(output, Path.GetFileNameWithoutExtension(fileName) + string.Format("_{0}_{1}", chapterIndex++, title) + Path.GetExtension(fileName)), chapter.ToString(), Encoding.UTF8); + } + } + + private List PackFiles(string input) + { + List files = new List(); + if (Path.HasExtension(input) && !string.IsNullOrEmpty(input)) + { + if (File.Exists(input)) + { + files.Add(input); + } + } + else if (!string.IsNullOrEmpty(input)) + { + if (Directory.Exists(input)) + { + string[] tempFiles = Directory.GetFiles(input); + if (tempFiles != null && tempFiles.Length > 0) + { + files.AddRange(tempFiles); + } + } + } + + return files; + } + + } +} diff --git a/Task/Novel/readme.md b/Task/Novel/readme.md new file mode 100644 index 0000000..4274761 --- /dev/null +++ b/Task/Novel/readme.md @@ -0,0 +1,19 @@ +1.创建一本书 +[title] +[author] +[description] +[book_type] +[file_path] +[status] +创建成功[status]>【待上传】,如果同步上传了文件[file_path]不空,[status]>【待提交】(此时已写入章节) +[guid] +[book_guid] +[chapter_index] +[title] +[content] +[status] +[status]>【处理中】 +【待确认人物关系】【等待分配角色】【生成中】【完成】 +2.上传文件后【待提交】,用户检查章节分割无误后等待提交 +3.按【提交】后,写入段落及细分是否是对话 +段落换行来分割,如有对话规则,再划分对话 diff --git a/Task/Python/PythonRunTask.cs b/Task/Python/PythonRunTask.cs new file mode 100644 index 0000000..2d34b3f --- /dev/null +++ b/Task/Python/PythonRunTask.cs @@ -0,0 +1,59 @@ +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Topshelf.Python; +using CloudBuilder.Topshelf.Task.Novel.Process; +using CloudBuilder.Topshelf.Utility; + +namespace CloudBuilder.Topshelf.Task +{ + //task:PythonRunTask param_name:param_value + public class PythonRunTask : IScheduleTask + { + private readonly IApplicationService service; + + public PythonRunTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + PythonCommand python = new PythonCommand(service); + try + { + Hanlp2 hanlp = new Hanlp2(python); + + string text = @"金越大师,听说你前两日派人请这位韩道友聚一下,他却开始闭关了,可有此事的。"; + //text = "艳美少妇打了韩立"; + //text = "徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。"; + + text = "银发老者神色一肃的向金越禅师问道。"; + //text = "鬼灵门门主一边吩咐着,一边冷冷打量着悬浮在身前的画轴,见其并没有任何异样发生,目光闪动几下。"; + text = "韩立闻言,眉头不经意的一皱,想了想后,还是摇摇头说道:"; + List sentiments = hanlp.GetTokFine(text); + + sentiments = hanlp.GetTokCoarse(text); + + string depRoot = hanlp.GetDepRoot(text); + + List ners = hanlp.GetHanlpNer(text); + + List> srls = hanlp.GetHanlpSrl(text); + + List cons = hanlp.GetHanlpCon(text); + + SpeakerAnalysisHelper speakerFeatureLearner = new SpeakerAnalysisHelper(); + + speakerFeatureLearner.GetPerson(depRoot, ners, srls, cons); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + finally + { + python.Dispose(); + } + } + } +} diff --git a/Task/RunTask.cs b/Task/RunTask.cs new file mode 100644 index 0000000..7fbb64e --- /dev/null +++ b/Task/RunTask.cs @@ -0,0 +1,21 @@ +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; + +namespace CloudBuilder.Topshelf.Task +{ + //task:RunTask param_name:param_value + public class RunTask : IScheduleTask + { + private readonly IApplicationService service; + + public RunTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + + } + } +} diff --git a/Task/SplitFileSaveUTF8Task.cs b/Task/SplitFileSaveUTF8Task.cs new file mode 100644 index 0000000..79ffc42 --- /dev/null +++ b/Task/SplitFileSaveUTF8Task.cs @@ -0,0 +1,135 @@ +using CloudBuilder.Core.Authorization; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Core.Policy; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Text; + + +namespace CloudBuilder.Topshelf.Task +{ + /// + /// 分隔文件并保存為UTF-8格式, + /// 【encoding】原文件格式必填, + /// 【split_size】分隔大小单位为M 【split_number】分隔文件數量,這兩個參數必填其中之一, + /// 【input】文件夹或者文件路径必填, + /// 【output】输出文件夹路径 + /// task:SplitFileSaveUTF8Task encoding:GB2312 split_size:1 input:D:\NET8\AIML文档\汉语大词典1994+订补+资料Txt output:D:\NET8\AIML文档\汉语大词典1994UTF8 + /// task:SplitFileSaveUTF8Task encoding:GB2312 split_number:1 input:D:\NET8\AIML文档\汉语大词典1994+订补+资料Txt output:D:\NET8\AIML文档\汉语大词典1994UTF8 + /// + public class SplitFileSaveUTF8Task : IScheduleTask + { + private readonly IApplicationService service; + + public SplitFileSaveUTF8Task(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + if (!bodyDict.ContainsKey("input")) return; + if (!bodyDict.ContainsKey("encoding")) return; + if (!bodyDict.ContainsKey("output")) return; + + int splitNumber = 0; + if (bodyDict.ContainsKey("split_number")) + splitNumber = Convert.ToInt32(bodyDict["split_number"]); + + string encoding = bodyDict["encoding"]; + string output = bodyDict["output"]; + string input = bodyDict["input"]; + + decimal splitSize = 0; + if (bodyDict.ContainsKey("split_size")) + splitSize = Convert.ToDecimal(bodyDict["split_size"]); + + List files = PackFiles(input); + + foreach (string file in files) + { + SaveFile(encoding, file, output, splitNumber, splitSize); + } + } + + private void SaveFile(string encoding, string fileName, string output, int splitNumber, decimal splitSize) + { + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); + + string context = File.ReadAllText(fileName, Encoding.GetEncoding(encoding)); + + int maxlength = context.Length; + + int maxSplit = maxlength; + + //如果傳入的是分隔數,以分隔數為準 + if (splitNumber > 0) + { + maxSplit = (int)Math.Ceiling(maxlength * 1.0m / splitNumber); + } + + if (splitSize > 0 && splitNumber == 0) + { + FileInfo fileInfo = new FileInfo(fileName); + + splitNumber = (int)Math.Ceiling(fileInfo.Length / ((1024m * 1024m) * splitSize)); + + maxSplit = (int)Math.Ceiling(maxlength * 1.0m / splitNumber); + } + + + int reqLenth = maxSplit; + + string ct = string.Empty; + + for (int i = 0; i < splitNumber; i++) + { + if (i > 0 && splitNumber == i + 1) { reqLenth = maxlength % maxSplit; } + + if (splitNumber > 1) + { + ct = context.Substring(i * maxSplit, reqLenth); + } + else + { + ct = context; + } + + string outputPath = Path.Combine(output, + Path.GetFileNameWithoutExtension(fileName) + string.Format("_{0}", i+1) + + Path.GetExtension(fileName)); + + File.WriteAllText(outputPath, + ct, Encoding.UTF8); + } + } + + private List PackFiles(string input) + { + List files = new List(); + if (Path.HasExtension(input) && !string.IsNullOrEmpty(input)) + { + if (File.Exists(input)) + { + files.Add(input); + } + } + else if (!string.IsNullOrEmpty(input)) + { + if (Directory.Exists(input)) + { + string[] tempFiles = Directory.GetFiles(input); + if (tempFiles != null && tempFiles.Length > 0) + { + files.AddRange(tempFiles); + } + } + } + + return files; + } + + } +} diff --git a/Task/TTS/TtsTask.cs b/Task/TTS/TtsTask.cs new file mode 100644 index 0000000..6e562a1 --- /dev/null +++ b/Task/TTS/TtsTask.cs @@ -0,0 +1,42 @@ +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Core.DependencyInjection.Task; +using CloudBuilder.Topshelf.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; +using static System.Net.Mime.MediaTypeNames; +using static System.Runtime.InteropServices.JavaScript.JSType; + +namespace CloudBuilder.Topshelf.Task.TTS +{ + //task:TtsTask voice:Sherpa2 save_path:D:\MAFAI\cc.wav text:乌云忽然凝聚变形,瞬间化为了一个身高寸许的黑绿婴儿出来,并口吐人言的说道。 + public class TtsTask : IScheduleTask + { + private readonly IApplicationService service; + + public TtsTask(IApplicationService service) + { + this.service = service; + } + + public void Run(Dictionary bodyDict) + { + string save_path = string.Empty, text = string.Empty, voice = ChineseTtsVoice.Sherpa2.ToString(); + if (bodyDict.ContainsKey("voice")) + voice = bodyDict["voice"]; + + if (bodyDict.ContainsKey("save_path")) + save_path = bodyDict["save_path"]; + + if (bodyDict.ContainsKey("text")) + text = bodyDict["text"]; + + if (string.IsNullOrEmpty(voice) || string.IsNullOrEmpty(save_path) || string.IsNullOrEmpty(text)) return; + + SaveAudioToFileHelper.AudioToFile(EnumHelper.ToEnum(voice), text, save_path); + } + } +} diff --git a/Utility/SaveAudioToFileHelper.cs b/Utility/SaveAudioToFileHelper.cs new file mode 100644 index 0000000..6513b0a --- /dev/null +++ b/Utility/SaveAudioToFileHelper.cs @@ -0,0 +1,317 @@ +using SherpaOnnx; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Reflection; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using static System.Net.Mime.MediaTypeNames; + +namespace CloudBuilder.Topshelf.Utility +{ + public static class SaveAudioToFileHelper + { + private static OfflineTts fanchenTTs = null; + private static OfflineTts sherpaTTs = null; + private static OfflineTts theresaTTs = null; + private static OfflineTts meloTTs = null; + private static OfflineTts icefallTTs = null; + private static OfflineTts matchaTTs = null; + private static OfflineTts eulaTTs = null; + public static void InitConfig() + { + OfflineTtsConfig config; + OfflineTtsGeneratedAudio audio; + int numThreads = 4; + if (fanchenTTs == null) + { + config = new OfflineTtsConfig(); + config.Model.Vits.Model = "tts-models/vits-zh-hf-fanchen-C/vits-zh-hf-fanchen-C.onnx"; + config.Model.Vits.Tokens = "tts-models/vits-zh-hf-fanchen-C/tokens.txt"; + config.Model.Vits.Lexicon = "tts-models/vits-zh-hf-fanchen-C/lexicon.txt"; + config.RuleFars = "tts-models/vits-zh-hf-fanchen-C/number.fst,tts-models/vits-zh-hf-fanchen-C/phone.fst"; + config.Model.NumThreads = numThreads; + //187 + fanchenTTs = new OfflineTts(config); + + config = new OfflineTtsConfig(); + config.Model.Vits.Model = "tts-models/sherpa-onnx-vits-zh-ll/model.onnx"; + config.Model.Vits.Tokens = "tts-models/sherpa-onnx-vits-zh-ll/tokens.txt"; + config.Model.Vits.Lexicon = "tts-models/sherpa-onnx-vits-zh-ll/lexicon.txt"; + config.RuleFars = "tts-models/sherpa-onnx-vits-zh-ll/number.fst,tts-models/sherpa-onnx-vits-zh-ll/phone.fst"; + config.Model.NumThreads = numThreads; + //多人音质最好(0 - 4) + sherpaTTs = new OfflineTts(config); + + config = new OfflineTtsConfig(); + config.Model.Vits.Model = "tts-models/vits-zh-hf-theresa/theresa.onnx"; + config.Model.Vits.Tokens = "tts-models/vits-zh-hf-theresa/tokens.txt"; + config.Model.Vits.Lexicon = "tts-models/vits-zh-hf-theresa/lexicon.txt"; + config.RuleFars = "tts-models/vits-zh-hf-theresa/number.fst,tts-models/vits-zh-hf-theresa/phone.fst"; + config.Model.NumThreads = numThreads; + //804 + theresaTTs = new OfflineTts(config); + + config = new OfflineTtsConfig(); + config.Model.Vits.Model = "tts-models/vits-melo-tts-zh_en/model.onnx"; + config.Model.Vits.Tokens = "tts-models/vits-melo-tts-zh_en/tokens.txt"; + config.Model.Vits.Lexicon = "tts-models/vits-melo-tts-zh_en/lexicon.txt"; + config.RuleFars = "tts-models/vits-melo-tts-zh_en/number.fst,tts-models/vits-melo-tts-zh_en/phone.fst"; + config.Model.NumThreads = numThreads; + //1 + meloTTs = new OfflineTts(config); + + config = new OfflineTtsConfig(); + config.Model.Vits.Model = "tts-models/vits-icefall-zh-aishell3/model.onnx"; + config.Model.Vits.Tokens = "tts-models/vits-icefall-zh-aishell3/tokens.txt"; + config.Model.Vits.Lexicon = "tts-models/vits-icefall-zh-aishell3/lexicon.txt"; + config.RuleFars = "tts-models/vits-icefall-zh-aishell3/number.fst,tts-models/vits-icefall-zh-aishell3/phone.fst"; + config.Model.NumThreads = numThreads; + //中文、32 个不同说话人,最快 + icefallTTs = new OfflineTts(config); + + config = new OfflineTtsConfig(); + config.Model.Vits.Model = "tts-models/vits-zh-hf-eula/eula.onnx"; + config.Model.Vits.Tokens = "tts-models/vits-zh-hf-eula/tokens.txt"; + config.Model.Vits.Lexicon = "tts-models/vits-zh-hf-eula/lexicon.txt"; + config.RuleFars = "tts-models/vits-zh-hf-eula/number.fst,tts-models/vits-zh-hf-eula/phone.fst"; + config.Model.NumThreads = numThreads; + + eulaTTs = new OfflineTts(config); + + config = new OfflineTtsConfig(); + config.Model.Matcha.AcousticModel = "tts-models/matcha-icefall-zh-baker/model-steps-3.onnx"; + config.Model.Matcha.Vocoder = "tts-models/matcha-icefall-zh-baker/vocos-22khz-univ.onnx"; + config.Model.Matcha.Tokens = "tts-models/matcha-icefall-zh-baker/tokens.txt"; + config.Model.Matcha.Lexicon = "tts-models/matcha-icefall-zh-baker/lexicon.txt"; + config.RuleFars = "tts-models/matcha-icefall-zh-baker/number.fst,tts-models/matcha-icefall-zh-baker/phone.fst"; + config.Model.NumThreads = numThreads; + //1 + matchaTTs = new OfflineTts(config); + + + } + } + + + + public static void AudioToFile(ChineseTtsVoice actorName, string text, string saveFilePath) + { + InitConfig(); + int sid = 0; + OfflineTtsGeneratedAudio audio; + switch (actorName) + { + case ChineseTtsVoice.Fanchen10: + case ChineseTtsVoice.Fanchen110: + case ChineseTtsVoice.Fanchen6: + case ChineseTtsVoice.Fanchen15: + case ChineseTtsVoice.Fanchen2: + case ChineseTtsVoice.Fanchen20: + case ChineseTtsVoice.Fanchen14: + case ChineseTtsVoice.Fanchen36: + sid = actorName.GetSidId(); + audio = fanchenTTs.Generate(text, 1.0f, sid); + break; + case ChineseTtsVoice.Sherpa0: + case ChineseTtsVoice.Sherpa1: + case ChineseTtsVoice.Sherpa2: + case ChineseTtsVoice.Sherpa3: + case ChineseTtsVoice.Sherpa4: + sid = actorName.GetSidId(); + audio = sherpaTTs.Generate(text, 1.0f, sid); + break; + case ChineseTtsVoice.Melo: + sid = actorName.GetSidId(); + audio = meloTTs.Generate(text, 1.0f, sid); + break; + case ChineseTtsVoice.Eula: + sid = actorName.GetSidId(); + audio = eulaTTs.Generate(text, 1.0f, sid); + break; + case ChineseTtsVoice.Theresa: + sid = actorName.GetSidId(); + audio = theresaTTs.Generate(text, 1.0f, sid); + break; + case ChineseTtsVoice.Aaishe1: + case ChineseTtsVoice.Aaishe6: + case ChineseTtsVoice.Aaishe14: + case ChineseTtsVoice.Aaishe15: + case ChineseTtsVoice.Aaishe18: + case ChineseTtsVoice.Aaishe10: + sid = actorName.GetSidId(); + audio = icefallTTs.Generate(text, 1.0f, sid); + break; + default: + sid = actorName.GetSidId(); + audio = matchaTTs.Generate(text, 1.0f, sid); + break; + } + + // --- 4. 保存音频 --- + audio.SaveToWaveFile(saveFilePath); + } + } + /// + /// 微软Edge TTS中文语音音色枚举 + /// 对应官方Neural语音标识,覆盖港澳台及大陆各地区音色 + /// + 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 ChineseTtsVoiceExtensions + { + /// + /// 获取枚举值对应的Description特性值 + /// + /// 语音枚举值 + /// 描述字符串(无特性时返回枚举名称) + public static int GetSidId(this ChineseTtsVoice voice) + { + // 获取枚举成员的特性 + var field = voice.GetType().GetField(voice.ToString()); + var attribute = field?.GetCustomAttribute(); + + // 有特性返回描述,无则返回枚举名 + return Convert.ToInt32(attribute?.Description.Split('-')[1] ?? "0"); + } + } + + public static class EnumHelper + { + // 枚举转字符串 + public static string ToEnumString(T value) where T : Enum + { + return value.ToString(); + } + + // 字符串转枚举 + public static T ToEnum(string str) where T : struct, Enum + { + return Enum.TryParse(str, out var result) ? result : default; + } + } +} + diff --git a/Utility/SegmenterHelper.cs b/Utility/SegmenterHelper.cs new file mode 100644 index 0000000..5ed7bfe --- /dev/null +++ b/Utility/SegmenterHelper.cs @@ -0,0 +1,18 @@ +using CloudBuilder.Core.DatabaseAccessor.Entity; +using CloudBuilder.Topshelf.Python; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudBuilder.Topshelf.Utility +{ + public class SegmenterHelper + { + public List Cut(string text, Hanlp2 hanlp) + { + return hanlp.GetTokFine(text); + } + } +} diff --git a/appsettings.json b/appsettings.json new file mode 100644 index 0000000..fd7f30a --- /dev/null +++ b/appsettings.json @@ -0,0 +1,38 @@ +{ + "CloudBuilder": { + "Culture": "zh-cn", + "DbContexts": { + "MasterDbContext": { + "DbContextTypeName": "MasterDbContext", + "ConnectionString": "Server=localhost\\SQLEXPRESS;Database=Furion;User=sa;Password=owen123456;MultipleActiveResultSets=True;TrustServerCertificate=true", + "DatabaseType": "SqlServer", + "LazyLoadingProxiesEnabled": true, + "AuditEntityEnabled": true, + "AutoMigrationEnabled": true + } + }, + "ServiceRequest": { + "BaseAddress": "http://localhost:5235", //通过Request是需要用户权限及服务器支持 + "DefaultRequestHeaders": { + "Accept": "application/json" + } + }, + "SecurityUser": { + "UserPassword": "1b457798-6d49-4b37-93a4-a6e105cce84b202cb962ac59075b964b07152d234b70", + "UserMobile": "13560851330" + } + }, + "Python": { + "PythonCommand": "D:\\Python38\\python38.dll", + "PythonFile": "D:\\Python38\\hanlp\\hanlp_processor.py", + "surnames_path": "D:/Python38/hanlp/dictionary/surnames.txt", + "titles_path": "D:/Python38/hanlp/dictionary/titles.txt", + "words_path": "D:/Python38/hanlp/dictionary/words.txt", + "salutations_path": "D:/Python38/hanlp/dictionary/salutations.txt", + "interlocutors_path": "D:/Python38/hanlp/dictionary/interlocutors.txt" + }, + "IApplicationService": { + "UserId": "000003" //通过Service是不需要用户权限而直接调用 + }, + "AllowedHosts": "*" +}