using CloudBuilder.AI.Policy; 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 SoVITS { public readonly Python39Command python; public Dictionary Voices = new Dictionary(); public SoVITS(Python39Command python) { InitVoice(); this.python = python; string file = python.ApplicationService.Configuration["Python39:PythonFile"]!; if (!File.Exists(file)) return; string init = File.ReadAllText(file, Encoding.UTF8); File.AppendAllText("log.txt", "SoVITS:" + file + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n"); using (Py.GIL()) { try { python.Exec(init); } catch (Exception ex) { File.AppendAllText("log.txt", "SoVITS-Exec:" + ex.Message + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n"); } File.AppendAllText("log.txt", "SoVITS-Exec:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n"); } } private void InitVoice() { Voices.Add(SoVITSTtsVoice.OLD_MAN1, new VoiceInfo() { FileName = "old_man1.wav", Sentence = "老松根底下埋着半坛酒,三十年前埋的,如今该叫它等待。" }); Voices.Add(SoVITSTtsVoice.OLD_MAN2, new VoiceInfo() { FileName = "old_man2.wav", Sentence = "子时风起,你听见房梁上那东西爬动的声音了吗,它说等你熄灯就下来。" }); Voices.Add(SoVITSTtsVoice.OLD_MAN3, new VoiceInfo() { FileName = "old_man3.wav", Sentence = "闺女啊,当年你爸追你妈用的二八大杠,现在共享单车扫不出我这颗老心跳。" }); Voices.Add(SoVITSTtsVoice.OLD_MAN4, new VoiceInfo() { FileName = "old_man4.wav", Sentence = "在纳粹集中营里,父亲用谎言为儿子编织了一个美丽的世界。" }); Voices.Add(SoVITSTtsVoice.OLD_MAN5, new VoiceInfo() { FileName = "old_man5.wav", Sentence = "张超与李亚男,两位听障手语主播,在汽车直播间里写下奇迹。" }); Voices.Add(SoVITSTtsVoice.OLD_MAN6, new VoiceInfo() { FileName = "old_man6.wav", Sentence = "程蝶衣不疯魔不成活的京戏人生,与段小楼跨越半个世纪的爱恨纠缠。" }); Voices.Add(SoVITSTtsVoice.OLD_MAN7, new VoiceInfo() { FileName = "old_man7.wav", Sentence = "少女闯入神隐世界,父母因贪吃变成猪。汤婆婆的油屋充满日本妖怪图鉴。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_MAN1, new VoiceInfo() { FileName = "middle_aged_man1.wav", Sentence = "星星之所以闪耀,是因为它们熬过了最深的黑夜。你的坚持,也会在某个时刻照亮自己。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_MAN2, new VoiceInfo() { FileName = "middle_aged_man2.wav", Sentence = "唐僧-阿弥陀佛,善哉善哉。出家人以慈悲为怀。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_MAN3, new VoiceInfo() { FileName = "middle_aged_man3.wav", Sentence = "它们的冒险故事充满了欢乐和惊喜,让我们仿佛回到了童年,心情轻松愉悦。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_MAN4, new VoiceInfo() { FileName = "middle_aged_man4.wav", Sentence = "电影中的故事发生在一个动荡的时代,主人公们在乱世中挣扎求生,他们的选择和行动将决定自己和他人的命运。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_MAN5, new VoiceInfo() { FileName = "middle_aged_man5.wav", Sentence = "舅舅当过地质勘探员,他给我看他拍的照片。戈壁滩上有一棵树,孤零零的。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_MAN6, new VoiceInfo() { FileName = "middle_aged_man6.wav", Sentence = "我想一个人旅行,背上简单的行囊,踏上行程,走过一个又一个陌生的城市。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_MAN7, new VoiceInfo() { FileName = "middle_aged_man7.wav", Sentence = "这款新型科技产品,拥有强大的功能和便捷的操作。它将改变我们的生活方式。" }); Voices.Add(SoVITSTtsVoice.YOUNG_MALE1, new VoiceInfo() { FileName = "young_male1.wav", Sentence = "我是磁性配音员超然,我的声音自然悦耳,磁性动听,如果选我给你的视频配音,绝对能让你的视频星光熠熠。" }); Voices.Add(SoVITSTtsVoice.YOUNG_MALE2, new VoiceInfo() { FileName = "young_male2.wav", Sentence = "纳斯达克的曲线再陡,也陡不过你递咖啡时,袖口露出的那道未愈的创可贴。" }); Voices.Add(SoVITSTtsVoice.YOUNG_MALE3, new VoiceInfo() { FileName = "young_male3.wav", Sentence = "你知道的,我的爸妈都是本市知名的企业家和慈善家,只要我动动嘴,就能让你们一家流落街头,无家可归。" }); Voices.Add(SoVITSTtsVoice.YOUNG_MALE4, new VoiceInfo() { FileName = "young_male4.wav", Sentence = "人生不就是充满各种意外吗和你一起,哪里都是风景。还有啊,事情发生了,我们就往前看。" }); Voices.Add(SoVITSTtsVoice.YOUNG_MALE5, new VoiceInfo() { FileName = "young_male5.wav", Sentence = "深夜的老式挂钟敲了第十一下,刑侦队长周正站在案情板前,案件发生在封闭的别墅内。" }); Voices.Add(SoVITSTtsVoice.YOUNG_MALE6, new VoiceInfo() { FileName = "young_male6.wav", Sentence = "他录一档古风知识科普,讲宋代点茶。声音像刚烧开的水,不急不沸,刚刚好的温度。" }); Voices.Add(SoVITSTtsVoice.YOUNG_MALE7, new VoiceInfo() { FileName = "young_male7.wav", Sentence = "夜色渐深,让忙碌的心慢慢静下来。每一天都是新的礼物,不必急于追赶。" }); Voices.Add(SoVITSTtsVoice.MALE_CHILD1, new VoiceInfo() { FileName = "male_child1.wav", Sentence = "电影中,一群勇敢的人踏上了寻找真相的征程,他们穿越险恶的环境,揭开了一个隐藏多年的秘密。" }); Voices.Add(SoVITSTtsVoice.MALE_CHILD2, new VoiceInfo() { FileName = "male_child2.wav", Sentence = "嘿,再叫俺臭狗熊,俺就揍你咧。俺知道你的生活艰难,但俺帮不了你什么,要不俺把蜂蜜给你吧。" }); Voices.Add(SoVITSTtsVoice.MALE_CHILD3, new VoiceInfo() { FileName = "male_child3.wav", Sentence = "没错!我就是个笨蛋!派大星,我们一起去抓水母吧,我们一起度过快乐的一天。" }); Voices.Add(SoVITSTtsVoice.MALE_CHILD4, new VoiceInfo() { FileName = "male_child4.wav", Sentence = "最近收到不少网友的反馈,说我话有点儿多,更过分的想要找代打来狗熊岭教训我。" }); Voices.Add(SoVITSTtsVoice.ELDERLY_FEMALE1, new VoiceInfo() { FileName = "elderly_female1.wav", Sentence = "无谓幼长,人生皆苦短。若少时通悟,少不了几分漠然。" }); Voices.Add(SoVITSTtsVoice.ELDERLY_FEMALE2, new VoiceInfo() { FileName = "elderly_female2.wav", Sentence = "我试图寻找一丝丝安慰,却发现一切都显得无济于事。" }); Voices.Add(SoVITSTtsVoice.ELDERLY_FEMALE3, new VoiceInfo() { FileName = "elderly_female3.wav", Sentence = "每天我都要走到巷口等信,腿疼也要去。邮递员说没有我的信。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_FEMALE1, new VoiceInfo() { FileName = "middle_aged_female1.wav", Sentence = "高墙关不住希望,20年凿壁之声是自由的呐喊。有些鸟羽毛太耀眼,注定要飞向光。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_FEMALE2, new VoiceInfo() { FileName = "middle_aged_female2.wav", Sentence = "武林风雨中,宫二用一生诠释“念念不忘,必有回响”。一口气,一盏灯,武学即人生。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_FEMALE3, new VoiceInfo() { FileName = "middle_aged_female3.wav", Sentence = "倒数第一考进庆应大学。垫底时流的泪,会变成逆袭时的光——教育是普通人最公平的战场。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_FEMALE4, new VoiceInfo() { FileName = "middle_aged_female4.wav", Sentence = "这个电影的色调也太暗淡了吧,跟我的心情一样沉闷。主角们好像也没什么精神。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_FEMALE5, new VoiceInfo() { FileName = "middle_aged_female5.wav", Sentence = "诺兰邀请物理学家设计的黑洞画面,让硬核科幻有了最诗意的注解。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_FEMALE6, new VoiceInfo() { FileName = "middle_aged_female6.wav", Sentence = "一部好的电影,能让人思考人生。就是这样的作品,它让中年的我们停下脚步,回顾自己的人生旅程。" }); Voices.Add(SoVITSTtsVoice.MIDDLE_AGED_FEMALE7, new VoiceInfo() { FileName = "middle_aged_female7.wav", Sentence = "行吧,这讲的就是一群人瞎折腾,也不知道在干嘛。主角一会儿这样一会儿那样,烦死了" }); Voices.Add(SoVITSTtsVoice.YOUNG_FEMALE1, new VoiceInfo() { FileName = "young_female1.wav", Sentence = "清洁工解出世界数学难题。天才的救赎不在公式里,在直面伤疤的勇气中。" }); Voices.Add(SoVITSTtsVoice.YOUNG_FEMALE2, new VoiceInfo() { FileName = "young_female2.wav", Sentence = "该片讲述了一个关于家庭和亲情的故事,主角们在面对家庭的变故时,展现出了坚强和勇敢的一面。" }); Voices.Add(SoVITSTtsVoice.YOUNG_FEMALE3, new VoiceInfo() { FileName = "young_female3.wav", Sentence = "可爱的小动物们在草地上嬉戏玩耍。它们活泼可爱的模样让人忍俊不禁。看着这些小生命,心中充满了温暖与喜悦。" }); Voices.Add(SoVITSTtsVoice.YOUNG_FEMALE4, new VoiceInfo() { FileName = "young_female4.wav", Sentence = "天哪!这真是太令人震惊了,我从未想过会发生这样的事情。这真是太不可思议了,简直让人难以置信,我真是被这个消息惊呆了!" }); Voices.Add(SoVITSTtsVoice.YOUNG_FEMALE5, new VoiceInfo() { FileName = "young_female5.wav", Sentence = "生动是奶奶讲故事时的表情,皱纹里藏着风霜,眼睛里却闪着光,把几十年前的旧事,说得像发生在昨天。" }); Voices.Add(SoVITSTtsVoice.YOUNG_FEMALE6, new VoiceInfo() { FileName = "young_female6.wav", Sentence = "草莓蛋糕发霉了?就像你夹在情书里的谎言,甜腻裹着蛆虫!" }); Voices.Add(SoVITSTtsVoice.YOUNG_FEMALE7, new VoiceInfo() { FileName = "young_female7.wav", Sentence = "人生就像一场马拉松,需要耐力、毅力和坚定的信念。无论面对什么挑战,我们都要积极应对。" }); Voices.Add(SoVITSTtsVoice.FEMALE_CHILD1, new VoiceInfo() { FileName = "female_child1.wav", Sentence = "哇,美丽的小马们来啦!紫悦很爱学习,苹果嘉儿很勇敢。" }); Voices.Add(SoVITSTtsVoice.FEMALE_CHILD2, new VoiceInfo() { FileName = "female_child2.wav", Sentence = "这部电影描绘了一个神秘而奇幻的世界,主人公们在其中展开了一场惊心动魄的冒险。" }); Voices.Add(SoVITSTtsVoice.FEMALE_CHILD3, new VoiceInfo() { FileName = "female_child3.wav", Sentence = "影片中,一个平凡的人意外获得了特殊的能力。" }); Voices.Add(SoVITSTtsVoice.FEMALE_CHILD4, new VoiceInfo() { FileName = "female_child4.wav", Sentence = "这部电影构建了一个宏大的宇宙观,各个星球的生物在其中展开了一场激烈的争斗,关乎着整个宇宙的命运。" }); } public void Generate(string text, VoiceInfo voice, string saveFilePath) { try { string template = python.ApplicationService.Configuration["Python39:Template"]!; //必须定义方法的方式使用 using (Py.GIL()) { string exec = $"api.generate(ref_wav_path=r\"{Path.Combine(template, voice.FileName)}\",prompt_text=\"{voice.Sentence}\",text=\"{text}\",output_path=r\"{saveFilePath}\")"; python.Exec(exec); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } public class VoiceInfo { public VoiceInfo() { } public string FileName { get; set; } public string Sentence { get; set; } } } /* import os import sys import random # Change to project directory這個是針對C#的環境 os.chdir(r"F:\GPT-SoVITS\GPT-SoVITS-v2pro-20250604") sys.path.insert(0, os.getcwd()) now_dir = os.getcwd() sys.path.append(now_dir) sys.path.append("%s/GPT_SoVITS" % (now_dir)) print(f"Current directory: {now_dir}") print(f"Python path: {sys.executable}") from gpt_sovits_api import GPTSoVITSAPI print("\nInitializing GPT-SoVITS API...") api = GPTSoVITSAPI(version="v2ProPlus") */