Spaces:
Runtime error
Runtime error
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() | |