[2noise/ChatTTS]我调用了很多次,发现每次调用的角色声音可能不一样。

2024-06-06 421 views
9

这个是哪里去指定? 或者随机? 或者根据内容自动模型自动适配?

回答

9

同,在colab上尝试通过spk_emb固定wavs1和wavs2的音色,但似乎没什么用。蹲一下解决方案

rand_spk = torch.randn(768)
params_infer_code = {'spk_emb' : rand_spk, 'temperature':.3}
wavs1 = chat.infer(texts[0], skip_refine_text = False, use_decoder=True,params_infer_code=params_infer_code)
wavs2 = chat.infer(texts[1], skip_refine_text = False, use_decoder=True,params_infer_code=params_infer_code)`
4

没有GPC,使用CPU不行是吗?

8

没有GPC,使用CPU不行是吗?

CPU可以运行啊。我就是在笔记本上运行的。

4

同,在colab上尝试通过spk_emb固定wavs1和wavs2的音色,但似乎没什么用。蹲一下解决方案

rand_spk = torch.randn(768)
params_infer_code = {'spk_emb' : rand_spk, 'temperature':.3}
wavs1 = chat.infer(texts[0], skip_refine_text = False, use_decoder=True,params_infer_code=params_infer_code)
wavs2 = chat.infer(texts[1], skip_refine_text = False, use_decoder=True,params_infer_code=params_infer_code)`

~使用use_decoder=False可以固定中/英文说话人的音色,但是感觉还是有一些差异。~

wavs = chat.infer(
    texts,
    params_refine_text=params_refine_text,
    params_infer_code=params_infer_code,
)

多测了几个随机数,看来还是需要spk_stat.pt

6

还缺少 spk_stat.pt吧?等着作者哪天开心,就会上传了吧。

3

现在作者已经发布了 spk_stat.pt, 但是还是不能固定说话人的音色啊,是我的用法不对吗?

std, mean = torch.load('/workspace/ChatTTS/asset/spk_stat.pt').chunk(2) rand_spk = torch.tensor([0.5] * 768) * std + mean

求大佬帮忙看看

2

同问。经调试发现,当‘spk_emb‘不变时,输入GPT模型前的model_input['inputs_embeds']也是不变的,但是经过推理输出说话人却会变。另外,暂时也没找到能影响说话人音色的其它输入。

3

同问,spk_stat.pt也加载了,spk_stat = torch.load('spk_stat.pt') ;'spk_emb': fixed_spk_emb,

生成1分41秒的视频还是会用到多个音色

9

mark下

4

同问,如何固定音色?

5

可以直接通过torch.manual_seed(SEED) 来固定音色,比如说6666是年轻男声

chat = ChatTTS.Chat()
chat.load_models()

torch.manual_seed(6666) # 音色种子
params_infer_code = {
    'spk_emb': chat.sample_random_speaker(),
    'temperature': 0.1,
    'top_P': 0.7,
    'top_K': 20,
}

同理可以通过设置种子来达到固定语气的作用

torch.manual_seed(6666) # 文本种子
wavs = chat.infer([<生成文本>], use_decoder=True,
                  params_infer_code=params_infer_code)
8

可以直接通过torch.manual_seed(SEED) 来固定音色,比如说6666是年轻男声

chat = ChatTTS.Chat()
chat.load_models()

torch.manual_seed(6666) # 音色种子
params_infer_code = {
    'spk_emb': chat.sample_random_speaker(),
    'temperature': 0.1,
    'top_P': 0.7,
    'top_K': 20,
}

同理可以通过设置种子来达到固定语气的作用

torch.manual_seed(6666) # 文本种子
wavs = chat.infer([<生成文本>], use_decoder=True,
                  params_infer_code=params_infer_code)

测试了,不行。只要文字发生变化,输出的音色就发生变化。

0

可以直接通过torch.manual_seed(SEED) 来固定音色,比如说6666是年轻男声

chat = ChatTTS.Chat()
chat.load_models()

torch.manual_seed(6666) # 音色种子
params_infer_code = {
    'spk_emb': chat.sample_random_speaker(),
    'temperature': 0.1,
    'top_P': 0.7,
    'top_K': 20,
}

同理可以通过设置种子来达到固定语气的作用

torch.manual_seed(6666) # 文本种子
wavs = chat.infer([<生成文本>], use_decoder=True,
                  params_infer_code=params_infer_code)

测试了,不行。只要文字发生变化,输出的音色就发生变化。

试了下,params_refine_text和params_infer_code 这两个参数需要配合使用,才能指定出一个相对比较稳定的音色。

7

如何配合才能稳定音色输出呢?求破!

9

m

4

可以直接通过torch.manual_seed(SEED) 来固定音色,比如说6666是年轻男声

chat = ChatTTS.Chat()
chat.load_models()

torch.manual_seed(6666) # 音色种子
params_infer_code = {
    'spk_emb': chat.sample_random_speaker(),
    'temperature': 0.1,
    'top_P': 0.7,
    'top_K': 20,
}

同理可以通过设置种子来达到固定语气的作用

torch.manual_seed(6666) # 文本种子
wavs = chat.infer([<生成文本>], use_decoder=True,
                  params_infer_code=params_infer_code)

测试了,不行。只要文字发生变化,输出的音色就发生变化。

试了下,params_refine_text和params_infer_code 这两个参数需要配合使用,才能指定出一个相对比较稳定的音色。 最近版测试有效。测试发现在不同文字下,音色一致。重启内核多次过程中,可能出现某次略微的音色差别。

给出我的实验代码:

torch.manual_seed(6666) # 固定说话人
# params_infer_code = {'prompt':'[speed_5]', 'temperature':.3}
params_refine_text = {'prompt':'[oral_2][laugh_0][break_6]'}

rand_spk = chat.sample_random_speaker()
print(type(rand_spk))
print(rand_spk.shape)
params_infer_code = {'spk_emb' : rand_spk, }

wav0 = chat.infer('四川美食确实以辣闻名,但也有不辣的选择。比如甜水面、赖汤圆、蛋烘糕、叶儿粑等,这些小吃口味温和,甜而不腻,也很受欢迎。', \
    params_refine_text=params_refine_text, params_infer_code=params_infer_code)

wav1 = chat.infer('我调用了很多次,发现每次调用的角色声音可能不一样。', \
    params_refine_text=params_refine_text, params_infer_code=params_infer_code)`
9

可以直接通过torch.manual_seed(SEED) 来固定音色,比如说6666是年轻男声

chat = ChatTTS.Chat()
chat.load_models()

torch.manual_seed(6666) # 音色种子
params_infer_code = {
    'spk_emb': chat.sample_random_speaker(),
    'temperature': 0.1,
    'top_P': 0.7,
    'top_K': 20,
}

同理可以通过设置种子来达到固定语气的作用

torch.manual_seed(6666) # 文本种子
wavs = chat.infer([<生成文本>], use_decoder=True,
                  params_infer_code=params_infer_code)

测试了,不行。只要文字发生变化,输出的音色就发生变化。

试了下,params_refine_text和params_infer_code 这两个参数需要配合使用,才能指定出一个相对比较稳定的音色。 最近版测试有效。测试发现在不同文字下,音色一致。重启内核多次过程中,可能出现某次略微的音色差别。

给出我的实验代码:

torch.manual_seed(6666) # 固定说话人
# params_infer_code = {'prompt':'[speed_5]', 'temperature':.3}
params_refine_text = {'prompt':'[oral_2][laugh_0][break_6]'}

rand_spk = chat.sample_random_speaker()
print(type(rand_spk))
print(rand_spk.shape)
params_infer_code = {'spk_emb' : rand_spk, }

wav0 = chat.infer('四川美食确实以辣闻名,但也有不辣的选择。比如甜水面、赖汤圆、蛋烘糕、叶儿粑等,这些小吃口味温和,甜而不腻,也很受欢迎。', \
    params_refine_text=params_refine_text, params_infer_code=params_infer_code)

wav1 = chat.infer('我调用了很多次,发现每次调用的角色声音可能不一样。', \
    params_refine_text=params_refine_text, params_infer_code=params_infer_code)`

其实拉取新版本后,可以参考chatTTS的webUI版本,在其中有关于固定音色的写法,如25-35行:

torch.manual_seed(audio_seed_input)
rand_spk = chat.sample_random_speaker()
params_infer_code = {
    'spk_emb': rand_spk, 
    'temperature': temperature,
    'top_P': top_P,
    'top_K': top_K,
    }
params_refine_text = {'prompt': '[oral_2][laugh_0][break_6]'}

torch.manual_seed(text_seed_input)

在web版本这里作者同时设置音频和文本的随机种子,这样使得文本生成的效果更加固定。需要注意的是种子的范围在16行random.randint(1, 100000000)