Artrajz / vits-simple-api

A simple VITS HTTP API, developed by extending Moegoe with additional features.
GNU Affero General Public License v3.0
822 stars 121 forks source link

SSML 合成语音时id问题 #157

Closed gushuaialan1 closed 7 months ago

gushuaialan1 commented 7 months ago

运行环境

问题描述

用ssml合成语音时,voice id 改动没用 好像并不和get请求中的id列表对应 ssml_text = """

你好我是中国人。

"""

问题复现步骤

Artrajz commented 7 months ago

测试了下功能正常。如果有预期之外的错误,麻烦提供复现操作。

gushuaialan1 commented 7 months ago

测试了下功能正常。如果有预期之外的错误,麻烦提供复现操作。

当model里面有多个存在多个模型时,ssml里面的参数voice id 貌似跟speak json返回的id不匹配

这是speak json返回的数据 {"BERT-VITS2":[{"id":0,"lang":["zh"],"name":"GU"},{"id":1,"lang":["ja"],"name":"HG2"},{"id":2,"lang":["zh"],"name":"lkw"},{"id":3,"lang":["zh"],"name":"llpb"},{"id":4,"lang":["zh"],"name":"pcbd"}],"GPT-SOVITS":[{"id":0,"lang":["zh","ja","en"],"name":"lkwgpt"}],"HUBERT-VITS":[],"VITS":[],"W2V2-VITS":[]}

我这边写的是id=2 返回的还是id=0 name:GU的声音

ssml_text = """
<speak lang="zh" format="mp3" length="1.2">
    <voice id="2" model_type="BERT-VITS2">你好我是中国人。</voice>
</speak>
"""
Artrajz commented 7 months ago
ssml_text = """
<speak lang="zh" format="mp3" length="1.2">
    <voice id="2" model_type="BERT-VITS2">你好我是中国人。</voice>
</speak>
"""

我使用同样的smml,在切换不同的id上表现正常,说话人能够正常切换。是使用的最新版本的代码吗?

gushuaialan1 commented 7 months ago
ssml_text = """
<speak lang="zh" format="mp3" length="1.2">
    <voice id="2" model_type="BERT-VITS2">你好我是中国人。</voice>
</speak>
"""

我使用同样的smml,在切换不同的id上表现正常,说话人能够正常切换。是使用的最新版本的代码吗?

反复测试,还是不正常,比如以下的例子 id0-2是一个模型里面的3个声音,在这3个声音中切换是正常的,到了id=3就不对了(id=3是第二个模型)此时返回的就是id=0的声音 {"BERT-VITS2":[{"id":0,"lang":["zh"],"name":"nan1"},{"id":1,"lang":["zh"],"name":"yuebao"},{"id":2,"lang":["zh"],"name":"qiqi"},{"id":3,"lang":["zh"],"name":"yh2"}],"GPT-SOVITS":[],"HUBERT-VITS":[],"VITS":[],"W2V2-VITS":[]}

ssml如下:

ssml_text = """
<speak lang="zh" format="mp3" length="1.2">
    <voice id="0" model_type="BERT-VITS2" preset="default">你好,我是中国人。</voice>
    <voice id="1" model_type="BERT-VITS2" preset="default">你好,我是中国人。</voice>
    <voice id="2" model_type="BERT-VITS2" preset="default">你好,我是中国人。</voice>
    <voice id="3" model_type="BERT-VITS2" preset="default">你好,我是中国人。</voice>
</speak>
"""
gushuaialan1 commented 7 months ago
ssml_text = """
<speak lang="zh" format="mp3" length="1.2">
    <voice id="2" model_type="BERT-VITS2">你好我是中国人。</voice>
</speak>
"""

我使用同样的smml,在切换不同的id上表现正常,说话人能够正常切换。是使用的最新版本的代码吗?

现在的情况是载入 A:载入1个含有3个声音的模型 外加一个其他模型 能在第一个模型内的3个声音切换 id定义到另外一个模型的时候返回为第一模型内的第一个声音

B:载入4个只有一个声音的模型,id定义为0123 都是返回第一个模型的声音

查看了TTSManager.py的相关代码,是否跟 model_type = element.attrib.get("model_type", root.attrib.get("model_type", list( self.model_manager.available_tts_model)[0])) 这边的定义有关

    def parse_ssml(self, ssml):
        root = ET.fromstring(ssml)
        format = root.attrib.get("format", "wav")
        voice_tasks = []
        brk_count = 0
        strength_dict = {"x-weak": 0.25, "weak": 0.5, "Medium": 0.75, "Strong": 1, "x-strong": 1.25}

        params = {ModelType.VITS.value: config.vits_config.asdict(),
                  ModelType.W2V2_VITS.value: config.w2v2_vits_config.asdict(),
                  ModelType.HUBERT_VITS.value: config.hubert_vits_config.asdict(),
                  ModelType.BERT_VITS2.value: config.bert_vits2_config.asdict(),
                  ModelType.GPT_SOVITS.value: config.gpt_sovits_config.asdict(),
                  }

        for element in root.iter():
            if element.tag == "voice":
                # 不填写则默认从已加载的模型中选择
                model_type = element.attrib.get("model_type", root.attrib.get("model_type", list(
                    self.model_manager.available_tts_model)[0]))
                if model_type is None:
                    raise ValueError(f"None model_type was specified")
                else:
                    model_type = model_type.upper()
Artrajz commented 7 months ago

非常抱歉,具体表现在不同模型的id切换异常,已找到问题https://github.com/Artrajz/vits-simple-api/commit/a6c444cbac1bc6472f3bb7538eaf6446cffdad42 可以拉代码试试看

应该是之前修改推理函数时,没有把原来获取id的代码删除,删除这一行就好了

task["id"] = self.get_real_id(model_type, task.get("id"))
gushuaialan1 commented 7 months ago

非常抱歉,具体表现在不同模型的id切换异常,已找到问题a6c444c 可以拉代码试试看

应该是之前修改推理函数时,没有把原来获取id的代码删除,删除这一行就好了

task["id"] = self.get_real_id(model_type, task.get("id"))

测试正常了,感谢大佬