Merge branch 'RVC-Boss:main' into patch-1

This commit is contained in:
jmaple12 2024-03-19 17:55:59 +08:00 committed by GitHub
commit db59859f27
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 118629 additions and 113675 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,6 +1,7 @@
import pickle import pickle
import os import os
import re import re
import wordsegment
from g2p_en import G2p from g2p_en import G2p
from string import punctuation from string import punctuation
@ -12,7 +13,6 @@ CMU_DICT_PATH = os.path.join(current_file_path, "cmudict.rep")
CMU_DICT_FAST_PATH = os.path.join(current_file_path, "cmudict-fast.rep") CMU_DICT_FAST_PATH = os.path.join(current_file_path, "cmudict-fast.rep")
CMU_DICT_HOT_PATH = os.path.join(current_file_path, "engdict-hot.rep") CMU_DICT_HOT_PATH = os.path.join(current_file_path, "engdict-hot.rep")
CACHE_PATH = os.path.join(current_file_path, "engdict_cache.pickle") CACHE_PATH = os.path.join(current_file_path, "engdict_cache.pickle")
_g2p = G2p()
arpa = { arpa = {
"AH0", "AH0",
@ -90,7 +90,7 @@ arpa = {
def replace_phs(phs): def replace_phs(phs):
rep_map = {";": ",", ":": ",", "'": "-", '"': "-"} rep_map = {"'": "-"}
phs_new = [] phs_new = []
for ph in phs: for ph in phs:
if ph in symbols: if ph in symbols:
@ -112,7 +112,7 @@ def read_dict():
if line_index >= start_line: if line_index >= start_line:
line = line.strip() line = line.strip()
word_split = line.split(" ") word_split = line.split(" ")
word = word_split[0] word = word_split[0].lower()
syllable_split = word_split[1].split(" - ") syllable_split = word_split[1].split(" - ")
g2p_dict[word] = [] g2p_dict[word] = []
@ -132,16 +132,11 @@ def read_dict_new():
line = f.readline() line = f.readline()
line_index = 1 line_index = 1
while line: while line:
if line_index >= 49: if line_index >= 57:
line = line.strip() line = line.strip()
word_split = line.split(" ") word_split = line.split(" ")
word = word_split[0] word = word_split[0].lower()
g2p_dict[word] = [word_split[1].split(" ")]
syllable_split = word_split[1].split(" - ")
g2p_dict[word] = []
for syllable in syllable_split:
phone_split = syllable.split(" ")
g2p_dict[word].append(phone_split)
line_index = line_index + 1 line_index = line_index + 1
line = f.readline() line = f.readline()
@ -153,10 +148,9 @@ def read_dict_new():
if line_index >= 0: if line_index >= 0:
line = line.strip() line = line.strip()
word_split = line.split(" ") word_split = line.split(" ")
word = word_split[0] word = word_split[0].lower()
if word not in g2p_dict: if word not in g2p_dict:
g2p_dict[word] = [] g2p_dict[word] = [word_split[1:]]
g2p_dict[word].append(word_split[1:])
line_index = line_index + 1 line_index = line_index + 1
line = f.readline() line = f.readline()
@ -168,10 +162,9 @@ def read_dict_new():
if line_index >= 0: if line_index >= 0:
line = line.strip() line = line.strip()
word_split = line.split(" ") word_split = line.split(" ")
word = word_split[0] word = word_split[0].lower()
#if word not in g2p_dict: # 自定义发音词直接覆盖字典
g2p_dict[word] = [] g2p_dict[word] = [word_split[1:]]
g2p_dict[word].append(word_split[1:])
line_index = line_index + 1 line_index = line_index + 1
line = f.readline() line = f.readline()
@ -200,24 +193,66 @@ eng_dict = get_dict()
def text_normalize(text): def text_normalize(text):
# todo: eng text normalize # todo: eng text normalize
return text.replace(";", ",") # 适配中文及 g2p_en 标点
rep_map = {
"[;:]": ",",
'["]': "'",
"": ".",
"": "!",
"": "?",
}
for p, r in rep_map.items():
text = re.sub(p, r, text)
return text
class en_G2p(G2p):
def __init__(self):
super().__init__()
# 分词初始化
wordsegment.load()
# 扩展过时字典
self.cmu = get_dict()
# 剔除读音错误的几个缩写
for word in ["AE", "AI", "AR", "IOS", "HUD", "OS"]:
del self.cmu[word.lower()]
# "A" 落单不读 "AH0" 读 "EY1"
self.cmu['a'] = [['EY1']]
def predict(self, word):
# 小写 oov 长度小于等于 3 直接读字母
if (len(word) <= 3):
return [phone for w in word for phone in self(w)]
# 尝试分离所有格
if re.match(r"^([a-z]+)('s)$", word):
phone = self(word[:-2])
phone.extend(['Z'])
return phone
# 尝试进行分词,应对复合词
comps = wordsegment.segment(word.lower())
# 无法分词的送回去预测
if len(comps)==1:
return super().predict(word)
# 可以分词的递归处理
return [phone for comp in comps for phone in self(comp)]
_g2p = en_G2p()
def g2p(text): def g2p(text):
phones = [] # g2p_en 整段推理剔除不存在的arpa返回
words = re.split(r"([,;.\-\?\!\s+])", text) phone_list = _g2p(text)
for w in words: phones = [ph if ph != "<unk>" else "UNK" for ph in phone_list if ph not in [" ", "<pad>", "UW", "</s>", "<s>"]]
if w.upper() in eng_dict:
phns = eng_dict[w.upper()]
for ph in phns:
phones += ph
else:
phone_list = list(filter(lambda p: p != " ", _g2p(w)))
for ph in phone_list:
if ph in arpa:
phones.append(ph)
else:
phones.append(ph)
return replace_phs(phones) return replace_phs(phones)

View File

@ -113,7 +113,7 @@ class TextNormalizer():
sentence = sentence.replace('ψ', '普赛').replace('Ψ', '普赛') sentence = sentence.replace('ψ', '普赛').replace('Ψ', '普赛')
sentence = sentence.replace('ω', '欧米伽').replace('Ω', '欧米伽') sentence = sentence.replace('ω', '欧米伽').replace('Ω', '欧米伽')
# re filter special characters, have one more character "-" than line 68 # re filter special characters, have one more character "-" than line 68
sentence = re.sub(r'[-——《》【】<=>{}()#&@“”^_|\\]', '', sentence) sentence = re.sub(r'[-——《》【】<=>{}()#&@“”^_|\\]', '', sentence)
return sentence return sentence
def normalize_sentence(self, sentence: str) -> str: def normalize_sentence(self, sentence: str) -> str:

View File

@ -51,6 +51,8 @@ _Note: numba==0.56.4 requires py<3.11_
If you are a Windows user (tested with win>=10), you can directly download the [pre-packaged distribution](https://huggingface.co/lj1995/GPT-SoVITS-windows-package/resolve/main/GPT-SoVITS-beta.7z?download=true) and double-click on _go-webui.bat_ to start GPT-SoVITS-WebUI. If you are a Windows user (tested with win>=10), you can directly download the [pre-packaged distribution](https://huggingface.co/lj1995/GPT-SoVITS-windows-package/resolve/main/GPT-SoVITS-beta.7z?download=true) and double-click on _go-webui.bat_ to start GPT-SoVITS-WebUI.
Users in China region can download the file by clicking [here](https://www.icloud.com.cn/iclouddrive/061bfkcVJcBfsMfLF5R2XKdTQ#GPT-SoVITS-beta0217) and then selecting "Download a copy."
### Linux ### Linux
```bash ```bash

View File

@ -51,6 +51,8 @@ _注意: numba==0.56.4 需要 python<3.11_
如果你是 Windows 用户(已在 win>=10 上测试),可以直接下载[预打包文件](https://huggingface.co/lj1995/GPT-SoVITS-windows-package/resolve/main/GPT-SoVITS-beta.7z?download=true),解压后双击 go-webui.bat 即可启动 GPT-SoVITS-WebUI。 如果你是 Windows 用户(已在 win>=10 上测试),可以直接下载[预打包文件](https://huggingface.co/lj1995/GPT-SoVITS-windows-package/resolve/main/GPT-SoVITS-beta.7z?download=true),解压后双击 go-webui.bat 即可启动 GPT-SoVITS-WebUI。
中国地区用户可以进入[此处](https://www.icloud.com.cn/iclouddrive/061bfkcVJcBfsMfLF5R2XKdTQ#GPT-SoVITS-beta0217)并点击“下载副本”进行下载。
### Linux ### Linux
```bash ```bash

View File

@ -89,6 +89,21 @@
1. 참조 텍스트 입력을 지원합니다. 1. 참조 텍스트 입력을 지원합니다.
2. 프론트엔드에 있던 중국어 텍스트 입력 버그를 수정하였습니다. 2. 프론트엔드에 있던 중국어 텍스트 입력 버그를 수정하였습니다.
todolist : ### 20240221 업데이트
1. 중국어 다음음자 추론 최적화 1. 데이터 처리에 음성 노이즈 감소 옵션을 추가하였습니다. (노이즈 감소는 16k 샘플링률만 남기며, 노이즈가 크지 않다면 사용하지 마십시오.)
2. 중국어 및 일본어 프론트엔드 처리를 최적화하였습니다. https://github.com/RVC-Boss/GPT-SoVITS/pull/559 https://github.com/RVC-Boss/GPT-SoVITS/pull/556 https://github.com/RVC-Boss/GPT-SoVITS/pull/532 https://github.com/RVC-Boss/GPT-SoVITS/pull/507 https://github.com/RVC-Boss/GPT-SoVITS/pull/509
3. Mac에서 CPU 추론이 더 빨라졌으므로 추론 장치를 mps에서 CPU로 변경하였습니다.
4. colab에서 공용 URL을 열지 않는 문제를 수정하였습니다.
### 20240306 업데이트
1. 추론 속도를 50% 빠르게 하였습니다. (RTX3090+pytorch2.2.1+cu11.8+win10+py39 테스트 완료) https://github.com/RVC-Boss/GPT-SoVITS/pull/672
2. faster whisper를 사용할 때 중국어 ASR을 먼저 다운로드할 필요가 없습니다.
3. uvr5의 잔향 제거 모델이 잔향이 있는지 여부를 반대로 반환하는 문제를 수정하였습니다.
4. faster whisper가 CUDA를 사용할 수 없는 경우 자동으로 CPU 추론을 사용하도록 수정하였습니다.
5. is_half의 판단을 수정하여 Mac에서 CPU 추론이 정상적으로 작동하도록 수정하였습니다.
todolist
1. 중국어 다양한 발음 단어 추론 최적화(테스트 결과를 작성하시는 분은 pr 코멘트 영역에 작성해주시면 감사하겠습니다)

View File

@ -57,7 +57,7 @@ bash install.sh
### macOS ### macOS
**주의: Mac에서 GPU로 훈련된 모델은 다른 장치에서 훈련된 모델에 비해 현저히 낮은 품질을 나타내므로, 우리는 일시적으로 CPU를 사용하여 훈련하고 있습니다.** **주의: Mac에서 GPU로 훈련된 모델은 다른 OS에서 훈련된 모델에 비해 품질이 낮습니다. 해당 문제를 해결하기 전까지 MacOS에선 CPU를 사용하여 훈련을 진행합니다.**
먼저 `brew install ffmpeg` 또는 `conda install ffmpeg`를 실행하여 FFmpeg가 설치되었는지 확인한 다음, 다음 명령어를 사용하여 설치하세요: 먼저 `brew install ffmpeg` 또는 `conda install ffmpeg`를 실행하여 FFmpeg가 설치되었는지 확인한 다음, 다음 명령어를 사용하여 설치하세요:

View File

@ -25,3 +25,4 @@ jieba_fast
jieba jieba
LangSegment>=0.2.0 LangSegment>=0.2.0
Faster_Whisper Faster_Whisper
wordsegment