CloudBuilder.Topshelf/Python/SoVITS.cs
owenchen 2c6475b2d5 ow
2026-06-22 17:02:26 +08:00

328 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<SoVITSTtsVoice, VoiceInfo> Voices = new Dictionary<SoVITSTtsVoice, VoiceInfo>();
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);
using (Py.GIL())
{
python.Exec(init);
}
}
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")
*/