这个是哪里去指定? 或者随机? 或者根据内容自动模型自动适配?
[2noise/ChatTTS]我调用了很多次,发现每次调用的角色声音可能不一样。
回答
同,在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)`
没有GPC,使用CPU不行是吗?
没有GPC,使用CPU不行是吗?
CPU可以运行啊。我就是在笔记本上运行的。
同,在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
。
还缺少 spk_stat.pt吧?等着作者哪天开心,就会上传了吧。
现在作者已经发布了 spk_stat.pt
, 但是还是不能固定说话人的音色啊,是我的用法不对吗?
std, mean = torch.load('/workspace/ChatTTS/asset/spk_stat.pt').chunk(2) rand_spk = torch.tensor([0.5] * 768) * std + mean
求大佬帮忙看看
同问。经调试发现,当‘spk_emb‘不变时,输入GPT模型前的model_input['inputs_embeds']也是不变的,但是经过推理输出说话人却会变。另外,暂时也没找到能影响说话人音色的其它输入。
同问,spk_stat.pt也加载了,spk_stat = torch.load('spk_stat.pt') ;'spk_emb': fixed_spk_emb,
生成1分41秒的视频还是会用到多个音色
mark下
同问,如何固定音色?
可以直接通过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)
可以直接通过
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)
测试了,不行。只要文字发生变化,输出的音色就发生变化。
可以直接通过
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 这两个参数需要配合使用,才能指定出一个相对比较稳定的音色。
如何配合才能稳定音色输出呢?求破!
m
可以直接通过
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)`
可以直接通过
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)