Bert-vits2新版本V2.1英文模型本地訓練以及中英文混合推理(mix)

在這里插入圖片描述

中英文混合輸出是文本轉語音(TTS)項目中很常見的需求場景,尤其在技術文章或者技術視頻領域里,其中文文本中一定會夾雜著海量的英文單詞,我們當然不希望AI口播只會念中文,Bert-vits2老版本(2.0以下版本)并不支持英文訓練和推理,但更新了底模之后,V2.0以上版本支持了中英文混合推理(mix)模式。

還是以霉霉為例子:

https://www.bilibili.com/video/BV1bB4y1R7Nu/

截取霉霉說英文的30秒音頻素材片段:

Bert-vits2英文素材處理

首先克隆項目:

git clone https://github.com/v3ucn/Bert-VITS2_V210.git

安裝依賴:

pip3 install -r requirements.txt

將音頻素材放入Data/meimei_en/raw目錄中,這里en代表英文角色。

隨后對素材進行切分:

python3 audio_slicer.py

隨后對音頻進行識別和重新采樣:

python3 short_audio_transcribe.py

這里還是使用語音識別模型whisper,默認選擇medium模型,如果顯存不夠可以針對short_audio_transcribe.py文件進行修改:

import whisper  
import os  
import json  
import torchaudio  
import argparse  
import torch  
from config import config  
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|",  }

識別后的語音文件:

Data\meimei_en\raw/meimei_en/processed_0.wav|meimei_en|EN|But these were songs that didn't make it on the album.  
Data\meimei_en\raw/meimei_en/processed_1.wav|meimei_en|EN|because I wanted to save them for the next album. And then it turned out the next album was like a whole different thing. And so they get left behind.  
Data\meimei_en\raw/meimei_en/processed_2.wav|meimei_en|EN|and you always think back on these songs, and you're like.  
Data\meimei_en\raw/meimei_en/processed_3.wav|meimei_en|EN|What would have happened? I wish people could hear this.  
Data\meimei_en\raw/meimei_en/processed_4.wav|meimei_en|EN|but it belongs in that moment in time.  
Data\meimei_en\raw/meimei_en/processed_5.wav|meimei_en|EN|So, now that I get to go back and revisit my old work,  
Data\meimei_en\raw/meimei_en/processed_6.wav|meimei_en|EN|I've dug up those songs.  
Data\meimei_en\raw/meimei_en/processed_7.wav|meimei_en|EN|from the crypt they were in.  
Data\meimei_en\raw/meimei_en/processed_8.wav|meimei_en|EN|And I have like, I've reached out to artists that I love and said, do you want to?  
Data\meimei_en\raw/meimei_en/processed_9.wav|meimei_en|EN|do you want to sing this with me? You know, Phoebe Bridgers is one of my favorite artists.

可以看到,每個切片都有對應的英文字符。

接著就是標注,以及bert模型文件生成:

python3 preprocess_text.py  
python3 emo_gen.py  
python3 spec_gen.py  
python3 bert_gen.py

運行完畢后,查看英文訓練集:

Data\meimei_en\raw/meimei_en/processed_3.wav|meimei_en|EN|What would have happened? I wish people could hear this.|_ w ah t w uh d hh ae V hh ae p ah n d ? ay w ih sh p iy p ah l k uh d hh ih r dh ih s . _|0 0 2 0 0 2 0 0 2 0 0 2 0 1 0 0 0 2 0 2 0 0 2 0 1 0 0 2 0 0 2 0 0 2 0 0 0|1 3 3 3 6 1 1 3 5 3 3 3 1 1  
Data\meimei_en\raw/meimei_en/processed_6.wav|meimei_en|EN|I've dug up those songs.|_ ay V d ah g ah p dh ow z s ao ng z . _|0 2 0 0 2 0 2 0 0 2 0 0 2 0 0 0 0|1 1 1 0 3 2 3 4 1 1  
Data\meimei_en\raw/meimei_en/processed_5.wav|meimei_en|EN|So, now that I get to go back and revisit my old work,|_ s ow , n aw dh ae t ay g eh t t uw g ow b ae k ae n d r iy V ih z ih t m ay ow l d w er k , _|0 0 2 0 0 2 0 2 0 2 0 2 0 0 2 0 2 0 2 0 2 0 0 0 1 0 2 0 1 0 0 2 2 0 0 0 2 0 0 0|1 2 1 2 3 1 3 2 2 3 3 7 2 3 3 1 1  
Data\meimei_en\raw/meimei_en/processed_1.wav|meimei_en|EN|because I wanted to save them for the next album. And then it turned out the next album was like a whole different thing. And so they get left behind.|_ b ih k ao z ay w aa n t ah d t uw s ey V dh eh m f ao r dh ah n eh k s t ae l b ah m . ae n d dh eh n ih t t er n d aw t dh ah n eh k s t ae l b ah m w aa z l ay k ah hh ow l d ih f er ah n t th ih ng . ae n d s ow dh ey g eh t l eh f t b ih hh ay n d . _|0 0 1 0 2 0 2 0 2 0 0 1 0 0 2 0 2 0 0 2 0 0 2 0 0 1 0 2 0 0 0 2 0 0 1 0 0 2 0 0 0 2 0 2 0 0 2 0 0 2 0 0 1 0 2 0 0 0 2 0 0 1 0 0 2 0 0 2 0 1 0 2 0 0 2 0 1 1 0 0 0 2 0 0 2 0 0 0 2 0 2 0 2 0 0 2 0 0 0 1 0 2 0 0 0 0|1 5 1 6 2 3 3 3 2 5 5 1 3 3 2 4 2 2 5 5 3 3 1 3 7 3 1 3 2 2 3 4 6 1 1  
Data\meimei_en\raw/meimei_en/processed_2.wav|meimei_en|EN|and you always think back on these songs, and you're like.|_ ae n d y uw ao l w ey z th ih ng k b ae k aa n dh iy z s ao ng z , ae n d y uh r l ay k . _|0 2 0 0 0 2 2 0 0 3 0 0 2 0 0 0 2 0 2 0 0 2 0 0 2 0 0 0 2 0 0 0 2 0 0 2 0 0 0|1 3 2 5 4 3 2 3 4 1 3 1 1 1 3 1 1

至此,英文數據集就處理好了。

Bert-vits2英文模型訓練

隨后運行訓練文件:

python3 train_ms.py

就可以在本地訓練英文模型了。

這里需要注意的是,中文模型和英文模型通常需要分別進行訓練,換句話說,不能把英文訓練集和中文訓練集混合著進行訓練。

中文和英文在語言結構、詞匯和語法等方面存在顯著差異。中文采用漢字作為基本單元,而英文使用字母作為基本單元。中文的句子結構和語序也與英文有所不同。因此,中文模型和英文模型在學習語言特征和模式時需要不同的處理方式和模型架構。

中英文文本數據的編碼方式不同。中文通常使用Unicode編碼,而英文使用ASCII或Unicode編碼。這導致了中文和英文文本數據的表示方式存在差異。在混合訓練時,中英文文本數據的編碼和處理方式需要統一,否則會導致模型訓練過程中的不一致性和錯誤。

所以,Bert-vits2所謂的Mix模式也僅僅指的是推理,而非訓練,當然,雖然沒法混合數據集進行訓練,但是開多進程進行中文和英文模型的并發訓練還是可以的。

Bert-vits2中英文模型混合推理

英文模型訓練完成后(所謂的訓練完成,往往是先跑個50步看看效果),將中文模型也放入Data目錄,關于中文模型的訓練,請移步:本地訓練,立等可取,30秒音頻素材復刻霉霉講中文音色基于Bert-VITS2V2.0.2,囿于篇幅,這里不再贅述。

模型結構如下:

E:\work\Bert-VITS2-v21_demo\Data>tree /f  
Folder PATH listing for volume myssd  
Volume serial number is 7CE3-15AE  
E:.  
├───meimei_cn  
│   │   config.json  
│   │   config.yml  
│   │  
│   ├───filelists  
│   │       cleaned.list  
│   │       short_character_anno.list  
│   │       train.list  
│   │       val.list  
│   │  
│   ├───models  
│   │       G_50.pth  
│   │  
│   └───raw  
│       └───meimei  
│               meimei_0.wav  
│               meimei_1.wav  
│               meimei_2.wav  
│               meimei_3.wav  
│               meimei_4.wav  
│               meimei_5.wav  
│               meimei_6.wav  
│               meimei_7.wav  
│               meimei_8.wav  
│               meimei_9.wav  
│               processed_0.bert.pt  
│               processed_0.emo.npy  
│               processed_0.spec.pt  
│               processed_0.wav  
│               processed_1.bert.pt  
│               processed_1.emo.npy  
│               processed_1.spec.pt  
│               processed_1.wav  
│               processed_2.bert.pt  
│               processed_2.emo.npy  
│               processed_2.spec.pt  
│               processed_2.wav  
│               processed_3.bert.pt  
│               processed_3.emo.npy  
│               processed_3.spec.pt  
│               processed_3.wav  
│               processed_4.bert.pt  
│               processed_4.emo.npy  
│               processed_4.spec.pt  
│               processed_4.wav  
│               processed_5.bert.pt  
│               processed_5.emo.npy  
│               processed_5.spec.pt  
│               processed_5.wav  
│               processed_6.bert.pt  
│               processed_6.emo.npy  
│               processed_6.spec.pt  
│               processed_6.wav  
│               processed_7.bert.pt  
│               processed_7.emo.npy  
│               processed_7.spec.pt  
│               processed_7.wav  
│               processed_8.bert.pt  
│               processed_8.emo.npy  
│               processed_8.spec.pt  
│               processed_8.wav  
│               processed_9.bert.pt  
│               processed_9.emo.npy  
│               processed_9.spec.pt  
│               processed_9.wav  
│  
└───meimei_en  │   config.json  │   config.yml  │  ├───filelists  │       cleaned.list  │       short_character_anno.list  │       train.list  │       val.list  │  ├───models  │   │   DUR_0.pth  │   │   DUR_50.pth  │   │   D_0.pth  │   │   D_50.pth  │   │   events.out.tfevents.1701484053.ly.16484.0  │   │   events.out.tfevents.1701620324.ly.10636.0  │   │   G_0.pth  │   │   G_50.pth  │   │   train.log  │   │  │   └───eval  │           events.out.tfevents.1701484053.ly.16484.1  │           events.out.tfevents.1701620324.ly.10636.1  │  └───raw  └───meimei_en  meimei_en_0.wav  meimei_en_1.wav  meimei_en_2.wav  meimei_en_3.wav  meimei_en_4.wav  meimei_en_5.wav  meimei_en_6.wav  meimei_en_7.wav  meimei_en_8.wav  meimei_en_9.wav  processed_0.bert.pt  processed_0.emo.npy  processed_0.wav  processed_1.bert.pt  processed_1.emo.npy  processed_1.spec.pt  processed_1.wav  processed_2.bert.pt  processed_2.emo.npy  processed_2.spec.pt  processed_2.wav  processed_3.bert.pt  processed_3.emo.npy  processed_3.spec.pt  processed_3.wav  processed_4.bert.pt  processed_4.emo.npy  processed_4.wav  processed_5.bert.pt  processed_5.emo.npy  processed_5.spec.pt  processed_5.wav  processed_6.bert.pt  processed_6.emo.npy  processed_6.spec.pt  processed_6.wav  processed_7.bert.pt  processed_7.emo.npy  processed_7.wav  processed_8.bert.pt  processed_8.emo.npy  processed_8.wav  processed_9.bert.pt  processed_9.emo.npy  processed_9.wav

這里meimei_cn代表中文角色模型,meimei_en代表英文角色模型,分別都只訓練了50步。

啟動推理服務:

python3 webui.py

訪問http://127.0.0.1:7860/,在文本框中輸入:

[meimei_cn]<zh>但這些歌曲沒進入專輯因為想留著他們下一張專輯用,然後下一張專輯完全不同所以他們被拋在了後面  
[meimei_en]<en>But these were songs that didn't make it on the album.  
because I wanted to save them for the next album. And then it turned out the next album was like a whole different thing. And so they get left behind.

隨后將語言設置為mix。

這里通過[角色]和<語言>對文本進行標識,讓系統選擇對應的中文或者英文模型進行并發推理:

如果本地只有一個英文模型和一個中文模型,也可以選擇auto模型,進行自動中英文混合推理:

但這些歌曲沒進入專輯因為想留著他們下一張專輯用,然後下一張專輯完全不同所以他們被拋在了後面  
But these were songs that didn't make it on the album.  
because I wanted to save them for the next album. And then it turned out the next album was like a whole different thing. And so they get left behind.

系統會自動偵測文本語言從而選擇對應模型進行推理。

結語

在技術文章翻譯轉口播或者視頻、跨語言信息檢索等任務中需要處理中英文之間的轉換和對齊,通過Bert-vits2中英文混合推理,可以更有效地處理這些任務,并提供更準確和連貫的結果,Bert-vits2中英文混合推理整合包地址如下:

https://pan.baidu.com/s/1iaC7f1GPXevDrDMCRCs8uQ?pwd=v3uc

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206789.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206789.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

完整方案開放下載!詳解中國移動《通信網絡中量子計算應用研究報告》

8月30日&#xff0c;中國移動在第四屆科技周暨戰略性新興產業共創發展大會上重磅發布了《通信網絡中量子計算應用研究報告》。 玻色量子作為中國移動在光量子計算領域的唯一一家合作企業兼戰投企業&#xff0c;在量子計算應用于通信行業達成了深入合作&#xff0c;并在5G天線多…

干貨分享|300平米A級機房設計方案

本方案中XXX計算機中心機房建設工程&#xff0c;是XXX的數據中心&#xff0c;機房位于建筑的X層&#xff0c;計算機機房面積300㎡。采購設備以及裝修工藝主要用于XXX所屬計算機機房裝修工程。 考慮到中心機房投資大、使用周期長&#xff0c;而業主業務發展快&#xff0c;現代技…

十二 動手學深度學習v2計算機視覺 ——目標檢測

文章目錄 錨框目標檢測常用算法RCNNFast RCNNFaster RCNNSSD 單發多框檢測YOLO 錨框 一類目標檢測算法&#xff1a;以圖像的每個像素為中心生成不同形狀的錨框&#xff0c;并賦予標號&#xff0c;每個錨框作為一個樣本進行訓練。在預測時&#xff0c;使用NMS來去掉冗余的預測。…

空間地圖GIS基礎

關注微信公眾號掌握更多技術動態 --------------------------------------------------------------- 一、GIS基本概念 地理信息系統&#xff08;Geographic Informaiton System, GIS&#xff09;是一個可以建立、瀏覽、查詢、分析地理空間數據的軟件系統&#xff0c;其功能小…

利用 Python 進行數據分析實驗(六)

一、實驗目的 使用Python解決問題 二、實驗要求 自主編寫并運行代碼&#xff0c;按照模板要求撰寫實驗報告 三、實驗步驟 假設有兩個txt文件&#xff0c;內容如下&#xff1a; seg1.txtseg2.txt 將這兩個文件中的內容根據id(即前面的編號)合并為如下內容&#xff0c;并存…

Vue+ElementUI實現輸入框日期框下拉框動態展示

1.首先根據后端返回的數據格式獲取類型從而展示對應的框 // fieIdName label名字 // fieIdType 類型 1和4是輸入框 2日期框 3日期時間框 5下拉框 // isRequired 1必填 0不必填 // fieIdTypeRange 存放一部分的下拉框的值 需要拿到數據后轉成下拉框所需要的格式這種數據…

【AI】Pytorch神經網絡分類初探

Pytorch神經網絡分類初探 1.數據準備 環境采用之前創建的Anaconda虛擬環境pytorch&#xff0c;為了方便查看每一步的返回值&#xff0c;可以使用Jupyter Notebook來進行開發。首先把需要的包導入進來 import torch from torch import nn from torch.utils.data import DataL…

【RHCE】openlab搭建web網站

網站需求&#xff1a; 1、基于域名 www.openlab.com 可以訪問網站內容為 welcome to openlab!!! 增加映射 [rootlocalhost ~]# vim /etc/hosts 創建網頁 [rootlocalhost ~]# mkdir -p /www/openlab [rootlocalhost ~]# echo welcome to openlab > /www/openlab/index.h…

利用法線貼圖渲染逼真的3D老虎模型

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

傅里葉變換在圖像中的應用

1.圖像增強與圖像去噪 絕大部分噪音都是圖像的高頻分量&#xff0c;通過低通濾波器來濾除高頻——噪聲; 邊緣也是圖像的高頻分量&#xff0c;可以通過添加高頻分量來增強原始圖像的邊緣&#xff1b; 2.圖像分割之邊緣檢測 提取圖像高頻分量 3.圖像特征提取&#xff1a; 形狀特…

3-Mybatis

文章目錄 Mybatis概述什么是Mybatis&#xff1f;Mybatis導入知識補充數據持久化持久層 第一個Mybatis程序&#xff1a;數據的增刪改查查創建環境編寫代碼1、目錄結構2、核心配置文件&#xff1a;resources/mybatis-config.xml3、mybatis工具類&#xff1a;Utils/MybatisUtils4、…

ALNS的MDP模型| 還沒整理完12-08

有好幾篇論文已經這樣做了&#xff0c;先擺出一篇&#xff0c;然后再慢慢更新 第一篇 該篇論文提出了一種稱為深增強ALNS&#xff08;DR-ALNS&#xff09;的方法&#xff0c;它利用DRL選擇最有效的破壞和修復運營商&#xff0c;配置破壞嚴重性參數施加在破壞算子上&#xff0c…

請簡要介紹一下HTML的發展史?

問題&#xff1a;什么是池化思想&#xff1f; 回答&#xff1a; 池化思想是一種資源管理的策略&#xff0c;通過事先創建并維護一組已經初始化好的資源對象池&#xff0c;以便在需要時快速獲取資源并在用完后歸還給池&#xff0c;以減少資源的創建和銷毀開銷&#xff0c;提高資…

第二十一章網絡通信總結

21.1 網絡程序設計基礎 Java網絡程序設計基礎涉及使用Java編程語言創建網絡應用程序。這通常涉及到使用Java的網絡API&#xff0c;如java.net包&#xff0c;以建立客戶端和服務器之間的通信。 基本步驟包括&#xff1a; 1.創建服務器&#xff1a; 使用ServerSocket類創建服務…

常見的中間件--消息隊列中間件測試點

最近刷題&#xff0c;看到了有問中間件的題目&#xff0c;于是整理了一些中間件的知識&#xff0c;大多是在小破站上的筆記&#xff0c;僅供大家參考~ 主要分為七個部分來分享&#xff1a; 一、常見的中間件 二、什么是隊列&#xff1f; 三、常見消息隊列MQ的比較 四、隊列…

用戶管理 --匯總

一、第一節課 1.1 本人寫的 前端&#xff1a; 魚皮 --&#xff1e; 用戶中心 第1節課-CSDN博客 中期&#xff1a; 一、用戶管理 第1節課中間-CSDN博客 后端&#xff1a; 一、用戶管理-CSDN博客 其他的鏈接 億圖腦圖MindMaster 1.2 優秀球友&#xff0c;推薦 Docs 另…

12_企業架構之Tomcat部署使用

Tomcat 學習目標和內容 1、能夠描述Tomcat的使用場景 2、能夠簡單描述Tomcat的工作原理 3、能夠實現部署安裝Tomcat 4、能夠實現配置Tomcat的service服務和自啟動 5、能夠實現Tomcat的Host的配置 6、能夠實現Nginx反向代理Tomcat 7、能夠實現Nginx負載均衡到Tomcat 一、Tomcat介…

Abaqus許可證配置文件問題

在使用Abaqus工程設計和仿真軟件時&#xff0c;您可能會遇到許可證配置文件問題。這些問題可能會影響軟件的正常運行和工作效率。為了幫助您解決這些問題&#xff0c;我們特別撰寫了這篇文章&#xff0c;以提供全面、有效的解決方案。 一、Abaqus許可證配置文件問題及原因 許…

力扣labuladong一刷day32天二叉樹

力扣labuladong一刷day32天二叉樹 一、297. 二叉樹的序列化與反序列化 題目鏈接&#xff1a;https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/ 思路&#xff1a;關于序列化與反序列化&#xff0c;題目不要求序列化的方式&#xff0c;只要求樹經過序列化…

linux的定時任務Corntab

安裝crontab # yum安裝crontab yum install -y crontab# 開機自啟crond服務并現在啟動 systemctl enable --now crondcron系統任務調度 系統任務調度&#xff1a; 系統周期性所要執行的工作&#xff0c;比如寫緩存數據到硬盤、日志清理等。 在/etc/crontab文件&#xff0c;這…