From 14a1579877b75a86d58de58f53fb5eed7e468c0b Mon Sep 17 00:00:00 2001
From: pengoosedev <73521518+pengoosedev@users.noreply.github.com>
Date: Thu, 18 Jan 2024 04:25:44 +0900
Subject: [PATCH 01/63] Add missing ko_KR.json
---
tools/i18n/locale/ko_KR.json | 135 +++++++++++++++++++++++++++++++++++
1 file changed, 135 insertions(+)
create mode 100644 tools/i18n/locale/ko_KR.json
diff --git a/tools/i18n/locale/ko_KR.json b/tools/i18n/locale/ko_KR.json
new file mode 100644
index 00000000..816ed3f7
--- /dev/null
+++ b/tools/i18n/locale/ko_KR.json
@@ -0,0 +1,135 @@
+{
+ ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3이면 harvest 음높이 인식 결과에 중간값 필터를 사용합니다. 이 수치는 필터 반경이며, 사용하면 불명확한 음성을 어느정도 배제할 수 있습니다.",
+ "A模型权重": "A 모델 가중치",
+ "A模型路径": "A 모델 경로",
+ "B模型路径": "B 모델 경로",
+ "E:\\语音音频+标注\\米津玄师\\src": "E:\\음성 오디오+주석\\요네즈 켄시\\src",
+ "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0 곡선 파일, 선택 사항, 한 줄에 하나의 음높이, 기본 F0 및 음높이 변화를 대체함",
+ "Index Rate": "인덱스 비율",
+ "Onnx导出": "Onnx 내보내기",
+ "Onnx输出路径": "Onnx 출력 경로",
+ "RVC模型路径": "RVC 모델 경로",
+ "ckpt处理": "ckpt 처리",
+ "harvest进程数": "harvest 프로세스 수",
+ "index文件路径不可包含中文": "인덱스 파일 경로에는 중국어를 포함할 수 없습니다.",
+ "pth文件路径不可包含中文": "pth 파일 경로에는 중국어를 포함할 수 없습니다.",
+ "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "rmvpe 카드 번호 구성: '-'로 구분하여 입력된 다른 프로세스 카드 번호, 예를 들어 0-0-1은 카드 0에서 2개의 프로세스를 실행하고 카드 1에서 1개의 프로세스를 실행",
+ "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 실험 설정을 작성합니다. 실험 데이터는 logs 아래에 있으며, 각 실험마다 하나의 폴더가 있습니다. 실험 이름 경로를 수동으로 입력해야 하며, 이 안에는 실험 설정, 로그, 훈련으로 얻은 모델 파일이 포함되어 있습니다.",
+ "step1:正在处理数据": "step1: 데이터 처리 중",
+ "step2:正在提取音高&正在提取特征": "step2: 음높이 추출 및 특성 추출 중",
+ "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 훈련 폴더 아래 모든 오디오로 디코딩 가능한 파일을 자동으로 순회하고 슬라이스 정규화를 진행하여, 실험 디렉토리 아래에 2개의 wav 폴더를 생성합니다; 현재는 단일 사용자 훈련만 지원합니다.",
+ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: CPU를 사용해 음높이를 추출합니다(모델이 음높이를 포함하는 경우), GPU를 사용해 특성을 추출합니다(카드 번호 선택)",
+ "step3: 填写训练设置, 开始训练模型和索引": "step3: 훈련 설정을 작성하고, 모델 및 인덱스 훈련을 시작합니다",
+ "step3a:正在训练模型": "step3a: 모델 훈련 중",
+ "一键训练": "원키 트레이닝",
+ "也可批量输入音频文件, 二选一, 优先读文件夹": "대량으로 오디오 파일 입력도 가능, 둘 중 하나 선택, 폴더 우선 읽기",
+ "人声伴奏分离批量处理, 使用UVR5模型。 合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 模型分为三类: 1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; 2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; 3、去混响、去延迟模型(by FoxJoy): (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响; (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。 去混响/去延迟,附: 1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍; 2、MDX-Net-Dereverb模型挺慢的; 3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "인간 목소리와 반주 분리 대량 처리, UVR5 모델 사용. 올바른 폴더 경로 예: E:\\codes\\py39\\vits_vc_gpu\\백로서화 테스트 케이스(파일 탐색기 주소창에서 복사하면 됨). 모델은 세 가지 유형으로 나뉩니다: 1. 인간 목소리 보존: 하모니가 없는 오디오를 선택, 주요 인간 목소리를 HP5보다 더 잘 보존. 내장된 HP2와 HP3 모델, HP3는 약간의 반주를 놓칠 수 있지만 HP2보다는 인간 목소리를 조금 더 잘 보존합니다. 2. 오직 주요 인간 목소리 보존: 하모니가 있는 오디오를 선택, 주요 인간 목소리가 약간 약해질 수 있음. 내장된 HP5 모델 하나; 3. 울림 제거, 지연 제거 모델(by FoxJoy): (1)MDX-Net(onnx_dereverb): 양채널 울림에 대해서는 최선의 선택, 단채널 울림 제거 불가능; (234)DeEcho: 지연 효과 제거. Aggressive가 Normal보다 더 철저하게 제거하며, DeReverb는 추가로 울림 제거, 단일 채널 울림 제거 가능하지만 고주파 중심의 판형 울림은 완전히 제거하지 못함. 울림/지연 제거 시 참고: 1. DeEcho-DeReverb 모델의 처리 시간은 다른 두 DeEcho 모델의 거의 2배임; 2. MDX-Net-Dereverb 모델은 상당히 느림; 3. 개인적으로 추천하는 가장 깨끗한 구성은 MDX-Net 다음에 DeEcho-Aggressive 사용.",
+ "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "-로 구분하여 입력한 카드 번호, 예를 들어 0-1-2는 카드0, 카드1, 카드2 사용",
+ "伴奏人声分离&去混响&去回声": "반주 및 인간 목소리 분리 & 울림 제거 & 에코 제거",
+ "使用模型采样率": "모델 샘플링 레이트 사용",
+ "使用设备采样率": "장치 샘플링 레이트 사용",
+ "保存名": "저장 이름",
+ "保存的文件名, 默认空为和源文件同名": "저장된 파일 이름, 기본값은 원본 파일과 동일",
+ "保存的模型名不带后缀": "저장된 모델 이름은 접미사 없음",
+ "保存频率save_every_epoch": "저장 빈도 save_every_epoch",
+ "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "청결한 자음과 숨소리를 보호하고, 전자음의 찢어짐과 같은 아티팩트를 방지하며, 0.5까지 끌어올리면 보호가 활성화되지 않으며, 낮추면 보호 강도는 증가하지만 인덱싱 효과는 감소할 수 있음",
+ "修改": "수정",
+ "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "모델 정보 수정(오직 weights 폴더에서 추출된 소형 모델 파일만 지원)",
+ "停止音频转换": "오디오 변환 중지",
+ "全流程结束!": "전체 과정 완료!",
+ "刷新音色列表和索引路径": "음색 목록 및 인덱스 경로 새로고침",
+ "加载模型": "모델 로드",
+ "加载预训练底模D路径": "사전 훈련된 베이스 모델 D 경로 로드",
+ "加载预训练底模G路径": "사전 훈련된 베이스 모델 G 경로 로드",
+ "单次推理": "단일 추론",
+ "卸载音色省显存": "음색 언로드로 메모리 절약",
+ "变调(整数, 半音数量, 升八度12降八度-12)": "변조(정수, 반음 수, 옥타브 상승 12, 옥타브 하강 -12)",
+ "后处理重采样至最终采样率,0为不进行重采样": "후처리로 최종 샘플링 레이트까지 리샘플링, 0은 리샘플링하지 않음",
+ "否": "아니오",
+ "启用相位声码器": "위상 보코더 활성화",
+ "响应阈值": "응답 임계값",
+ "响度因子": "소리 크기 인자",
+ "处理数据": "데이터 처리",
+ "导出Onnx模型": "Onnx 모델 내보내기",
+ "导出文件格式": "파일 형식 내보내기",
+ "常见问题解答": "자주 묻는 질문 답변",
+ "常规设置": "일반 설정",
+ "开始音频转换": "오디오 변환 시작",
+ "很遗憾您这没有能用的显卡来支持您训练": "유감스럽게도 훈련을 지원할 수 있는 그래픽 카드가 없습니다",
+ "性能设置": "성능 설정",
+ "总训练轮数total_epoch": "총 훈련 회차 total_epoch",
+ "批量推理": "대량 추론",
+ "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "대량 변환, 변환할 오디오 폴더 입력, 또는 여러 오디오 파일 업로드, 지정된 폴더(기본값 opt)에 변환된 오디오 출력.",
+ "指定输出主人声文件夹": "주인공 목소리 출력 폴더 지정",
+ "指定输出文件夹": "출력 파일 폴더 지정",
+ "指定输出非主人声文件夹": "비주인공 목소리 출력 폴더 지정",
+ "推理时间(ms):": "추론 시간(ms):",
+ "推理音色": "추론 음색",
+ "提取": "추출",
+ "提取音高和处理数据使用的CPU进程数": "음높이 추출 및 데이터 처리에 사용되는 CPU 프로세스 수",
+ "是": "예",
+ "是否仅保存最新的ckpt文件以节省硬盘空间": "디스크 공간을 절약하기 위해 가장 최신의 ckpt 파일만 저장할지 여부",
+ "是否在每次保存时间点将最终小模型保存至weights文件夹": "매 저장 시점마다 최종 작은 모델을 weights 폴더에 저장할지 여부",
+ "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "모든 훈련 세트를 VRAM에 캐시할지 여부. 10분 미만의 작은 데이터는 훈련 속도를 높이기 위해 캐시할 수 있으나, 큰 데이터는 VRAM을 초과하여 큰 속도 향상을 기대할 수 없음.",
+ "显卡信息": "그래픽 카드 정보",
+ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. 如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "이 소프트웨어는 MIT 라이선스로 오픈 소스이며, 작성자는 소프트웨어에 대한 어떠한 제어도 가지지 않으며, 소프트웨어 사용자 및 소프트웨어에서 내보낸 소리를 전파하는 사용자는 모든 책임을 져야 함. 이 조항을 인정하지 않는 경우, 소프트웨어 패키지 내의 어떠한 코드나 파일도 사용하거나 인용할 수 없음. 자세한 내용은 루트 디렉토리의 LICENSE를 참조.",
+ "查看": "보기",
+ "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "모델 정보 보기(오직 weights 폴더에서 추출된 작은 모델 파일만 지원)",
+ "检索特征占比": "특징 검색 비율",
+ "模型": "모델",
+ "模型推理": "모델 추론",
+ "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "모델 추출(로그 폴더 아래 대용량 모델 경로 입력), 중간에 훈련을 중단하고 싶은 경우나 작은 파일 모델을 자동으로 저장하지 않은 경우, 또는 중간 모델을 테스트하고 싶은 경우에 적합",
+ "模型是否带音高指导": "모델이 음높이 지도를 포함하는지 여부",
+ "模型是否带音高指导(唱歌一定要, 语音可以不要)": "모델이 음높이 지도를 포함하는지 여부(노래에는 필수, 말하기에는 선택적)",
+ "模型是否带音高指导,1是0否": "모델이 음높이 지도를 포함하는지 여부, 1은 '예', 0은 '아니오'",
+ "模型版本型号": "모델 버전 및 모델",
+ "模型融合, 可用于测试音色融合": "모델 통합, 음색 통합 테스트에 사용 가능",
+ "模型路径": "모델 경로",
+ "每张显卡的batch_size": "각 GPU의 batch_size",
+ "淡入淡出长度": "페이드 인/아웃 길이",
+ "版本": "버전",
+ "特征提取": "특징 추출",
+ "特征检索库文件路径,为空则使用下拉的选择结果": "특징 검색 라이브러리 파일 경로, 비어 있으면 드롭다운 선택 결과 사용",
+ "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "남성에서 여성으로 전환 시 +12키 추천, 여성에서 남성으로 전환 시 -12키 추천, 음역대 폭발로 음색 왜곡이 발생할 경우 적절한 음역대로 조정 가능.",
+ "目标采样率": "목표 샘플링 비율",
+ "算法延迟(ms):": "알고리즘 지연(ms):",
+ "自动检测index路径,下拉式选择(dropdown)": "index 경로 자동 감지, 드롭다운 선택",
+ "融合": "통합",
+ "要改的模型信息": "수정할 모델 정보",
+ "要置入的模型信息": "삽입할 모델 정보",
+ "训练": "훈련",
+ "训练模型": "모델 훈련",
+ "训练特征索引": "특징 인덱스 훈련",
+ "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "훈련이 완료되었습니다. 콘솔 훈련 로그나 실험 폴더 내의 train.log를 확인하세요.",
+ "请指定说话人id": "화자 id를 지정해주세요.",
+ "请选择index文件": "index 파일을 선택해주세요.",
+ "请选择pth文件": "pth 파일을 선택해주세요.",
+ "请选择说话人id": "화자 id를 선택해주세요.",
+ "转换": "변환",
+ "输入实验名": "실험명을 입력하세요.",
+ "输入待处理音频文件夹路径": "처리할 오디오 파일 폴더 경로를 입력하세요.",
+ "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "처리할 오디오 파일 폴더 경로를 입력하세요(파일 관리자의 주소 표시줄에서 복사하세요).",
+ "输入待处理音频文件路径(默认是正确格式示例)": "처리할 오디오 파일 경로를 입력하세요(기본값은 올바른 형식의 예시입니다).",
+ "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "원본 볼륨 엔벨로프와 출력 볼륨 엔벨로프의 혼합 비율을 입력하세요. 1에 가까울수록 출력 엔벨로프를 더 많이 사용합니다.",
+ "输入监听": "모니터링 입력",
+ "输入训练文件夹路径": "학습시킬 파일 폴더의 경로를 입력하세요.",
+ "输入设备": "입력 장치",
+ "输入降噪": "입력 노이즈 감소",
+ "输出信息": "출력 정보",
+ "输出变声": "음성 변환 출력",
+ "输出设备": "출력 장치",
+ "输出降噪": "출력 노이즈 감소",
+ "输出音频(右下角三个点,点了可以下载)": "오디오 출력(오른쪽 하단 세 개의 점, 클릭하면 다운로드 가능)",
+ "选择.index文件": ".index 파일 선택",
+ "选择.pth文件": ".pth 파일 선택",
+ "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU": "음고 추출 알고리즘을 선택하세요. 노래 입력 시 pm으로 속도를 높일 수 있으며, harvest는 저음이 좋지만 매우 느리고, crepe는 효과가 좋지만 GPU를 많이 사용합니다.",
+ "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU": "음고 추출 알고리즘을 선택하세요. 노래 입력 시 pm으로 속도를 높일 수 있고, harvest는 저음이 좋지만 매우 느리며, crepe는 효과가 좋지만 GPU를 많이 사용하고, rmvpe는 가장 좋은 효과를 내면서 GPU를 적게 사용합니다.",
+ "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "음고 추출 알고리즘 선택: 노래 입력 시 pm으로 속도를 높일 수 있으며, 고품질 음성이지만 CPU가 낮을 때는 dio로 속도를 높일 수 있고, harvest는 품질이 더 좋지만 느리며, rmvpe는 최고의 효과를 내면서 CPU/GPU를 적게 사용합니다.",
+ "采样率:": "샘플링 레이트:",
+ "采样长度": "샘플링 길이",
+ "重载设备列表": "장치 목록 리로드",
+ "音调设置": "음조 설정",
+ "音频设备(请使用同种类驱动)": "오디오 장치(동일한 유형의 드라이버를 사용해주세요)",
+ "音高算法": "음고 알고리즘",
+ "额外推理时长": "추가적인 추론 시간"
+}
From 37ae8bf051c4ae43869cf799831ae19d5df1557d Mon Sep 17 00:00:00 2001
From: Yuan-Man <68322456+Yuan-ManX@users.noreply.github.com>
Date: Wed, 14 Feb 2024 20:32:26 +0800
Subject: [PATCH 02/63] Update es_ES.json
---
i18n/locale/es_ES.json | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/i18n/locale/es_ES.json b/i18n/locale/es_ES.json
index 5445b698..3bcd2a38 100644
--- a/i18n/locale/es_ES.json
+++ b/i18n/locale/es_ES.json
@@ -8,8 +8,16 @@
"是否开启UVR5-WebUI": "¿Habilitar UVR5-WebUI?",
"UVR5进程输出信息": "Información de salida del proceso UVR5",
"0b-语音切分工具": "0b-Herramienta de división de voz",
+ ".list标注文件的路径": "Ruta del archivo de anotación .list",
+ "GPT模型列表": "Lista de modelos GPT",
+ "SoVITS模型列表": "Lista de modelos SoVITS",
+ "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。": "Directorio donde se guardan los archivos de audio después del corte! Ruta completa del archivo de audio a leer = este directorio - nombre de archivo correspondiente a la forma de onda en el archivo de lista (no la ruta completa).",
"音频自动切分输入路径,可文件可文件夹": "Ruta de entrada para la división automática de audio, puede ser un archivo o una carpeta",
"切分后的子音频的输出根目录": "Directorio raíz de salida de los sub-audios después de la división",
+ "怎么切": "Cómo cortar",
+ "不切": "No cortar",
+ "凑四句一切": "Completa cuatro oraciones para rellenar todo",
+ "按英文句号.切": "Cortar por puntos en inglés.",
"threshold:音量小于这个值视作静音的备选切割点": "umbral: puntos de corte alternativos considerados como silencio si el volumen es menor que este valor",
"min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "min_length: duración mínima de cada segmento, si el primer segmento es demasiado corto, se conecta continuamente con los siguientes hasta que supera este valor",
"min_interval:最短切割间隔": "min_interval: intervalo mínimo de corte",
From 709c6c3d4031cd1bdbdb26ee1bece9d67e45616c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E6=82=A6?=
Date: Sat, 17 Feb 2024 12:13:43 +0800
Subject: [PATCH 03/63] Update english.py
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
热词应该是覆盖逻辑,因为原版字典里如果key存在的话,那么用户定义的热词纠正发音就不会生效
---
GPT_SoVITS/text/english.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/GPT_SoVITS/text/english.py b/GPT_SoVITS/text/english.py
index 0a5d6c21..90f48a55 100644
--- a/GPT_SoVITS/text/english.py
+++ b/GPT_SoVITS/text/english.py
@@ -169,9 +169,9 @@ def read_dict_new():
line = line.strip()
word_split = line.split(" ")
word = word_split[0]
- if word not in g2p_dict:
- g2p_dict[word] = []
- g2p_dict[word].append(word_split[1:])
+ #if word not in g2p_dict:
+ g2p_dict[word] = []
+ g2p_dict[word].append(word_split[1:])
line_index = line_index + 1
line = f.readline()
From c70a609a313cceaf808044f81531dedb2fffabf2 Mon Sep 17 00:00:00 2001
From: KamioRinn
Date: Sat, 17 Feb 2024 16:04:06 +0800
Subject: [PATCH 04/63] Adjust ja clean text
---
GPT_SoVITS/inference_webui.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index dd8fce3b..39ae7e43 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -248,6 +248,10 @@ def clean_text_inf(text, language):
formattext = ""
language = language.replace("all_","")
for tmp in LangSegment.getTexts(text):
+ if language == "ja":
+ if tmp["lang"] == language or tmp["lang"] == "zh":
+ formattext += tmp["text"] + " "
+ continue
if tmp["lang"] == language:
formattext += tmp["text"] + " "
while " " in formattext:
@@ -279,8 +283,6 @@ def nonen_clean_text_inf(text, language):
for tmp in LangSegment.getTexts(text):
langlist.append(tmp["lang"])
textlist.append(tmp["text"])
- print(textlist)
- print(langlist)
phones_list = []
word2ph_list = []
norm_text_list = []
From e97cc3346a16a1cf2fddf2be5735f8d06425bcbe Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Sat, 17 Feb 2024 16:45:31 +0800
Subject: [PATCH 05/63] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=AE=9E=E9=AA=8C?=
=?UTF-8?q?=E5=90=8D=E5=8F=AF=E8=AE=BE=E7=BD=AE=E4=B8=BA=E4=B8=AD=E6=96=87?=
=?UTF-8?q?=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
fix https://github.com/RVC-Boss/GPT-SoVITS/issues/500
---
GPT_SoVITS/process_ckpt.py | 12 ++++++++++--
GPT_SoVITS/s1_train.py | 11 ++++++++++-
GPT_SoVITS/utils.py | 11 ++++++++++-
3 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/GPT_SoVITS/process_ckpt.py b/GPT_SoVITS/process_ckpt.py
index 74833379..3a436f10 100644
--- a/GPT_SoVITS/process_ckpt.py
+++ b/GPT_SoVITS/process_ckpt.py
@@ -1,11 +1,18 @@
import traceback
from collections import OrderedDict
-
+from time import time as ttime
+import shutil,os
import torch
from tools.i18n.i18n import I18nAuto
i18n = I18nAuto()
+def my_save(fea,path):#####fix issue: torch.save doesn't support chinese path
+ dir=os.path.dirname(path)
+ name=os.path.basename(path)
+ tmp_path="%s.pth"%(ttime())
+ torch.save(fea,tmp_path)
+ shutil.move(tmp_path,"%s/%s"%(dir,name))
def savee(ckpt, name, epoch, steps, hps):
try:
@@ -17,7 +24,8 @@ def savee(ckpt, name, epoch, steps, hps):
opt["weight"][key] = ckpt[key].half()
opt["config"] = hps
opt["info"] = "%sepoch_%siteration" % (epoch, steps)
- torch.save(opt, "%s/%s.pth" % (hps.save_weight_dir, name))
+ # torch.save(opt, "%s/%s.pth" % (hps.save_weight_dir, name))
+ my_save(opt, "%s/%s.pth" % (hps.save_weight_dir, name))
return "Success."
except:
return traceback.format_exc()
diff --git a/GPT_SoVITS/s1_train.py b/GPT_SoVITS/s1_train.py
index c26302a8..fb273542 100644
--- a/GPT_SoVITS/s1_train.py
+++ b/GPT_SoVITS/s1_train.py
@@ -24,6 +24,14 @@ torch.set_float32_matmul_precision("high")
from AR.utils import get_newest_ckpt
from collections import OrderedDict
+from time import time as ttime
+import shutil
+def my_save(fea,path):#####fix issue: torch.save doesn't support chinese path
+ dir=os.path.dirname(path)
+ name=os.path.basename(path)
+ tmp_path="%s.pth"%(ttime())
+ torch.save(fea,tmp_path)
+ shutil.move(tmp_path,"%s/%s"%(dir,name))
class my_model_ckpt(ModelCheckpoint):
@@ -70,7 +78,8 @@ class my_model_ckpt(ModelCheckpoint):
to_save_od["weight"][key] = dictt[key].half()
to_save_od["config"] = self.config
to_save_od["info"] = "GPT-e%s" % (trainer.current_epoch + 1)
- torch.save(
+ # torch.save(
+ my_save(
to_save_od,
"%s/%s-e%s.ckpt"
% (
diff --git a/GPT_SoVITS/utils.py b/GPT_SoVITS/utils.py
index 0ce03b33..7984b5a8 100644
--- a/GPT_SoVITS/utils.py
+++ b/GPT_SoVITS/utils.py
@@ -64,6 +64,14 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False
)
return model, optimizer, learning_rate, iteration
+from time import time as ttime
+import shutil
+def my_save(fea,path):#####fix issue: torch.save doesn't support chinese path
+ dir=os.path.dirname(path)
+ name=os.path.basename(path)
+ tmp_path="%s.pth"%(ttime())
+ torch.save(fea,tmp_path)
+ shutil.move(tmp_path,"%s/%s"%(dir,name))
def save_checkpoint(model, optimizer, learning_rate, iteration, checkpoint_path):
logger.info(
@@ -75,7 +83,8 @@ def save_checkpoint(model, optimizer, learning_rate, iteration, checkpoint_path)
state_dict = model.module.state_dict()
else:
state_dict = model.state_dict()
- torch.save(
+ # torch.save(
+ my_save(
{
"model": state_dict,
"iteration": iteration,
From 99ad1f3ce586747534f87edf6072d9054a69703e Mon Sep 17 00:00:00 2001
From: ChanningWang2018 <40551910+ChanningWang2018@users.noreply.github.com>
Date: Sat, 17 Feb 2024 20:19:10 +0800
Subject: [PATCH 06/63] Fix Issue with Share Link Generation in
colab_webui.ipynb
Modified the way we retrieve the "is_share" environment variable.
---
colab_webui.ipynb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/colab_webui.ipynb b/colab_webui.ipynb
index 21722da5..79717ccf 100644
--- a/colab_webui.ipynb
+++ b/colab_webui.ipynb
@@ -82,7 +82,7 @@
"source": [
"# @title launch WebUI 启动WebUI\n",
"!/usr/local/bin/pip install ipykernel\n",
- "!sed -i '9s/False/True/' /content/GPT-SoVITS/config.py\n",
+ "!sed -i 's/os.environ.get("is_share","False")/os.environ.get("is_share","True")/g' /content/GPT-SoVITS/config.py\n",
"%cd /content/GPT-SoVITS/\n",
"!/usr/local/bin/python webui.py"
],
@@ -93,4 +93,4 @@
"outputs": []
}
]
-}
\ No newline at end of file
+}
From 82d5928bf28d272a5fbb47962410347496a64551 Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Sat, 17 Feb 2024 22:25:33 +0800
Subject: [PATCH 07/63] Revert "Fix Issue with Share Link Generation in
colab_webui.ipynb"
---
colab_webui.ipynb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/colab_webui.ipynb b/colab_webui.ipynb
index 79717ccf..21722da5 100644
--- a/colab_webui.ipynb
+++ b/colab_webui.ipynb
@@ -82,7 +82,7 @@
"source": [
"# @title launch WebUI 启动WebUI\n",
"!/usr/local/bin/pip install ipykernel\n",
- "!sed -i 's/os.environ.get("is_share","False")/os.environ.get("is_share","True")/g' /content/GPT-SoVITS/config.py\n",
+ "!sed -i '9s/False/True/' /content/GPT-SoVITS/config.py\n",
"%cd /content/GPT-SoVITS/\n",
"!/usr/local/bin/python webui.py"
],
@@ -93,4 +93,4 @@
"outputs": []
}
]
-}
+}
\ No newline at end of file
From e60988a568290b2d76b2b0b860aa1c9cd2f9524a Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Sat, 17 Feb 2024 22:30:54 +0800
Subject: [PATCH 08/63] Update colab_webui.ipynb
---
colab_webui.ipynb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/colab_webui.ipynb b/colab_webui.ipynb
index 21722da5..70fa7940 100644
--- a/colab_webui.ipynb
+++ b/colab_webui.ipynb
@@ -82,7 +82,7 @@
"source": [
"# @title launch WebUI 启动WebUI\n",
"!/usr/local/bin/pip install ipykernel\n",
- "!sed -i '9s/False/True/' /content/GPT-SoVITS/config.py\n",
+ "!sed -i '10s/False/True/' /content/GPT-SoVITS/config.py\n",
"%cd /content/GPT-SoVITS/\n",
"!/usr/local/bin/python webui.py"
],
@@ -93,4 +93,4 @@
"outputs": []
}
]
-}
\ No newline at end of file
+}
From f49d60d6bb7fec124ff859431b048fe423b59627 Mon Sep 17 00:00:00 2001
From: Tundra Work
Date: Sun, 18 Feb 2024 07:13:09 +0000
Subject: [PATCH 09/63] fix: 1A-Dataset formatting doesn't work if using a
empty 'Audio dataset folder'
---
GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py
index b8355dd4..9e137a9f 100644
--- a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py
+++ b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py
@@ -98,7 +98,7 @@ for line in lines[int(i_part)::int(all_parts)]:
try:
# wav_name,text=line.split("\t")
wav_name, spk_name, language, text = line.split("|")
- if (inp_wav_dir !=None):
+ if (inp_wav_dir != ""):
wav_name = os.path.basename(wav_name)
wav_path = "%s/%s"%(inp_wav_dir, wav_name)
From 7d6f9aecc72ffbe339ad40911f2c077ed0af01f4 Mon Sep 17 00:00:00 2001
From: pengoosedev <73521518+pengoosedev@users.noreply.github.com>
Date: Sun, 18 Feb 2024 23:36:15 +0900
Subject: [PATCH 10/63] docs: uppdate Changelog_KO.md
---
docs/ko/Changelog_KO.md | 46 ++++++++++++++++++++++++++++++++++++-----
1 file changed, 41 insertions(+), 5 deletions(-)
diff --git a/docs/ko/Changelog_KO.md b/docs/ko/Changelog_KO.md
index 1afa9e5c..ede4e613 100644
--- a/docs/ko/Changelog_KO.md
+++ b/docs/ko/Changelog_KO.md
@@ -50,9 +50,45 @@
2. 중국어 및 영어 문자열의 문장 부호가 잘리는 문제 및 문장의 시작과 끝에 문장 부호가 추가되는 문제를 수정했습니다.
3. 문장 부호의 수를 확장하였습니다.
-todolist:
+### 20240201 업데이트
-1. 동음이의어(중문) 추론 최적화
-2. 영문 대문자 인식 및 영문 하이픈 [문제](https://github.com/RVC-Boss/GPT-SoVITS/issues/271)
-3. 텍스트에 % 기호가 포함되어 있으면 오류가 발생하며 추론이 불가능합니다. 또한 '元/吨'이 '元吨'으로 읽히지 않고 '元每吨'으로 읽히도록 하는 등의 문제가 존재합니다. 이러한 문제를 해결하기 위해 어떤 라이브러리를 사용해야 하며, 이에 대한 개선을 고민하고 있습니다.
-4. 중-일-영, 중-영, 일-영을 포함한 다섯 가지 언어를 지원하는 것을 목표로 잡고있습니다.
+1. uvr5가 잘못된 형식으로 읽어들이는 문제를 수정하였습니다.
+2. 중국어, 일본어, 영어가 혼합된 여러 텍스트를 자동으로 분리하여 언어를 인식합니다.
+
+### 20240202 업데이트
+
+1. asr 경로의 끝에 `/`가 포함되어 있는 경우 오류가 발생하는 문제를 수정하였습니다.
+2. paddlespeech의 Normalizer를 도입하여 [문제를 해결](https://github.com/RVC-Boss/GPT-SoVITS/pull/377)하여, 예를 들어 xx.xx%(백분율), 元/吨이 元吨으로 읽히는 문제를 해결하였습니다. 또한, 밑줄이 더 이상 오류를 발생시키지 않습니다.
+
+### 20240207 업데이트
+
+1. 언어 전달 매개변수가 혼란스러워져 [중국어 추론 효과가 저하되는 문제](https://github.com/RVC-Boss/GPT-SoVITS/issues/391)를 수정하였습니다.
+2. uvr5가 `inf everywhere` [오류를 반환하는 문제](https://github.com/RVC-Boss/GPT-SoVITS/pull/403)를 수정하였습니다.
+3. uvr5의 `is_half` 매개변수가 bool로 변환되지 않아 항상 반정밀도 추론으로 설정되어 16 시리즈 그래픽 카드에서 `inf`가 반환되는 [문제](https://github.com/RVC-Boss/GPT-SoVITS/commit/14a285109a521679f8846589c22da8f656a46ad8)를 수정하였습니다.
+4. 영어 텍스트 입력을 최적화하였습니다.
+5. gradio 종속성을 지원합니다.
+6. 루트 디렉토리가 비어 있으면 `.list` 전체 경로를 자동으로 읽습니다.
+7. faster whisper ASR 일본어 및 영어를 지원합니다.
+
+### 20240208 업데이트
+
+1. GPT 학습이 카드에 따라 멈추는 문제와 [GPT 학습 중 ZeroDivisionError](https://github.com/RVC-Boss/GPT-SoVITS/commit/59f35adad85815df27e9c6b33d420f5ebfd8376b) 문제를 수정하였습니다.
+
+### 20240212 업데이트
+
+1. faster whisper 및 funasr 로직을 최적화하였습니다. faster whisper는 이미지 스토어에서 다운로드하여 huggingface에 연결하지 못하는 문제를 회피합니다.
+2. DPO Loss 실험적 학습 옵션을 활성화하여 부정적 샘플을 생성하여 [GPT 반복 및 누락 문자 문제](https://github.com/RVC-Boss/GPT-SoVITS/pull/457)를 완화합니다. 추론 인터페이스에 몇 가지 추론 매개변수를 공개합니다.
+
+### 20240214 업데이트
+
+1. 학습에서 중국어 실험 이름을 지원합니다. (이전에 오류가 발생했습니다)
+2. DPO 학습을 선택적으로 설정할 수 있도록 변경하였습니다. 배치 크기를 선택하면 자동으로 절반으로 줄어듭니다. 추론 인터페이스에서 새로운 매개변수를 전달하지 않는 문제를 수정하였습니다.
+
+### 20240216 업데이트
+
+1. 참조 텍스트 입력을 지원합니다.
+2. 프론트엔드에 있던 중국어 텍스트 입력 버그를 수정하였습니다.
+
+todolist :
+
+1. 중국어 다음음자 추론 최적화
From 92b229132fc23cafbde5b63385a844ed6af1ed0b Mon Sep 17 00:00:00 2001
From: pengoosedev <73521518+pengoosedev@users.noreply.github.com>
Date: Sun, 18 Feb 2024 23:36:45 +0900
Subject: [PATCH 11/63] chore: tiny change i18n(ko_KR.json)
---
i18n/locale/ko_KR.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/i18n/locale/ko_KR.json b/i18n/locale/ko_KR.json
index 9061ef97..1898c9b9 100644
--- a/i18n/locale/ko_KR.json
+++ b/i18n/locale/ko_KR.json
@@ -5,7 +5,7 @@
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. 如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "본 소프트웨어는 MIT 라이선스로 오픈 소스로 제공되며, 제작자는 소프트웨어에 대해 어떠한 제어력도 가지지 않습니다. 소프트웨어 사용자 및 소프트웨어에서 내보낸 소리를 전파하는 자는 전적으로 책임져야 합니다. 이 조항을 인정하지 않으면 소프트웨어의 코드 및 파일을 사용하거나 인용할 수 없습니다. 루트 디렉터리의 LICENSE를 참조하십시오.",
"0-前置数据集获取工具": "0-전방 데이터 세트 수집 도구",
"0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 보컬 및 반주 분리 및 에코 및 지연 제거 도구",
- "是否开启UVR5-WebUI": "UVR5-WebUI 활성화 여부",
+ "是否开启UVR5-WebUI": "UVR5-WebUI를 여시겠습니까?",
"UVR5进程输出信息": "UVR5 프로세스 출력 정보",
"0b-语音切分工具": "0b-음성 분리 도구",
".list标注文件的路径": ".list 주석 파일 경로",
From 0edf40bc4b490f388f3520e138f19bf4db6c4156 Mon Sep 17 00:00:00 2001
From: pengoosedev <73521518+pengoosedev@users.noreply.github.com>
Date: Sun, 18 Feb 2024 23:38:04 +0900
Subject: [PATCH 12/63] chore: sync i18n
---
tools/i18n/locale/ko_KR.json | 328 +++++++++++++++++++++++++----------
1 file changed, 239 insertions(+), 89 deletions(-)
diff --git a/tools/i18n/locale/ko_KR.json b/tools/i18n/locale/ko_KR.json
index 816ed3f7..1898c9b9 100644
--- a/tools/i18n/locale/ko_KR.json
+++ b/tools/i18n/locale/ko_KR.json
@@ -1,135 +1,285 @@
{
- ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3이면 harvest 음높이 인식 결과에 중간값 필터를 사용합니다. 이 수치는 필터 반경이며, 사용하면 불명확한 음성을 어느정도 배제할 수 있습니다.",
+ "很遗憾您这没有能用的显卡来支持您训练": "죄송합니다. 훈련을 지원할 수 있는 그래픽 카드가 없습니다.",
+ "UVR5已开启": "UVR5가 활성화되었습니다",
+ "UVR5已关闭": "UVR5가 비활성화되었습니다",
+ "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. 如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "본 소프트웨어는 MIT 라이선스로 오픈 소스로 제공되며, 제작자는 소프트웨어에 대해 어떠한 제어력도 가지지 않습니다. 소프트웨어 사용자 및 소프트웨어에서 내보낸 소리를 전파하는 자는 전적으로 책임져야 합니다. 이 조항을 인정하지 않으면 소프트웨어의 코드 및 파일을 사용하거나 인용할 수 없습니다. 루트 디렉터리의 LICENSE를 참조하십시오.",
+ "0-前置数据集获取工具": "0-전방 데이터 세트 수집 도구",
+ "0a-UVR5人声伴奏分离&去混响去延迟工具": "0a-UVR5 보컬 및 반주 분리 및 에코 및 지연 제거 도구",
+ "是否开启UVR5-WebUI": "UVR5-WebUI를 여시겠습니까?",
+ "UVR5进程输出信息": "UVR5 프로세스 출력 정보",
+ "0b-语音切分工具": "0b-음성 분리 도구",
+ ".list标注文件的路径": ".list 주석 파일 경로",
+ "GPT模型路径": "GPT 모델 경로",
+ "SoVITS模型列表": "SoVITS 모델 목록",
+ "填切割后音频所在目录!读取的音频文件完整路径=该目录-拼接-list文件里波形对应的文件名(不是全路径)。": "분리된 오디오가 있는 디렉터리를 입력하십시오! 읽은 오디오 파일의 전체 경로 = 해당 디렉터리-연결-목록 파일에 해당하는 원본 이름 (전체 경로가 아님).",
+ "音频自动切分输入路径,可文件可文件夹": "오디오 자동 분리 입력 경로, 파일 또는 폴더 가능",
+ "切分后的子音频的输出根目录": "분리된 하위 오디오의 출력 기본 디렉터리",
+ "怎么切": "자르기 옵션",
+ "不切": "자르지 않음",
+ "凑四句一切": "네 문장의 세트를 완성하세요.",
+ "按英文句号.切": "영어 문장으로 분리하기",
+ "threshold:音量小于这个值视作静音的备选切割点": "임계 값: 이 값보다 작은 볼륨은 대체 분리 지점으로 간주됩니다.",
+ "min_length:每段最小多长,如果第一段太短一直和后面段连起来直到超过这个值": "최소 길이: 각 세그먼트의 최소 길이. 첫 번째 세그먼트가 너무 짧으면 계속해서 뒷부분과 연결하여 이 값 이상이 될 때까지",
+ "min_interval:最短切割间隔": "최소 분리 간격",
+ "hop_size:怎么算音量曲线,越小精度越大计算量越高(不是精度越大效果越好)": "hop 크기: 볼륨 곡선을 계산하는 방법. 작을수록 정확도가 높아지지만 계산량이 높아집니다 (정확도가 높다고 효과가 좋아지지 않음)",
+ "max_sil_kept:切完后静音最多留多长": "최대 유지되는 정적 길이 (분리 후)",
+ "开启语音切割": "음성 분리 활성화",
+ "终止语音切割": "음성 분리 종료",
+ "max:归一化后最大值多少": "최대 값 (정규화 후)",
+ "alpha_mix:混多少比例归一化后音频进来": "알파 믹스: 정규화된 오디오가 들어오는 비율",
+ "切割使用的进程数": "사용되는 프로세스 수로 자르기",
+ "语音切割进程输出信息": "음성 분리 프로세스 출력 정보",
+ "0c-中文批量离线ASR工具": "0c-중국어 대량 오프라인 ASR 도구",
+ "开启离线批量ASR": "오프라인 대량 ASR 활성화",
+ "终止ASR进程": "ASR 프로세스 종료",
+ "批量ASR(中文only)输入文件夹路径": "대량 ASR (중국어 전용) 입력 폴더 경로",
+ "ASR进程输出信息": "ASR 프로세스 출력 정보",
+ "0d-语音文本校对标注工具": "0d-음성 텍스트 교정 주석 도구",
+ "是否开启打标WebUI": "웹 기반 주석 활성화 여부",
+ "打标数据标注文件路径": "주석 데이터 주석 파일 경로",
+ "打标工具进程输出信息": "주석 도구 프로세스 출력 정보",
+ "1-GPT-SoVITS-TTS": "1-GPT-SoVITS-TTS",
+ "*实验/模型名": "*실험/모델 이름",
+ "显卡信息": "그래픽 카드 정보",
+ "预训练的SoVITS-G模型路径": "사전 훈련된 SoVITS-G 모델 경로",
+ "预训练的SoVITS-D模型路径": "사전 훈련된 SoVITS-D 모델 경로",
+ "预训练的GPT模型路径": "사전 훈련된 GPT 모델 경로",
+ "1A-训练集格式化工具": "1A-훈련 세트 형식 지정 도구",
+ "输出logs/实验名目录下应有23456开头的文件和文件夹": "logs/실험 이름 디렉터리에는 23456으로 시작하는 파일과 폴더가 있어야 함",
+ "*文本标注文件": "*텍스트 주석 파일",
+ "*训练集音频文件目录": "*훈련 세트 오디오 파일 디렉터리",
+ "训练集音频文件目录 拼接 list文件里波形对应的文件名。": "훈련 세트 오디오 파일 디렉터리 - 목록 파일에 해당하는 원형 이름 연결",
+ "1Aa-文本内容": "1Aa-텍스트 내용",
+ "GPU卡号以-分割,每个卡号一个进程": "GPU 카드 번호는 -로 구분되며 각 카드 번호에 하나의 프로세스가 있어야 함",
+ "预训练的中文BERT模型路径": "사전 훈련된 중국어 BERT 모델 경로",
+ "开启文本获取": "텍스트 추출 활성화",
+ "终止文本获取进程": "텍스트 추출 프로세스 종료",
+ "文本进程输出信息": "텍스트 프로세스 출력 정보",
+ "1Ab-SSL自监督特征提取": "1Ab-SSL 자기 지도 특징 추출",
+ "预训练的SSL模型路径": "사전 훈련된 SSL 모델 경로",
+ "开启SSL提取": "SSL 추출 활성화",
+ "终止SSL提取进程": "SSL 추출 프로세스 종료",
+ "SSL进程输出信息": "SSL 프로세스 출력 정보",
+ "1Ac-语义token提取": "1Ac-의미 토큰 추출",
+ "开启语义token提取": "의미 토큰 추출 활성화",
+ "终止语义token提取进程": "의미 토큰 추출 프로세스 종료",
+ "语义token提取进程输出信息": "의미 토큰 추출 프로세스 출력 정보",
+ "1Aabc-训练集格式化一键三连": "1Aabc-훈련 세트 형식 지정 일괄 처리",
+ "开启一键三连": "일괄 처리 활성화",
+ "终止一键三连": "일괄 처리 종료",
+ "一键三连进程输出信息": "일괄 처리 프로세스 출력 정보",
+ "1B-微调训练": "1B-미세 조정 훈련",
+ "1Ba-SoVITS训练。用于分享的模型文件输出在SoVITS_weights下。": "1Ba-SoVITS 훈련. 공유 용 모델 파일은 SoVITS_weights 하위에 출력됩니다.",
+ "每张显卡的batch_size": "각 그래픽 카드의 배치 크기",
+ "总训练轮数total_epoch,不建议太高": "총 훈련 라운드 수 (total_epoch), 너무 높지 않게 권장됨",
+ "文本模块学习率权重": "텍스트 모듈 학습률 가중치",
+ "保存频率save_every_epoch": "저장 빈도 (각 라운드마다)",
+ "是否仅保存最新的ckpt文件以节省硬盘空间": "디스크 공간을 절약하기 위해 최신 ckpt 파일만 저장할지 여부",
+ "是否在每次保存时间点将最终小模型保存至weights文件夹": "각 저장 시간에 최종 작은 모델을 weights 폴더에 저장할지 여부",
+ "开启SoVITS训练": "SoVITS 훈련 활성화",
+ "终止SoVITS训练": "SoVITS 훈련 종료",
+ "SoVITS训练进程输出信息": "SoVITS 훈련 프로세스 출력 정보",
+ "1Bb-GPT训练。用于分享的模型文件输出在GPT_weights下。": "1Bb-GPT 훈련. 공유 용 모델 파일은 GPT_weights 하위에 출력됩니다.",
+ "总训练轮数total_epoch": "총 훈련 라운드 수 (total_epoch)",
+ "开启GPT训练": "GPT 훈련 활성화",
+ "终止GPT训练": "GPT 훈련 종료",
+ "GPT训练进程输出信息": "GPT 훈련 프로세스 출력 정보",
+ "1C-推理": "1C-추론",
+ "选择训练完存放在SoVITS_weights和GPT_weights下的模型。默认的一个是底模,体验5秒Zero Shot TTS用。": "SoVITS_weights 및 GPT_weights에 저장된 훈련 완료된 모델 중 선택. 기본적으로 하나는 기본 모델이며 5초 Zero Shot TTS를 체험할 수 있습니다.",
+ "*GPT模型列表": "*GPT 모델 목록",
+ "*SoVITS模型列表": "*SoVITS 모델 목록",
+ "GPU卡号,只能填1个整数": "GPU 카드 번호, 1개의 정수만 입력 가능",
+ "刷新模型路径": "모델 경로 새로 고침",
+ "是否开启TTS推理WebUI": "TTS 추론 WebUI 활성화 여부",
+ "TTS推理WebUI进程输出信息": "TTS 추론 WebUI 프로세스 출력 정보",
+ "2-GPT-SoVITS-变声": "2-GPT-SoVITS-음성 변환",
+ "施工中,请静候佳音": "공사 중입니다. 기다려주십시오.",
+ "参考音频在3~10秒范围外,请更换!": "참고 오디오가 3~10초 범위를 벗어났습니다. 다른 것으로 바꾸십시오!",
+ "请上传3~10秒内参考音频,超过会报错!": "3~10초 이내의 참고 오디오를 업로드하십시오. 초과하면 오류가 발생합니다!",
+ "TTS推理进程已开启": "TTS 추론 프로세스가 열렸습니다",
+ "TTS推理进程已关闭": "TTS 추론 프로세스가 닫혔습니다",
+ "打标工具WebUI已开启": "주석 도구 WebUI가 열렸습니다",
+ "打标工具WebUI已关闭": "주석 도구 WebUI가 닫혔습니다",
+ "*请填写需要合成的目标文本。中英混合选中文,日英混合选日文,中日混合暂不支持,非目标语言文本自动遗弃。": "*합성할 대상 텍스트를 입력하십시오. 중국어와 영어를 혼합하면 중국어를 선택하고 일본어와 영어를 혼합하면 일본어를 선택하십시오. 중국어와 일본어를 혼합하는 것은 아직 지원되지 않으며 대상 언어가 아닌 텍스트는 자동으로 버려집니다.",
+ "*请填写需要合成的目标文本": "*합성할 대상 텍스트를 입력하십시오",
+ "ASR任务开启:%s": "ASR 작업 시작: %s",
+ "GPT训练完成": "GPT 훈련 완료",
+ "GPT训练开始:%s": "GPT 훈련 시작: %s",
+ "SSL提取进程执行中": "SSL 추출 프로세스 실행 중",
+ "SSL提取进程结束": "SSL 추출 프로세스 종료",
+ "SoVITS训练完成": "SoVITS 훈련 완료",
+ "SoVITS训练开始:%s": "SoVITS 훈련 시작: %s",
+ "一键三连中途报错": "일괄 처리 중 오류 발생",
+ "一键三连进程结束": "일괄 처리 프로세스 종료",
+ "中文": "중국어",
+ "凑50字一切": "50자를 채우십시오",
+ "凑五句一切": "다섯 문장을 채우십시오",
+ "切分后文本": "분리된 텍스트",
+ "切割执行中": "분리 진행 중",
+ "切割结束": "분리 종료",
+ "参考音频的文本": "참고 오디오의 텍스트",
+ "参考音频的语种": "참고 오디오의 언어",
+ "合成语音": "합성 음성",
+ "后续将支持混合语种编码文本输入。": "향후 혼합 언어 코딩 텍스트 입력을 지원할 예정입니다.",
+ "已有正在进行的ASR任务,需先终止才能开启下一次任务": "이미 진행 중인 ASR 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已有正在进行的GPT训练任务,需先终止才能开启下一次任务": "이미 진행 중인 GPT 훈련 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已有正在进行的SSL提取任务,需先终止才能开启下一次任务": "이미 진행 중인 SSL 추출 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已有正在进行的SoVITS训练任务,需先终止才能开启下一次任务": "이미 진행 중인 SoVITS 훈련 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已有正在进行的一键三连任务,需先终止才能开启下一次任务": "이미 진행 중인 일괄 처리 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已有正在进行的切割任务,需先终止才能开启下一次任务": "이미 진행 중인 분리 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已有正在进行的文本任务,需先终止才能开启下一次任务": "이미 진행 중인 텍스트 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已有正在进行的语义token提取任务,需先终止才能开启下一次任务": "이미 진행 중인 의미 토큰 추출 작업이 있습니다. 다음 작업을 시작하려면 먼저 종료하십시오.",
+ "已终止ASR进程": "ASR 프로세스 종료됨",
+ "已终止GPT训练": "GPT 훈련 종료됨",
+ "已终止SoVITS训练": "SoVITS 훈련 종료됨",
+ "已终止所有1a进程": "모든 1a 프로세스 종료됨",
+ "已终止所有1b进程": "모든 1b 프로세스 종료됨",
+ "已终止所有一键三连进程": "모든 일괄 처리 프로세스 종료됨",
+ "已终止所有切割进程": "모든 분리 프로세스 종료됨",
+ "已终止所有语义token进程": "모든 의미 토큰 프로세스 종료됨",
+ "按中文句号。切": "중국어 문장으로 분리하십시오.",
+ "文本切分工具。太长的文本合成出来效果不一定好,所以太长建议先切。合成会根据文本的换行分开合成再拼起来。": "텍스트 분리 도구. 너무 긴 텍스트는 합성 결과가 항상 좋지 않을 수 있으므로 너무 길면 먼저 분리하는 것이 좋습니다. 합성은 텍스트 줄 바꿈을 기준으로 분리되어 다시 조합됩니다.",
+ "文本进程执行中": "텍스트 프로세스 실행 중",
+ "文本进程结束": "텍스트 프로세스 종료",
+ "日文": "일본어",
+ "英文": "영어",
+ "语义token提取进程执行中": "의미 토큰 추출 프로세스 실행 중",
+ "语义token提取进程结束": "의미 토큰 추출 프로세스 종료",
+ "请上传参考音频": "참고 오디오를 업로드하십시오",
+ "输入路径不存在": "입력 경로가 존재하지 않습니다",
+ "输入路径存在但既不是文件也不是文件夹": "입력 경로가 파일이나 폴더가 아닙니다",
+ "输出的语音": "출력 음성",
+ "进度:1a-done": "진행: 1a-done",
+ "进度:1a-done, 1b-ing": "진행: 1a-done, 1b-ing",
+ "进度:1a-ing": "진행: 1a-ing",
+ "进度:1a1b-done": "진행: 1a1b-done",
+ "进度:1a1b-done, 1cing": "진행: 1a1b-done, 1cing",
+ "进度:all-done": "진행: all-done",
+ "需要合成的切分前文本": "합성해야 할 분할 전 텍스트",
+ "需要合成的文本": "합성해야 할 텍스트",
+ "需要合成的语种": "합성해야 할 언어",
+ ">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3이면 harvest 음고 인식 결과에 중앙값 필터를 사용하며, 값은 필터 반경이며 사용하면 소리를 약하게 할 수 있습니다",
"A模型权重": "A 모델 가중치",
"A模型路径": "A 모델 경로",
"B模型路径": "B 모델 경로",
- "E:\\语音音频+标注\\米津玄师\\src": "E:\\음성 오디오+주석\\요네즈 켄시\\src",
- "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0 곡선 파일, 선택 사항, 한 줄에 하나의 음높이, 기본 F0 및 음높이 변화를 대체함",
+ "E:\\语音音频+标注\\米津玄师\\src": "E:\\음성 오디오 + 주석\\Miyuki Kenshi\\src",
+ "F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "F0 곡선 파일, 선택 사항, 한 줄에 하나의 음고, 기본 F0 및 음조 대신 사용",
"Index Rate": "인덱스 비율",
"Onnx导出": "Onnx 내보내기",
"Onnx输出路径": "Onnx 출력 경로",
"RVC模型路径": "RVC 모델 경로",
"ckpt处理": "ckpt 처리",
"harvest进程数": "harvest 프로세스 수",
- "index文件路径不可包含中文": "인덱스 파일 경로에는 중국어를 포함할 수 없습니다.",
- "pth文件路径不可包含中文": "pth 파일 경로에는 중국어를 포함할 수 없습니다.",
- "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "rmvpe 카드 번호 구성: '-'로 구분하여 입력된 다른 프로세스 카드 번호, 예를 들어 0-0-1은 카드 0에서 2개의 프로세스를 실행하고 카드 1에서 1개의 프로세스를 실행",
- "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 실험 설정을 작성합니다. 실험 데이터는 logs 아래에 있으며, 각 실험마다 하나의 폴더가 있습니다. 실험 이름 경로를 수동으로 입력해야 하며, 이 안에는 실험 설정, 로그, 훈련으로 얻은 모델 파일이 포함되어 있습니다.",
+ "index文件路径不可包含中文": "인덱스 파일 경로에는 중국어를 포함할 수 없습니다",
+ "pth文件路径不可包含中文": "pth 파일 경로에는 중국어를 포함할 수 없습니다",
+ "rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "rmvpe 카드 번호 구성: 각 입력에 사용되는 다른 프로세스 카드를 -로 구분하여 입력하십시오. 예: 0-0-1은 카드 0에서 2개의 프로세스를 실행하고 카드 1에서 1개의 프로세스를 실행합니다",
+ "step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "step1: 실험 구성 입력. 실험 데이터는 logs 하위에 있으며 각 실험에 대한 폴더가 있어야합니다. 실험 이름 경로를 수동으로 입력해야하며 실험 구성, 로그, 훈련된 모델 파일이 포함되어 있습니다.",
"step1:正在处理数据": "step1: 데이터 처리 중",
- "step2:正在提取音高&正在提取特征": "step2: 음높이 추출 및 특성 추출 중",
- "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 훈련 폴더 아래 모든 오디오로 디코딩 가능한 파일을 자동으로 순회하고 슬라이스 정규화를 진행하여, 실험 디렉토리 아래에 2개의 wav 폴더를 생성합니다; 현재는 단일 사용자 훈련만 지원합니다.",
- "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: CPU를 사용해 음높이를 추출합니다(모델이 음높이를 포함하는 경우), GPU를 사용해 특성을 추출합니다(카드 번호 선택)",
- "step3: 填写训练设置, 开始训练模型和索引": "step3: 훈련 설정을 작성하고, 모델 및 인덱스 훈련을 시작합니다",
+ "step2:正在提取音高&正在提取特征": "step2: 음고 추출 및 특징 추출 중",
+ "step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "step2a: 자동으로 훈련 폴더에서 오디오로 디코딩할 수 있는 모든 파일을 반복하고 슬라이스 정규화를 수행하여 실험 디렉토리에 2 개의 wav 폴더를 생성합니다. 현재 단일 훈련만 지원됩니다.",
+ "step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "step2b: CPU로 음고 추출(모델이 음고를 지원하는 경우), GPU로 특징 추출(카드 번호 선택)",
+ "step3: 填写训练设置, 开始训练模型和索引": "step3: 훈련 설정 입력, 모델 및 인덱스 훈련 시작",
"step3a:正在训练模型": "step3a: 모델 훈련 중",
- "一键训练": "원키 트레이닝",
- "也可批量输入音频文件, 二选一, 优先读文件夹": "대량으로 오디오 파일 입력도 가능, 둘 중 하나 선택, 폴더 우선 읽기",
- "人声伴奏分离批量处理, 使用UVR5模型。 合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 模型分为三类: 1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; 2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; 3、去混响、去延迟模型(by FoxJoy): (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响; (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。 去混响/去延迟,附: 1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍; 2、MDX-Net-Dereverb模型挺慢的; 3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。": "인간 목소리와 반주 분리 대량 처리, UVR5 모델 사용. 올바른 폴더 경로 예: E:\\codes\\py39\\vits_vc_gpu\\백로서화 테스트 케이스(파일 탐색기 주소창에서 복사하면 됨). 모델은 세 가지 유형으로 나뉩니다: 1. 인간 목소리 보존: 하모니가 없는 오디오를 선택, 주요 인간 목소리를 HP5보다 더 잘 보존. 내장된 HP2와 HP3 모델, HP3는 약간의 반주를 놓칠 수 있지만 HP2보다는 인간 목소리를 조금 더 잘 보존합니다. 2. 오직 주요 인간 목소리 보존: 하모니가 있는 오디오를 선택, 주요 인간 목소리가 약간 약해질 수 있음. 내장된 HP5 모델 하나; 3. 울림 제거, 지연 제거 모델(by FoxJoy): (1)MDX-Net(onnx_dereverb): 양채널 울림에 대해서는 최선의 선택, 단채널 울림 제거 불가능; (234)DeEcho: 지연 효과 제거. Aggressive가 Normal보다 더 철저하게 제거하며, DeReverb는 추가로 울림 제거, 단일 채널 울림 제거 가능하지만 고주파 중심의 판형 울림은 완전히 제거하지 못함. 울림/지연 제거 시 참고: 1. DeEcho-DeReverb 모델의 처리 시간은 다른 두 DeEcho 모델의 거의 2배임; 2. MDX-Net-Dereverb 모델은 상당히 느림; 3. 개인적으로 추천하는 가장 깨끗한 구성은 MDX-Net 다음에 DeEcho-Aggressive 사용.",
- "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "-로 구분하여 입력한 카드 번호, 예를 들어 0-1-2는 카드0, 카드1, 카드2 사용",
- "伴奏人声分离&去混响&去回声": "반주 및 인간 목소리 분리 & 울림 제거 & 에코 제거",
- "使用模型采样率": "모델 샘플링 레이트 사용",
- "使用设备采样率": "장치 샘플링 레이트 사용",
+ "一键训练": "일괄 훈련",
+ "也可批量输入音频文件, 二选一, 优先读文件夹": "오디오 파일을 일괄로 입력할 수도 있습니다. 둘 중 하나를 선택하고 폴더를 읽기를 우선합니다.",
+ "以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "-로 구분하여 입력에 사용되는 카드 번호를 지정하십시오. 예 : 0-1-2는 카드 0, 1 및 2를 사용합니다",
+ "伴奏人声分离&去混响&去回声": "반주 및 보컬 분리 & 리버브 제거 & 에코 제거",
+ "使用模型采样率": "모델 샘플링 속도 사용",
+ "使用设备采样率": "기기 샘플링 속도 사용",
"保存名": "저장 이름",
- "保存的文件名, 默认空为和源文件同名": "저장된 파일 이름, 기본값은 원본 파일과 동일",
- "保存的模型名不带后缀": "저장된 모델 이름은 접미사 없음",
- "保存频率save_every_epoch": "저장 빈도 save_every_epoch",
- "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "청결한 자음과 숨소리를 보호하고, 전자음의 찢어짐과 같은 아티팩트를 방지하며, 0.5까지 끌어올리면 보호가 활성화되지 않으며, 낮추면 보호 강도는 증가하지만 인덱싱 효과는 감소할 수 있음",
+ "保存的文件名, 默认空为和源文件同名": "저장할 파일 이름, 기본적으로 공백은 원본 파일과 동일한 이름입니다",
+ "保存的模型名不带后缀": "저장할 모델 이름에는 확장자가 없습니다",
+ "保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "클리어 자음 및 숨소를 보호하여 전자 음향 찢김과 같은 아티팩트를 방지하려면 0.5로 설정하되, 보호 강도를 높이려면 0.5로 당기지 않고 낮추면 인덱스 효과가 감소할 수 있습니다",
"修改": "수정",
- "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "모델 정보 수정(오직 weights 폴더에서 추출된 소형 모델 파일만 지원)",
+ "修改模型信息(仅支持weights文件夹下提取的小模型文件)": "모델 정보 수정 (weights 폴더에서 추출된 작은 모델 파일만 지원됨)",
"停止音频转换": "오디오 변환 중지",
- "全流程结束!": "전체 과정 완료!",
- "刷新音色列表和索引路径": "음색 목록 및 인덱스 경로 새로고침",
+ "全流程结束!": "전체 프로세스 완료!",
+ "刷新音色列表和索引路径": "음색 목록 및 인덱스 경로 새로 고침",
"加载模型": "모델 로드",
- "加载预训练底模D路径": "사전 훈련된 베이스 모델 D 경로 로드",
- "加载预训练底模G路径": "사전 훈련된 베이스 모델 G 경로 로드",
+ "加载预训练底模D路径": "사전 훈련된 기본 모델 D 경로 로드",
+ "加载预训练底模G路径": "사전 훈련된 기본 모델 G 경로 로드",
"单次推理": "단일 추론",
- "卸载音色省显存": "음색 언로드로 메모리 절약",
- "变调(整数, 半音数量, 升八度12降八度-12)": "변조(정수, 반음 수, 옥타브 상승 12, 옥타브 하강 -12)",
- "后处理重采样至最终采样率,0为不进行重采样": "후처리로 최종 샘플링 레이트까지 리샘플링, 0은 리샘플링하지 않음",
+ "卸载音色省显存": "음색 언로드 및 GPU 메모리 절약",
+ "变调(整数, 半音数量, 升八度12降八度-12)": "음높이 변경(정수, 반음 수, 올림 높이 12 내림 높이 -12)",
+ "后处理重采样至最终采样率,0为不进行重采样": "후 처리를 통한 최종 샘플링률 재샘플링, 0은 재샘플링 미실행",
"否": "아니오",
- "启用相位声码器": "위상 보코더 활성화",
+ "启用相位声码器": "페이즈 보코더 사용",
"响应阈值": "응답 임계값",
- "响度因子": "소리 크기 인자",
+ "响度因子": "음량 요소",
"处理数据": "데이터 처리",
"导出Onnx模型": "Onnx 모델 내보내기",
- "导出文件格式": "파일 형식 내보내기",
- "常见问题解答": "자주 묻는 질문 답변",
+ "导出文件格式": "내보내기 파일 형식",
+ "常见问题解答": "자주 묻는 질문 해결",
"常规设置": "일반 설정",
"开始音频转换": "오디오 변환 시작",
- "很遗憾您这没有能用的显卡来支持您训练": "유감스럽게도 훈련을 지원할 수 있는 그래픽 카드가 없습니다",
"性能设置": "성능 설정",
- "总训练轮数total_epoch": "총 훈련 회차 total_epoch",
- "批量推理": "대량 추론",
- "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "대량 변환, 변환할 오디오 폴더 입력, 또는 여러 오디오 파일 업로드, 지정된 폴더(기본값 opt)에 변환된 오디오 출력.",
- "指定输出主人声文件夹": "주인공 목소리 출력 폴더 지정",
- "指定输出文件夹": "출력 파일 폴더 지정",
- "指定输出非主人声文件夹": "비주인공 목소리 출력 폴더 지정",
+ "批量推理": "일괄 추론",
+ "批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "일괄 변환, 변환 대기 중인 오디오 폴더를 입력하거나 여러 오디오 파일을 업로드하고 지정된 폴더(opt 기본값)에 변환된 오디오를 출력합니다.",
+ "指定输出主人声文件夹": "지정된 주인 목소리 출력 폴더",
+ "指定输出文件夹": "지정된 출력 폴더",
+ "指定输出非主人声文件夹": "지정된 비주인 목소리 출력 폴더",
"推理时间(ms):": "추론 시간(ms):",
"推理音色": "추론 음색",
"提取": "추출",
- "提取音高和处理数据使用的CPU进程数": "음높이 추출 및 데이터 처리에 사용되는 CPU 프로세스 수",
+ "提取音高和处理数据使用的CPU进程数": "음높이 추출 및 데이터 처리에 사용되는 CPU 프로세스 수 추출",
"是": "예",
- "是否仅保存最新的ckpt文件以节省硬盘空间": "디스크 공간을 절약하기 위해 가장 최신의 ckpt 파일만 저장할지 여부",
- "是否在每次保存时间点将最终小模型保存至weights文件夹": "매 저장 시점마다 최종 작은 모델을 weights 폴더에 저장할지 여부",
- "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "모든 훈련 세트를 VRAM에 캐시할지 여부. 10분 미만의 작은 데이터는 훈련 속도를 높이기 위해 캐시할 수 있으나, 큰 데이터는 VRAM을 초과하여 큰 속도 향상을 기대할 수 없음.",
- "显卡信息": "그래픽 카드 정보",
- "本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. 如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录LICENSE.": "이 소프트웨어는 MIT 라이선스로 오픈 소스이며, 작성자는 소프트웨어에 대한 어떠한 제어도 가지지 않으며, 소프트웨어 사용자 및 소프트웨어에서 내보낸 소리를 전파하는 사용자는 모든 책임을 져야 함. 이 조항을 인정하지 않는 경우, 소프트웨어 패키지 내의 어떠한 코드나 파일도 사용하거나 인용할 수 없음. 자세한 내용은 루트 디렉토리의 LICENSE를 참조.",
+ "是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "모든 훈련 세트를 GPU 메모리에 캐시할지 여부. 10분 미만의 소량 데이터는 훈련 속도를 높이기 위해 캐시할 수 있지만, 대량 데이터를 캐시하면 메모리가 터지고 속도가 크게 향상되지 않을 수 있습니다.",
"查看": "보기",
- "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "모델 정보 보기(오직 weights 폴더에서 추출된 작은 모델 파일만 지원)",
- "检索特征占比": "특징 검색 비율",
+ "查看模型信息(仅支持weights文件夹下提取的小模型文件)": "모델 정보보기(작은 모델 파일로 추출된 weights 폴더에서만 지원)",
+ "检索特征占比": "특징 비율 검색",
"模型": "모델",
"模型推理": "모델 추론",
- "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "모델 추출(로그 폴더 아래 대용량 모델 경로 입력), 중간에 훈련을 중단하고 싶은 경우나 작은 파일 모델을 자동으로 저장하지 않은 경우, 또는 중간 모델을 테스트하고 싶은 경우에 적합",
- "模型是否带音高指导": "모델이 음높이 지도를 포함하는지 여부",
- "模型是否带音高指导(唱歌一定要, 语音可以不要)": "모델이 음높이 지도를 포함하는지 여부(노래에는 필수, 말하기에는 선택적)",
- "模型是否带音高指导,1是0否": "모델이 음높이 지도를 포함하는지 여부, 1은 '예', 0은 '아니오'",
- "模型版本型号": "모델 버전 및 모델",
+ "模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "모델 추출(로그 폴더에 대형 파일 모델 경로 입력), 반 훈련하고 싶지 않거나 모델이 자동으로 작은 파일 모델로 추출되지 않았거나 중간 모델을 테스트하려는 경우에 사용",
+ "模型是否带音高指导": "모델에 음높이 안내가 있는지 여부",
+ "模型是否带音高指导(唱歌一定要, 语音可以不要)": "모델에 음높이 안내가 있는지 여부(노래에는 필수, 음성은 선택 사항)",
+ "模型是否带音高指导,1是0否": "모델에 음높이 안내가 있는지 여부, 1이면 있음 0이면 없음",
+ "模型版本型号": "모델 버전 및 모델 번호",
"模型融合, 可用于测试音色融合": "모델 통합, 음색 통합 테스트에 사용 가능",
"模型路径": "모델 경로",
- "每张显卡的batch_size": "각 GPU의 batch_size",
"淡入淡出长度": "페이드 인/아웃 길이",
"版本": "버전",
- "特征提取": "특징 추출",
- "特征检索库文件路径,为空则使用下拉的选择结果": "특징 검색 라이브러리 파일 경로, 비어 있으면 드롭다운 선택 결과 사용",
- "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "남성에서 여성으로 전환 시 +12키 추천, 여성에서 남성으로 전환 시 -12키 추천, 음역대 폭발로 음색 왜곡이 발생할 경우 적절한 음역대로 조정 가능.",
- "目标采样率": "목표 샘플링 비율",
- "算法延迟(ms):": "알고리즘 지연(ms):",
- "自动检测index路径,下拉式选择(dropdown)": "index 경로 자동 감지, 드롭다운 선택",
- "融合": "통합",
+ "特征提取": "특성 추출",
+ "特征检索库文件路径,为空则使用下拉的选择结果": "특성 검색 라이브러리 파일 경로, 비어 있으면 드롭다운 선택 결과 사용",
+ "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "남성을 여성으로 추천 +12키, 여성을 남성으로 추천 -12키, 음역 폭발로 음색이 왜곡되면 적절한 음역으로 직접 조절 가능",
+ "目标采样率": "목표 샘플링률",
+ "算法延迟(ms):": "알고리즘 지연 시간(ms):",
+ "自动检测index路径,下拉式选择(dropdown)": "자동으로 index 경로 감지, 드롭다운 선택",
+ "融合": "융합",
"要改的模型信息": "수정할 모델 정보",
"要置入的模型信息": "삽입할 모델 정보",
"训练": "훈련",
"训练模型": "모델 훈련",
- "训练特征索引": "특징 인덱스 훈련",
- "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "훈련이 완료되었습니다. 콘솔 훈련 로그나 실험 폴더 내의 train.log를 확인하세요.",
- "请指定说话人id": "화자 id를 지정해주세요.",
- "请选择index文件": "index 파일을 선택해주세요.",
- "请选择pth文件": "pth 파일을 선택해주세요.",
- "请选择说话人id": "화자 id를 선택해주세요.",
+ "训练特征索引": "특성 인덱스 훈련",
+ "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "훈련 종료, 콘솔 훈련 로그 또는 실험 폴더의 train.log를 확인할 수 있습니다",
+ "请指定说话人id": "화자 ID 지정",
+ "请选择index文件": "index 파일 선택",
+ "请选择pth文件": "pth 파일 선택",
+ "请选择说话人id": "화자 ID 선택",
"转换": "변환",
- "输入实验名": "실험명을 입력하세요.",
- "输入待处理音频文件夹路径": "처리할 오디오 파일 폴더 경로를 입력하세요.",
- "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "처리할 오디오 파일 폴더 경로를 입력하세요(파일 관리자의 주소 표시줄에서 복사하세요).",
- "输入待处理音频文件路径(默认是正确格式示例)": "처리할 오디오 파일 경로를 입력하세요(기본값은 올바른 형식의 예시입니다).",
- "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "원본 볼륨 엔벨로프와 출력 볼륨 엔벨로프의 혼합 비율을 입력하세요. 1에 가까울수록 출력 엔벨로프를 더 많이 사용합니다.",
- "输入监听": "모니터링 입력",
- "输入训练文件夹路径": "학습시킬 파일 폴더의 경로를 입력하세요.",
+ "输入实验名": "실험명 입력",
+ "输入待处理音频文件夹路径": "처리 대기 중인 오디오 폴더 경로 입력",
+ "输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "처리 대기 중인 오디오 폴더 경로 입력(파일 관리자 주소 표시 줄에서 복사하면 됨)",
+ "输入待处理音频文件路径(默认是正确格式示例)": "처리 대기 중인 오디오 파일 경로 입력(기본적으로 올바른 형식의 예제)",
+ "输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "소스 음량 에너벌롭을 입력하여 출력 음량 에너벌롭 합성 비율을 대체하면 1에 가까울수록 출력 에너벌롭 사용",
+ "输入监听": "입력 모니터링",
+ "输入训练文件夹路径": "훈련 폴더 경로 입력",
"输入设备": "입력 장치",
- "输入降噪": "입력 노이즈 감소",
+ "输入降噪": "노이즈 감소 입력",
"输出信息": "출력 정보",
- "输出变声": "음성 변환 출력",
+ "输出变声": "음성 출력",
"输出设备": "출력 장치",
- "输出降噪": "출력 노이즈 감소",
- "输出音频(右下角三个点,点了可以下载)": "오디오 출력(오른쪽 하단 세 개의 점, 클릭하면 다운로드 가능)",
- "选择.index文件": ".index 파일 선택",
- "选择.pth文件": ".pth 파일 선택",
- "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU": "음고 추출 알고리즘을 선택하세요. 노래 입력 시 pm으로 속도를 높일 수 있으며, harvest는 저음이 좋지만 매우 느리고, crepe는 효과가 좋지만 GPU를 많이 사용합니다.",
- "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU": "음고 추출 알고리즘을 선택하세요. 노래 입력 시 pm으로 속도를 높일 수 있고, harvest는 저음이 좋지만 매우 느리며, crepe는 효과가 좋지만 GPU를 많이 사용하고, rmvpe는 가장 좋은 효과를 내면서 GPU를 적게 사용합니다.",
- "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "음고 추출 알고리즘 선택: 노래 입력 시 pm으로 속도를 높일 수 있으며, 고품질 음성이지만 CPU가 낮을 때는 dio로 속도를 높일 수 있고, harvest는 품질이 더 좋지만 느리며, rmvpe는 최고의 효과를 내면서 CPU/GPU를 적게 사용합니다.",
- "采样率:": "샘플링 레이트:",
+ "输出降噪": "노이즈 감소 출력",
+ "输出音频(右下角三个点,点了可以下载)": "출력 오디오(우하단 세 점, 클릭하면 다운로드 가능)",
+ "选择.index文件": "index 파일 선택",
+ "选择.pth文件": "pth 파일 선택",
+ "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU": "음높이 추출 알고리즘 선택, 노래 입력에 pm 사용 가능, harvest는 저음이 좋지만 매우 느림, crepe 효과는 좋지만 GPU 사용",
+ "选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU": "음높이 추출 알고리즘 선택, 노래 입력에 pm 사용 가능, harvest는 저음이 좋지만 매우 느림, crepe 효과는 좋지만 GPU 사용, rmvpe 효과가 가장 좋으며 약간의 GPU 사용",
+ "选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "음높이 추출 알고리즘 선택: 노래 입력에 pm 사용 가능, 고품질 음성이지만 CPU가 낮음, dio 사용 가능, harvest 품질이 더 좋지만 느림, rmvpe 효과가 최고이며 CPU/GPU 약간 사용",
+ "采样率:": "샘플링률:",
"采样长度": "샘플링 길이",
- "重载设备列表": "장치 목록 리로드",
+ "重载设备列表": "장치 목록 다시로드",
"音调设置": "음조 설정",
- "音频设备(请使用同种类驱动)": "오디오 장치(동일한 유형의 드라이버를 사용해주세요)",
- "音高算法": "음고 알고리즘",
- "额外推理时长": "추가적인 추론 시간"
+ "音频设备(请使用同种类驱动)": "오디오 장치(동일한 유형의 드라이버 사용 권장)",
+ "音高算法": "음높이 알고리즘",
+ "额外推理时长": "추가 추론 시간"
}
From 26e6fe6b15e9259c0f4b77b5435c5fe5efbbff43 Mon Sep 17 00:00:00 2001
From: yukannoshonen <151692166+idkdik2@users.noreply.github.com>
Date: Sun, 18 Feb 2024 14:50:20 -0300
Subject: [PATCH 13/63] Add inference-only
---
GPT_SoVITS_Inference.ipynb | 152 +++++++++++++++++++++++++++++++++++++
1 file changed, 152 insertions(+)
create mode 100644 GPT_SoVITS_Inference.ipynb
diff --git a/GPT_SoVITS_Inference.ipynb b/GPT_SoVITS_Inference.ipynb
new file mode 100644
index 00000000..a5b55325
--- /dev/null
+++ b/GPT_SoVITS_Inference.ipynb
@@ -0,0 +1,152 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3"
+ },
+ "accelerator": "GPU"
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Credits for bubarino giving me the huggingface import code (感谢 bubarino 给了我 huggingface 导入代码)"
+ ],
+ "metadata": {
+ "id": "himHYZmra7ix"
+ }
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "e9b7iFV3dm1f"
+ },
+ "source": [
+ "!git clone https://github.com/RVC-Boss/GPT-SoVITS.git\n",
+ "%cd GPT-SoVITS\n",
+ "!apt-get update && apt-get install -y --no-install-recommends tzdata ffmpeg libsox-dev parallel aria2 git git-lfs && git lfs install\n",
+ "!pip install -r requirements.txt"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# @title Download pretrained models 下载预训练模型\n",
+ "!mkdir -p /content/GPT-SoVITS/GPT_SoVITS/pretrained_models\n",
+ "!mkdir -p /content/GPT-SoVITS/tools/damo_asr/models\n",
+ "!mkdir -p /content/GPT-SoVITS/tools/uvr5\n",
+ "%cd /content/GPT-SoVITS/GPT_SoVITS/pretrained_models\n",
+ "!git clone https://huggingface.co/lj1995/GPT-SoVITS\n",
+ "%cd /content/GPT-SoVITS/tools/damo_asr/models\n",
+ "!git clone https://www.modelscope.cn/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git\n",
+ "!git clone https://www.modelscope.cn/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch.git\n",
+ "!git clone https://www.modelscope.cn/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch.git\n",
+ "# @title UVR5 pretrains 安装uvr5模型\n",
+ "%cd /content/GPT-SoVITS/tools/uvr5\n",
+ "!git clone https://huggingface.co/Delik/uvr5_weights\n",
+ "!git config core.sparseCheckout true\n",
+ "!mv /content/GPT-SoVITS/GPT_SoVITS/pretrained_models/GPT-SoVITS/* /content/GPT-SoVITS/GPT_SoVITS/pretrained_models/"
+ ],
+ "metadata": {
+ "id": "0NgxXg5sjv7z",
+ "cellView": "form"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "#@title Create folder models 创建文件夹模型\n",
+ "import os\n",
+ "base_directory = \"/content/GPT-SoVITS\"\n",
+ "folder_names = [\"SoVITS_weights\", \"GPT_weights\"]\n",
+ "\n",
+ "for folder_name in folder_names:\n",
+ " if os.path.exists(os.path.join(base_directory, folder_name)):\n",
+ " print(f\"The folder '{folder_name}' already exists. (文件夹'{folder_name}'已经存在。)\")\n",
+ " else:\n",
+ " os.makedirs(os.path.join(base_directory, folder_name))\n",
+ " print(f\"The folder '{folder_name}' was created successfully! (文件夹'{folder_name}'已成功创建!)\")\n",
+ "\n",
+ "print(\"All folders have been created. (所有文件夹均已创建。)\")"
+ ],
+ "metadata": {
+ "cellView": "form",
+ "id": "cPDEH-9czOJF"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import requests\n",
+ "import zipfile\n",
+ "import shutil\n",
+ "import os\n",
+ "\n",
+ "#@title Import model 导入模型 (HuggingFace)\n",
+ "hf_link = 'https://huggingface.co/modelloosrvcc/Nagisa_Shingetsu_GPT-SoVITS/resolve/main/Nagisa.zip' #@param {type: \"string\"}\n",
+ "\n",
+ "output_path = '/content/'\n",
+ "\n",
+ "response = requests.get(hf_link)\n",
+ "with open(output_path + 'file.zip', 'wb') as file:\n",
+ " file.write(response.content)\n",
+ "\n",
+ "with zipfile.ZipFile(output_path + 'file.zip', 'r') as zip_ref:\n",
+ " zip_ref.extractall(output_path)\n",
+ "\n",
+ "os.remove(output_path + \"file.zip\")\n",
+ "\n",
+ "source_directory = output_path\n",
+ "SoVITS_destination_directory = '/content/GPT-SoVITS/SoVITS_weights'\n",
+ "GPT_destination_directory = '/content/GPT-SoVITS/GPT_weights'\n",
+ "\n",
+ "for filename in os.listdir(source_directory):\n",
+ " if filename.endswith(\".pth\"):\n",
+ " source_path = os.path.join(source_directory, filename)\n",
+ " destination_path = os.path.join(SoVITS_destination_directory, filename)\n",
+ " shutil.move(source_path, destination_path)\n",
+ "\n",
+ "for filename in os.listdir(source_directory):\n",
+ " if filename.endswith(\".ckpt\"):\n",
+ " source_path = os.path.join(source_directory, filename)\n",
+ " destination_path = os.path.join(GPT_destination_directory, filename)\n",
+ " shutil.move(source_path, destination_path)\n",
+ "\n",
+ "print(f'Model downloaded. (模型已下载。)')"
+ ],
+ "metadata": {
+ "cellView": "form",
+ "id": "vbZY-LnM0tzq"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# @title launch WebUI 启动WebUI\n",
+ "!/usr/local/bin/pip install ipykernel\n",
+ "!sed -i '10s/False/True/' /content/GPT-SoVITS/config.py\n",
+ "%cd /content/GPT-SoVITS/\n",
+ "!/usr/local/bin/python webui.py"
+ ],
+ "metadata": {
+ "id": "4oRGUzkrk8C7",
+ "cellView": "form"
+ },
+ "execution_count": null,
+ "outputs": []
+ }
+ ]
+}
\ No newline at end of file
From 55f82e9ad17f98f3b25803f426e5d423e0245d46 Mon Sep 17 00:00:00 2001
From: KamioRinn
Date: Mon, 19 Feb 2024 02:11:02 +0800
Subject: [PATCH 14/63] Fix text formatting
---
GPT_SoVITS/inference_webui.py | 9 ++++++---
GPT_SoVITS/text/chinese.py | 2 +-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index 39ae7e43..407437f4 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -562,10 +562,13 @@ def cut5(inp):
# if not re.search(r'[^\w\s]', inp[-1]):
# inp += '。'
inp = inp.strip("\n")
- punds = r'[,.;?!、,。?!;:]'
+ punds = r'[,.;?!、,。?!;:…]'
items = re.split(f'({punds})', inp)
- items = ["".join(group) for group in zip(items[::2], items[1::2])]
- opt = "\n".join(items)
+ mergeitems = ["".join(group) for group in zip(items[::2], items[1::2])]
+ # 在句子不存在符号或句尾无符号的时候保证文本完整
+ if len(items)%2 == 1:
+ mergeitems.append(items[-1])
+ opt = "\n".join(mergeitems)
return opt
diff --git a/GPT_SoVITS/text/chinese.py b/GPT_SoVITS/text/chinese.py
index ea41db1f..5334326e 100644
--- a/GPT_SoVITS/text/chinese.py
+++ b/GPT_SoVITS/text/chinese.py
@@ -30,7 +30,7 @@ rep_map = {
"\n": ".",
"·": ",",
"、": ",",
- "...": "…",
+ # "...": "…",
"$": ".",
"/": ",",
"—": "-",
From 41ffbe5c3ec2bd0ef242d81e2018f279d812a63a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=88=98=E6=82=A6?=
Date: Mon, 19 Feb 2024 09:49:50 +0800
Subject: [PATCH 15/63] Add files via upload
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加Kaggle平台运行脚本
---
gpt-sovits_kaggle.ipynb | 218 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 218 insertions(+)
create mode 100644 gpt-sovits_kaggle.ipynb
diff --git a/gpt-sovits_kaggle.ipynb b/gpt-sovits_kaggle.ipynb
new file mode 100644
index 00000000..1980a77a
--- /dev/null
+++ b/gpt-sovits_kaggle.ipynb
@@ -0,0 +1,218 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "45857cb2",
+ "metadata": {
+ "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
+ "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5",
+ "execution": {
+ "iopub.execute_input": "2024-02-18T14:43:46.735480Z",
+ "iopub.status.busy": "2024-02-18T14:43:46.735183Z",
+ "iopub.status.idle": "2024-02-18T14:48:10.724175Z",
+ "shell.execute_reply": "2024-02-18T14:48:10.723059Z"
+ },
+ "papermill": {
+ "duration": 263.994935,
+ "end_time": "2024-02-18T14:48:10.726613",
+ "exception": false,
+ "start_time": "2024-02-18T14:43:46.731678",
+ "status": "completed"
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "!git clone https://github.com/RVC-Boss/GPT-SoVITS.git\n",
+ "%cd GPT-SoVITS\n",
+ "!apt-get update && apt-get install -y --no-install-recommends tzdata ffmpeg libsox-dev parallel aria2 git git-lfs && git lfs install\n",
+ "!pip install -r requirements.txt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b9d346b4",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2024-02-18T14:48:10.815802Z",
+ "iopub.status.busy": "2024-02-18T14:48:10.814899Z",
+ "iopub.status.idle": "2024-02-18T14:50:31.253276Z",
+ "shell.execute_reply": "2024-02-18T14:50:31.252024Z"
+ },
+ "papermill": {
+ "duration": 140.484893,
+ "end_time": "2024-02-18T14:50:31.255720",
+ "exception": false,
+ "start_time": "2024-02-18T14:48:10.770827",
+ "status": "completed"
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# @title Download pretrained models 下载预训练模型\n",
+ "!mkdir -p /kaggle/working/GPT-SoVITS/GPT_SoVITS/pretrained_models\n",
+ "!mkdir -p /kaggle/working/GPT-SoVITS/tools/damo_asr/models\n",
+ "!mkdir -p /kaggle/working/GPT-SoVITS/tools/uvr5\n",
+ "%cd /kaggle/working/GPT-SoVITS/GPT_SoVITS/pretrained_models\n",
+ "!git clone https://huggingface.co/lj1995/GPT-SoVITS\n",
+ "%cd /kaggle/working/GPT-SoVITS/tools/damo_asr/models\n",
+ "!git clone https://www.modelscope.cn/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch.git\n",
+ "!git clone https://www.modelscope.cn/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch.git\n",
+ "!git clone https://www.modelscope.cn/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch.git\n",
+ "# # @title UVR5 pretrains 安装uvr5模型\n",
+ "%cd /kaggle/working/GPT-SoVITS/tools/uvr5\n",
+ "!git clone https://huggingface.co/Delik/uvr5_weights\n",
+ "!git config core.sparseCheckout true\n",
+ "!mv /kaggle/working/GPT-SoVITS/GPT_SoVITS/pretrained_models/GPT-SoVITS/* /kaggle/working/GPT-SoVITS/GPT_SoVITS/pretrained_models/"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ea94d245",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2024-02-18T14:29:01.071549Z",
+ "iopub.status.busy": "2024-02-18T14:29:01.070592Z",
+ "iopub.status.idle": "2024-02-18T14:40:45.318368Z",
+ "shell.execute_reply": "2024-02-18T14:40:45.317130Z",
+ "shell.execute_reply.started": "2024-02-18T14:29:01.071512Z"
+ },
+ "papermill": {
+ "duration": null,
+ "end_time": null,
+ "exception": false,
+ "start_time": "2024-02-18T14:50:31.309013",
+ "status": "running"
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# @title launch WebUI 启动WebUI\n",
+ "%cd /kaggle/working/GPT-SoVITS/\n",
+ "!npm install -g localtunnel\n",
+ "import subprocess\n",
+ "import threading\n",
+ "import time\n",
+ "import socket\n",
+ "import urllib.request\n",
+ "def iframe_thread(port):\n",
+ " while True:\n",
+ " time.sleep(0.5)\n",
+ " sock= socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n",
+ " result = sock.connect_ex(('127.0.0.1', port))\n",
+ " if result == 0:\n",
+ " break\n",
+ " sock.close()\n",
+ "\n",
+ " from colorama import Fore, Style\n",
+ " print (Fore.GREEN + \"\\nIP: \", Fore. RED, urllib.request.urlopen('https://ipv4.icanhazip.com').read().decode('utf8').strip(\"\\n\"), \"\\n\", Style. RESET_ALL)\n",
+ " p = subprocess.Popen([\"lt\", \"--port\", \"{}\".format(port)], stdout=subprocess.PIPE)\n",
+ " for line in p.stdout:\n",
+ " print(line.decode(), end='')\n",
+ "threading.Thread (target=iframe_thread, daemon=True, args=(9874,)).start()\n",
+ "\n",
+ "!python webui.py"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "dda88a6d",
+ "metadata": {
+ "execution": {
+ "iopub.execute_input": "2024-02-18T14:40:56.880608Z",
+ "iopub.status.busy": "2024-02-18T14:40:56.879879Z"
+ },
+ "papermill": {
+ "duration": null,
+ "end_time": null,
+ "exception": null,
+ "start_time": null,
+ "status": "pending"
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# 开启推理页面\n",
+ "%cd /kaggle/working/GPT-SoVITS/\n",
+ "!npm install -g localtunnel\n",
+ "import subprocess\n",
+ "import threading\n",
+ "import time\n",
+ "import socket\n",
+ "import urllib.request\n",
+ "def iframe_thread(port):\n",
+ " while True:\n",
+ " time.sleep(0.5)\n",
+ " sock= socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n",
+ " result = sock.connect_ex(('127.0.0.1', port))\n",
+ " if result == 0:\n",
+ " break\n",
+ " sock.close()\n",
+ "\n",
+ " from colorama import Fore, Style\n",
+ " print (Fore.GREEN + \"\\nIP: \", Fore. RED, urllib.request.urlopen('https://ipv4.icanhazip.com').read().decode('utf8').strip(\"\\n\"), \"\\n\", Style. RESET_ALL)\n",
+ " p = subprocess.Popen([\"lt\", \"--port\", \"{}\".format(port)], stdout=subprocess.PIPE)\n",
+ " for line in p.stdout:\n",
+ " print(line.decode(), end='')\n",
+ "threading.Thread (target=iframe_thread, daemon=True, args=(9872,)).start()\n",
+ "\n",
+ "!python ./GPT_SoVITS/inference_webui.py"
+ ]
+ }
+ ],
+ "metadata": {
+ "kaggle": {
+ "accelerator": "nvidiaTeslaT4",
+ "dataSources": [
+ {
+ "datasetId": 4459328,
+ "sourceId": 7649639,
+ "sourceType": "datasetVersion"
+ }
+ ],
+ "dockerImageVersionId": 30646,
+ "isGpuEnabled": true,
+ "isInternetEnabled": true,
+ "language": "python",
+ "sourceType": "notebook"
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.13"
+ },
+ "papermill": {
+ "default_parameters": {},
+ "duration": null,
+ "end_time": null,
+ "environment_variables": {},
+ "exception": null,
+ "input_path": "__notebook__.ipynb",
+ "output_path": "__notebook__.ipynb",
+ "parameters": {},
+ "start_time": "2024-02-18T14:43:44.011910",
+ "version": "2.5.0"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
From d36c7fa1dffa609902935f3aba6a12d462c8c95f Mon Sep 17 00:00:00 2001
From: Lion
Date: Mon, 19 Feb 2024 19:28:32 +0800
Subject: [PATCH 16/63] Update README
---
README.md | 2 +-
docs/cn/README.md | 2 +-
docs/ja/README.md | 2 +-
docs/ko/README.md | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 72f3694f..4266970f 100644
--- a/README.md
+++ b/README.md
@@ -107,7 +107,7 @@ For Chinese ASR (additionally), download models from [Damo ASR Model](https://mo
If you are a Mac user, make sure you meet the following conditions for training and inferencing with GPU:
-- Mac computers with Apple silicon or AMD GPUs
+- Mac computers with Apple silicon
- macOS 12.3 or later
- Xcode command-line tools installed by running `xcode-select --install`
diff --git a/docs/cn/README.md b/docs/cn/README.md
index 8d3ca49a..4e47e21b 100644
--- a/docs/cn/README.md
+++ b/docs/cn/README.md
@@ -49,7 +49,7 @@ _注意: numba==0.56.4 需要 python<3.11_
如果你是 Mac 用户,请先确保满足以下条件以使用 GPU 进行训练和推理:
-- 搭载 Apple 芯片或 AMD GPU 的 Mac
+- 搭载 Apple 芯片 的 Mac
- macOS 12.3 或更高版本
- 已通过运行`xcode-select --install`安装 Xcode command-line tools
diff --git a/docs/ja/README.md b/docs/ja/README.md
index aa300c86..b27fd652 100644
--- a/docs/ja/README.md
+++ b/docs/ja/README.md
@@ -47,7 +47,7 @@ _注記: numba==0.56.4 は py<3.11 が必要です_
如果あなたが Mac ユーザーである場合、GPU を使用してトレーニングおよび推論を行うために以下の条件を満たしていることを確認してください:
-- Apple シリコンまたは AMD GPU を搭載した Mac コンピューター
+- Apple シリコンを搭載した Mac コンピューター
- macOS 12.3 以降
- `xcode-select --install`を実行してインストールされた Xcode コマンドラインツール
diff --git a/docs/ko/README.md b/docs/ko/README.md
index afcdd667..c57cf5cb 100644
--- a/docs/ko/README.md
+++ b/docs/ko/README.md
@@ -49,7 +49,7 @@ _참고: numba==0.56.4 는 python<3.11 을 필요로 합니다._
MacOS 사용자는 GPU를 사용하여 훈련 및 추론을 하려면 다음 조건을 충족해야 합니다:
-- Apple 칩 또는 AMD GPU가 장착된 Mac
+- Apple 칩이 장착된 Mac
- macOS 12.3 이상
- `xcode-select --install`을 실행하여 Xcode command-line tools를 설치했습니다.
From 555c52b0aa93b08ba05621b349e6e61f243f1b3d Mon Sep 17 00:00:00 2001
From: Lion
Date: Mon, 19 Feb 2024 19:29:57 +0800
Subject: [PATCH 17/63] Update README
---
docs/cn/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/cn/README.md b/docs/cn/README.md
index 4e47e21b..a0cfd0a0 100644
--- a/docs/cn/README.md
+++ b/docs/cn/README.md
@@ -49,7 +49,7 @@ _注意: numba==0.56.4 需要 python<3.11_
如果你是 Mac 用户,请先确保满足以下条件以使用 GPU 进行训练和推理:
-- 搭载 Apple 芯片 的 Mac
+- 搭载 Apple 芯片的 Mac
- macOS 12.3 或更高版本
- 已通过运行`xcode-select --install`安装 Xcode command-line tools
From bbef82fa86cb99ba08c6c71d8144e51689b7bc7e Mon Sep 17 00:00:00 2001
From: KamioRinn
Date: Tue, 20 Feb 2024 22:41:39 +0800
Subject: [PATCH 18/63] Refactoring get phones and bert
---
GPT_SoVITS/inference_webui.py | 167 +++++++++++-----------------------
GPT_SoVITS/text/chinese.py | 2 +-
requirements.txt | 2 +-
3 files changed, 55 insertions(+), 116 deletions(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index 407437f4..70519dab 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -209,54 +209,8 @@ dict_language = {
}
-def splite_en_inf(sentence, language):
- pattern = re.compile(r'[a-zA-Z ]+')
- textlist = []
- langlist = []
- pos = 0
- for match in pattern.finditer(sentence):
- start, end = match.span()
- if start > pos:
- textlist.append(sentence[pos:start])
- langlist.append(language)
- textlist.append(sentence[start:end])
- langlist.append("en")
- pos = end
- if pos < len(sentence):
- textlist.append(sentence[pos:])
- langlist.append(language)
- # Merge punctuation into previous word
- for i in range(len(textlist)-1, 0, -1):
- if re.match(r'^[\W_]+$', textlist[i]):
- textlist[i-1] += textlist[i]
- del textlist[i]
- del langlist[i]
- # Merge consecutive words with the same language tag
- i = 0
- while i < len(langlist) - 1:
- if langlist[i] == langlist[i+1]:
- textlist[i] += textlist[i+1]
- del textlist[i+1]
- del langlist[i+1]
- else:
- i += 1
-
- return textlist, langlist
-
-
def clean_text_inf(text, language):
- formattext = ""
- language = language.replace("all_","")
- for tmp in LangSegment.getTexts(text):
- if language == "ja":
- if tmp["lang"] == language or tmp["lang"] == "zh":
- formattext += tmp["text"] + " "
- continue
- if tmp["lang"] == language:
- formattext += tmp["text"] + " "
- while " " in formattext:
- formattext = formattext.replace(" ", " ")
- phones, word2ph, norm_text = clean_text(formattext, language)
+ phones, word2ph, norm_text = clean_text(text, language)
phones = cleaned_text_to_sequence(phones)
return phones, word2ph, norm_text
@@ -274,55 +228,6 @@ def get_bert_inf(phones, word2ph, norm_text, language):
return bert
-def nonen_clean_text_inf(text, language):
- if(language!="auto"):
- textlist, langlist = splite_en_inf(text, language)
- else:
- textlist=[]
- langlist=[]
- for tmp in LangSegment.getTexts(text):
- langlist.append(tmp["lang"])
- textlist.append(tmp["text"])
- phones_list = []
- word2ph_list = []
- norm_text_list = []
- for i in range(len(textlist)):
- lang = langlist[i]
- phones, word2ph, norm_text = clean_text_inf(textlist[i], lang)
- phones_list.append(phones)
- if lang == "zh":
- word2ph_list.append(word2ph)
- norm_text_list.append(norm_text)
- print(word2ph_list)
- phones = sum(phones_list, [])
- word2ph = sum(word2ph_list, [])
- norm_text = ' '.join(norm_text_list)
-
- return phones, word2ph, norm_text
-
-
-def nonen_get_bert_inf(text, language):
- if(language!="auto"):
- textlist, langlist = splite_en_inf(text, language)
- else:
- textlist=[]
- langlist=[]
- for tmp in LangSegment.getTexts(text):
- langlist.append(tmp["lang"])
- textlist.append(tmp["text"])
- print(textlist)
- print(langlist)
- bert_list = []
- for i in range(len(textlist)):
- lang = langlist[i]
- phones, word2ph, norm_text = clean_text_inf(textlist[i], lang)
- bert = get_bert_inf(phones, word2ph, norm_text, lang)
- bert_list.append(bert)
- bert = torch.cat(bert_list, dim=1)
-
- return bert
-
-
splits = {",", "。", "?", "!", ",", ".", "?", "!", "~", ":", ":", "—", "…", }
@@ -332,23 +237,59 @@ def get_first(text):
return text
-def get_cleaned_text_final(text,language):
+def get_phones_and_bert(text,language):
if language in {"en","all_zh","all_ja"}:
- phones, word2ph, norm_text = clean_text_inf(text, language)
+ language = language.replace("all_","")
+ if language == "en":
+ LangSegment.setfilters(["en"])
+ formattext = " ".join(tmp["text"] for tmp in LangSegment.getTexts(text))
+ else:
+ # 因无法区别中日文汉字,以用户输入为准
+ formattext = text
+ while " " in formattext:
+ formattext = formattext.replace(" ", " ")
+ phones, word2ph, norm_text = clean_text_inf(formattext, language)
+ if language == "zh":
+ bert = get_bert_feature(norm_text, word2ph).to(device)
+ else:
+ bert = torch.zeros(
+ (1024, len(phones)),
+ dtype=torch.float16 if is_half == True else torch.float32,
+ ).to(device)
elif language in {"zh", "ja","auto"}:
- phones, word2ph, norm_text = nonen_clean_text_inf(text, language)
- return phones, word2ph, norm_text
+ textlist=[]
+ langlist=[]
+ LangSegment.setfilters(["zh","ja","en"])
+ if language == "auto":
+ for tmp in LangSegment.getTexts(text):
+ langlist.append(tmp["lang"])
+ textlist.append(tmp["text"])
+ else:
+ for tmp in LangSegment.getTexts(text):
+ if tmp["lang"] == "en":
+ langlist.append(tmp["lang"])
+ else:
+ # 因无法区别中日文汉字,以用户输入为准
+ langlist.append(language)
+ textlist.append(tmp["text"])
+ print(textlist)
+ print(langlist)
+ phones_list = []
+ bert_list = []
+ norm_text_list = []
+ for i in range(len(textlist)):
+ lang = langlist[i]
+ phones, word2ph, norm_text = clean_text_inf(textlist[i], lang)
+ bert = get_bert_inf(phones, word2ph, norm_text, lang)
+ phones_list.append(phones)
+ norm_text_list.append(norm_text)
+ bert_list.append(bert)
+ bert = torch.cat(bert_list, dim=1)
+ phones = sum(phones_list, [])
+ norm_text = ' '.join(norm_text_list)
+
+ return phones,bert.to(dtype),norm_text
-def get_bert_final(phones, word2ph, text,language,device):
- if language == "en":
- bert = get_bert_inf(phones, word2ph, text, language)
- elif language in {"zh", "ja","auto"}:
- bert = nonen_get_bert_inf(text, language)
- elif language == "all_zh":
- bert = get_bert_feature(text, word2ph).to(device)
- else:
- bert = torch.zeros((1024, len(phones))).to(device)
- return bert
def merge_short_text_in_array(texts, threshold):
if (len(texts)) < 2:
@@ -425,8 +366,7 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
texts = merge_short_text_in_array(texts, 5)
audio_opt = []
if not ref_free:
- phones1, word2ph1, norm_text1=get_cleaned_text_final(prompt_text, prompt_language)
- bert1=get_bert_final(phones1, word2ph1, norm_text1,prompt_language,device).to(dtype)
+ phones1,bert1,norm_text1=get_phones_and_bert(prompt_text, prompt_language)
for text in texts:
# 解决输入目标文本的空行导致报错的问题
@@ -434,8 +374,7 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
continue
if (text[-1] not in splits): text += "。" if text_language != "en" else "."
print(i18n("实际输入的目标文本(每句):"), text)
- phones2, word2ph2, norm_text2 = get_cleaned_text_final(text, text_language)
- bert2 = get_bert_final(phones2, word2ph2, norm_text2, text_language, device).to(dtype)
+ phones2,bert2,norm_text2=get_phones_and_bert(text, text_language)
if not ref_free:
bert = torch.cat([bert1, bert2], 1)
all_phoneme_ids = torch.LongTensor(phones1+phones2).to(device).unsqueeze(0)
diff --git a/GPT_SoVITS/text/chinese.py b/GPT_SoVITS/text/chinese.py
index 5334326e..ea41db1f 100644
--- a/GPT_SoVITS/text/chinese.py
+++ b/GPT_SoVITS/text/chinese.py
@@ -30,7 +30,7 @@ rep_map = {
"\n": ".",
"·": ",",
"、": ",",
- # "...": "…",
+ "...": "…",
"$": ".",
"/": ",",
"—": "-",
diff --git a/requirements.txt b/requirements.txt
index fae6198d..75bd945d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -23,5 +23,5 @@ PyYAML
psutil
jieba_fast
jieba
-LangSegment
+LangSegment>=0.2.0
Faster_Whisper
\ No newline at end of file
From 76570cff52ff81e90b6b5f98e80aa657afc70738 Mon Sep 17 00:00:00 2001
From: KamioRinn
Date: Tue, 20 Feb 2024 22:45:49 +0800
Subject: [PATCH 19/63] Del a-zA-Z
---
GPT_SoVITS/inference_webui.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index 70519dab..c427b25f 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -245,7 +245,7 @@ def get_phones_and_bert(text,language):
formattext = " ".join(tmp["text"] for tmp in LangSegment.getTexts(text))
else:
# 因无法区别中日文汉字,以用户输入为准
- formattext = text
+ formattext = re.sub('[a-zA-Z]', '', text)
while " " in formattext:
formattext = formattext.replace(" ", " ")
phones, word2ph, norm_text = clean_text_inf(formattext, language)
From 31802947108cb12d708404fb621f287fd5d13716 Mon Sep 17 00:00:00 2001
From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com>
Date: Tue, 20 Feb 2024 15:57:58 +0000
Subject: [PATCH 20/63] Update config.py
Change the inference device for Mac to accelerate inference and reduce memory leak
---
config.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config.py b/config.py
index 3e9e951c..caaadd47 100644
--- a/config.py
+++ b/config.py
@@ -20,7 +20,7 @@ python_exec = sys.executable or "python"
if torch.cuda.is_available():
infer_device = "cuda"
elif torch.backends.mps.is_available():
- infer_device = "mps"
+ infer_device = "cpu"
else:
infer_device = "cpu"
From 861658050b6eab32ce6a34cfee37fc63a53a4ae7 Mon Sep 17 00:00:00 2001
From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com>
Date: Tue, 20 Feb 2024 16:03:08 +0000
Subject: [PATCH 21/63] Update inference_webui.py
Change inference device to accelerate inference on Mac and reduce memory leak
---
GPT_SoVITS/inference_webui.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index c427b25f..a046776d 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -73,7 +73,7 @@ os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 确保直接启动推理UI时
if torch.cuda.is_available():
device = "cuda"
elif torch.backends.mps.is_available():
- device = "mps"
+ device = "cpu"
else:
device = "cpu"
From 84062074a311d10da5998f10b5f3d36dc8467b5f Mon Sep 17 00:00:00 2001
From: KamioRinn
Date: Wed, 21 Feb 2024 01:14:09 +0800
Subject: [PATCH 22/63] Adjust text normlization
---
GPT_SoVITS/inference_webui.py | 5 +++--
GPT_SoVITS/text/chinese.py | 2 ++
GPT_SoVITS/text/zh_normalization/num.py | 15 +++++++++++++++
.../text/zh_normalization/text_normlization.py | 10 +++++++---
4 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index c427b25f..695121ac 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -245,7 +245,7 @@ def get_phones_and_bert(text,language):
formattext = " ".join(tmp["text"] for tmp in LangSegment.getTexts(text))
else:
# 因无法区别中日文汉字,以用户输入为准
- formattext = re.sub('[a-zA-Z]', '', text)
+ formattext = text
while " " in formattext:
formattext = formattext.replace(" ", " ")
phones, word2ph, norm_text = clean_text_inf(formattext, language)
@@ -286,7 +286,7 @@ def get_phones_and_bert(text,language):
bert_list.append(bert)
bert = torch.cat(bert_list, dim=1)
phones = sum(phones_list, [])
- norm_text = ' '.join(norm_text_list)
+ norm_text = ''.join(norm_text_list)
return phones,bert.to(dtype),norm_text
@@ -375,6 +375,7 @@ def get_tts_wav(ref_wav_path, prompt_text, prompt_language, text, text_language,
if (text[-1] not in splits): text += "。" if text_language != "en" else "."
print(i18n("实际输入的目标文本(每句):"), text)
phones2,bert2,norm_text2=get_phones_and_bert(text, text_language)
+ print(i18n("前端处理后的文本(每句):"), norm_text2)
if not ref_free:
bert = torch.cat([bert1, bert2], 1)
all_phoneme_ids = torch.LongTensor(phones1+phones2).to(device).unsqueeze(0)
diff --git a/GPT_SoVITS/text/chinese.py b/GPT_SoVITS/text/chinese.py
index ea41db1f..f9a4b360 100644
--- a/GPT_SoVITS/text/chinese.py
+++ b/GPT_SoVITS/text/chinese.py
@@ -34,6 +34,8 @@ rep_map = {
"$": ".",
"/": ",",
"—": "-",
+ "~": "…",
+ "~":"…",
}
tone_modifier = ToneSandhi()
diff --git a/GPT_SoVITS/text/zh_normalization/num.py b/GPT_SoVITS/text/zh_normalization/num.py
index 8a54d3e6..8ef7f48f 100644
--- a/GPT_SoVITS/text/zh_normalization/num.py
+++ b/GPT_SoVITS/text/zh_normalization/num.py
@@ -172,6 +172,21 @@ def replace_range(match) -> str:
return result
+# ~至表达式
+RE_TO_RANGE = re.compile(
+ r'((-?)((\d+)(\.\d+)?)|(\.(\d+)))(%|°C|℃|度|摄氏度|cm2|cm²|cm3|cm³|cm|db|ds|kg|km|m2|m²|m³|m3|ml|m|mm|s)[~]((-?)((\d+)(\.\d+)?)|(\.(\d+)))(%|°C|℃|度|摄氏度|cm2|cm²|cm3|cm³|cm|db|ds|kg|km|m2|m²|m³|m3|ml|m|mm|s)')
+
+def replace_to_range(match) -> str:
+ """
+ Args:
+ match (re.Match)
+ Returns:
+ str
+ """
+ result = match.group(0).replace('~', '至')
+ return result
+
+
def _get_value(value_string: str, use_zero: bool=True) -> List[str]:
stripped = value_string.lstrip('0')
if len(stripped) == 0:
diff --git a/GPT_SoVITS/text/zh_normalization/text_normlization.py b/GPT_SoVITS/text/zh_normalization/text_normlization.py
index 1250e96c..712537d5 100644
--- a/GPT_SoVITS/text/zh_normalization/text_normlization.py
+++ b/GPT_SoVITS/text/zh_normalization/text_normlization.py
@@ -33,6 +33,7 @@ from .num import RE_NUMBER
from .num import RE_PERCENTAGE
from .num import RE_POSITIVE_QUANTIFIERS
from .num import RE_RANGE
+from .num import RE_TO_RANGE
from .num import replace_default_num
from .num import replace_frac
from .num import replace_negative_num
@@ -40,6 +41,7 @@ from .num import replace_number
from .num import replace_percentage
from .num import replace_positive_quantifier
from .num import replace_range
+from .num import replace_to_range
from .phonecode import RE_MOBILE_PHONE
from .phonecode import RE_NATIONAL_UNIFORM_NUMBER
from .phonecode import RE_TELEPHONE
@@ -65,7 +67,7 @@ class TextNormalizer():
if lang == "zh":
text = text.replace(" ", "")
# 过滤掉特殊字符
- text = re.sub(r'[——《》【】<=>{}()()#&@“”^_|…\\]', '', text)
+ text = re.sub(r'[——《》【】<=>{}()()#&@“”^_|\\]', '', text)
text = self.SENTENCE_SPLITOR.sub(r'\1\n', text)
text = text.strip()
sentences = [sentence.strip() for sentence in re.split(r'\n+', text)]
@@ -73,8 +75,8 @@ class TextNormalizer():
def _post_replace(self, sentence: str) -> str:
sentence = sentence.replace('/', '每')
- sentence = sentence.replace('~', '至')
- sentence = sentence.replace('~', '至')
+ # sentence = sentence.replace('~', '至')
+ # sentence = sentence.replace('~', '至')
sentence = sentence.replace('①', '一')
sentence = sentence.replace('②', '二')
sentence = sentence.replace('③', '三')
@@ -128,6 +130,8 @@ class TextNormalizer():
sentence = RE_TIME_RANGE.sub(replace_time, sentence)
sentence = RE_TIME.sub(replace_time, sentence)
+ # 处理~波浪号作为至的替换
+ sentence = RE_TO_RANGE.sub(replace_to_range, sentence)
sentence = RE_TEMPERATURE.sub(replace_temperature, sentence)
sentence = replace_measure(sentence)
sentence = RE_FRAC.sub(replace_frac, sentence)
From 220367f90c85f6dc20751c4a586320c463b28406 Mon Sep 17 00:00:00 2001
From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com>
Date: Wed, 21 Feb 2024 01:15:11 +0000
Subject: [PATCH 23/63] Update inference_webui.py
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
精简代码
---
GPT_SoVITS/inference_webui.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index a046776d..3a4bfb3e 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -72,8 +72,6 @@ os.environ['PYTORCH_ENABLE_MPS_FALLBACK'] = '1' # 确保直接启动推理UI时
if torch.cuda.is_available():
device = "cuda"
-elif torch.backends.mps.is_available():
- device = "cpu"
else:
device = "cpu"
From db40317d9ceaf782b5ccb383e044281a0489f29a Mon Sep 17 00:00:00 2001
From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com>
Date: Wed, 21 Feb 2024 01:15:31 +0000
Subject: [PATCH 24/63] Update config.py
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
精简代码
---
config.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/config.py b/config.py
index caaadd47..1f741285 100644
--- a/config.py
+++ b/config.py
@@ -19,8 +19,6 @@ exp_root = "logs"
python_exec = sys.executable or "python"
if torch.cuda.is_available():
infer_device = "cuda"
-elif torch.backends.mps.is_available():
- infer_device = "cpu"
else:
infer_device = "cpu"
From b0b039ad2154d9867ae77bd484367fc6a8d1d2c7 Mon Sep 17 00:00:00 2001
From: Kenn Zhang
Date: Sat, 17 Feb 2024 09:57:18 +0000
Subject: [PATCH 25/63] =?UTF-8?q?Docker=E9=95=9C=E5=83=8F=E6=9E=84?=
=?UTF-8?q?=E5=BB=BA=E8=84=9A=E6=9C=AC=E5=AF=B9=E4=BA=8E=E9=95=9C=E5=83=8F?=
=?UTF-8?q?=E7=9A=84Tag=E5=A2=9E=E5=8A=A0Git=20Commit=E7=9A=84Hash?=
=?UTF-8?q?=E5=80=BC=EF=BC=8C=E4=BE=BF=E4=BA=8E=E7=9F=A5=E9=81=93=E9=95=9C?=
=?UTF-8?q?=E5=83=8F=E4=B8=AD=E5=BA=94=E7=94=A8=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.dockerignore | 4 +++-
dockerbuild.sh | 9 ++++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/.dockerignore b/.dockerignore
index dc39f76f..4eca27be 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -3,4 +3,6 @@ logs
output
reference
SoVITS_weights
-.git
\ No newline at end of file
+GPT_weights
+TEMP
+.git
diff --git a/dockerbuild.sh b/dockerbuild.sh
index 1b3dcee5..3a4a1e18 100755
--- a/dockerbuild.sh
+++ b/dockerbuild.sh
@@ -2,13 +2,20 @@
# 获取当前日期,格式为 YYYYMMDD
DATE=$(date +%Y%m%d)
+# 获取最新的 Git commit 哈希值的前 7 位
+COMMIT_HASH=$(git rev-parse HEAD | cut -c 1-7)
# 构建 full 版本的镜像
docker build --build-arg IMAGE_TYPE=full -t breakstring/gpt-sovits:latest .
# 为同一个镜像添加带日期的标签
docker tag breakstring/gpt-sovits:latest breakstring/gpt-sovits:dev-$DATE
+# 为同一个镜像添加带当前代码库Commit哈希值的标签
+docker tag breakstring/gpt-sovits:latest breakstring/gpt-sovits:dev-$COMMIT_HASH
-# 构建 elite 版本的镜像
+
+# 构建 elite 版本的镜像(无模型下载步骤,需手工将模型下载安装进容器)
docker build --build-arg IMAGE_TYPE=elite -t breakstring/gpt-sovits:latest-elite .
# 为同一个镜像添加带日期的标签
docker tag breakstring/gpt-sovits:latest-elite breakstring/gpt-sovits:dev-$DATE-elite
+# 为同一个镜像添加带当前代码库Commit哈希值的标签
+docker tag breakstring/gpt-sovits:latest-elite breakstring/gpt-sovits:dev-$COMMIT_HASH-elite
From 4b0fae83020389eed0dfd283c5122e5f3df584fc Mon Sep 17 00:00:00 2001
From: JavaAndPython55 <34533090+JavaAndPython55@users.noreply.github.com>
Date: Wed, 21 Feb 2024 18:11:59 +0800
Subject: [PATCH 26/63] =?UTF-8?q?=E6=96=B0=E5=A2=9Eapi.py=E4=B8=AD?=
=?UTF-8?q?=EF=BC=9A=E5=8F=AF=E5=9C=A8=E5=90=AF=E5=8A=A8=E5=90=8E=E5=8A=A8?=
=?UTF-8?q?=E6=80=81=E4=BF=AE=E6=94=B9=E6=A8=A1=E5=9E=8B=EF=BC=8C=E4=BB=A5?=
=?UTF-8?q?=E6=AD=A4=E6=BB=A1=E8=B6=B3=E5=90=8C=E4=B8=80=E4=B8=AAapi?=
=?UTF-8?q?=E4=B8=8D=E5=90=8C=E7=9A=84=E6=9C=97=E8=AF=BB=E8=80=85=E8=AF=B7?=
=?UTF-8?q?=E6=B1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
可在启动后动态修改模型,以此满足同一个api不同的朗读者请求
---
api.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 53 insertions(+), 1 deletion(-)
diff --git a/api.py b/api.py
index b8d584e7..754f0769 100644
--- a/api.py
+++ b/api.py
@@ -144,7 +144,7 @@ parser.add_argument("-dt", "--default_refer_text", type=str, default="", help="
parser.add_argument("-dl", "--default_refer_language", type=str, default="", help="默认参考音频语种")
parser.add_argument("-d", "--device", type=str, default=g_config.infer_device, help="cuda / cpu / mps")
-parser.add_argument("-a", "--bind_addr", type=str, default="127.0.0.1", help="default: 127.0.0.1")
+parser.add_argument("-a", "--bind_addr", type=str, default="0.0.0.0", help="default: 0.0.0.0")
parser.add_argument("-p", "--port", type=int, default=g_config.api_port, help="default: 9880")
parser.add_argument("-fp", "--full_precision", action="store_true", default=False, help="覆盖config.is_half为False, 使用全精度")
parser.add_argument("-hp", "--half_precision", action="store_true", default=False, help="覆盖config.is_half为True, 使用半精度")
@@ -227,6 +227,44 @@ def is_full(*items): # 任意一项为空返回False
return False
return True
+def change_sovits_weights(sovits_path):
+ global vq_model, hps
+ dict_s2 = torch.load(sovits_path, map_location="cpu")
+ hps = dict_s2["config"]
+ hps = DictToAttrRecursive(hps)
+ hps.model.semantic_frame_rate = "25hz"
+ vq_model = SynthesizerTrn(
+ hps.data.filter_length // 2 + 1,
+ hps.train.segment_size // hps.data.hop_length,
+ n_speakers=hps.data.n_speakers,
+ **hps.model
+ )
+ if ("pretrained" not in sovits_path):
+ del vq_model.enc_q
+ if is_half == True:
+ vq_model = vq_model.half().to(device)
+ else:
+ vq_model = vq_model.to(device)
+ vq_model.eval()
+ print(vq_model.load_state_dict(dict_s2["weight"], strict=False))
+ with open("./sweight.txt", "w", encoding="utf-8") as f:
+ f.write(sovits_path)
+def change_gpt_weights(gpt_path):
+ global hz, max_sec, t2s_model, config
+ hz = 50
+ dict_s1 = torch.load(gpt_path, map_location="cpu")
+ config = dict_s1["config"]
+ max_sec = config["data"]["max_sec"]
+ t2s_model = Text2SemanticLightningModule(config, "****", is_train=False)
+ t2s_model.load_state_dict(dict_s1["weight"])
+ if is_half == True:
+ t2s_model = t2s_model.half()
+ t2s_model = t2s_model.to(device)
+ t2s_model.eval()
+ total = sum([param.nelement() for param in t2s_model.parameters()])
+ print("Number of parameter: %.2fM" % (total / 1e6))
+ with open("./gweight.txt", "w", encoding="utf-8") as f: f.write(gpt_path)
+
def get_bert_feature(text, word2ph):
with torch.no_grad():
@@ -452,6 +490,20 @@ def handle(refer_wav_path, prompt_text, prompt_language, text, text_language):
app = FastAPI()
+#clark新增-----2024-02-21
+#可在启动后动态修改模型,以此满足同一个api不同的朗读者请求
+@app.post("/set_model")
+async def set_model(request: Request):
+ json_post_raw = await request.json()
+ global gpt_path
+ gpt_path=json_post_raw.get("gpt_model_path")
+ global sovits_path
+ sovits_path=json_post_raw.get("sovits_model_path")
+ print("gptpath"+gpt_path+";vitspath"+sovits_path)
+ change_sovits_weights(sovits_path)
+ change_gpt_weights(gpt_path)
+ return "ok"
+# 新增-----end------
@app.post("/control")
async def control(request: Request):
From 6da486c15d09e3d99fa42c5e560aaac56b6b4ce1 Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Wed, 21 Feb 2024 18:27:59 +0800
Subject: [PATCH 27/63] Add files via upload
---
webui.py | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/webui.py b/webui.py
index cff7cdb2..c6430d92 100644
--- a/webui.py
+++ b/webui.py
@@ -117,6 +117,7 @@ def change_choices():
p_label=None
p_uvr5=None
p_asr=None
+p_denoise=None
p_tts_inference=None
def kill_proc_tree(pid, including_parent=True):
@@ -220,6 +221,29 @@ def close_asr():
kill_process(p_asr.pid)
p_asr=None
return "已终止ASR进程",{"__type__":"update","visible":True},{"__type__":"update","visible":False}
+def open_denoise(denoise_inp_dir, denoise_opt_dir):
+ global p_denoise
+ if(p_denoise==None):
+ denoise_inp_dir=my_utils.clean_path(denoise_inp_dir)
+ denoise_opt_dir=my_utils.clean_path(denoise_opt_dir)
+ cmd = '"%s" tools/cmd-denoise.py -i "%s" -o "%s" -p %s'%(python_exec,denoise_inp_dir,denoise_opt_dir,"float16"if is_half==True else "float32")
+
+ yield "语音降噪任务开启:%s"%cmd,{"__type__":"update","visible":False},{"__type__":"update","visible":True}
+ print(cmd)
+ p_denoise = Popen(cmd, shell=True)
+ p_denoise.wait()
+ p_denoise=None
+ yield f"语音降噪任务完成, 查看终端进行下一步",{"__type__":"update","visible":True},{"__type__":"update","visible":False}
+ else:
+ yield "已有正在进行的语音降噪任务,需先终止才能开启下一次任务",{"__type__":"update","visible":False},{"__type__":"update","visible":True}
+ # return None
+
+def close_denoise():
+ global p_denoise
+ if(p_denoise!=None):
+ kill_process(p_denoise.pid)
+ p_denoise=None
+ return "已终止语音降噪进程",{"__type__":"update","visible":True},{"__type__":"update","visible":False}
p_train_SoVITS=None
def open1Ba(batch_size,total_epoch,exp_name,text_low_lr_rate,if_save_latest,if_save_every_weights,save_every_epoch,gpu_numbers1Ba,pretrained_s2G,pretrained_s2D):
@@ -678,6 +702,13 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
alpha=gr.Slider(minimum=0,maximum=1,step=0.05,label=i18n("alpha_mix:混多少比例归一化后音频进来"),value=0.25,interactive=True)
n_process=gr.Slider(minimum=1,maximum=n_cpu,step=1,label=i18n("切割使用的进程数"),value=4,interactive=True)
slicer_info = gr.Textbox(label=i18n("语音切割进程输出信息"))
+ gr.Markdown(value=i18n("0bb-语音降噪工具"))
+ with gr.Row():
+ open_denoise_button = gr.Button(i18n("开启语音降噪"), variant="primary",visible=True)
+ close_denoise_button = gr.Button(i18n("终止语音降噪进程"), variant="primary",visible=False)
+ denoise_input_dir=gr.Textbox(label=i18n("降噪音频文件输入文件夹"),value="")
+ denoise_output_dir=gr.Textbox(label=i18n("降噪结果输出文件夹"),value="output/denoise_opt")
+ denoise_info = gr.Textbox(label=i18n("语音降噪进程输出信息"))
gr.Markdown(value=i18n("0c-中文批量离线ASR工具"))
with gr.Row():
open_asr_button = gr.Button(i18n("开启离线批量ASR"), variant="primary",visible=True)
@@ -740,6 +771,9 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
close_asr_button.click(close_asr, [], [asr_info,open_asr_button,close_asr_button])
open_slicer_button.click(open_slice, [slice_inp_path,slice_opt_root,threshold,min_length,min_interval,hop_size,max_sil_kept,_max,alpha,n_process], [slicer_info,open_slicer_button,close_slicer_button])
close_slicer_button.click(close_slice, [], [slicer_info,open_slicer_button,close_slicer_button])
+ open_denoise_button.click(open_denoise, [denoise_input_dir,denoise_output_dir], [denoise_info,open_denoise_button,close_denoise_button])
+ close_denoise_button.click(close_denoise, [], [denoise_info,open_denoise_button,close_denoise_button])
+
with gr.TabItem(i18n("1-GPT-SoVITS-TTS")):
with gr.Row():
exp_name = gr.Textbox(label=i18n("*实验/模型名"), value="xxx", interactive=True)
From 5a17177342d2df1e11369f2f4f58d34a3feb1a35 Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Wed, 21 Feb 2024 18:28:22 +0800
Subject: [PATCH 28/63] Add files via upload
---
tools/cmd-denoise.py | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 tools/cmd-denoise.py
diff --git a/tools/cmd-denoise.py b/tools/cmd-denoise.py
new file mode 100644
index 00000000..69b51e66
--- /dev/null
+++ b/tools/cmd-denoise.py
@@ -0,0 +1,29 @@
+import os,argparse
+
+from modelscope.pipelines import pipeline
+from modelscope.utils.constant import Tasks
+from tqdm import tqdm
+
+path_denoise = 'tools/denoise-model/speech_frcrn_ans_cirm_16k'
+path_denoise = path_denoise if os.path.exists(path_denoise) else "damo/speech_frcrn_ans_cirm_16k"
+ans = pipeline(Tasks.acoustic_noise_suppression,model=path_denoise)
+def execute_denoise(input_folder,output_folder):
+ os.makedirs(output_folder,exist_ok=True)
+ # print(input_folder)
+ # print(list(os.listdir(input_folder).sort()))
+ for name in tqdm(os.listdir(input_folder)):
+ ans("%s/%s"%(input_folder,name),output_path='%s/%s'%(output_folder,name))
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+ parser.add_argument("-i", "--input_folder", type=str, required=True,
+ help="Path to the folder containing WAV files.")
+ parser.add_argument("-o", "--output_folder", type=str, required=True,
+ help="Output folder to store transcriptions.")
+ parser.add_argument("-p", "--precision", type=str, default='float16', choices=['float16','float32'],
+ help="fp16 or fp32")#还没接入
+ cmd = parser.parse_args()
+ execute_denoise(
+ input_folder = cmd.input_folder,
+ output_folder = cmd.output_folder,
+ )
\ No newline at end of file
From 82085e48869fbe6f817e83a7e858309ca2f06bd6 Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Wed, 21 Feb 2024 18:29:14 +0800
Subject: [PATCH 29/63] Create .gitignore
---
tools/denoise-model/.gitignore | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 tools/denoise-model/.gitignore
diff --git a/tools/denoise-model/.gitignore b/tools/denoise-model/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/tools/denoise-model/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
From 788ea251dafa9aff6de7ca019d1870443f08f445 Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Wed, 21 Feb 2024 18:33:13 +0800
Subject: [PATCH 30/63] Update Changelog_CN.md
---
docs/cn/Changelog_CN.md | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/docs/cn/Changelog_CN.md b/docs/cn/Changelog_CN.md
index 6622146a..8afd3514 100644
--- a/docs/cn/Changelog_CN.md
+++ b/docs/cn/Changelog_CN.md
@@ -125,6 +125,16 @@
2-修复中文文本前端bug https://github.com/RVC-Boss/GPT-SoVITS/issues/475
+### 20240221更新
+
+1-数据处理添加语音降噪选项
+
+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
+
todolist:
1-中文多音字推理优化
From 8b4f0dfe43ed92606e5ff4fd95040abb8bba541b Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Wed, 21 Feb 2024 18:37:19 +0800
Subject: [PATCH 31/63] Update 2-get-hubert-wav32k.py
---
GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py
index 76a7ec99..7607259e 100644
--- a/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py
+++ b/GPT_SoVITS/prepare_datasets/2-get-hubert-wav32k.py
@@ -99,7 +99,7 @@ for line in lines[int(i_part)::int(all_parts)]:
try:
# wav_name,text=line.split("\t")
wav_name, spk_name, language, text = line.split("|")
- if (inp_wav_dir != ""):
+ if (inp_wav_dir != "" and inp_wav_dir != None):
wav_name = os.path.basename(wav_name)
wav_path = "%s/%s"%(inp_wav_dir, wav_name)
From 939971afe3770c530b0bc0f9a1d5824a1786411d Mon Sep 17 00:00:00 2001
From: RVC-Boss <129054828+RVC-Boss@users.noreply.github.com>
Date: Wed, 21 Feb 2024 18:52:07 +0800
Subject: [PATCH 32/63] Add files via upload
---
GPT_SoVITS/inference_webui.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index 2247bc74..d2f3f949 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -561,12 +561,12 @@ with gr.Blocks(title="GPT-SoVITS WebUI") as app:
inp_ref = gr.Audio(label=i18n("请上传3~10秒内参考音频,超过会报错!"), type="filepath")
with gr.Column():
ref_text_free = gr.Checkbox(label=i18n("开启无参考文本模式。不填参考文本亦相当于开启。"), value=False, interactive=True, show_label=True)
- gr.Markdown(i18n("使用无参考文本模式时建议使用微调的GPT"))
+ gr.Markdown(i18n("使用无参考文本模式时建议使用微调的GPT,听不清参考音频说的啥(不晓得写啥)可以开,开启后无视填写的参考文本。"))
prompt_text = gr.Textbox(label=i18n("参考音频的文本"), value="")
prompt_language = gr.Dropdown(
label=i18n("参考音频的语种"), choices=[i18n("中文"), i18n("英文"), i18n("日文"), i18n("中英混合"), i18n("日英混合"), i18n("多语种混合")], value=i18n("中文")
)
- gr.Markdown(value=i18n("*请填写需要合成的目标文本。中英混合选中文,日英混合选日文,中日混合暂不支持,非目标语言文本自动遗弃。"))
+ gr.Markdown(value=i18n("*请填写需要合成的目标文本和语种模式"))
with gr.Row():
text = gr.Textbox(label=i18n("需要合成的文本"), value="")
text_language = gr.Dropdown(
From 9fa3da91a7a66c0e0aed8a43f13ad7456491b764 Mon Sep 17 00:00:00 2001
From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com>
Date: Wed, 21 Feb 2024 13:21:37 +0000
Subject: [PATCH 33/63] Update config.py
---
config.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config.py b/config.py
index 1f741285..eaf292f1 100644
--- a/config.py
+++ b/config.py
@@ -6,7 +6,7 @@ import torch
sovits_path = ""
gpt_path = ""
is_half_str = os.environ.get("is_half", "True")
-is_half = True if is_half_str.lower() == 'true' else False
+is_half = True if is_half_str.lower() == 'true' and not torch.backends.mps.is_available() else False
is_share_str = os.environ.get("is_share","False")
is_share= True if is_share_str.lower() == 'true' else False
From 97e3479b07155b37785547a04076619ce74285c1 Mon Sep 17 00:00:00 2001
From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com>
Date: Wed, 21 Feb 2024 13:24:16 +0000
Subject: [PATCH 34/63] Update config.py
---
config.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config.py b/config.py
index eaf292f1..1f741285 100644
--- a/config.py
+++ b/config.py
@@ -6,7 +6,7 @@ import torch
sovits_path = ""
gpt_path = ""
is_half_str = os.environ.get("is_half", "True")
-is_half = True if is_half_str.lower() == 'true' and not torch.backends.mps.is_available() else False
+is_half = True if is_half_str.lower() == 'true' else False
is_share_str = os.environ.get("is_share","False")
is_share= True if is_share_str.lower() == 'true' else False
From 83c9e8ff0294510dea3c44978edc44c915d7c4b2 Mon Sep 17 00:00:00 2001
From: XXXXRT666 <157766680+XXXXRT666@users.noreply.github.com>
Date: Wed, 21 Feb 2024 13:26:30 +0000
Subject: [PATCH 35/63] Update inference_webui.py
---
GPT_SoVITS/inference_webui.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/GPT_SoVITS/inference_webui.py b/GPT_SoVITS/inference_webui.py
index d2f3f949..26936472 100644
--- a/GPT_SoVITS/inference_webui.py
+++ b/GPT_SoVITS/inference_webui.py
@@ -16,6 +16,7 @@ logging.getLogger("asyncio").setLevel(logging.ERROR)
logging.getLogger("charset_normalizer").setLevel(logging.ERROR)
logging.getLogger("torchaudio._extension").setLevel(logging.ERROR)
import pdb
+import torch
if os.path.exists("./gweight.txt"):
with open("./gweight.txt", 'r', encoding="utf-8") as file:
@@ -48,11 +49,11 @@ is_share = os.environ.get("is_share", "False")
is_share = eval(is_share)
if "_CUDA_VISIBLE_DEVICES" in os.environ:
os.environ["CUDA_VISIBLE_DEVICES"] = os.environ["_CUDA_VISIBLE_DEVICES"]
-is_half = eval(os.environ.get("is_half", "True"))
+is_half = eval(os.environ.get("is_half", "True")) and not torch.backends.mps.is_available()
import gradio as gr
from transformers import AutoModelForMaskedLM, AutoTokenizer
import numpy as np
-import librosa, torch
+import librosa
from feature_extractor import cnhubert
cnhubert.cnhubert_base_path = cnhubert_base_path
From 0d88cff99eb721b5a9bdcd84261951129fcbe90e Mon Sep 17 00:00:00 2001
From: Lion
Date: Fri, 23 Feb 2024 20:32:25 +0800
Subject: [PATCH 36/63] optimize the structure
---
README.md | 117 +++++++++++++++++++++-------------------------
docs/cn/README.md | 89 ++++++++++++++++-------------------
docs/ja/README.md | 81 ++++++++++++++------------------
docs/ko/README.md | 81 ++++++++++++++------------------
4 files changed, 166 insertions(+), 202 deletions(-)
diff --git a/README.md b/README.md
index 4266970f..6f42aa61 100644
--- a/README.md
+++ b/README.md
@@ -17,14 +17,6 @@ A Powerful Few-shot Voice Conversion and Text-to-Speech WebUI.
---
-> Check out our [demo video](https://www.bilibili.com/video/BV12g4y1m7Uw) here!
-
-Unseen speakers few-shot fine-tuning demo:
-
-https://github.com/RVC-Boss/GPT-SoVITS/assets/129054828/05bee1fa-bdd8-4d85-9350-80c060ab47fb
-
-For users in China region, you can use AutoDL Cloud Docker to experience the full functionality online: https://www.codewithgpu.com/i/RVC-Boss/GPT-SoVITS/GPT-SoVITS-Official
-
## Features:
1. **Zero-shot TTS:** Input a 5-second vocal sample and experience instant text-to-speech conversion.
@@ -35,19 +27,29 @@ For users in China region, you can use AutoDL Cloud Docker to experience the ful
4. **WebUI Tools:** Integrated tools include voice accompaniment separation, automatic training set segmentation, Chinese ASR, and text labeling, assisting beginners in creating training datasets and GPT/SoVITS models.
-## Environment Preparation
+**Check out our [demo video](https://www.bilibili.com/video/BV12g4y1m7Uw) here!**
-If you are a Windows user (tested with win>=10) you can install directly via the prezip. Just download the [prezip](https://huggingface.co/lj1995/GPT-SoVITS-windows-package/resolve/main/GPT-SoVITS-beta.7z?download=true), unzip it and double-click go-webui.bat to start GPT-SoVITS-WebUI.
+Unseen speakers few-shot fine-tuning demo:
+
+https://github.com/RVC-Boss/GPT-SoVITS/assets/129054828/05bee1fa-bdd8-4d85-9350-80c060ab47fb
+
+## Installation
+
+For users in China region, you can [click here](https://www.codewithgpu.com/i/RVC-Boss/GPT-SoVITS/GPT-SoVITS-Official) to use AutoDL Cloud Docker to experience the full functionality online.
### Tested Environments
- Python 3.9, PyTorch 2.0.1, CUDA 11
- Python 3.10.13, PyTorch 2.1.2, CUDA 12.3
-- Python 3.9, PyTorch 2.3.0.dev20240122, macOS 14.3 (Apple silicon, GPU)
+- Python 3.9, PyTorch 2.3.0.dev20240122, macOS 14.3 (Apple silicon)
-_Note: numba==0.56.4 require py<3.11_
+_Note: numba==0.56.4 requires py<3.11_
-### Quick Install with Conda
+### Windows
+
+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.
+
+### Linux
```bash
conda create -n GPTSoVits python=3.9
@@ -55,15 +57,37 @@ conda activate GPTSoVits
bash install.sh
```
+### macOS
+
+Only Macs that meet the following conditions can train models:
+
+- Mac computers with Apple silicon
+- macOS 12.3 or later
+- Xcode command-line tools installed by running `xcode-select --install`
+
+**All Macs can do inference with CPU, which has been demonstrated to outperform GPU inference.**
+
+First make sure you have installed FFmpeg by running `brew install ffmpeg` or `conda install ffmpeg`, then install by using the following commands:
+
+```bash
+conda create -n GPTSoVits python=3.9
+conda activate GPTSoVits
+
+pip3 install --pre torch torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu
+pip install -r requirements.txt
+```
+
+_Note: Training models will only work if you've installed PyTorch Nightly._
+
### Install Manually
-#### Pip Packages
+#### Install Dependences
```bash
pip install -r requirements.txt
```
-#### FFmpeg
+#### Install FFmpeg
##### Conda Users
@@ -79,57 +103,10 @@ sudo apt install libsox-dev
conda install -c conda-forge 'ffmpeg<7'
```
-##### MacOS Users
-
-```bash
-brew install ffmpeg
-```
-
##### Windows Users
Download and place [ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe) and [ffprobe.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe) in the GPT-SoVITS root.
-### Pretrained Models
-
-Download pretrained models from [GPT-SoVITS Models](https://huggingface.co/lj1995/GPT-SoVITS) and place them in `GPT_SoVITS/pretrained_models`.
-
-For UVR5 (Vocals/Accompaniment Separation & Reverberation Removal, additionally), download models from [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) and place them in `tools/uvr5/uvr5_weights`.
-
-Users in China region can download these two models by entering the links below and clicking "Download a copy"
-
-- [GPT-SoVITS Models](https://www.icloud.com.cn/iclouddrive/056y_Xog_HXpALuVUjscIwTtg#GPT-SoVITS_Models)
-
-- [UVR5 Weights](https://www.icloud.com.cn/iclouddrive/0bekRKDiJXboFhbfm3lM2fVbA#UVR5_Weights)
-
-For Chinese ASR (additionally), download models from [Damo ASR Model](https://modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/files), [Damo VAD Model](https://modelscope.cn/models/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch/files), and [Damo Punc Model](https://modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files) and place them in `tools/damo_asr/models`.
-
-### For Mac Users
-
-If you are a Mac user, make sure you meet the following conditions for training and inferencing with GPU:
-
-- Mac computers with Apple silicon
-- macOS 12.3 or later
-- Xcode command-line tools installed by running `xcode-select --install`
-
-_Other Macs can do inference with CPU only._
-
-Then install by using the following commands:
-
-#### Create Environment
-
-```bash
-conda create -n GPTSoVits python=3.9
-conda activate GPTSoVits
-```
-
-#### Install Requirements
-
-```bash
-pip install -r requirements.txt
-pip uninstall torch torchaudio
-pip3 install --pre torch torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu
-```
-
### Using Docker
#### docker-compose.yaml configuration
@@ -157,6 +134,20 @@ As above, modify the corresponding parameters based on your actual situation, th
docker run --rm -it --gpus=all --env=is_half=False --volume=G:\GPT-SoVITS-DockerTest\output:/workspace/output --volume=G:\GPT-SoVITS-DockerTest\logs:/workspace/logs --volume=G:\GPT-SoVITS-DockerTest\SoVITS_weights:/workspace/SoVITS_weights --workdir=/workspace -p 9880:9880 -p 9871:9871 -p 9872:9872 -p 9873:9873 -p 9874:9874 --shm-size="16G" -d breakstring/gpt-sovits:xxxxx
```
+## Pretrained Models
+
+Download pretrained models from [GPT-SoVITS Models](https://huggingface.co/lj1995/GPT-SoVITS) and place them in `GPT_SoVITS/pretrained_models`.
+
+For UVR5 (Vocals/Accompaniment Separation & Reverberation Removal, additionally), download models from [UVR5 Weights](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights) and place them in `tools/uvr5/uvr5_weights`.
+
+Users in China region can download these two models by entering the links below and clicking "Download a copy"
+
+- [GPT-SoVITS Models](https://www.icloud.com.cn/iclouddrive/056y_Xog_HXpALuVUjscIwTtg#GPT-SoVITS_Models)
+
+- [UVR5 Weights](https://www.icloud.com.cn/iclouddrive/0bekRKDiJXboFhbfm3lM2fVbA#UVR5_Weights)
+
+For Chinese ASR (additionally), download models from [Damo ASR Model](https://modelscope.cn/models/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/files), [Damo VAD Model](https://modelscope.cn/models/damo/speech_fsmn_vad_zh-cn-16k-common-pytorch/files), and [Damo Punc Model](https://modelscope.cn/models/damo/punc_ct-transformer_zh-cn-common-vocab272727-pytorch/files) and place them in `tools/damo_asr/models`.
+
## Dataset Format
The TTS annotation .list file format:
@@ -229,8 +220,6 @@ python ./tools/damo_asr/WhisperASR.py -i -o