GENIE / app.py
Tom1986's picture
Enhance Gradio compatibility by adding theme handling and updating UI_CONFIG; refactor requirements.txt for clarity
8b86e7b
"""
Genie TTS Hugging Face Spaces Deployment - Main Application
重构后的主应用文件,仅包含Gradio界面定义和应用启动逻辑
模块化重构后的架构:
- installer.py: 依赖管理
- config.py: 配置常量
- tts_engine.py: TTS核心功能
- ui_utils.py: UI辅助函数
- app.py: 主应用界面(当前文件)
"""
import gradio as gr
import logging
import warnings
from tts_engine import tts_interface
from ui_utils import clear_all, load_example, create_tts_wrapper, create_system_status_display
from config import APP_TITLE, APP_DESCRIPTION, EXAMPLE_TEXTS, UI_CONFIG, UI_TEXT, GRADIO_THEME
# 设置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 禁用一些警告
warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=UserWarning)
# 创建UI函数
tts_wrapper = create_tts_wrapper(tts_interface)
get_system_status = create_system_status_display(tts_interface)
def create_interface():
"""创建Gradio界面"""
# 定义界面
with gr.Blocks(
title=APP_TITLE,
theme=gr.themes.Soft(),
css="""
.gradio-container {
max-width: 1200px !important;
}
.status-success {
color: #28a745 !important;
}
.status-error {
color: #dc3545 !important;
}
"""
) as demo:
gr.Markdown(f"""
# {APP_TITLE}
{APP_DESCRIPTION}
<div style="background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); padding: 1rem; border-radius: 10px; color: white; margin: 1rem 0;">
<strong>🌟 功能特点</strong><br>
✅ CPU 优化推理,无需 GPU<br>
✅ 基于 GPT-SoVITS V2 技术<br>
✅ 支持长文本自动分句<br>
✅ 实时音频流输出
</div>
**📖 使用说明:** 选择角色模型 → 输入日语文本 → 点击合成按钮 → 获得高质量语音
""")
# 系统状态显示
system_status = get_system_status()
if "🔴" in system_status:
status_color = "#ff4444"
status_text = "服务不可用"
details = ("Hugging Face Spaces环境限制导致PyAudio依赖安装失败。<br>"
"💡 <strong>解决方案:</strong> 请在本地环境运行此应用以获得完整功能。")
else:
status_color = "#44ff44"
status_text = "服务正常"
details = "Genie TTS引擎已成功加载,可以正常使用。"
gr.Markdown(f"""
<div style="background: {status_color}20; border-left: 4px solid {status_color}; padding: 1rem; margin: 1rem 0; border-radius: 0 8px 8px 0;">
<strong>{system_status}</strong><br>
<small>{details}</small>
</div>
""")
with gr.Tab("🎵 语音合成") as tts_tab:
with gr.Row():
with gr.Column(scale=1):
# 角色选择
with gr.Group():
gr.Markdown("### 👤 角色设置")
character_dropdown = gr.Dropdown(
choices=tts_interface.available_characters,
value=tts_interface.available_characters[0],
label=UI_TEXT["character_label"],
info="当前可用的预训练角色模型",
interactive=True
)
# 文本输入
with gr.Group():
gr.Markdown("### 📝 文本输入")
text_input = gr.Textbox(
lines=5,
label=UI_TEXT["text_label"],
placeholder=UI_TEXT["text_placeholder"],
info="💡 支持日语文本,建议输入完整的句子以获得更好的效果",
show_copy_button=True
)
# 控制按钮
with gr.Row():
submit_btn = gr.Button(
UI_TEXT["submit_button"],
variant="primary",
size="lg",
scale=2
)
clear_btn = gr.Button(
UI_TEXT["clear_button"],
variant="secondary",
scale=1
)
with gr.Column(scale=1):
# 音频输出
with gr.Group():
gr.Markdown("### 🔊 音频输出")
audio_output = gr.Audio(
label=UI_TEXT["audio_label"],
type="filepath",
interactive=False,
show_download_button=True
)
# 状态显示
status_output = gr.Textbox(
label=UI_TEXT["status_label"],
interactive=False,
show_copy_button=False
)
# 示例和教程标签页
with gr.Tab("📚 示例与教程") as examples_tab:
gr.Markdown("### 🎯 快速示例")
gr.Markdown("点击下面的示例可以快速体验不同类型的文本合成效果:")
# 示例网格
with gr.Row():
with gr.Column():
gr.Markdown("**🌅 问候语**")
gr.Examples(
examples=EXAMPLE_TEXTS[:3],
inputs=[text_input, character_dropdown],
outputs=[text_input, character_dropdown, status_output],
fn=load_example,
run_on_click=True
)
with gr.Column():
gr.Markdown("**💭 情感表达**")
gr.Examples(
examples=[
["どうしようかな……やっぱりやりたいかも……!", "misono_mika"],
["うーん、これは難しいですね", "misono_mika"],
["わあ、すごいですね!", "misono_mika"]
],
inputs=[text_input, character_dropdown],
outputs=[text_input, character_dropdown, status_output],
fn=load_example,
run_on_click=True
)
with gr.Column():
gr.Markdown("**🎭 日常对话**")
gr.Examples(
examples=[
["ありがとうございます", "misono_mika"],
["さようなら、また明日", "misono_mika"],
["お先に失礼します", "misono_mika"]
],
inputs=[text_input, character_dropdown],
outputs=[text_input, character_dropdown, status_output],
fn=load_example,
run_on_click=True
)
gr.Markdown("""
### 📋 使用技巧
1. **文本长度**: 建议单次输入文本长度在 100 字以内,过长的文本会自动分句处理
2. **标点符号**: 适当使用标点符号(。!?)可以改善语音的自然度
3. **特殊符号**: 支持省略号(……)和感叹号(!)等情感表达
4. **处理时间**: 首次加载角色需要下载模型(约30秒),后续合成较快(5-10秒)
### 🔧 技术说明
- **模型架构**: 基于 Transformer 的端到端语音合成
- **采样率**: 32kHz,支持高质量音频输出
- **推理方式**: CPU 优化的 ONNX 模型,适合云端部署
- **内存占用**: 约 500MB RAM,支持并发处理
""")
# 关于标签页
with gr.Tab("ℹ️ 关于项目") as about_tab:
gr.Markdown("""
### 🔍 项目信息
**Genie TTS** 是基于 GPT-SoVITS V2 架构的轻量级语音合成引擎,专门为 CPU 推理优化。
#### 📊 技术规格
| 项目 | 规格 |
|------|------|
| **基础模型** | GPT-SoVITS V2 |
| **推理框架** | ONNX Runtime |
| **支持语言** | 日语 (Japanese) |
| **音频格式** | WAV, 32kHz |
| **推理设备** | CPU (无需 GPU) |
| **模型大小** | ~200MB |
| **内存需求** | ~500MB RAM |
#### 🔗 相关链接
- 🏠 [项目主页](https://github.com/High-Logic/Genie)
- 🤗 [Hugging Face 模型](https://huggingface.co/High-Logic/Genie)
- 📖 [GPT-SoVITS 官方](https://github.com/RVC-Boss/GPT-SoVITS)
- 💬 [问题反馈](https://github.com/High-Logic/Genie/issues)
#### 🙏 致谢
感谢以下项目和开发者:
- [High-Logic](https://github.com/High-Logic) 团队开发的 Genie TTS
- [RVC-Boss](https://github.com/RVC-Boss) 团队的 GPT-SoVITS 项目
- Hugging Face 提供的模型托管和 Spaces 平台
#### ⚖️ 免责声明
本应用仅用于演示和研究目的。请合理使用,生成的语音内容责任由使用者承担。
""")
# 绑定事件
submit_btn.click(
fn=tts_wrapper,
inputs=[text_input, character_dropdown],
outputs=[audio_output, status_output],
show_progress="full",
queue=True
)
clear_btn.click(
fn=clear_all,
outputs=[text_input, audio_output, status_output]
)
return demo
# 启动应用
if __name__ == "__main__":
demo = create_interface()
# 处理Gradio主题兼容性
launch_config = UI_CONFIG.copy()
try:
# 尝试使用主题参数(适用于较新版本的Gradio)
import gradio as gr
if hasattr(gr.Blocks, 'launch') and 'theme' in gr.Blocks.launch.__code__.co_varnames:
launch_config['theme'] = GRADIO_THEME
except:
# 如果出现错误,忽略主题设置
pass
demo.launch(**launch_config)