Skip to content

Commit

Permalink
nvl模式逻辑修改
Browse files Browse the repository at this point in the history
  • Loading branch information
haruhi committed Sep 30, 2024
1 parent 57da343 commit 6d757cc
Show file tree
Hide file tree
Showing 16 changed files with 59 additions and 245 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
/.idea
*.pyc
/build
*.spec
*.spec
/.vscode
5 changes: 1 addition & 4 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,8 @@
|--app.py 程序入口
```
## 语音合成使用说明
目前仅支持通过API方式调用`GPT-SoVITS-V2`
目前仅支持通过API方式调用[GPT-SoVITS-V2](https://github.com/RVC-Boss/GPT-SoVITS),可在本地部署此项目或使用他人的在线服务。

语音合成的相关配置项位于`./const/tts_setting.py`

请参考`./test/`中的示例表格进行编辑。

## 打包程序
- 工具: pyinstaller
Expand Down
10 changes: 9 additions & 1 deletion app.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def __init__(self, master=None):
self.voice_cmd_mapping = tts_config.voice_cmd_mapping
self.default_prompt_text = tts_config.default_prompt_text
self.default_prompt_audio = tts_config.default_prompt_audio
self.deepL_api_key = tts_config.deepL_api_key
self.save_config_gui = tts_config.save_config_gui
self.delete_role_gui = tts_config.delete_role
self.delete_voice_cmd_gui = tts_config.delete_voice_cmd
Expand Down Expand Up @@ -148,12 +149,19 @@ def createConfigWidgets(self):
self.api_base_entry = Entry(self.config_tab)
self.api_base_entry.place(relx=0.32, rely=0.75, relwidth=0.4, relheight=0.05)
self.api_base_entry.insert(0, self.API_BASE_URL['base'])

self.deepL_api_label = Label(self.config_tab, text='DeepL API_KEY:', style='TLabel')
self.deepL_api_label.place(relx=0.20, rely=0.80, relwidth=0.2, relheight=0.05)
self.deepL_api_entry = Entry(self.config_tab)
self.deepL_api_entry.place(relx=0.32, rely=0.80, relwidth=0.4, relheight=0.05)
self.deepL_api_entry.insert(0, self.deepL_api_key)

def save_config_try(self):

self.default_prompt_audio = self.default_audio_entry.get()
self.default_prompt_text = self.default_text_entry.get()
self.api_base_url = {'base': self.api_base_entry.get()}
self.deepL_api_key = self.deepL_api_entry.get()

# 更新角色模型映射
if self.last_selected_role:
Expand All @@ -168,7 +176,7 @@ def save_config_try(self):
'prompt_text':self.prompt_text_entry.get()
}

self.save_config_gui(self.default_prompt_text, self.default_prompt_audio, self.api_base_url, self.role_model_mapping, self.voice_cmd_mapping)
self.save_config_gui(self.default_prompt_text, self.default_prompt_audio, self.api_base_url, self.role_model_mapping, self.voice_cmd_mapping, self.deepL_api_key)

def add_role(self):
new_role = simpledialog.askstring("新增角色", "请输入角色名:")
Expand Down
25 changes: 13 additions & 12 deletions config.json
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
{
"role_model_mapping": {
"长门": {
"gpt": "GPT_weights_v2/nagato_yuki-e15.ckpt11",
"sovits": "SoVITS_weights_v2/nagato_yuki_e15_s2160.pth11"
"长门有希": {
"gpt": "GPT_weights_v2/nagato_yuki-e15.ckpt",
"sovits": "SoVITS_weights_v2/nagato_yuki_e15_s2160.pth"
},
"角色2": {
"gpt": "",
"sovits": ""
"your_first_character": {
"gpt": "角色名应与你在表格中填写的角色名相同,熟悉后请新建角色使用",
"sovits": "如果你在本地运行API,请填写本地模型位置,否则请咨询在线服务的提供者"
}
},
"voice_cmd_mapping": {
"voice_cmd_1": {
"ref_audio_path": "path_to_reference_1.wav21313",
"prompt_text": "Prompt text for 123"
"ref_audio_path": "仅当你使用表格中的语音指令列时,才需要用到此项",
"prompt_text": "否则仅需配置默认参考音频及文本便可"
},
"voice_cmd_2": {
"ref_audio_path": "",
"prompt_text": ""
"ref_audio_path": "这一额外参数可帮助你针对不同情况使用不同的参考音频与文本",
"prompt_text": "熟悉后请新建指令使用,选择你需要的命名方式"
}
},
"default_prompt_audio": "D:/GPT-SoVITS-v2-240821/predef_ref/正常有希/01_有希_平静.wav",
"default_prompt_audio": "./predef_ref/正常有希/01_有希_平静.wav",
"default_prompt_text": "私が再び異常動作を起こさないという確証はない。",
"API_BASE_URL": {
"base": "http://127.0.0.1:9880/"
}
},
"deepL_api_key": "YOUR_DEEPL_API_KEY"
}
23 changes: 11 additions & 12 deletions const/converter_setting.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,18 @@
ElementColNumMapping = {
'role_name': 0,
'text': 1,
'music': 18,
'character': 19,
'change_page': 20,
'background': 21,
'remark': 22,
'mode': 23,
'sound': 24,
'transition': 25,
'special': 26,
'voice': 27,
'character': 18,
'background': 19,
'transition': 20,
'music': 21,
'voice': 22,
'voice_cmd':23,
'mode': 24,
'change_page': 25,
'sound': 26,
'side_character': 27,
'menu': 28,
'side_character': 29,
'voice_cmd':30,
'remark': 29,
}

# 元素映射
Expand Down
61 changes: 14 additions & 47 deletions const/tts_setting.py
Original file line number Diff line number Diff line change
@@ -1,71 +1,35 @@
'''
#为角色选择对应的模型路径
role_model_mapping = {
"长门": {
"gpt": "GPT_weights_v2/nagato_yuki-e15.ckpt",
"sovits": "SoVITS_weights_v2/nagato_yuki_e15_s2160.pth"
},
"角色2": {
"gpt": "gpt_model_2_path",
"sovits": "sovits_model_2_path"
},
# 添加更多角色...
}
#为语音指令选项自定义请求参数
voice_cmd_mapping = {
"voice_cmd_1": {
"ref_audio_path": "path_to_reference_1.wav",
"prompt_text": "Prompt text for voice_cmd_1"
},
"voice_cmd_2": {
"ref_audio_path": "path_to_reference_2.wav",
"prompt_text": "Prompt text for voice_cmd_2"
},
# 添加更多映射...
}
#选择无语音指令状态下的默认参考音频及其对应文本
default_prompt_audio = "D:/GPT-SoVITS-v2-240821/predef_ref/正常有希/01_有希_平静.wav"
default_prompt_text = "私が再び異常動作を起こさないという確証はない。"
#选择API端点
API_BASE_URL = {
'base': 'http://127.0.0.1:9880/'
}
'''

import json
import os

class TTSConfig:
def __init__(self, config_file='config.json'):
self.config_file = config_file
self.role_model_mapping = {
"长门": {
"长门有希": {
"gpt": "GPT_weights_v2/nagato_yuki-e15.ckpt",
"sovits": "SoVITS_weights_v2/nagato_yuki_e15_s2160.pth"
},
"角色2": {
"gpt": "gpt_model_2_path",
"sovits": "sovits_model_2_path"
"your_first_character": {
"gpt": "角色名应与你在表格中填写的角色名相同,熟悉后请新建角色使用",
"sovits": "如果你在本地运行API,请填写本地模型位置,否则请咨询在线服务的提供者"
},
# 添加更多角色...
}
self.voice_cmd_mapping = {
"voice_cmd_1": {
"ref_audio_path": "path_to_reference_1.wav",
"prompt_text": "Prompt text for voice_cmd_1"
"ref_audio_path": "仅当你使用表格中的语音指令列时,才需要用到此项",
"prompt_text": "否则仅需配置默认参考音频及文本便可"
},
"voice_cmd_2": {
"ref_audio_path": "path_to_reference_2.wav",
"prompt_text": "Prompt text for voice_cmd_2"
"ref_audio_path": "这一额外参数可帮助你针对不同情况使用不同的参考音频与文本",
"prompt_text": "熟悉后请新建指令使用,选择你需要的命名方式"
},
# 添加更多映射...
}
self.default_prompt_audio = "D:/GPT-SoVITS-v2-240821/predef_ref/正常有希/01_有希_平静.wav"
self.default_prompt_audio = "./predef_ref/正常有希/01_有希_平静.wav"
self.default_prompt_text = "私が再び異常動作を起こさないという確証はない。"
self.api_base_url = {'base': 'http://127.0.0.1:9880/'}
self.deepL_api_key = "YOUR_DEEPL_API_KEY"

if os.path.exists(self.config_file):
self.load_config()
Expand All @@ -80,6 +44,7 @@ def load_config(self):
self.default_prompt_audio = config['default_prompt_audio']
self.default_prompt_text = config['default_prompt_text']
self.api_base_url = config['API_BASE_URL']
self.deepL_api_key = config['deepL_api_key']

def save_config(self):
config = {
Expand All @@ -88,17 +53,19 @@ def save_config(self):
'default_prompt_audio': self.default_prompt_audio,
'default_prompt_text': self.default_prompt_text,
'API_BASE_URL': self.api_base_url,
'deepL_api_key': self.deepL_api_key
}
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(config, f, indent=4, ensure_ascii=False)

def save_config_gui(self, default_prompt_text, default_prompt_audio, api_base_url, role_model_mapping, voice_cmd_mapping):
def save_config_gui(self, default_prompt_text, default_prompt_audio, api_base_url, role_model_mapping, voice_cmd_mapping, deepL_api_key):
config = {
'role_model_mapping': role_model_mapping,
'voice_cmd_mapping': voice_cmd_mapping,
'default_prompt_audio': default_prompt_audio,
'default_prompt_text': default_prompt_text,
'API_BASE_URL': api_base_url,
'deepL_api_key': deepL_api_key
}
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(config, f, indent=4, ensure_ascii=False)
Expand Down
Binary file modified dist/Excel2RpyScript.exe
Binary file not shown.
14 changes: 7 additions & 7 deletions handler/converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,17 +123,17 @@ def _converter_mode(self):
def _converter_role(self):
# 角色
role_name = self.row[ElementColNumMapping.get('role_name')]
if role_name not in ["", "旁白"]:
# 当其他角色出现时,重置模式为nvl
if role_name and role_name != "旁白":
# 当新的角色名出现时,切换到该角色
self.converter.current_role = self.converter.add_role(role_name)
elif role_name == "" and self.converter.current_mode == "":
#self.converter.current_mode = "nvl" # 可选:根据需要设置当前模式
elif role_name == "":
# 空角色名时,保持当前角色不变
return self.converter.current_role
else:
# 处理旁白角色或其他情况
self.converter.current_role = Role("narrator_{}".format(self.converter.current_mode), "None")
# elif role_name != "":
# # 当其他角色出现时,重置模式为nvl
# self.converter.current_role = self.converter.add_role(role_name)
# self.converter.current_mode = "nvl"

return self.converter.current_role

def _converter_text(self):
Expand Down
3 changes: 2 additions & 1 deletion handler/tts.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def __init__(self,conveter):
self.voice_cmd_mapping = tts_config.voice_cmd_mapping
self.default_prompt_text = tts_config.default_prompt_text
self.default_prompt_audio = tts_config.default_prompt_audio
self.deepL_api_key = tts_config.deepL_api_key



Expand Down Expand Up @@ -84,7 +85,7 @@ def translate_text(self, text, target_lang):
# DeepL API翻译方法
api_url = "https://api-free.deepl.com/v2/translate"
params = {
"auth_key": "a3db6896-b41d-460a-bdbd-402d53c9eadc:fx", # 替换为你的API密钥
"auth_key": self.deepL_api_key, # 替换为你的API密钥
"text": text,
"target_lang": target_lang,
}
Expand Down
13 changes: 0 additions & 13 deletions how-to-use.MD

This file was deleted.

Binary file added predef_ref/01_有希_平静.wav
Binary file not shown.
34 changes: 0 additions & 34 deletions test/Sheet2.rpy

This file was deleted.

Loading

0 comments on commit 6d757cc

Please sign in to comment.