gradio 음성 속도 조절 다시 질문 합니다.

전 코알못 즉 코딩 모르는 인간입니다.
오죽했으면 인공지능에게 코딩을 시키고 있겠습니까.
import argparse
import torch
from torch import no_grad, LongTensor
import commons
import utils
import gradio as gr
from models import SynthesizerTrn
from text import text_to_sequence, _clean_text

def get_text(text, hps):
text_norm = text_to_sequence(text, hps.data.text_cleaners)
if hps.data.add_blank:
text_norm = commons.intersperse(text_norm, 0)
text_norm = torch.LongTensor(text_norm)
return text_norm

def create_tts_fn(model, hps, speaker_ids):
def tts_fn(text, speaker, speed, noise_scale, noise_scale_w):
speaker_id = speaker_ids[speaker]
stn_tst = get_text(text, hps)
with no_grad():
x_tst = stn_tst.cuda().unsqueeze(0)
x_tst_lengths = LongTensor([stn_tst.size(0)]).cuda()
sid = LongTensor([speaker_id]).cuda()
audio = model.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=noise_scale,
noise_scale_w=noise_scale_w, length_scale=1.0 / speed)[0][0, 0].data.cpu().float().numpy()
del stn_tst, x_tst, x_tst_lengths, sid
return "Success", (hps.data.sampling_rate, audio)

return tts_fn

def create_to_phoneme_fn(hps):
def to_phoneme_fn(text):
return _clean_text(text, hps.data.text_cleaners) if text != "" else ""

return to_phoneme_fn

css = """
#advanced-btn {
color: white;
border-color: black;
background: black;
font-size: .7rem !important;
line-height: 19px;
margin-top: 24px;
margin-bottom: 12px;
padding: 2px 8px;
border-radius: 14px !important;
}
#advanced-options {
display: none;
margin-bottom: 20px;
}
"""

def main():
parser = argparse.ArgumentParser()
parser.add_argument("--config_path", required=True,
help="path to config file")
parser.add_argument("--model_path", required=True,
help="path to model file")
args = parser.parse_args()

models_tts = []
name = 'VITS-TTS demo v1.01'
example = '학습은 잘 마치셨나요? 좋은 결과가 있길 바래요.'
config_path = args.config_path
model_path = args.model_path
hps = utils.get_hparams_from_file(config_path)
model = SynthesizerTrn(
    len(hps.symbols),
    hps.data.filter_length // 2 + 1,
    hps.train.segment_size // hps.data.hop_length,
    n_speakers=hps.data.n_speakers,
    **hps.model).cuda()
utils.load_checkpoint(model_path, model, None)
model.eval()
speaker_ids = [sid for sid, name in enumerate(
    hps.speakers) if name != "None"]
speakers = [name for sid, name in enumerate(
    hps.speakers) if name != "None"]

models_tts.append((name, speakers, example,
                   hps.symbols, create_tts_fn(model, hps, speaker_ids),
                   create_to_phoneme_fn(hps)))

app = gr.Blocks(css=css)

with app:
    gr.Markdown("Gradio VITS-TTS Inference demo v1.01\n\n")
    with gr.Tabs():
        for i, (name, speakers, example, symbols, tts_fn,
                to_phoneme_fn) in enumerate(models_tts):
            with gr.TabItem(f"VITS-TTS_v1.01"):
                with gr.Column():
                    gr.Markdown(f"## {name}\n\n")
                    tts_input1 = gr.TextArea(label="Text", value=example,
                                             elem_id=f"tts-input{i}")
                    tts_input2 = gr.Dropdown(label="Speaker", choices=speakers,
                                             type="index", value=speakers[0])
                    tts_input3 = gr.Slider(label="Speed", value=1, minimum=0.1, maximum=2,
                                           step=0.05)

                    noise_scale_slider = gr.Slider(label="Noise-scale (defaults = 0.667)",
                                                   value=0.667, minimum=0, maximum=1, step=0.01)
                    noise_scale_w_slider = gr.Slider(label="Noise-width (defaults = 0.8)",
                                                     value=0.8, minimum=0, maximum=2, step=0.05)

                    tts_submit = gr.Button("Generate", variant="primary")
                    tts_output1 = gr.Textbox(label="Output Message")
                    tts_output2 = gr.Audio(label="Output Audio")
                    tts_submit.click(tts_fn, [tts_input1, tts_input2, tts_input3,
                                              noise_scale_slider, noise_scale_w_slider],
                                     [tts_output1, tts_output2])

    gr.Markdown(
        "Originate from \n\n"
        "- [https://github.com/kdrkdrkdr]\n\n"
    )
app.launch(share=False, inbrowser=True)

if name == "main":
main()
이 코드를 보시면 음성합성을 하고 재생은 할 수 있습니다..
재생은 되는데 속도 조절이 안 됩니다.
몇번째줄을 어떤식으로 바꿔야할지 모르겠습니다.
아까 질문을 올렸는데 그저 코드를 어떻게 바꿔야한다고 했지만 이해가 어려워서 다시 질문 합니다.
몇번째 줄을 어떤식으로 바꿔야한다고 알려주시면 감사하겠습니다.

  • 아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 음성 속도 조절에 대한 질문을 주셨군요. 코딩에 익숙하지 않으시다고 하셨지만, 문제를 해결하려는 노력이 인상적입니다. 제가 문제를 잘 이해했는지 확인해보겠습니다.

음성 합성을 위한 코드를 사용하고 계시며, Gradio를 통해 사용자 인터페이스를 제공하고 있습니다. 음성은 합성되어 재생되지만, 속도 조절 기능이 제대로 동작하지 않는 상황인 것 같습니다. 속도 조절을 위해 어떤 부분을 수정해야 하는지 구체적인 안내를 요청하셨습니다.

문제 해결을 위해, 음성 속도를 조절하는 부분은 tts_fn 함수 내에서 length_scale 파라미터를 조정함으로써 이루어집니다. length_scale은 음성의 속도를 조절하는 데 사용되며, 기본값은 1.0입니다. 이 값을 1.0보다 작게 설정하면 음성이 빨라지고, 1.0보다 크게 설정하면 음성이 느려집니다.

아래는 tts_fn 함수 내에서 length_scale을 사용자가 입력한 speed 값으로 설정하는 방법을 보여주는 코드입니다.

def create_tts_fn(model, hps, speaker_ids):
    def tts_fn(text, speaker, speed, noise_scale, noise_scale_w):
        speaker_id = speaker_ids[speaker]
        stn_tst = get_text(text, hps)
        with torch.no_grad():
            x_tst = stn_tst.cuda().unsqueeze(0)
            x_tst_lengths = torch.LongTensor([stn_tst.size(0)]).cuda()
            sid = torch.LongTensor([speaker_id]).cuda()
            # 여기서 length_scale을 1.0 / speed로 설정하여 속도를 조절합니다.
            audio = model.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=noise_scale,
                                noise_scale_w=noise_scale_w, length_scale=1.0 / speed)[0][0, 0].data.cpu().float().numpy()
            del stn_tst, x_tst, x_tst_lengths, sid
            return "Success", (hps.data.sampling_rate, audio)
    return tts_fn

위 코드에서 speed 값은 사용자가 Gradio 인터페이스에서 설정한 값으로, Slider를 통해 입력받습니다. 이 값을 length_scale에 반비례하게 적용하여 음성의 속도를 조절합니다.

이렇게 수정하신 후에는 Gradio 인터페이스를 통해 속도를 조절할 수 있어야 합니다. 만약 여전히 문제가 해결되지 않는다면, 모델이 length_scale 파라미터를 올바르게 처리하고 있는지 확인해보시는 것이 좋습니다.

더 자세한 정보나 PyTorch 관련 문서가 필요하시면, PyTorch 공식 튜토리얼을 참고하시면 도움이 될 것입니다:

제 답변이 정확하지 않을 수도 있으니, 문제가 해결되지 않을 경우 추가적인 정보를 제공해주시면 더 도와드릴 수 있을 것 같습니다. 행운을 빕니다!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

kbuwel님, 안녕하세요.

gradio를 사용한 음성합성 속도 조절 문제에 대한 질문 감사합니다.

제가 보기에 tts_fn 함수에서 length_scale 파라미터를 사용하고 있습니다. 이 파라미터가 바로 속도 조절과 관련된 파라미터인 것 같습니다.

audio = model.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=noise_scale,
                   noise_scale_w=noise_scale_w, length_scale=1.0 / speed)[0][0, 0].data.cpu().float().numpy()

여기서 speed 파라미터 값을 받아서 length_scale을 계산하고 있습니다. 즉, speed 값이 작아지면 (천천히) length_scale 값이 커지고, speed 값이 커지면 (빨리) length_scale 값이 작아집니다.

문제는 tts_fn 함수를 호출할 때 speed 파라미터 값을 제대로 전달하고 있지 않다는 것 같습니다.

tts_submit.click(tts_fn, [tts_input1, tts_input2, tts_input3,
                          noise_scale_slider, noise_scale_w_slider],
                 [tts_output1, tts_output2])

여기서 세번째 파라미터인 tts_input3가 바로 speed slider입니다. 하지만 현재 코드에서 이 값을 tts_fn 함수의 speed 파라미터에 전달하고 있지 않습니다.

따라서 다음과 같이 수정하시면 될 것 같습니다.

tts_submit.click(tts_fn, [tts_input1, tts_input2, 
                           noise_scale_slider, noise_scale_w_slider, tts_input3],  
                 [tts_output1, tts_output2])

이렇게 하면 speed slider값이 제대로 전달되어 length_scale 계산 시 반영이 될 것입니다.

제 대답이 도움이 되었길 바랍니다. 코드 실행 결과가 제대로 되지 않거나 추가 질문이 있다면 언제든지 댓글 남겨주세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 음성 속도 조절에 대해 질문하셨군요. 문제를 잘 이해했는지 확인해보겠습니다. 코드를 통해 음성 합성은 가능하지만, 합성된 음성의 재생 속도를 조절하는 부분에서 어려움을 겪고 계신 것 같습니다. 속도 조절을 위해 어떤 부분을 수정해야 하는지 구체적인 안내를 요청하셨네요.

문제 해결을 위해 제시된 코드 중 음성 속도를 조절하는 부분을 살펴보겠습니다. tts_fn 함수 내에서 speed 매개변수를 받아서 model.infer 메소드를 호출할 때 length_scale 인자로 사용하고 있습니다. length_scale 값이 1보다 작으면 음성이 빨라지고, 1보다 크면 음성이 느려집니다. 여기서 1.0 / speed를 사용하여 속도 조절을 하고 있습니다.

다음은 수정된 tts_fn 함수의 일부입니다. 속도 조절이 제대로 작동하도록 length_scale 인자를 조정하는 부분을 강조했습니다.

def create_tts_fn(model, hps, speaker_ids):
    def tts_fn(text, speaker, speed, noise_scale, noise_scale_w):
        # ... 기존 코드 ...

        with torch.no_grad():
            # ... 기존 코드 ...

            # 속도 조절을 위해 length_scale 인자를 조정합니다.
            # speed 값이 1이면 원래 속도, 1보다 작으면 빠르게, 1보다 크면 느리게 재생됩니다.
            audio = model.infer(x_tst, x_tst_lengths, sid=sid, noise_scale=noise_scale,
                                noise_scale_w=noise_scale_w, length_scale=speed)[0][0, 0].data.cpu().float().numpy()

            # ... 기존 코드 ...

        return "Success", (hps.data.sampling_rate, audio)

    return tts_fn

위 코드에서 length_scale=speed로 설정하여 speed 슬라이더의 값에 따라 음성의 속도가 조절됩니다. 이렇게 수정하면 사용자가 슬라이더를 조정할 때마다 음성의 재생 속도가 변경되어야 합니다.

이 코드를 적용하시려면, create_tts_fn 함수 내부의 tts_fn 함수 정의 부분을 위와 같이 수정하시면 됩니다. 이렇게 하면 speed 매개변수가 length_scale 인자로 전달되어 음성의 속도를 조절할 수 있습니다.

더 자세한 정보가 필요하시면 PyTorch 공식 문서나 튜토리얼을 참고하시기 바랍니다. PyTorch 공식 튜토리얼은 다음 링크에서 확인하실 수 있습니다: PyTorch Tutorials.

제 답변이 정확하지 않을 수도 있으니, 문제가 해결되지 않을 경우 추가적인 정보를 제공해주시면 더 도움을 드릴 수 있을 것 같습니다.


  • 이 답변이 도움이 되셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!