ChatTTS-Forge / modules /webui /speaker /speaker_creator.py
zhzluke96
update
f83b1b7
raw
history blame
4.8 kB
import gradio as gr
import torch
from modules.speaker import Speaker
from modules.utils.SeedContext import SeedContext
from modules.hf import spaces
from modules.models import load_chat_tts
from modules.utils.rng import np_rng
from modules.webui.webui_utils import get_speakers, tts_generate
import tempfile
names_list = [
"Alice",
"Bob",
"Carol",
"Carlos",
"Charlie",
"Chuck",
"Chad",
"Craig",
"Dan",
"Dave",
"David",
"Erin",
"Eve",
"Yves",
"Faythe",
"Frank",
"Grace",
"Heidi",
"Ivan",
"Judy",
"Mallory",
"Mallet",
"Darth",
"Michael",
"Mike",
"Niaj",
"Olivia",
"Oscar",
"Peggy",
"Pat",
"Rupert",
"Sybil",
"Trent",
"Ted",
"Trudy",
"Victor",
"Vanna",
"Walter",
"Wendy",
]
@torch.inference_mode()
@spaces.GPU
def create_spk_from_seed(
seed: int,
name: str,
gender: str,
desc: str,
):
chat_tts = load_chat_tts()
with SeedContext(seed, True):
emb = chat_tts.sample_random_speaker()
spk = Speaker(seed=-2, name=name, gender=gender, describe=desc)
spk.emb = emb
with tempfile.NamedTemporaryFile(delete=False, suffix=".pt") as tmp_file:
torch.save(spk, tmp_file)
tmp_file_path = tmp_file.name
return tmp_file_path
@torch.inference_mode()
@spaces.GPU
def test_spk_voice(seed: int, text: str):
return tts_generate(
spk=seed,
text=text,
)
def random_speaker():
seed = np_rng()
name = names_list[seed % len(names_list)]
return seed, name
creator_ui_desc = """
## Speaker Creator
使用本面板快捷抽卡生成 speaker.pt 文件。
1. **生成说话人**:输入种子、名字、性别和描述。点击 "Generate speaker.pt" 按钮,生成的说话人配置会保存为.pt文件。
2. **测试说话人声音**:输入测试文本。点击 "Test Voice" 按钮,生成的音频会在 "Output Audio" 中播放。
3. **随机生成说话人**:点击 "Random Speaker" 按钮,随机生成一个种子和名字,可以进一步编辑其他信息并测试。
"""
def speaker_creator_ui():
def on_generate(seed, name, gender, desc):
file_path = create_spk_from_seed(seed, name, gender, desc)
return file_path
def create_test_voice_card(seed_input):
with gr.Group():
gr.Markdown("🎤Test voice")
with gr.Row():
test_voice_btn = gr.Button("Test Voice", variant="secondary")
with gr.Column(scale=4):
test_text = gr.Textbox(
label="Test Text",
placeholder="Please input test text",
value="说话人测试 123456789 [uv_break] ok, test done [lbreak]",
)
with gr.Row():
current_seed = gr.Label(label="Current Seed", value=-1)
with gr.Column(scale=4):
output_audio = gr.Audio(label="Output Audio", format="mp3")
test_voice_btn.click(
fn=test_spk_voice,
inputs=[seed_input, test_text],
outputs=[output_audio],
)
test_voice_btn.click(
fn=lambda x: x,
inputs=[seed_input],
outputs=[current_seed],
)
gr.Markdown(creator_ui_desc)
with gr.Row():
with gr.Column(scale=2):
with gr.Group():
gr.Markdown("ℹ️Speaker info")
seed_input = gr.Number(label="Seed", value=2)
name_input = gr.Textbox(
label="Name", placeholder="Enter speaker name", value="Bob"
)
gender_input = gr.Textbox(
label="Gender", placeholder="Enter gender", value="*"
)
desc_input = gr.Textbox(
label="Description",
placeholder="Enter description",
)
random_button = gr.Button("Random Speaker")
with gr.Group():
gr.Markdown("🔊Generate speaker.pt")
generate_button = gr.Button("Save .pt file")
output_file = gr.File(label="Save to File")
with gr.Column(scale=5):
create_test_voice_card(seed_input=seed_input)
create_test_voice_card(seed_input=seed_input)
create_test_voice_card(seed_input=seed_input)
create_test_voice_card(seed_input=seed_input)
random_button.click(
random_speaker,
outputs=[seed_input, name_input],
)
generate_button.click(
fn=on_generate,
inputs=[seed_input, name_input, gender_input, desc_input],
outputs=[output_file],
)