Spaces:
Runtime error
Runtime error
jianuo
commited on
Commit
•
14a6e16
1
Parent(s):
5ee48fc
代码重钩,将功能模块化,使代码高内聚,第耦合
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- TTSs/base_tts.py +141 -0
- TTSs/elevenlabs_tts.py +89 -49
- TTSs/genshin_api_tts.py +75 -26
- TTSs/genshin_local/__init__.py +1 -0
- TTSs/{genshin → genshin_local/genshin}/.gitignore +0 -0
- TTSs/{genshin → genshin_local/genshin}/.gitmodules +0 -0
- TTSs/{genshin → genshin_local/genshin}/.pre-commit-config.yaml +0 -0
- TTSs/{genshin → genshin_local/genshin}/LICENSE +0 -0
- TTSs/{genshin → genshin_local/genshin}/README.md +0 -0
- TTSs/{genshin → genshin_local/genshin}/__init__.py +0 -0
- TTSs/{genshin → genshin_local/genshin}/attentions.py +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/.gitattributes +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/README.md +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/tokenizer_config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/vocab.txt +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/.gitattributes +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/README.md +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/tokenizer_config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/vocab.txt +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/bert_models.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/.gitattributes +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/README.md +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/added_tokens.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/special_tokens_map.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/tokenizer.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/tokenizer_config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/vocab.txt +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/.gitattributes +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/README.md +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/special_tokens_map.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/tokenizer_config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/vocab.txt +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/.gitattributes +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/README.md +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/special_tokens_map.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/tokenizer.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/tokenizer_config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/.gitattributes +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/README.md +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/generator_config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/tokenizer_config.json +0 -0
- TTSs/{genshin → genshin_local/genshin}/bert_gen.py +0 -0
- TTSs/{genshin → genshin_local/genshin}/clap_gen.py +0 -0
- TTSs/{genshin → genshin_local/genshin}/clap_wrapper.py +0 -0
TTSs/base_tts.py
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import abc
|
2 |
+
import io
|
3 |
+
import scipy.io.wavfile as wavfile
|
4 |
+
from pydub import AudioSegment
|
5 |
+
|
6 |
+
import gradio as gr
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
def mix_background_music(original_audio, 背景音乐, TTS_up, bg_up):
|
11 |
+
original_audio = original_audio + TTS_up
|
12 |
+
|
13 |
+
ori_out = io.BytesIO()
|
14 |
+
original_audio.export(ori_out, format="mp3")
|
15 |
+
ori_out.seek(0)
|
16 |
+
original_audio_bytes = ori_out.read()
|
17 |
+
|
18 |
+
if 背景音乐 is None: # 没有背景音乐
|
19 |
+
return original_audio_bytes, None
|
20 |
+
|
21 |
+
else: # 有背景音乐
|
22 |
+
# 读取用户上传的背景音乐文件
|
23 |
+
wav_io = io.BytesIO()
|
24 |
+
wavfile.write(wav_io, 背景音乐[0], 背景音乐[1])
|
25 |
+
wav_io.seek(0)
|
26 |
+
background_music = AudioSegment.from_wav(wav_io)
|
27 |
+
|
28 |
+
background_music = background_music + bg_up
|
29 |
+
|
30 |
+
# 将背景音乐合并到原始音频中
|
31 |
+
combined = original_audio.overlay(background_music)
|
32 |
+
|
33 |
+
# 使用BytesIO导出合并后的音频为字节串
|
34 |
+
mix_out = io.BytesIO()
|
35 |
+
combined.export(mix_out, format="mp3")
|
36 |
+
mix_out.seek(0) # 重置指针到开始位置
|
37 |
+
combined_audio_bytes = mix_out.read()
|
38 |
+
|
39 |
+
return original_audio_bytes, combined_audio_bytes
|
40 |
+
|
41 |
+
class Base_TTS(metaclass=abc.ABCMeta):
|
42 |
+
default_show = False
|
43 |
+
|
44 |
+
@abc.abstractmethod
|
45 |
+
def _get_config_page(self):
|
46 |
+
"""要求返回2个参数:config和inputs
|
47 |
+
config: gr.Group对象,用于包裹所有的输入项
|
48 |
+
inputs: 一个列表,包含所有的输入项,用于后续的事件绑定,列表的顺序必须和后续_generate方法中参数args的顺序一致
|
49 |
+
|
50 |
+
例如:
|
51 |
+
:return: config, inputs
|
52 |
+
"""
|
53 |
+
|
54 |
+
@abc.abstractmethod
|
55 |
+
def _generate(self, text, *args):
|
56 |
+
"""要求返回一个AudioSegment对象
|
57 |
+
|
58 |
+
:param text: str,要转换为语音的文本
|
59 |
+
:param args: 其他参数,与_get_config_page方法中的inputs一一对应
|
60 |
+
|
61 |
+
:return: original_audio
|
62 |
+
|
63 |
+
示例:
|
64 |
+
original_audio = AudioSegment.from_file(io.BytesIO(original_audio_bytes), format="mp3")
|
65 |
+
return original_audio
|
66 |
+
"""
|
67 |
+
|
68 |
+
@abc.abstractmethod
|
69 |
+
def get_name(self):
|
70 |
+
"""要求返回一个str,是TTS的名称
|
71 |
+
|
72 |
+
:return: name
|
73 |
+
|
74 |
+
示例:
|
75 |
+
return '原神语音合成引擎'
|
76 |
+
"""
|
77 |
+
|
78 |
+
def is_show(self):
|
79 |
+
"""
|
80 |
+
是否显示这个TTS
|
81 |
+
|
82 |
+
:return: True or False
|
83 |
+
"""
|
84 |
+
return True
|
85 |
+
|
86 |
+
def _get_submit_button(self):
|
87 |
+
"""
|
88 |
+
要求返回1个参数:btn
|
89 |
+
btn: gr.Button对象,是提交按钮
|
90 |
+
|
91 |
+
:return: btn
|
92 |
+
"""
|
93 |
+
btn = gr.Button(value="test提交", variant="primary", interactive=True, visible=False)
|
94 |
+
return btn
|
95 |
+
|
96 |
+
def get_config_page(self):
|
97 |
+
self.config, self.inputs = self._get_config_page()
|
98 |
+
if self.default_show:
|
99 |
+
self.config.visible = True
|
100 |
+
else:
|
101 |
+
self.config.visible = False
|
102 |
+
|
103 |
+
def get_submit_button(self):
|
104 |
+
self.btn = self._get_submit_button()
|
105 |
+
if self.default_show:
|
106 |
+
self.btn.visible = True
|
107 |
+
else:
|
108 |
+
self.btn.visible = False
|
109 |
+
|
110 |
+
def set_visible(self, visible: bool):
|
111 |
+
# 检查是否已经获取了config和btn
|
112 |
+
if not hasattr(self, 'config') or not hasattr(self, 'btn'):
|
113 |
+
raise Exception('请先调用get_config_page和get_submit_button方法')
|
114 |
+
|
115 |
+
self.btn.visible = visible
|
116 |
+
self.config.visible = visible
|
117 |
+
|
118 |
+
def create_interface_event(self, text, audio, TTS_up, bg_up, text_output, ori_audio_output, mix_audio_output):
|
119 |
+
"""如果交互方法只是的点击提交按钮,可以不用重写这个方法"""
|
120 |
+
|
121 |
+
# 检查是否已经获取了config和btn
|
122 |
+
if not hasattr(self, 'config') or not hasattr(self, 'btn'):
|
123 |
+
raise Exception('请先调用get_config_page和get_submit_button方法')
|
124 |
+
|
125 |
+
self.btn.click(self.generate, inputs=[
|
126 |
+
text,
|
127 |
+
audio,
|
128 |
+
TTS_up,
|
129 |
+
bg_up
|
130 |
+
] + self.inputs,
|
131 |
+
outputs=[text_output, ori_audio_output, mix_audio_output])
|
132 |
+
|
133 |
+
def generate(self, text, 背景音乐, TTS_up, bg_up, *args):
|
134 |
+
try:
|
135 |
+
original_audio = self._generate(text, *args)
|
136 |
+
|
137 |
+
return None, *mix_background_music(original_audio, 背景音乐, TTS_up, bg_up)
|
138 |
+
except Exception as e:
|
139 |
+
return str(e), None, None
|
140 |
+
|
141 |
+
|
TTSs/elevenlabs_tts.py
CHANGED
@@ -1,20 +1,68 @@
|
|
1 |
import io
|
2 |
-
import
|
3 |
|
4 |
-
import
|
5 |
from elevenlabs import voices, generate, set_api_key, VoiceSettings, Voice
|
6 |
from pydub import AudioSegment
|
7 |
|
8 |
-
from .
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
set_api_key(token)
|
14 |
|
15 |
original_audio_bytes = generate(
|
16 |
text=text,
|
17 |
-
voice=Voice(voice_id=voices_eleven[speakers_eleven[音色选择]].voice_id,
|
18 |
settings=VoiceSettings(stability=stability, similarity_boost=similarity_boost, style=style,
|
19 |
use_speaker_boost=use_speaker_boost)),
|
20 |
model="eleven_multilingual_v2",
|
@@ -23,44 +71,36 @@ def merge_audio(token, text, 背景音乐, 音色选择, stability, similarity_b
|
|
23 |
|
24 |
# 将字节串转换为AudioSegment对象
|
25 |
original_audio = AudioSegment.from_file(io.BytesIO(original_audio_bytes), format="mp3")
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
label['
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
return voices_eleven, speakers_eleven, select_key
|
60 |
-
except Exception as e:
|
61 |
-
print(e)
|
62 |
-
return [], {'获取音色失败': '获取音色失败'}, ['获取音色失败']
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
voices_eleven, speakers_eleven, select_key = get_eleven_spk()
|
|
|
1 |
import io
|
2 |
+
import os
|
3 |
|
4 |
+
import gradio as gr
|
5 |
from elevenlabs import voices, generate, set_api_key, VoiceSettings, Voice
|
6 |
from pydub import AudioSegment
|
7 |
|
8 |
+
from TTSs.base_tts import Base_TTS
|
9 |
+
|
10 |
+
|
11 |
+
class eleven_TTS(Base_TTS):
|
12 |
+
def __init__(self):
|
13 |
+
self.voices_eleven, self.speakers_eleven, self.select_key = self.get_eleven_spk()
|
14 |
+
|
15 |
+
def get_name(self):
|
16 |
+
return 'ElevenLabs'
|
17 |
+
|
18 |
+
def _get_config_page(self):
|
19 |
+
with gr.Group(visible=False) as config:
|
20 |
+
with gr.Row():
|
21 |
+
elevenlabs_api_key = gr.Textbox(label="elevenlabs的API Key(默认为环境变量值)",
|
22 |
+
placeholder="请输入elevenlabs的API Key",
|
23 |
+
type="password",
|
24 |
+
interactive=True,
|
25 |
+
value=os.environ.get('ELEVENLABS_API_KEY', ''))
|
26 |
+
speaker_eleven = gr.Dropdown(choices=self.select_key,
|
27 |
+
value=self.select_key[0], label="音色选择",
|
28 |
+
interactive=True)
|
29 |
+
with gr.Blocks():
|
30 |
+
with gr.Row():
|
31 |
+
stability = gr.Slider(minimum=0, maximum=1, value=0.5, label='stability', interactive=True)
|
32 |
+
similarity_boost = gr.Slider(minimum=0, maximum=1, value=0.75, label='similarity_boost',
|
33 |
+
interactive=True)
|
34 |
+
|
35 |
+
with gr.Row():
|
36 |
+
style = gr.Slider(minimum=0, maximum=1, value=0, label='style', interactive=True)
|
37 |
+
use_speaker_boost = gr.Checkbox(label="Use Speaker Boost", value=True, interactive=True)
|
38 |
+
|
39 |
+
inputs = [
|
40 |
+
elevenlabs_api_key,
|
41 |
+
speaker_eleven,
|
42 |
+
stability,
|
43 |
+
similarity_boost,
|
44 |
+
style,
|
45 |
+
use_speaker_boost
|
46 |
+
]
|
47 |
+
|
48 |
+
return config, inputs
|
49 |
+
|
50 |
+
def _get_submit_button(self):
|
51 |
+
"""
|
52 |
+
要求返回1个参数:btn
|
53 |
+
btn: gr.Button对象,是提交按钮
|
54 |
+
|
55 |
+
:return: btn
|
56 |
+
"""
|
57 |
+
btn = gr.Button(value="ElevenLabs提交", variant="primary", interactive=True, visible=False)
|
58 |
+
return btn
|
59 |
+
|
60 |
+
def _generate(self, text, token, 音色选择, stability, similarity_boost, style, use_speaker_boost):
|
61 |
set_api_key(token)
|
62 |
|
63 |
original_audio_bytes = generate(
|
64 |
text=text,
|
65 |
+
voice=Voice(voice_id=self.voices_eleven[self.speakers_eleven[音色选择]].voice_id,
|
66 |
settings=VoiceSettings(stability=stability, similarity_boost=similarity_boost, style=style,
|
67 |
use_speaker_boost=use_speaker_boost)),
|
68 |
model="eleven_multilingual_v2",
|
|
|
71 |
|
72 |
# 将字节串转换为AudioSegment对象
|
73 |
original_audio = AudioSegment.from_file(io.BytesIO(original_audio_bytes), format="mp3")
|
74 |
+
return original_audio
|
75 |
+
|
76 |
+
def get_eleven_spk(self):
|
77 |
+
try:
|
78 |
+
voices_eleven = voices()
|
79 |
+
speakers_eleven = {}
|
80 |
+
for i, v in enumerate(voices_eleven):
|
81 |
+
label = {}
|
82 |
+
label['口音'] = v.labels.get('accent')
|
83 |
+
|
84 |
+
if 'description ' in v.labels:
|
85 |
+
label['描述'] = v.labels['description ']
|
86 |
+
elif 'description' in v.labels:
|
87 |
+
label['描述'] = v.labels['description']
|
88 |
+
|
89 |
+
label['年龄'] = v.labels['age']
|
90 |
+
label['性别'] = v.labels['gender']
|
91 |
+
|
92 |
+
if 'use case' in v.labels:
|
93 |
+
label['用例'] = v.labels['use case']
|
94 |
+
elif 'usecase' in v.labels:
|
95 |
+
label['用例'] = v.labels['usecase']
|
96 |
+
else:
|
97 |
+
raise Exception('use case not found')
|
98 |
+
|
99 |
+
key = v.name + '-' + str(label)
|
100 |
+
speakers_eleven[key] = i
|
101 |
+
select_key = list(speakers_eleven.keys())
|
102 |
+
|
103 |
+
return voices_eleven, speakers_eleven, select_key
|
104 |
+
except Exception as e:
|
105 |
+
print(e)
|
106 |
+
return [], {'获取音色失败': '获取音色失败'}, ['获取音色失败']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TTSs/genshin_api_tts.py
CHANGED
@@ -1,46 +1,95 @@
|
|
1 |
import io
|
2 |
import json
|
|
|
3 |
|
|
|
4 |
import requests
|
5 |
from pydub import AudioSegment
|
6 |
|
7 |
-
from .
|
8 |
|
9 |
|
10 |
-
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
speed = (100 - length) / 100
|
13 |
headers = {'Content-Type': 'application/json'}
|
14 |
infer_info = {'lang': 'zh', 'appid': appid, 'token': token, 'speaker': speaker, 'text': text,
|
15 |
'sdp_ratio': sdp, 'noise': noise, 'noisew': noisew, 'length': speed}
|
16 |
-
resp = requests.post(url=f"{genshin_api}/api/ex/vits", headers=headers,
|
17 |
data=json.dumps(infer_info))
|
18 |
data = json.loads(resp.text)
|
19 |
|
20 |
wmv_file = requests.get(data["audio"]).content
|
21 |
|
22 |
original_audio = AudioSegment.from_wav(io.BytesIO(wmv_file))
|
|
|
23 |
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
return
|
28 |
-
|
29 |
-
|
30 |
-
def get_spk():
|
31 |
-
resp = requests.get(url=f"{genshin_api}/spklist/spks.json")
|
32 |
-
data = json.loads(resp.text)
|
33 |
-
return data
|
34 |
-
|
35 |
-
|
36 |
-
def search_speaker(search_value):
|
37 |
-
for s in speakers_genshin:
|
38 |
-
if search_value == s:
|
39 |
-
return s
|
40 |
-
for s in speakers_genshin:
|
41 |
-
if search_value in s:
|
42 |
-
return s
|
43 |
-
|
44 |
|
45 |
-
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import io
|
2 |
import json
|
3 |
+
import os
|
4 |
|
5 |
+
import gradio as gr
|
6 |
import requests
|
7 |
from pydub import AudioSegment
|
8 |
|
9 |
+
from TTSs.base_tts import Base_TTS
|
10 |
|
11 |
|
12 |
+
class genshin_api_TTS(Base_TTS):
|
13 |
+
def __init__(self):
|
14 |
+
self.genshin_api = "https://tirs.ai-lab.top"
|
15 |
+
self.speakers_genshin = self.get_spk()
|
16 |
+
|
17 |
+
def get_name(self):
|
18 |
+
return '原神语音合成-api'
|
19 |
+
|
20 |
+
def _get_submit_button(self):
|
21 |
+
"""
|
22 |
+
要求返回1个参数:btn
|
23 |
+
btn: gr.Button对象,是提交按钮
|
24 |
+
|
25 |
+
:return: btn
|
26 |
+
"""
|
27 |
+
btn = gr.Button(value="原神提交", variant="primary", interactive=True, visible=False)
|
28 |
+
return btn
|
29 |
+
|
30 |
+
def _get_config_page(self):
|
31 |
+
with gr.Group(visible=False) as config_genshin_api:
|
32 |
+
gr.Markdown('原作者:https://modelscope.cn/studios/erythrocyte/Bert-VITS2_Genshin_TTS/summary')
|
33 |
+
with gr.Row():
|
34 |
+
token = gr.Textbox(label="AccessToken", placeholder="请输入AccessToken",
|
35 |
+
type="password",
|
36 |
+
interactive=True, value=os.environ.get('GENSHIN_API_KEY', ''))
|
37 |
+
appid = gr.Textbox(label="AppID", placeholder="请输入AppID", interactive=True,
|
38 |
+
value='ig8t76x6036h3hpw')
|
39 |
+
with gr.Row():
|
40 |
+
gr.Markdown(
|
41 |
+
"AppID不要改,AccessToken最好换自己的。")
|
42 |
+
|
43 |
+
with gr.Row():
|
44 |
+
speaker = gr.Dropdown(choices=self.speakers_genshin,
|
45 |
+
value=self.speakers_genshin[0], label="角色",
|
46 |
+
interactive=True)
|
47 |
+
search = gr.Textbox(label="搜索角色", lines=1, interactive=True)
|
48 |
+
btn2 = gr.Button(value="搜索")
|
49 |
+
with gr.Column():
|
50 |
+
with gr.Row():
|
51 |
+
sdp_ratio = gr.Slider(minimum=0, maximum=1, value=0.2, step=0.1, label="SDP/DP 混合比",
|
52 |
+
interactive=True)
|
53 |
+
noise_scale = gr.Slider(minimum=0.1, maximum=2, value=0.6, step=0.1, label="感情",
|
54 |
+
interactive=True)
|
55 |
+
with gr.Row():
|
56 |
+
noise_scale_w = gr.Slider(minimum=0.1, maximum=2, value=0.8, step=0.1, label="音素长度",
|
57 |
+
interactive=True)
|
58 |
+
length_scale = gr.Slider(minimum=-99, maximum=99, value=0, step=0.1, label="语速(%)",
|
59 |
+
interactive=True)
|
60 |
+
|
61 |
+
btn2.click(self.search_speaker, inputs=[search], outputs=[speaker])
|
62 |
+
|
63 |
+
inputs = [
|
64 |
+
token, appid, speaker, sdp_ratio, noise_scale, noise_scale_w,
|
65 |
+
length_scale
|
66 |
+
]
|
67 |
+
|
68 |
+
return config_genshin_api, inputs
|
69 |
+
|
70 |
+
def _generate(self, text, token, appid, speaker, sdp, noise, noisew, length):
|
71 |
speed = (100 - length) / 100
|
72 |
headers = {'Content-Type': 'application/json'}
|
73 |
infer_info = {'lang': 'zh', 'appid': appid, 'token': token, 'speaker': speaker, 'text': text,
|
74 |
'sdp_ratio': sdp, 'noise': noise, 'noisew': noisew, 'length': speed}
|
75 |
+
resp = requests.post(url=f"{self.genshin_api}/api/ex/vits", headers=headers,
|
76 |
data=json.dumps(infer_info))
|
77 |
data = json.loads(resp.text)
|
78 |
|
79 |
wmv_file = requests.get(data["audio"]).content
|
80 |
|
81 |
original_audio = AudioSegment.from_wav(io.BytesIO(wmv_file))
|
82 |
+
return original_audio
|
83 |
|
84 |
+
def get_spk(self):
|
85 |
+
resp = requests.get(url=f"{self.genshin_api}/spklist/spks.json")
|
86 |
+
data = json.loads(resp.text)
|
87 |
+
return data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
|
89 |
+
def search_speaker(self, search_value):
|
90 |
+
for s in self.speakers_genshin:
|
91 |
+
if search_value == s:
|
92 |
+
return s
|
93 |
+
for s in self.speakers_genshin:
|
94 |
+
if search_value in s:
|
95 |
+
return s
|
TTSs/genshin_local/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
from .genshin_local_tts import genshin_local_TTS
|
TTSs/{genshin → genshin_local/genshin}/.gitignore
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/.gitmodules
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/.pre-commit-config.yaml
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/LICENSE
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/README.md
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/__init__.py
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/attentions.py
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/.gitattributes
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/README.md
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/tokenizer_config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-base-japanese-v3/vocab.txt
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/.gitattributes
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/README.md
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/tokenizer_config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert-large-japanese-v2/vocab.txt
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/bert_models.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/.gitattributes
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/README.md
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/added_tokens.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/special_tokens_map.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/tokenizer.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/tokenizer_config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/chinese-roberta-wwm-ext-large/vocab.txt
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/.gitattributes
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/README.md
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/special_tokens_map.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/tokenizer_config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese-char-wwm/vocab.txt
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/.gitattributes
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/README.md
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/special_tokens_map.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/tokenizer.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v2-large-japanese/tokenizer_config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/.gitattributes
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/README.md
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/generator_config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert/deberta-v3-large/tokenizer_config.json
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/bert_gen.py
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/clap_gen.py
RENAMED
File without changes
|
TTSs/{genshin → genshin_local/genshin}/clap_wrapper.py
RENAMED
File without changes
|