337 lines
16 KiB
C#
337 lines
16 KiB
C#
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);
|
||
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")
|
||
|
||
*/ |