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()