|
import os |
|
|
|
import gradio as gr |
|
|
|
from TTSs import elevenlabs_tts |
|
from TTSs import genshin_api_tts |
|
from TTSs import openai_tts |
|
from TTSs import reecho_ai |
|
from TTSs import volcengine |
|
|
|
try: |
|
import load_env |
|
|
|
print('已加载环境变量') |
|
except ImportError: |
|
print('未找到环境变量文件,将使用现有环境变量') |
|
|
|
using_local = True if os.environ.get('USING_LOCAL', 'false').lower() == 'true' else False |
|
|
|
with gr.Blocks() as TTS_merge: |
|
def change_config_page(select_bar): |
|
|
|
if using_local: |
|
available_configs = { |
|
config_eleven: gr.Group(visible=False), |
|
config_openai: gr.Group(visible=False), |
|
config_genshin_api: gr.Group(visible=False), |
|
config_genshin_local: gr.Group(visible=False), |
|
config_reecho_ai: gr.Group(visible=False), |
|
config_volcengine: gr.Group(visible=False), |
|
btn_eleven: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_openai: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_genshin_api: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_recho_ai: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_volcengine: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_genshin_local: gr.Button("一键合成", variant="primary", visible=False), |
|
} |
|
else: |
|
available_configs = { |
|
config_eleven: gr.Group(visible=False), |
|
config_openai: gr.Group(visible=False), |
|
config_genshin_api: gr.Group(visible=False), |
|
config_reecho_ai: gr.Group(visible=False), |
|
config_volcengine: gr.Group(visible=False), |
|
btn_eleven: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_openai: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_recho_ai: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_volcengine: gr.Button("一键合成", variant="primary", visible=False), |
|
btn_genshin_api: gr.Button("一键合成", variant="primary", visible=False), |
|
} |
|
|
|
|
|
if select_bar == 'elevenlabs': |
|
available_configs[config_eleven] = gr.Group(visible=True) |
|
available_configs[btn_eleven] = gr.Button("一键合成", variant="primary", visible=True) |
|
elif select_bar == 'openai': |
|
available_configs[config_openai] = gr.Group(visible=True) |
|
available_configs[btn_openai] = gr.Button("一键合成", variant="primary", visible=True) |
|
elif select_bar == 'genshin-api': |
|
available_configs[config_genshin_api] = gr.Group(visible=True) |
|
available_configs[btn_genshin_api] = gr.Button("一键合成", variant="primary", visible=True) |
|
elif select_bar == 'genshin-local': |
|
available_configs[config_genshin_local] = gr.Group(visible=True) |
|
available_configs[btn_genshin_local] = gr.Button("一键合成", variant="primary", visible=True) |
|
elif select_bar == 'reecho-ai': |
|
available_configs[config_reecho_ai] = gr.Group(visible=True) |
|
available_configs[btn_recho_ai] = gr.Button("一键合成", variant="primary", visible=True) |
|
elif select_bar == 'volcengine': |
|
available_configs[config_volcengine] = gr.Group(visible=True) |
|
available_configs[btn_volcengine] = gr.Button("一键合成", variant="primary", visible=True) |
|
|
|
else: |
|
raise Exception('select error') |
|
|
|
return available_configs |
|
|
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
if using_local: |
|
select = ['elevenlabs', 'openai', 'genshin-api', 'reecho-ai', 'volcengine', 'genshin-local'] |
|
else: |
|
select = ['elevenlabs', 'openai', 'genshin-api', 'reecho-ai', 'volcengine'] |
|
|
|
with gr.Group(): |
|
select_bar = gr.Dropdown(choices=select, label="选择测试接口", value=select[0], interactive=True) |
|
audio = gr.Audio(label="背景音乐", interactive=True) |
|
with gr.Row(): |
|
speaker_up = gr.Slider(minimum=-20, maximum=20, value=0, label='TTS语音增益(db)', interactive=True) |
|
back_up = gr.Slider(minimum=-20, maximum=20, value=0, label='BGM增益(db)', interactive=True) |
|
|
|
text = gr.TextArea(label="要合成的内容", placeholder="内容", |
|
value="旅行者和开拓者们,大家好呀!欢迎各位试用原神和星穹铁道在线语音合成!", |
|
lines=3, interactive=True) |
|
|
|
with gr.Accordion("配置页面") as config_page: |
|
with gr.Group(visible=True) as config_eleven: |
|
with gr.Row(): |
|
elevenlabs_api_key = gr.Textbox(label="elevenlabs的API Key(默认为环境变量值)", |
|
placeholder="请输入elevenlabs的API Key", |
|
type="password", |
|
interactive=True, |
|
value=os.environ.get('ELEVENLABS_API_KEY', '')) |
|
speaker_eleven = gr.Dropdown(choices=elevenlabs_tts.select_key, |
|
value=elevenlabs_tts.select_key[0], label="音色选择", |
|
interactive=True) |
|
with gr.Blocks(): |
|
with gr.Row(): |
|
stability = gr.Slider(minimum=0, maximum=1, value=0.5, label='stability', interactive=True) |
|
similarity_boost = gr.Slider(minimum=0, maximum=1, value=0.75, label='similarity_boost', |
|
interactive=True) |
|
|
|
with gr.Row(): |
|
style = gr.Slider(minimum=0, maximum=1, value=0, label='style', interactive=True) |
|
use_speaker_boost = gr.Checkbox(label="Use Speaker Boost", value=True, interactive=True) |
|
|
|
with gr.Group(visible=False) as config_openai: |
|
openai_api_key = gr.Textbox(label="openai的API Key(默认为环境变量值)", |
|
placeholder="请输入openai的API Key", |
|
type="password", |
|
interactive=True, |
|
value=os.environ.get('OPENAI_API_KEY', '')) |
|
with gr.Row(): |
|
openai_model_choices = ['tts-1', 'tts-1-hd'] |
|
openai_voices = ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'] |
|
openai_model = gr.Dropdown(choices=openai_model_choices, value=openai_model_choices[0], |
|
label="模型选择", |
|
interactive=True) |
|
openai_speaker = gr.Dropdown(choices=openai_voices, value=openai_voices[0], label="音色选择", |
|
interactive=True) |
|
|
|
with gr.Group(visible=False) as config_genshin_api: |
|
gr.Markdown('原作者:https://modelscope.cn/studios/erythrocyte/Bert-VITS2_Genshin_TTS/summary') |
|
with gr.Row(): |
|
token = gr.Textbox(label="AccessToken", placeholder="请输入AccessToken", |
|
type="password", |
|
interactive=True, value=os.environ.get('GENSHIN_API_KEY', '')) |
|
appid = gr.Textbox(label="AppID", placeholder="请输入AppID", interactive=True, |
|
value='ig8t76x6036h3hpw') |
|
with gr.Row(): |
|
gr.Markdown( |
|
"AppID不要改,AccessToken最好换自己的。") |
|
|
|
with gr.Row(): |
|
speaker = gr.Dropdown(choices=genshin_api_tts.speakers_genshin, |
|
value=genshin_api_tts.speakers_genshin[0], label="角色", |
|
interactive=True) |
|
search = gr.Textbox(label="搜索角色", lines=1, interactive=True) |
|
btn2 = gr.Button(value="搜索") |
|
with gr.Column(): |
|
with gr.Row(): |
|
sdp_ratio = gr.Slider(minimum=0, maximum=1, value=0.2, step=0.1, label="SDP/DP 混合比", |
|
interactive=True) |
|
noise_scale = gr.Slider(minimum=0.1, maximum=2, value=0.6, step=0.1, label="感情", |
|
interactive=True) |
|
with gr.Row(): |
|
noise_scale_w = gr.Slider(minimum=0.1, maximum=2, value=0.8, step=0.1, label="音素长度", |
|
interactive=True) |
|
length_scale = gr.Slider(minimum=-99, maximum=99, value=0, step=0.1, label="语速(%)", |
|
interactive=True) |
|
|
|
btn2.click(genshin_api_tts.search_speaker, inputs=[search], outputs=[speaker]) |
|
|
|
with gr.Group(visible=False) as config_reecho_ai: |
|
gr.Markdown('控制台在此:https://dash.reecho.ai/') |
|
with gr.Row(): |
|
reecho_api_key = gr.Textbox(label="reecho的API Key(默认为环境变量值)", |
|
placeholder="请输入reecho的API Key", |
|
type="password", |
|
interactive=True, |
|
value=os.environ.get('REECHO_API_KEY', ''), |
|
scale=3) |
|
btn_refush = gr.Button(value="刷新角色列表") |
|
|
|
with gr.Row(): |
|
randomness = gr.Slider(minimum=0, maximum=100, value=97, step=1, label="多样性", |
|
interactive=True) |
|
stability_boost = gr.Slider(minimum=0, maximum=100, value=0, step=1, label="稳定性过度", |
|
interactive=True) |
|
|
|
reecho_ai.refresh_roles(reecho_api_key.value) |
|
|
|
role = gr.Dropdown(choices=reecho_ai.available_roles.keys(), |
|
value=list(reecho_ai.available_roles.keys())[0], |
|
label="角色", interactive=True) |
|
|
|
example_audio = gr.Audio(label="该角色示例音频", interactive=False, |
|
value=reecho_ai.get_example_audio(role.value)) |
|
|
|
role.change(reecho_ai.get_example_audio, |
|
inputs=[role], outputs=[example_audio]) |
|
|
|
btn_refush.click(lambda x: (reecho_ai.refresh_roles(x), |
|
gr.Dropdown(choices=reecho_ai.available_roles.keys(), |
|
value=list(reecho_ai.available_roles.keys())[0], |
|
label="角色", interactive=True) |
|
)[-1], |
|
inputs=[reecho_api_key], |
|
outputs=[role]) |
|
|
|
with gr.Group(visible=False) as config_volcengine: |
|
voices = list(volcengine.useful_voice.keys()) |
|
|
|
with gr.Row(): |
|
volcengine_appid = gr.Textbox(label="volcengine的appid(默认为环境变量值)", |
|
placeholder="请输入volcengine的appid", |
|
type="password", |
|
interactive=True, |
|
value=os.environ.get('VOLCENGINE_APPID', '')) |
|
volcengine_access_token = gr.Textbox(label="volcengine的access_token(默认为环境变量值)", |
|
placeholder="请输入volengine的access_token", |
|
type="password", |
|
interactive=True, |
|
value=os.environ.get('VOLCENGINE_ACCESS_TOKEN', '')) |
|
|
|
voice_type = gr.Dropdown(choices=voices, value=voices[0], label="音色选择", interactive=True) |
|
|
|
with gr.Row(): |
|
speed_ratio = gr.Slider(minimum=0.2, maximum=3, value=1, step=0.1, label="语速", |
|
interactive=True) |
|
volume_ratio = gr.Slider(minimum=0.1, maximum=3, value=1, step=0.1, label="音量", |
|
interactive=True) |
|
pitch_ratio = gr.Slider(minimum=0.1, maximum=3, value=1, step=0.1, label="音高", |
|
interactive=True) |
|
|
|
with gr.Row(): |
|
emotion = gr.Textbox(label="情感/风格(还未适配)", placeholder="请输入情感", interactive=True) |
|
language = gr.Textbox(label="语言类型(还未适配)", placeholder="请输入语言", interactive=True) |
|
|
|
if using_local: |
|
with gr.Group(visible=False) as config_genshin_local: |
|
from TTSs.genshin_bg import speakers as speakers_genshin_local |
|
from TTSs.genshin_bg import languages |
|
from TTSs import genshin_local_tts |
|
|
|
|
|
def search_speaker(search_value): |
|
for s in speakers_genshin_local: |
|
if search_value == s: |
|
return s |
|
for s in speakers_genshin_local: |
|
if search_value in s: |
|
return s |
|
|
|
|
|
gr.Markdown('原作者:红血球AE3803\nhttps://space.bilibili.com/6589795/dynamic') |
|
with gr.Row(): |
|
speaker_local = gr.Dropdown(choices=speakers_genshin_local, value=speakers_genshin_local[0], |
|
label="角色", |
|
interactive=True) |
|
search_local = gr.Textbox(label="搜索角色", lines=1, interactive=True) |
|
btn2 = gr.Button(value="搜索") |
|
with gr.Column(): |
|
with gr.Row(): |
|
sdp_ratio_local = gr.Slider(minimum=0, maximum=1, value=0.5, step=0.1, |
|
label="SDP Ratio", |
|
interactive=True) |
|
noise_scale_local = gr.Slider(minimum=0.1, maximum=2, value=0.6, step=0.1, |
|
label="Noise", |
|
interactive=True) |
|
with gr.Row(): |
|
noise_scale_w_local = gr.Slider(minimum=0.1, maximum=2, value=0.9, step=0.1, |
|
label="Noise_W", |
|
interactive=True) |
|
length_scale_local = gr.Slider(minimum=0.1, maximum=2, value=1.0, step=0.1, |
|
label="Length", |
|
interactive=True) |
|
|
|
language_local = gr.Dropdown( |
|
choices=languages, value=languages[0], label="Language", interactive=True |
|
) |
|
|
|
btn2.click(search_speaker, inputs=[search], outputs=[speaker]) |
|
|
|
btn_eleven = gr.Button("一键合成", variant="primary", visible=True) |
|
btn_openai = gr.Button("一键合成", variant="primary", visible=False) |
|
btn_genshin_api = gr.Button("一键合成", variant="primary", visible=False) |
|
btn_recho_ai = gr.Button("一键合成", variant="primary", visible=False) |
|
btn_volcengine = gr.Button("一键合成", variant="primary", visible=True) |
|
|
|
if using_local: |
|
btn_genshin_local = gr.Button("一键合成", variant="primary", visible=False) |
|
|
|
with gr.Column(): |
|
ori_audio_output = gr.Audio(label="TTS引擎输出", interactive=False) |
|
mix_audio_output = gr.Audio(label="TTS混合背景音乐后的输出", interactive=False) |
|
text_output = gr.Textbox(label="日志", lines=5, max_lines=100) |
|
|
|
if using_local: |
|
select_bar.change(change_config_page, inputs=[select_bar], |
|
outputs=[config_eleven, config_openai, config_genshin_api, config_reecho_ai, |
|
config_genshin_local, btn_eleven, |
|
btn_openai, btn_genshin_api, btn_recho_ai, btn_genshin_local, btn_volcengine, config_volcengine]) |
|
else: |
|
select_bar.change(change_config_page, inputs=[select_bar], |
|
outputs=[config_eleven, config_openai, config_genshin_api, config_reecho_ai, btn_eleven, |
|
btn_openai, |
|
btn_recho_ai, btn_genshin_api, btn_volcengine, config_volcengine]) |
|
|
|
btn_eleven.click(elevenlabs_tts.merge_audio, |
|
inputs=[elevenlabs_api_key, text, audio, speaker_eleven, stability, |
|
similarity_boost, style, |
|
use_speaker_boost, speaker_up, back_up], |
|
outputs=[text_output, ori_audio_output, mix_audio_output]) |
|
|
|
btn_openai.click(openai_tts.tts, |
|
inputs=[openai_api_key, text, openai_model, openai_speaker, audio, speaker_up, back_up], |
|
outputs=[text_output, ori_audio_output, mix_audio_output]) |
|
|
|
btn_genshin_api.click(genshin_api_tts.infer, |
|
inputs=[token, appid, speaker, text, sdp_ratio, noise_scale, noise_scale_w, |
|
length_scale, audio, |
|
speaker_up, back_up], |
|
outputs=[text_output, ori_audio_output, mix_audio_output]) |
|
|
|
btn_recho_ai.click(reecho_ai.get_reecho_ai_result, |
|
inputs=[reecho_api_key, text, role, randomness, stability_boost, |
|
audio, speaker_up, back_up], |
|
outputs=[text_output, ori_audio_output, mix_audio_output]) |
|
|
|
btn_volcengine.click(volcengine.tts, |
|
inputs=[text, volcengine_appid, volcengine_access_token, voice_type, speed_ratio, |
|
volume_ratio, pitch_ratio, audio, speaker_up, back_up], |
|
outputs=[text_output, ori_audio_output, mix_audio_output]) |
|
|
|
if using_local: |
|
btn_genshin_local.click(genshin_local_tts.func_genshin, |
|
inputs=[ |
|
text, |
|
speaker_local, |
|
sdp_ratio_local, |
|
noise_scale_local, |
|
noise_scale_w_local, |
|
length_scale_local, |
|
language_local, |
|
audio, |
|
speaker_up, |
|
back_up |
|
], |
|
outputs=[text_output, ori_audio_output, mix_audio_output] |
|
) |
|
|
|
if __name__ == "__main__": |
|
if using_local: |
|
from TTSs.genshin_bg import get_advanced_block |
|
|
|
iface = gr.TabbedInterface([TTS_merge, get_advanced_block()], |
|
["TTS all in one", "原神本地推理-高级版"]) |
|
else: |
|
iface = gr.TabbedInterface([TTS_merge], |
|
["TTS all in one"]) |
|
|
|
iface.launch() |
|
|