TTS_all_in_one / main.py
jianuo
添加新引擎
6cce716
raw
history blame
No virus
21.3 kB
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()