国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

栩栩如生,音色克隆,Bert-vits2文字轉(zhuǎn)語音打造鬼畜視頻實踐(Python3.10)

這篇具有很好參考價值的文章主要介紹了栩栩如生,音色克隆,Bert-vits2文字轉(zhuǎn)語音打造鬼畜視頻實踐(Python3.10)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

諸公可知目前最牛逼的TTS免費開源項目是哪一個?沒錯,是Bert-vits2,沒有之一。它是在本來已經(jīng)極其強大的Vits項目中融入了Bert大模型,基本上解決了VITS的語氣韻律問題,在效果非常出色的情況下訓練的成本開銷普通人也完全可以接受。

BERT的核心思想是通過在大規(guī)模文本語料上進行無監(jiān)督預(yù)訓練,學習到通用的語言表示,然后將這些表示用于下游任務(wù)的微調(diào)。相比傳統(tǒng)的基于詞嵌入的模型,BERT引入了雙向上下文信息的建模,使得模型能夠更好地理解句子中的語義和關(guān)系。

BERT的模型結(jié)構(gòu)基于Transformer,它由多個編碼器層組成。每個編碼器層都有多頭自注意力機制和前饋神經(jīng)網(wǎng)絡(luò),用于對輸入序列進行多層次的特征提取和表示學習。在預(yù)訓練階段,BERT使用了兩種任務(wù)來學習語言表示:掩碼語言模型(Masked Language Model,MLM)和下一句預(yù)測(Next Sentence Prediction,NSP)。通過這兩種任務(wù),BERT能夠?qū)W習到上下文感知的詞嵌入和句子級別的語義表示。

在實際應(yīng)用中,BERT的預(yù)訓練模型可以用于各種下游任務(wù),如文本分類、命名實體識別、問答系統(tǒng)等。通過微調(diào)預(yù)訓練模型,可以在特定任務(wù)上取得更好的性能,而無需從頭開始訓練模型。

BERT的出現(xiàn)對自然語言處理領(lǐng)域帶來了重大影響,成為了許多最新研究和應(yīng)用的基礎(chǔ)。它在多個任務(wù)上取得了領(lǐng)先的性能,并促進了自然語言理解的發(fā)展。

本次讓我們基于Bert-vits2項目來克隆渣渣輝和劉青云的聲音,打造一款時下熱搜榜一的“青島啤酒”鬼畜視頻。

語音素材和模型

首先我們需要渣渣輝和劉青云的原版音頻素材,原版《掃毒》素材可以參考:https://www.bilibili.com/video/BV1R64y1F7SQ/。

將兩個主角的聲音單獨提取出來,隨后依次進行背景音和前景音的分離,聲音降噪以及聲音切片等操作,這些步驟之前已經(jīng)做過詳細介紹,請參見:民謠女神唱流行,基于AI人工智能so-vits庫訓練自己的音色模型(葉蓓/Python3.10)。 囿于篇幅,這里不再贅述。

做好素材的簡單處理后,我們來克隆項目:

git clone https://github.com/Stardust-minus/Bert-VITS2

隨后安裝項目的依賴:

cd Bert-VITS2  
  
pip3 install -r requirements.txt

接著下載bert模型放入到項目的bert目錄。

bert模型下載地址:

中:https://huggingface.co/hfl/chinese-roberta-wwm-ext-large  
日:https://huggingface.co/cl-tohoku/bert-base-japanese-v3/tree/main

語音標注

接著我們需要對已經(jīng)切好分片的語音進行標注,這里我們使用開源庫whisper,關(guān)于whisper請移步:聞其聲而知雅意,M1 Mac基于PyTorch(mps/cpu/cuda)的人工智能AI本地語音識別庫Whisper(Python3.10)。

編寫標注代碼:

import whisper  
import os  
import json  
import torchaudio  
import argparse  
import torch  
  
lang2token = {  
            'zh': "ZH|",  
            'ja': "JP|",  
            "en": "EN|",  
        }  
def transcribe_one(audio_path):  
    # load audio and pad/trim it to fit 30 seconds  
    audio = whisper.load_audio(audio_path)  
    audio = whisper.pad_or_trim(audio)  
  
    # make log-Mel spectrogram and move to the same device as the model  
    mel = whisper.log_mel_spectrogram(audio).to(model.device)  
  
    # detect the spoken language  
    _, probs = model.detect_language(mel)  
    print(f"Detected language: {max(probs, key=probs.get)}")  
    lang = max(probs, key=probs.get)  
    # decode the audio  
    options = whisper.DecodingOptions(beam_size=5)  
    result = whisper.decode(model, mel, options)  
  
    # print the recognized text  
    print(result.text)  
    return lang, result.text  
if __name__ == "__main__":  
    parser = argparse.ArgumentParser()  
    parser.add_argument("--languages", default="CJ")  
    parser.add_argument("--whisper_size", default="medium")  
    args = parser.parse_args()  
    if args.languages == "CJE":  
        lang2token = {  
            'zh': "ZH|",  
            'ja': "JP|",  
            "en": "EN|",  
        }  
    elif args.languages == "CJ":  
        lang2token = {  
            'zh': "ZH|",  
            'ja': "JP|",  
        }  
    elif args.languages == "C":  
        lang2token = {  
            'zh': "ZH|",  
        }  
    assert (torch.cuda.is_available()), "Please enable GPU in order to run Whisper!"  
    model = whisper.load_model(args.whisper_size)  
    parent_dir = "./custom_character_voice/"  
    speaker_names = list(os.walk(parent_dir))[0][1]  
    speaker_annos = []  
    total_files = sum([len(files) for r, d, files in os.walk(parent_dir)])  
    # resample audios  
    # 2023/4/21: Get the target sampling rate  
    with open("./configs/config.json", 'r', encoding='utf-8') as f:  
        hps = json.load(f)  
    target_sr = hps['data']['sampling_rate']  
    processed_files = 0  
    for speaker in speaker_names:  
        for i, wavfile in enumerate(list(os.walk(parent_dir + speaker))[0][2]):  
            # try to load file as audio  
            if wavfile.startswith("processed_"):  
                continue  
            try:  
                wav, sr = torchaudio.load(parent_dir + speaker + "/" + wavfile, frame_offset=0, num_frames=-1, normalize=True,  
                                          channels_first=True)  
                wav = wav.mean(dim=0).unsqueeze(0)  
                if sr != target_sr:  
                    wav = torchaudio.transforms.Resample(orig_freq=sr, new_freq=target_sr)(wav)  
                if wav.shape[1] / sr > 20:  
                    print(f"{wavfile} too long, ignoring\n")  
                save_path = parent_dir + speaker + "/" + f"processed_{i}.wav"  
                torchaudio.save(save_path, wav, target_sr, channels_first=True)  
                # transcribe text  
                lang, text = transcribe_one(save_path)  
                if lang not in list(lang2token.keys()):  
                    print(f"{lang} not supported, ignoring\n")  
                    continue  
                #text = "ZH|" + text + "\n"  
                text = lang2token[lang] + text + "\n"  
                speaker_annos.append(save_path + "|" + speaker + "|" + text)  
                  
                processed_files += 1  
                print(f"Processed: {processed_files}/{total_files}")  
            except:  
                continue

標注后,會生成切片語音對應(yīng)文件:

./genshin_dataset/ying/vo_dialog_DPEQ003_raidenEi_01.wav|ying|ZH|神子…臣民對我的畏懼…  
./genshin_dataset/ying/vo_dialog_DPEQ003_raidenEi_02.wav|ying|ZH|我不會那么做…  
./genshin_dataset/ying/vo_dialog_SGLQ002_raidenEi_01.wav|ying|ZH|不用著急,好好挑選吧,我就在這里等著。  
./genshin_dataset/ying/vo_dialog_SGLQ003_raidenEi_01.wav|ying|ZH|現(xiàn)在在做的事就是「留影」…  
./genshin_dataset/ying/vo_dialog_SGLQ003_raidenEi_02.wav|ying|ZH|嗯,不錯,又學到新東西了。快開始吧。

說白了,就是通過whisper把人物說的話先轉(zhuǎn)成文字,并且生成對應(yīng)的音標:

./genshin_dataset/ying/vo_dialog_DPEQ003_raidenEi_01.wav|ying|ZH|神子…臣民對我的畏懼…|_ sh en z i0 … ch en m in d ui w o d e w ei j v … _|0 2 2 5 5 0 2 2 2 2 4 4 3 3 5 5 4 4 4 4 0 0|1 2 2 1 2 2 2 2 2 2 2 1 1  
./genshin_dataset/ying/vo_dialog_DPEQ003_raidenEi_02.wav|ying|ZH|我不會那么做…|_ w o b u h ui n a m e z uo … _|0 3 3 2 2 4 4 4 4 5 5 4 4 0 0|1 2 2 2 2 2 2 1 1  
./genshin_dataset/ying/vo_dialog_SGLQ002_raidenEi_01.wav|ying|ZH|不用著急,好好挑選吧,我就在這里等著.|_ b u y ong zh ao j i , h ao h ao t iao x van b a , w o j iu z ai zh e l i d eng zh e . _|0 2 2 4 4 2 2 2 2 0 2 2 3 3 1 1 3 3 5 5 0 3 3 4 4 4 4 4 4 3 3 3 3 5 5 0 0|1 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 1  
./genshin_dataset/ying/vo_dialog_SGLQ003_raidenEi_01.wav|ying|ZH|現(xiàn)在在做的事就是'留影'…|_ x ian z ai z ai z uo d e sh ir j iu sh ir ' l iu y ing ' … _|0 4 4 4 4 4 4 4 4 5 5 4 4 4 4 4 4 0 2 2 3 3 0 0 0|1 2 2 2 2 2 2 2 2 1 2 2 1 1 1  
./genshin_dataset/ying/vo_dialog_SGLQ003_raidenEi_02.wav|ying|ZH|恩,不錯,又學到新東西了.快開始吧.|_ EE en , b u c uo , y ou x ve d ao x in d ong x i l e . k uai k ai sh ir b a

最后,將標注好的文件轉(zhuǎn)換為bert模型可讀文件:

import torch  
from multiprocessing import Pool  
import commons  
import utils  
from tqdm import tqdm  
from text import cleaned_text_to_sequence, get_bert  
import argparse  
import torch.multiprocessing as mp  
  
  
def process_line(line):  
    rank = mp.current_process()._identity  
    rank = rank[0] if len(rank) > 0 else 0  
    if torch.cuda.is_available():  
        gpu_id = rank % torch.cuda.device_count()  
        device = torch.device(f"cuda:{gpu_id}")  
    wav_path, _, language_str, text, phones, tone, word2ph = line.strip().split("|")  
    phone = phones.split(" ")  
    tone = [int(i) for i in tone.split(" ")]  
    word2ph = [int(i) for i in word2ph.split(" ")]  
    word2ph = [i for i in word2ph]  
    phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str)  
  
    phone = commons.intersperse(phone, 0)  
    tone = commons.intersperse(tone, 0)  
    language = commons.intersperse(language, 0)  
    for i in range(len(word2ph)):  
        word2ph[i] = word2ph[i] * 2  
    word2ph[0] += 1  
  
    bert_path = wav_path.replace(".wav", ".bert.pt")  
  
    try:  
        bert = torch.load(bert_path)  
        assert bert.shape[-1] == len(phone)  
    except Exception:  
        bert = get_bert(text, word2ph, language_str, device)  
        assert bert.shape[-1] == len(phone)  
        torch.save(bert, bert_path)

模型訓練

此時,打開項目目錄中的config.json文件:

{  
  "train": {  
    "log_interval": 100,  
    "eval_interval": 100,  
    "seed": 52,  
    "epochs": 200,  
    "learning_rate": 0.0001,  
    "betas": [  
      0.8,  
      0.99  
    ],  
    "eps": 1e-09,  
    "batch_size": 4,  
    "fp16_run": false,  
    "lr_decay": 0.999875,  
    "segment_size": 16384,  
    "init_lr_ratio": 1,  
    "warmup_epochs": 0,  
    "c_mel": 45,  
    "c_kl": 1.0,  
    "skip_optimizer": true  
  },  
  "data": {  
    "training_files": "filelists/train.list",  
    "validation_files": "filelists/val.list",  
    "max_wav_value": 32768.0,  
    "sampling_rate": 44100,  
    "filter_length": 2048,  
    "hop_length": 512,  
    "win_length": 2048,  
    "n_mel_channels": 128,  
    "mel_fmin": 0.0,  
    "mel_fmax": null,  
    "add_blank": true,  
    "n_speakers": 1,  
    "cleaned_text": true,  
    "spk2id": {  
      "ying": 0  
    }  
  },  
  "model": {  
    "use_spk_conditioned_encoder": true,  
    "use_noise_scaled_mas": true,  
    "use_mel_posterior_encoder": false,  
    "use_duration_discriminator": true,  
    "inter_channels": 192,  
    "hidden_channels": 192,  
    "filter_channels": 768,  
    "n_heads": 2,  
    "n_layers": 6,  
    "kernel_size": 3,  
    "p_dropout": 0.1,  
    "resblock": "1",  
    "resblock_kernel_sizes": [  
      3,  
      7,  
      11  
    ],  
    "resblock_dilation_sizes": [  
      [  
        1,  
        3,  
        5  
      ],  
      [  
        1,  
        3,  
        5  
      ],  
      [  
        1,  
        3,  
        5  
      ]  
    ],  
    "upsample_rates": [  
      8,  
      8,  
      2,  
      2,  
      2  
    ],  
    "upsample_initial_channel": 512,  
    "upsample_kernel_sizes": [  
      16,  
      16,  
      8,  
      2,  
      2  
    ],  
    "n_layers_q": 3,  
    "use_spectral_norm": false,  
    "gin_channels": 256  
  }  
}

這里需要修改的參數(shù)是batch_size,通常情況下,數(shù)值和本地顯存應(yīng)該是一致的,但是最好還是改小一點,比如說一塊4060的8G卡,最好batch_size是4,如果寫8的話,還是有幾率爆顯存。

隨后開始訓練:

python3 train_ms.py

程序返回:

[W C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\torch\csrc\distributed\c10d\socket.cpp:601] [c10d] The client socket has failed to connect to [v3u.net]:65280 (system error: 10049 - 在其上下文中,該請求的地址無效。).  
[W C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\torch\csrc\distributed\c10d\socket.cpp:601] [c10d] The client socket has failed to connect to [v3u.net]:65280 (system error: 10049 - 在其上下文中,該請求的地址無效。).  
2023-10-23 15:36:08.293 | INFO     | data_utils:_filter:61 - Init dataset...  
100%|█████████████████████████████████████████████████████████████████████████████| 562/562 [00:00<00:00, 14706.57it/s]  
2023-10-23 15:36:08.332 | INFO     | data_utils:_filter:76 - skipped: 0, total: 562  
2023-10-23 15:36:08.333 | INFO     | data_utils:_filter:61 - Init dataset...  
100%|████████████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:00<?, ?it/s]  
2023-10-23 15:36:08.334 | INFO     | data_utils:_filter:76 - skipped: 0, total: 4  
Using noise scaled MAS for VITS2  
Using duration discriminator for VITS2  
INFO:OUTPUT_MODEL:Loaded checkpoint './logs\OUTPUT_MODEL\DUR_4600.pth' (iteration 33)  
INFO:OUTPUT_MODEL:Loaded checkpoint './logs\OUTPUT_MODEL\G_4600.pth' (iteration 33)  
INFO:OUTPUT_MODEL:Loaded checkpoint './logs\OUTPUT_MODEL\D_4600.pth' (iteration 33)

說明沒有問題,訓練日志存放在項目的logs目錄下。

隨后可以通過tensorboard來監(jiān)控訓練過程:

python3 -m tensorboard.main --logdir=logs\OUTPUT_MODEL

當loss趨于穩(wěn)定說明模型已經(jīng)收斂:

模型推理

最后,我們就可以使用模型來生成我們想要聽到的語音了:

python3 webui.py -m ./logs\OUTPUT_MODEL\G_47700.pth

注意參數(shù)為訓練好的迭代模型,如果覺得當前迭代的模型可用,那么直接把pth和config.json拷貝出來即可,隨后可以接著訓練下一個模型。

結(jié)語

基于Bert-vits2打造的渣渣輝和劉青云音色的鬼畜視頻已經(jīng)上線到Y(jié)outube(B站),請檢索:劉悅的技術(shù)博客,歡迎諸君品鑒和臻賞。文章來源地址http://www.zghlxwxcb.cn/news/detail-711370.html

到了這里,關(guān)于栩栩如生,音色克隆,Bert-vits2文字轉(zhuǎn)語音打造鬼畜視頻實踐(Python3.10)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • AIGC:語音克隆模型Bert-VITS2-2.3部署與實戰(zhàn)

    AIGC:語音克隆模型Bert-VITS2-2.3部署與實戰(zhàn)

    單階段文本到語音模型最近被積極研究,其結(jié)果優(yōu)于兩階段管道系統(tǒng)。以往的單階段模型雖然取得了較大的進展,但在間歇性非自然性、計算效率、對音素轉(zhuǎn)換依賴性強等方面仍有改進的空間。本文提出VITS2,一種單階段的文本到語音模型,通過改進之前工作的幾個方面,有

    2024年04月17日
    瀏覽(28)
  • Bert-vits2最終版Bert-vits2-2.3云端訓練和推理(Colab免費GPU算力平臺)

    Bert-vits2最終版Bert-vits2-2.3云端訓練和推理(Colab免費GPU算力平臺)

    對于深度學習初學者來說,JupyterNoteBook的腳本運行形式顯然更加友好,依托Python語言的跨平臺特性,JupyterNoteBook既可以在本地線下環(huán)境運行,也可以在線上服務(wù)器上運行。GoogleColab作為免費GPU算力平臺的執(zhí)牛耳者,更是讓JupyterNoteBook的腳本運行形式如虎添翼。 本次我們利用

    2024年02月04日
    瀏覽(22)
  • Bert-vits2-2.3-Final,Bert-vits2最終版一鍵整合包(復(fù)刻生化危機艾達王)

    Bert-vits2-2.3-Final,Bert-vits2最終版一鍵整合包(復(fù)刻生化危機艾達王)

    近日,Bert-vits2發(fā)布了最新的版本2.3-final,意為最終版,修復(fù)了一些已知的bug,添加基于 WavLM 的 Discriminator(來源于 StyleTTS2),令人意外的是,因情感控制效果不佳,去除了 CLAP情感模型,換成了相對簡單的 BERT 融合語義方式。 事實上,經(jīng)過2.2版本的測試,CLAP情感模型的效果

    2024年02月04日
    瀏覽(29)
  • Python - Bert-VITS2 語音推理服務(wù)部署

    Python - Bert-VITS2 語音推理服務(wù)部署

    目錄 一.引言 二.服務(wù)搭建 1.服務(wù)配置 2.服務(wù)代碼 3.服務(wù)踩坑 三.服務(wù)使用 1.服務(wù)啟動 2.服務(wù)調(diào)用 3.服務(wù)結(jié)果 四.總結(jié) 上一篇文章我們介紹了如果使用 conda 搭建 Bert-VITS2 最新版本的環(huán)境并訓練自定義語音,通過 1000 個 epoch 的訓練,我們得到了自定義語音模型,本文基于上文得

    2024年02月02日
    瀏覽(27)
  • Python - Bert-VITS2 自定義訓練語音

    Python - Bert-VITS2 自定義訓練語音

    目錄 一.引言 二.前期準備 1.Conda 環(huán)境搭建 2.Bert 模型下載 3.預(yù)訓練模型下載? 三.數(shù)據(jù)準備 1.音頻文件批量處理 2.訓練文件地址生成 3.模型訓練配置生成 4.訓練文件重采樣 5.Tensor pt 文件生成 四.模型訓練 1.預(yù)訓練模型 2.模型訓練 3.模型收菜 五.總結(jié) 前面我們通過視頻 OCR 技術(shù)識

    2024年01月20日
    瀏覽(25)
  • bert-vits2本地部署報錯疑難問題匯總

    bert-vits2本地部署報錯疑難問題匯總

    bert-vits2.3 win 和wsl bert-vits2本地部署報錯疑難問題匯總 問題1: Conda安裝requirements里面依賴出現(xiàn)ERROR: No matching distribution found for opencc==1.1.6 解決方法 問題2: error: Microsoft Visual C++ 14.0 or greater is required. Get it with \\\"Microsoft C++ Build Tool 解決方法 安裝VS2019 單獨安裝2個組件 問題3: 訓練報錯

    2024年02月19日
    瀏覽(28)
  • 如何快速部署本地訓練的 Bert-VITS2 語音模型到 Hugging Face

    如何快速部署本地訓練的 Bert-VITS2 語音模型到 Hugging Face

    Hugging Face是一個機器學習(ML)和數(shù)據(jù)科學平臺和社區(qū),幫助用戶構(gòu)建、部署和訓練機器學習模型。它提供基礎(chǔ)設(shè)施,用于在實時應(yīng)用中演示、運行和部署人工智能(AI)。用戶還可以瀏覽其他用戶上傳的模型和數(shù)據(jù)集。Hugging Face通常被稱為機器學習界的GitHub,因為它讓開發(fā)人

    2024年02月01日
    瀏覽(27)
  • 基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的語音智能助手

    基于GPT3.5逆向 和 本地Bert-Vits2-2.3 的語音智能助手

    各位讀者你們好,我最近在研究一個語音助手的項目,是基于GPT3.5網(wǎng)頁版的逆向和本地BertVits2-2.3 文字轉(zhuǎn)語音,能實現(xiàn)的事情感覺還挺多,目前實現(xiàn)【無需翻墻,國內(nèi)網(wǎng)絡(luò)發(fā)送消息,返回答案文字和語音】,網(wǎng)站已上線并未公開鏈接,以下是演示GIF: 前端使用uni-app完成,登錄

    2024年01月24日
    瀏覽(26)
  • 本地訓練,開箱可用,Bert-VITS2 V2.0.2版本本地基于現(xiàn)有數(shù)據(jù)集訓練(原神刻晴)

    本地訓練,開箱可用,Bert-VITS2 V2.0.2版本本地基于現(xiàn)有數(shù)據(jù)集訓練(原神刻晴)

    按照固有思維方式,深度學習的訓練環(huán)節(jié)應(yīng)該在云端,畢竟本地硬件條件有限。但事實上,在語音識別和自然語言處理層面,即使相對較少的數(shù)據(jù)量也可以訓練出高性能的模型,對于預(yù)算有限的同學們來說,也沒必要花冤枉錢上“云端”了,本次我們來演示如何在本地訓練

    2024年02月05日
    瀏覽(20)
  • 義無反顧馬督工,Bert-vits2V210復(fù)刻馬督工實踐(Python3.10)

    義無反顧馬督工,Bert-vits2V210復(fù)刻馬督工實踐(Python3.10)

    Bert-vits2更新了版本V210,修正了日/英的bert對齊問題,效果進一步優(yōu)化;對底模使用的數(shù)據(jù)進行優(yōu)化和加量,減少finetune失敗以及電音的可能性;日語bert更換了模型,完善了多語言推理。 更多情報請參考Bert-vits2官網(wǎng): 最近的事情大家也都曉得了,馬督工義無反顧帶頭沖鋒,身

    2024年02月05日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包