找回密码
 立即注册
首页 业界区 安全 旅行者,让我教你用VITS合成提瓦特语音吧!(原神角色版 ...

旅行者,让我教你用VITS合成提瓦特语音吧!(原神角色版技术指南)

毡轩 2025-5-31 23:19:31
【可莉的快乐开场】哒哒哒~一起来玩语音魔法吧!

嗨嗨~我是西风骑士团的可莉!今天琴团长说"可莉要好好学习",所以可莉要教大家一个超级有趣的魔法——VITS语音合成!就像可莉能用蹦蹦炸弹炸鱼一样(嘘...不要告诉琴团长),你们也能用这个魔法创造出提瓦特大陆上任何角色的声音哦!
【钟离的沉稳解说】何谓VITS?

轻抿一口茶
据古籍记载,VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)是一种基于深度学习的端到端语音合成技术。相较于传统TTS系统,它无需复杂的声学模型和声码器,直接通过文本生成自然流畅的语音。
其核心在于:

  • 变分自编码器(VAE)结构
  • 对抗训练机制
  • 蒙特卡洛flow-based时长预测
【温迪的诗意比喻】VITS如风般自由

啊~让我用诗歌来解释吧!VITS就像蒙德城自由的风:

  • 文本编码器是"前奏",将文字化作音符
  • 先验编码器是"间奏",捕捉语音的韵律
  • 解码器是"高潮",把音符变成动听歌声
  • 判别器则是"观众",确保演出足够真实
【雷电将军的威严命令】安装必备工具

"此乃永恒之需,务必严格执行":
  1. # 基础环境
  2. conda create -n vits python=3.8
  3. conda activate vits
  4. pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/cu113/torch_stable.html
  5. # 核心依赖
  6. pip install numpy scipy matplotlib pandas
  7. pip install tensorboard librosa unidecode inflect
复制代码
【神里绫华的优雅示范】获取代码仓库

"白鹭霜华,代码如雪般纯净":
  1. git clone https://github.com/Plachtaa/VITS-fast-fine-tuning.git
  2. pip install -r requirements.txt
复制代码
原神角色模型(请遵守相关版权规定)

访问【VITS-genshin】下载相关的模型,密码是8243。将整个目录下载下来放在源码目录下。
【魈的实战演示】合成你的第一段语音

"听令!"
  1. import os
  2. import torch
  3. import utils
  4. import commons
  5. import logging
  6. import soundfile as sf
  7. from text import text_to_sequence
  8. from models import SynthesizerTrn
  9. from torch import no_grad, LongTensor
  10. logger = logging.getLogger("jieba")
  11. logger.setLevel(logging.WARNING)
  12. limitation = False
  13. hps_ms = utils.get_hparams_from_file('./configs/uma_trilingual.json')
  14.    
  15. device = torch.device("cpu")
  16. net_g_ms = SynthesizerTrn(
  17.     len(hps_ms.symbols),
  18.     hps_ms.data.filter_length // 2 + 1,
  19.     hps_ms.train.segment_size // hps_ms.data.hop_length,
  20.     n_speakers=hps_ms.data.n_speakers,
  21.     **hps_ms.model)
  22. _ = net_g_ms.eval().to(device)
  23. model, optimizer, learning_rate, epochs = utils.load_checkpoint("./pretrained_models/G_trilingual.pth", net_g_ms, None)
  24. def get_text(text, hps):
  25.     text_norm = text_to_sequence(text, hps.symbols, hps.data.text_cleaners)
  26.     if hps.data.add_blank:
  27.         text_norm = commons.intersperse(text_norm, 0)
  28.     text_norm = LongTensor(text_norm)
  29.     return text_norm
  30. def vits(text, language, speaker_id, noise_scale, noise_scale_w, length_scale):
  31.     if not len(text):
  32.         return "输入文本不能为空!", None, None
  33.     text = text.replace('\n', ' ').replace('\r', '').replace(" ", "")
  34.     length = len(text)
  35.     if length > 100:
  36.         return "输入文字过长!", None, None
  37.     if language == 0:
  38.         text = "[ZH]{}[ZH]".format(text)
  39.     elif language == 1:
  40.         text = "[JA]{}[JA]".format(text)
  41.     stn_tst = get_text(text, hps_ms)
  42.     with no_grad():
  43.         x_tst = stn_tst.unsqueeze(0).to(device)
  44.         x_tst_lengths = LongTensor([stn_tst.size(0)]).to(device)
  45.         speaker_id = LongTensor([speaker_id]).to(device)
  46.         audio = net_g_ms.infer(x_tst, x_tst_lengths, sid=speaker_id, noise_scale=noise_scale, noise_scale_w=noise_scale_w,
  47.                                length_scale=length_scale)[0][0, 0].data.cpu().float().numpy()
  48.     return 22050, audio
  49. if __name__ == "__main__":
  50.     speakers = {
  51.         "特别周": 0, "无声铃鹿": 1, "东海帝王": 2, "丸善斯基": 3, "富士奇迹": 4, "小栗帽": 5, "黄金船": 6, "伏特加": 7, "大和赤骥": 8, "大树快车": 9,
  52.         "草上飞": 10, "菱亚马逊": 11, "目白麦昆": 12, "神鹰": 13, "好歌剧": 14, "成田白仁": 15, "鲁道夫象征": 16, "气槽": 17, "爱丽数码": 18, "青云天空": 19,
  53.         "玉藻十字": 20, "美妙姿势": 21, "琵琶晨光": 22, "重炮": 23, "曼城茶座": 24, "美普波旁": 25, "目白雷恩": 26, "雪之美人": 28, "米浴": 29, "艾尼斯风神": 30,
  54.          "爱丽速子": 31, "爱慕织姬": 32, "稻荷一": 33, "胜利奖券": 34, "空中神宫": 35, "荣进闪耀": 36, "真机伶": 37, "川上公主": 38, "黄金城市": 39, "樱花进王": 40,
  55.          "采珠": 41, "新光风": 42, "东商变革": 43, "超级小溪": 44, "醒目飞鹰": 45, "荒漠英雄": 46, "东瀛佐敦": 47, "中山庆典": 48, "成田大进": 49, "西野花": 50,
  56.           "春乌拉拉": 51, "青竹回忆": 52, "待兼福来": 55, "名将怒涛": 57, "目白多伯": 58, "优秀素质": 59, "帝王光环": 60, "待兼诗歌剧": 61, "生野狄杜斯": 62,
  57.           "目白善信": 63, "大拓太阳神": 64, "双涡轮": 65, "里见光钻": 66, "北部玄驹": 67, "樱花千代王": 68, "天狼星象征": 69, "目白阿尔丹": 70, "八重无敌": 71,
  58.           "鹤丸刚志": 72, "目白光明": 73, "樱花桂冠": 74, "成田路": 75, "也文摄辉": 76, "真弓快车": 80, "骏川手纲": 81, "小林历奇": 83, "奇锐骏": 85, "秋川理事长": 86,
  59.           "綾地": 87, "因幡": 88, "椎葉": 89, "仮屋": 90, "戸隠": 91, "九条裟罗": 92, "芭芭拉": 93, "派蒙": 94, "荒泷一斗": 96, "早柚": 97, "香菱": 98, "神里绫华": 99,
  60.           "重云": 100, "流浪者": 102, "优菈": 103, "凝光": 105, "钟离": 106, "雷电将军": 107, "枫原万叶": 108, "赛诺": 109, "诺艾尔": 112, "八重神子": 113, "凯亚": 114,
  61.            "魈": 115, "托马": 116, "可莉": 117, "迪卢克": 120, "夜兰": 121, "鹿野院平藏": 123, "辛焱": 124, "丽莎": 125, "云堇": 126, "坎蒂丝": 127, "罗莎莉亚": 128,
  62.            "北斗": 129, "珊瑚宫心海": 132, "烟绯": 133, "久岐忍": 136, "宵宫": 139, "安柏": 143, "迪奥娜": 144, "班尼特": 146, "雷泽": 147, "阿贝多": 151, "温迪": 152,
  63.            "空": 153, "神里绫人": 154, "琴": 155, "艾尔海森": 156, "莫娜": 157, "妮露": 159, "胡桃": 160, "甘雨": 161, "纳西妲": 162, "刻晴": 165, "荧": 169, "埃洛伊": 179,
  64.            "柯莱": 182, "多莉": 184, "提纳里": 186, "砂糖": 188, "行秋": 190, "奥兹": 193, "五郎": 198, "达达利亚": 202, "七七": 207, "申鹤": 217, "莱依拉": 228, "菲谢尔": 230
  65.     }
  66.     speed = 1
  67.     output_dir = "output"
  68.     if not os.path.exists(output_dir):
  69.         os.makedirs(output_dir)
  70.     for k in  speakers:
  71.         id = speakers[k]
  72.         print("Speaker:",k)
  73.         sr, audio = vits('你好,我是玛丽', 0, torch.tensor([id]), 0.1, 0.668, 1.0/speed)
  74.         filename = os.path.join(output_dir, "{}.wav".format(k))
  75.         sf.write(filename, audio, samplerate=sr)
复制代码
将以上代码复制到Python脚本中。运行即可看到如下生成的效果:

最后来听下效果:
     八重神子       东海帝王  【全体角色的谢幕】一起创造提瓦特之声吧!

"愿风神护佑你的代码没有bug!"(温迪) "此即,智慧之殿堂。"(纳西妲) "代码如契约,必须严格执行。"(钟离) "哒哒哒~可莉要去写更多语音啦!"(可莉)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册