mirror of
https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git
synced 2025-05-11 22:39:14 +08:00
Compare commits
7 Commits
26e2805f0e
...
016e8754b9
Author | SHA1 | Date | |
---|---|---|---|
|
016e8754b9 | ||
|
8d5c34601b | ||
|
4e8e235024 | ||
|
53051852f1 | ||
|
49434901d8 | ||
|
f6fa0c9cd9 | ||
|
c3e65cdf96 |
5
.gitignore
vendored
5
.gitignore
vendored
@ -21,3 +21,8 @@ rmvpe.pt
|
|||||||
|
|
||||||
# To set a Python version for the project
|
# To set a Python version for the project
|
||||||
.tool-versions
|
.tool-versions
|
||||||
|
|
||||||
|
/runtime
|
||||||
|
/assets/weights/*
|
||||||
|
ffmpeg.*
|
||||||
|
ffprobe.*
|
@ -136,7 +136,7 @@ sudo apt install ffmpeg
|
|||||||
```bash
|
```bash
|
||||||
brew install ffmpeg
|
brew install ffmpeg
|
||||||
```
|
```
|
||||||
#### Windwos 用户
|
#### Windows 用户
|
||||||
下载后放置在根目录。
|
下载后放置在根目录。
|
||||||
- 下载[ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe)
|
- 下载[ffmpeg.exe](https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe)
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
{"pth_path": "assets/weights/kikiV1.pth", "index_path": "logs/kikiV1.index", "sg_input_device": "VoiceMeeter Output (VB-Audio Vo (MME)", "sg_output_device": "VoiceMeeter Input (VB-Audio Voi (MME)", "sr_type": "sr_model", "threhold": -60.0, "pitch": 12.0, "rms_mix_rate": 0.5, "index_rate": 0.0, "block_time": 0.2, "crossfade_length": 0.08, "extra_time": 2.00, "n_cpu": 4.0, "use_jit": false, "use_pv": false, "f0method": "fcpe"}
|
{"pth_path": "assets/weights/kikiV1.pth", "index_path": "logs/kikiV1.index", "sg_hostapi": "MME", "sg_wasapi_exclusive": false, "sg_input_device": "VoiceMeeter Output (VB-Audio Vo", "sg_output_device": "VoiceMeeter Input (VB-Audio Voi", "sr_type": "sr_device", "threhold": -60.0, "pitch": 12.0, "rms_mix_rate": 0.5, "index_rate": 0.0, "block_time": 0.15, "crossfade_length": 0.08, "extra_time": 2.0, "n_cpu": 4.0, "use_jit": false, "use_pv": false, "f0method": "fcpe"}
|
105
docs/pt-BR/Changelog_pt-BR.md
Normal file
105
docs/pt-BR/Changelog_pt-BR.md
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
### 2023-10-06
|
||||||
|
- Criamos uma GUI para alteração de voz em tempo real: go-realtime-gui.bat/gui_v1.py (observe que você deve escolher o mesmo tipo de dispositivo de entrada e saída, por exemplo, MME e MME).
|
||||||
|
- Treinamos um modelo RMVPE de extração de pitch melhor.
|
||||||
|
- Otimizar o layout da GUI de inferência.
|
||||||
|
|
||||||
|
### 2023-08-13
|
||||||
|
1-Correção de bug regular
|
||||||
|
- Alterar o número total mínimo de épocas para 1 e alterar o número total mínimo de epoch para 2
|
||||||
|
- Correção de erros de treinamento por não usar modelos de pré-treinamento
|
||||||
|
- Após a separação dos vocais de acompanhamento, limpe a memória dos gráficos
|
||||||
|
- Alterar o caminho absoluto do faiss save para o caminho relativo
|
||||||
|
- Suporte a caminhos com espaços (tanto o caminho do conjunto de treinamento quanto o nome do experimento são suportados, e os erros não serão mais relatados)
|
||||||
|
- A lista de arquivos cancela a codificação utf8 obrigatória
|
||||||
|
- Resolver o problema de consumo de CPU causado pela busca do faiss durante alterações de voz em tempo real
|
||||||
|
|
||||||
|
Atualizações do 2-Key
|
||||||
|
- Treine o modelo de extração de pitch vocal de código aberto mais forte do momento, o RMVPE, e use-o para treinamento de RVC, inferência off-line/em tempo real, com suporte a PyTorch/Onnx/DirectML
|
||||||
|
- Suporte para placas gráficas AMD e Intel por meio do Pytorch_DML
|
||||||
|
|
||||||
|
(1) Mudança de voz em tempo real (2) Inferência (3) Separação do acompanhamento vocal (4) Não há suporte para treinamento no momento, mudaremos para treinamento de CPU; há suporte para inferência RMVPE de gpu por Onnx_Dml
|
||||||
|
|
||||||
|
|
||||||
|
### 2023-06-18
|
||||||
|
- Novos modelos v2 pré-treinados: 32k e 48k
|
||||||
|
- Correção de erros de inferência de modelo não-f0
|
||||||
|
- Para conjuntos de treinamento que excedam 1 hora, faça minibatch-kmeans automáticos para reduzir a forma dos recursos, de modo que o treinamento, a adição e a pesquisa do Index sejam muito mais rápidos.
|
||||||
|
- Fornecer um espaço de brinquedo vocal2guitar huggingface
|
||||||
|
- Exclusão automática de áudios de conjunto de treinamento de atalhos discrepantes
|
||||||
|
- Guia de exportação Onnx
|
||||||
|
|
||||||
|
Experimentos com falha:
|
||||||
|
- ~~Recuperação de recurso: adicionar recuperação de recurso temporal: não eficaz~~
|
||||||
|
- ~~Recuperação de recursos: adicionar redução de dimensionalidade PCAR: a busca é ainda mais lenta~~
|
||||||
|
- ~~Aumento de dados aleatórios durante o treinamento: não é eficaz~~
|
||||||
|
|
||||||
|
Lista de tarefas:
|
||||||
|
- ~~Vocos-RVC (vocoder minúsculo): não é eficaz~~
|
||||||
|
- ~~Suporte de crepe para treinamento: substituído pelo RMVPE~~
|
||||||
|
- ~~Inferência de crepe de meia precisão:substituída pelo RMVPE. E difícil de conseguir.~~
|
||||||
|
- Suporte ao editor de F0
|
||||||
|
|
||||||
|
### 2023-05-28
|
||||||
|
- Adicionar notebook jupyter v2, changelog em coreano, corrigir alguns requisitos de ambiente
|
||||||
|
- Adicionar consoante sem voz e modo de proteção de respiração
|
||||||
|
- Suporte à detecção de pitch crepe-full
|
||||||
|
- Separação vocal UVR5: suporte a modelos dereverb e modelos de-echo
|
||||||
|
- Adicionar nome e versão do experimento no nome do Index
|
||||||
|
- Suporte aos usuários para selecionar manualmente o formato de exportação dos áudios de saída durante o processamento de conversão de voz em lote e a separação vocal UVR5
|
||||||
|
- Não há mais suporte para o treinamento do modelo v1 32k
|
||||||
|
|
||||||
|
### 2023-05-13
|
||||||
|
- Limpar os códigos redundantes na versão antiga do tempo de execução no pacote de um clique: lib.infer_pack e uvr5_pack
|
||||||
|
- Correção do bug de pseudo multiprocessamento no pré-processamento do conjunto de treinamento
|
||||||
|
- Adição do ajuste do raio de filtragem mediana para o algoritmo de reconhecimento de inclinação da extração
|
||||||
|
- Suporte à reamostragem de pós-processamento para exportação de áudio
|
||||||
|
- A configuração "n_cpu" de multiprocessamento para treinamento foi alterada de "extração de f0" para "pré-processamento de dados e extração de f0"
|
||||||
|
- Detectar automaticamente os caminhos de Index na pasta de registros e fornecer uma função de lista suspensa
|
||||||
|
- Adicionar "Perguntas e respostas frequentes" na página da guia (você também pode consultar o wiki do RVC no github)
|
||||||
|
- Durante a inferência, o pitch da colheita é armazenado em cache quando se usa o mesmo caminho de áudio de entrada (finalidade: usando a extração do pitch da colheita, todo o pipeline passará por um processo longo e repetitivo de extração do pitch. Se o armazenamento em cache não for usado, os usuários que experimentarem diferentes configurações de raio de filtragem de timbre, Index e mediana de pitch terão um processo de espera muito doloroso após a primeira inferência)
|
||||||
|
|
||||||
|
### 2023-05-14
|
||||||
|
- Use o envelope de volume da entrada para misturar ou substituir o envelope de volume da saída (pode aliviar o problema de "muting de entrada e ruído de pequena amplitude de saída"). Se o ruído de fundo do áudio de entrada for alto, não é recomendável ativá-lo, e ele não é ativado por padrão (1 pode ser considerado como não ativado)
|
||||||
|
- Suporte ao salvamento de modelos pequenos extraídos em uma frequência especificada (se você quiser ver o desempenho em épocas diferentes, mas não quiser salvar todos os pontos de verificação grandes e extrair manualmente modelos pequenos pelo processamento ckpt todas as vezes, esse recurso será muito prático)
|
||||||
|
- Resolver o problema de "erros de conexão" causados pelo proxy global do servidor, definindo variáveis de ambiente
|
||||||
|
- Oferece suporte a modelos v2 pré-treinados (atualmente, apenas as versões 40k estão disponíveis publicamente para teste e as outras duas taxas de amostragem ainda não foram totalmente treinadas)
|
||||||
|
- Limita o volume excessivo que excede 1 antes da inferência
|
||||||
|
- Ajustou ligeiramente as configurações do pré-processamento do conjunto de treinamento
|
||||||
|
|
||||||
|
|
||||||
|
#######################
|
||||||
|
|
||||||
|
Histórico de registros de alterações:
|
||||||
|
|
||||||
|
### 2023-04-09
|
||||||
|
- Parâmetros de treinamento corrigidos para melhorar a taxa de utilização da GPU: A100 aumentou de 25% para cerca de 90%, V100: 50% para cerca de 90%, 2060S: 60% para cerca de 85%, P40: 25% para cerca de 95%; melhorou significativamente a velocidade de treinamento
|
||||||
|
- Parâmetro alterado: total batch_size agora é por GPU batch_size
|
||||||
|
- Total_epoch alterado: limite máximo aumentado de 100 para 1000; padrão aumentado de 10 para 20
|
||||||
|
- Corrigido o problema da extração de ckpt que reconhecia o pitch incorretamente, causando inferência anormal
|
||||||
|
- Corrigido o problema do treinamento distribuído que salvava o ckpt para cada classificação
|
||||||
|
- Aplicada a filtragem de recursos nan para extração de recursos
|
||||||
|
- Corrigido o problema com a entrada/saída silenciosa que produzia consoantes aleatórias ou ruído (os modelos antigos precisavam ser treinados novamente com um novo conjunto de dados)
|
||||||
|
|
||||||
|
### Atualização 2023-04-16
|
||||||
|
- Adicionada uma mini-GUI de alteração de voz local em tempo real, iniciada com um clique duplo em go-realtime-gui.bat
|
||||||
|
- Filtragem aplicada para bandas de frequência abaixo de 50 Hz durante o treinamento e a inferência
|
||||||
|
- Diminuição da extração mínima de tom do pyworld do padrão 80 para 50 para treinamento e inferência, permitindo que vozes masculinas de tom baixo entre 50-80 Hz não sejam silenciadas
|
||||||
|
- A WebUI suporta a alteração de idiomas de acordo com a localidade do sistema (atualmente suporta en_US, ja_JP, zh_CN, zh_HK, zh_SG, zh_TW; o padrão é en_US se não for suportado)
|
||||||
|
- Correção do reconhecimento de algumas GPUs (por exemplo, falha no reconhecimento da V100-16G, falha no reconhecimento da P4)
|
||||||
|
|
||||||
|
### Atualização de 2023-04-28
|
||||||
|
- Atualizadas as configurações do Index faiss para maior velocidade e qualidade
|
||||||
|
- Removida a dependência do total_npy; o futuro compartilhamento de modelos não exigirá a entrada do total_npy
|
||||||
|
- Restrições desbloqueadas para as GPUs da série 16, fornecendo configurações de inferência de 4 GB para GPUs com VRAM de 4 GB
|
||||||
|
- Corrigido o erro na separação do acompanhamento vocal do UVR5 para determinados formatos de áudio
|
||||||
|
- A mini-GUI de alteração de voz em tempo real agora suporta modelos de pitch não 40k e que não são lentos
|
||||||
|
|
||||||
|
### Planos futuros:
|
||||||
|
Recursos:
|
||||||
|
- Opção de adição: extrair modelos pequenos para cada epoch salvo
|
||||||
|
- Adicionar opção: exportar mp3 adicional para o caminho especificado durante a inferência
|
||||||
|
- Suporte à guia de treinamento para várias pessoas (até 4 pessoas)
|
||||||
|
|
||||||
|
Modelo básico:
|
||||||
|
- Coletar arquivos wav de respiração para adicionar ao conjunto de dados de treinamento para corrigir o problema de sons de respiração distorcidos
|
||||||
|
- No momento, estamos treinando um modelo básico com um conjunto de dados de canto estendido, que será lançado no futuro
|
193
docs/pt-BR/README.pt-BR.md
Normal file
193
docs/pt-BR/README.pt-BR.md
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<h1>Retrieval-based-Voice-Conversion-WebUI</h1>
|
||||||
|
Uma estrutura de conversão de voz fácil de usar baseada em VITS.<br><br>
|
||||||
|
|
||||||
|
[](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI)
|
||||||
|
|
||||||
|
<img src="https://counter.seku.su/cmoe?name=rvc&theme=r34" /><br>
|
||||||
|
|
||||||
|
[](https://colab.research.google.com/github/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/main/Retrieval_based_Voice_Conversion_WebUI.ipynb)
|
||||||
|
[](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/main/LICENSE)
|
||||||
|
[](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/)
|
||||||
|
|
||||||
|
[](https://discord.gg/HcsmBBGyVk)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
------
|
||||||
|
[**Changelog**](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/main/docs/Changelog_EN.md) | [**FAQ (Frequently Asked Questions)**](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/wiki/FAQ-(Frequently-Asked-Questions))
|
||||||
|
|
||||||
|
[**English**](../en/README.en.md) | [**中文简体**](../../README.md) | [**日本語**](../jp/README.ja.md) | [**한국어**](../kr/README.ko.md) ([**韓國語**](../kr/README.ko.han.md)) | [**Türkçe**](../tr/README.tr.md)
|
||||||
|
|
||||||
|
|
||||||
|
Confira nosso [Vídeo de demonstração](https://www.bilibili.com/video/BV1pm4y1z7Gm/) aqui!
|
||||||
|
|
||||||
|
Treinamento/Inferência WebUI:go-web.bat
|
||||||
|

|
||||||
|
|
||||||
|
GUI de conversão de voz em tempo real:go-realtime-gui.bat
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
> O dataset para o modelo de pré-treinamento usa quase 50 horas de conjunto de dados de código aberto VCTK de alta qualidade.
|
||||||
|
|
||||||
|
> Dataset de músicas licenciadas de alta qualidade serão adicionados ao conjunto de treinamento, um após o outro, para seu uso, sem se preocupar com violação de direitos autorais.
|
||||||
|
|
||||||
|
> Aguarde o modelo básico pré-treinado do RVCv3, que possui parâmetros maiores, mais dados de treinamento, melhores resultados, velocidade de inferência inalterada e requer menos dados de treinamento para treinamento.
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
Este repositório possui os seguintes recursos:
|
||||||
|
+ Reduza o vazamento de tom substituindo o recurso de origem pelo recurso de conjunto de treinamento usando a recuperação top1;
|
||||||
|
+ Treinamento fácil e rápido, mesmo em placas gráficas relativamente ruins;
|
||||||
|
+ Treinar com uma pequena quantidade de dados também obtém resultados relativamente bons (>=10min de áudio com baixo ruído recomendado);
|
||||||
|
+ Suporta fusão de modelos para alterar timbres (usando guia de processamento ckpt-> mesclagem ckpt);
|
||||||
|
+ Interface Webui fácil de usar;
|
||||||
|
+ Use o modelo UVR5 para separar rapidamente vocais e instrumentos.
|
||||||
|
+ Use o mais poderoso algoritmo de extração de voz de alta frequência [InterSpeech2023-RMVPE](#Credits) para evitar o problema de som mudo. Fornece os melhores resultados (significativamente) e é mais rápido, com consumo de recursos ainda menor que o Crepe_full.
|
||||||
|
+ Suporta aceleração de placas gráficas AMD/Intel.
|
||||||
|
+ Aceleração de placas gráficas Intel ARC com suporte para IPEX.
|
||||||
|
|
||||||
|
## Preparando o ambiente
|
||||||
|
Os comandos a seguir precisam ser executados no ambiente Python versão 3.8 ou superior.
|
||||||
|
|
||||||
|
(Windows/Linux)
|
||||||
|
Primeiro instale as dependências principais através do pip:
|
||||||
|
```bash
|
||||||
|
# Instale as dependências principais relacionadas ao PyTorch, pule se instaladas
|
||||||
|
# Referência: https://pytorch.org/get-started/locally/
|
||||||
|
pip install torch torchvision torchaudio
|
||||||
|
|
||||||
|
#Para arquitetura Windows + Nvidia Ampere (RTX30xx), você precisa especificar a versão cuda correspondente ao pytorch de acordo com a experiência de https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/issues/ 21
|
||||||
|
#pip instalar tocha torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
|
||||||
|
|
||||||
|
#Para placas Linux + AMD, você precisa usar as seguintes versões do pytorch:
|
||||||
|
#pip instalar tocha torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.4.2
|
||||||
|
```
|
||||||
|
|
||||||
|
Então pode usar poesia para instalar as outras dependências:
|
||||||
|
```bash
|
||||||
|
# Instale a ferramenta de gerenciamento de dependências Poetry, pule se instalada
|
||||||
|
# Referência: https://python-poetry.org/docs/#installation
|
||||||
|
curl -sSL https://install.python-poetry.org | python3 -
|
||||||
|
|
||||||
|
#Instale as dependências do projeto
|
||||||
|
poetry install
|
||||||
|
```
|
||||||
|
|
||||||
|
Você também pode usar pip para instalá-los:
|
||||||
|
```bash
|
||||||
|
|
||||||
|
for Nvidia graphics cards
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
for AMD/Intel graphics cards on Windows (DirectML):
|
||||||
|
pip install -r requirements-dml.txt
|
||||||
|
|
||||||
|
for Intel ARC graphics cards on Linux / WSL using Python 3.10:
|
||||||
|
pip install -r requirements-ipex.txt
|
||||||
|
|
||||||
|
for AMD graphics cards on Linux (ROCm):
|
||||||
|
pip install -r requirements-amd.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
------
|
||||||
|
Usuários de Mac podem instalar dependências via `run.sh`:
|
||||||
|
```bash
|
||||||
|
sh ./run.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Preparação de outros Pré-modelos
|
||||||
|
RVC requer outros pré-modelos para inferir e treinar.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#Baixe todos os modelos necessários em https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/
|
||||||
|
python tools/download_models.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Ou apenas baixe-os você mesmo em nosso [Huggingface space](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/).
|
||||||
|
|
||||||
|
Aqui está uma lista de pré-modelos e outros arquivos que o RVC precisa:
|
||||||
|
```bash
|
||||||
|
./assets/hubert/hubert_base.pt
|
||||||
|
|
||||||
|
./assets/pretrained
|
||||||
|
|
||||||
|
./assets/uvr5_weights
|
||||||
|
|
||||||
|
Downloads adicionais são necessários se você quiser testar a versão v2 do modelo.
|
||||||
|
|
||||||
|
./assets/pretrained_v2
|
||||||
|
|
||||||
|
Se você deseja testar o modelo da versão v2 (o modelo da versão v2 alterou a entrada do recurso dimensional 256 do Hubert + final_proj de 9 camadas para o recurso dimensional 768 do Hubert de 12 camadas e adicionou 3 discriminadores de período), você precisará baixar recursos adicionais
|
||||||
|
|
||||||
|
./assets/pretrained_v2
|
||||||
|
|
||||||
|
#Se você estiver usando Windows, também pode precisar desses dois arquivos, pule se FFmpeg e FFprobe estiverem instalados
|
||||||
|
ffmpeg.exe
|
||||||
|
|
||||||
|
https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffmpeg.exe
|
||||||
|
|
||||||
|
ffprobe.exe
|
||||||
|
|
||||||
|
https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/ffprobe.exe
|
||||||
|
|
||||||
|
Se quiser usar o algoritmo de extração de tom vocal SOTA RMVPE mais recente, você precisa baixar os pesos RMVPE e colocá-los no diretório raiz RVC
|
||||||
|
|
||||||
|
https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/rmvpe.pt
|
||||||
|
|
||||||
|
Para usuários de placas gráficas AMD/Intel, você precisa baixar:
|
||||||
|
|
||||||
|
https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/rmvpe.onnx
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Os usuários de placas gráficas Intel ARC precisam executar o comando `source /opt/intel/oneapi/setvars.sh` antes de iniciar o Webui.
|
||||||
|
|
||||||
|
Em seguida, use este comando para iniciar o Webui:
|
||||||
|
```bash
|
||||||
|
python infer-web.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Se estiver usando Windows ou macOS, você pode baixar e extrair `RVC-beta.7z` para usar RVC diretamente usando `go-web.bat` no Windows ou `sh ./run.sh` no macOS para iniciar o Webui.
|
||||||
|
|
||||||
|
## Suporte ROCm para placas gráficas AMD (somente Linux)
|
||||||
|
Para usar o ROCm no Linux, instale todos os drivers necessários conforme descrito [aqui](https://rocm.docs.amd.com/en/latest/deploy/linux/os-native/install.html).
|
||||||
|
|
||||||
|
No Arch use pacman para instalar o driver:
|
||||||
|
````
|
||||||
|
pacman -S rocm-hip-sdk rocm-opencl-sdk
|
||||||
|
````
|
||||||
|
|
||||||
|
Talvez você também precise definir estas variáveis de ambiente (por exemplo, em um RX6700XT):
|
||||||
|
````
|
||||||
|
export ROCM_PATH=/opt/rocm
|
||||||
|
export HSA_OVERRIDE_GFX_VERSION=10.3.0
|
||||||
|
````
|
||||||
|
Verifique também se seu usuário faz parte do grupo `render` e `video`:
|
||||||
|
````
|
||||||
|
sudo usermod -aG render $USERNAME
|
||||||
|
sudo usermod -aG video $USERNAME
|
||||||
|
````
|
||||||
|
Depois disso, você pode executar o WebUI:
|
||||||
|
```bash
|
||||||
|
python infer-web.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
+ [ContentVec](https://github.com/auspicious3000/contentvec/)
|
||||||
|
+ [VITS](https://github.com/jaywalnut310/vits)
|
||||||
|
+ [HIFIGAN](https://github.com/jik876/hifi-gan)
|
||||||
|
+ [Gradio](https://github.com/gradio-app/gradio)
|
||||||
|
+ [FFmpeg](https://github.com/FFmpeg/FFmpeg)
|
||||||
|
+ [Ultimate Vocal Remover](https://github.com/Anjok07/ultimatevocalremovergui)
|
||||||
|
+ [audio-slicer](https://github.com/openvpi/audio-slicer)
|
||||||
|
+ [Vocal pitch extraction:RMVPE](https://github.com/Dream-High/RMVPE)
|
||||||
|
+ The pretrained model is trained and tested by [yxlllc](https://github.com/yxlllc/RMVPE) and [RVC-Boss](https://github.com/RVC-Boss).
|
||||||
|
|
||||||
|
## Thanks to all contributors for their efforts
|
||||||
|
<a href="https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/graphs/contributors" target="_blank">
|
||||||
|
<img src="https://contrib.rocks/image?repo=RVC-Project/Retrieval-based-Voice-Conversion-WebUI" />
|
||||||
|
</a>
|
||||||
|
|
102
docs/pt-BR/faiss_tips_BR.md
Normal file
102
docs/pt-BR/faiss_tips_BR.md
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
pONTAS de afinação FAISS
|
||||||
|
==================
|
||||||
|
# sobre faiss
|
||||||
|
faiss é uma biblioteca de pesquisas de vetores densos na área, desenvolvida pela pesquisa do facebook, que implementa com eficiência muitos métodos de pesquisa de área aproximada.
|
||||||
|
A Pesquisa Aproximada de área encontra vetores semelhantes rapidamente, sacrificando alguma precisão.
|
||||||
|
|
||||||
|
## faiss em RVC
|
||||||
|
No RVC, para a incorporação de recursos convertidos pelo HuBERT, buscamos incorporações semelhantes à incorporação gerada a partir dos dados de treinamento e as misturamos para obter uma conversão mais próxima do discurso original. No entanto, como essa pesquisa leva tempo se realizada de forma ingênua, a conversão de alta velocidade é realizada usando a pesquisa aproximada de área.
|
||||||
|
|
||||||
|
# visão geral da implementação
|
||||||
|
Em '/logs/nome-do-seu-modelo/3_feature256', onde o modelo está localizado, os recursos extraídos pelo HuBERT de cada dado de voz estão localizados.
|
||||||
|
A partir daqui, lemos os arquivos npy ordenados por nome de arquivo e concatenamos os vetores para criar big_npy. (Este vetor tem a forma [N, 256].)
|
||||||
|
Depois de salvar big_npy as /logs/nome-do-seu-modelo/total_fea.npy, treine-o com faiss.
|
||||||
|
|
||||||
|
Neste artigo, explicarei o significado desses parâmetros.
|
||||||
|
|
||||||
|
# Explicação do método
|
||||||
|
## Fábrica de Index
|
||||||
|
Uma fábrica de Index é uma notação faiss exclusiva que expressa um pipeline que conecta vários métodos de pesquisa de área aproximados como uma string.
|
||||||
|
Isso permite que você experimente vários métodos aproximados de pesquisa de área simplesmente alterando a cadeia de caracteres de fábrica do Index.
|
||||||
|
No RVC é usado assim:
|
||||||
|
|
||||||
|
```python
|
||||||
|
index = faiss.index_factory(256, "IVF%s,Flat" % n_ivf)
|
||||||
|
```
|
||||||
|
Entre os argumentos de index_factory, o primeiro é o número de dimensões do vetor, o segundo é a string de fábrica do Index e o terceiro é a distância a ser usada.
|
||||||
|
|
||||||
|
Para uma notação mais detalhada
|
||||||
|
https://github.com/facebookresearch/faiss/wiki/The-index-factory
|
||||||
|
|
||||||
|
## Construção de Index
|
||||||
|
Existem dois Indexs típicos usados como similaridade de incorporação da seguinte forma.
|
||||||
|
|
||||||
|
- Distância euclidiana (MÉTRICA_L2)
|
||||||
|
- Produto interno (METRIC_INNER_PRODUCT)
|
||||||
|
|
||||||
|
A distância euclidiana toma a diferença quadrática em cada dimensão, soma as diferenças em todas as dimensões e, em seguida, toma a raiz quadrada. Isso é o mesmo que a distância em 2D e 3D que usamos diariamente.
|
||||||
|
O produto interno não é usado como um Index de similaridade como é, e a similaridade de cosseno que leva o produto interno depois de ser normalizado pela norma L2 é geralmente usada.
|
||||||
|
|
||||||
|
O que é melhor depende do caso, mas a similaridade de cosseno é frequentemente usada na incorporação obtida pelo word2vec e modelos de recuperação de imagem semelhantes aprendidos pelo ArcFace. Se você quiser fazer a normalização l2 no vetor X com numpy, você pode fazê-lo com o seguinte código com eps pequeno o suficiente para evitar a divisão 0.
|
||||||
|
|
||||||
|
```python
|
||||||
|
X_normed = X / np.maximum(eps, np.linalg.norm(X, ord=2, axis=-1, keepdims=True))
|
||||||
|
```
|
||||||
|
|
||||||
|
Além disso, para a Construção de Index, você pode alterar o Index de distância usado para cálculo escolhendo o valor a ser passado como o terceiro argumento.
|
||||||
|
|
||||||
|
```python
|
||||||
|
index = faiss.index_factory(dimention, text, faiss.METRIC_INNER_PRODUCT)
|
||||||
|
```
|
||||||
|
|
||||||
|
## FI
|
||||||
|
IVF (Inverted file indexes) é um algoritmo semelhante ao Index invertido na pesquisa de texto completo.
|
||||||
|
Durante o aprendizado, o destino da pesquisa é agrupado com kmeans e o particionamento Voronoi é realizado usando o centro de cluster. A cada ponto de dados é atribuído um cluster, por isso criamos um dicionário que procura os pontos de dados dos clusters.
|
||||||
|
|
||||||
|
Por exemplo, se os clusters forem atribuídos da seguinte forma
|
||||||
|
|index|Cluster|
|
||||||
|
|-----|-------|
|
||||||
|
|1|A|
|
||||||
|
|2|B|
|
||||||
|
|3|A|
|
||||||
|
|4|C|
|
||||||
|
|5|B|
|
||||||
|
|
||||||
|
O Index invertido resultante se parece com isso:
|
||||||
|
|
||||||
|
| cluster | Index |
|
||||||
|
|-------|-----|
|
||||||
|
| A | 1, 3 |
|
||||||
|
| B | 2 5 |
|
||||||
|
| C | 4 |
|
||||||
|
|
||||||
|
Ao pesquisar, primeiro pesquisamos n_probe clusters dos clusters e, em seguida, calculamos as distâncias para os pontos de dados pertencentes a cada cluster.
|
||||||
|
|
||||||
|
# Parâmetro de recomendação
|
||||||
|
Existem diretrizes oficiais sobre como escolher um Index, então vou explicar de
|
||||||
|
acordo. https://github.com/facebookresearch/faiss/wiki/Guidelines-to-choose-an-index
|
||||||
|
|
||||||
|
Para conjuntos de dados abaixo de 1M, o 4bit-PQ é o método mais eficiente disponível no faiss em abril de 2023.
|
||||||
|
Combinando isso com a fertilização in vitro, estreitando os candidatos com 4bit-PQ e, finalmente, recalcular a distância com um Index preciso pode ser descrito usando a seguinte fábrica de Indexs.
|
||||||
|
|
||||||
|
```python
|
||||||
|
index = faiss.index_factory(256, "IVF1024,PQ128x4fs,RFlat")
|
||||||
|
```
|
||||||
|
|
||||||
|
## Parâmetros recomendados para FIV
|
||||||
|
Considere o caso de muitas FIVs. Por exemplo, se a quantização grosseira por FIV for realizada para o número de dados, isso é o mesmo que uma pesquisa exaustiva ingênua e é ineficiente.
|
||||||
|
Para 1M ou menos, os valores de FIV são recomendados entre 4*sqrt(N) ~ 16*sqrt(N) para N número de pontos de dados.
|
||||||
|
|
||||||
|
Como o tempo de cálculo aumenta proporcionalmente ao número de n_sondas, consulte a precisão e escolha adequadamente. Pessoalmente, não acho que o RVC precise de tanta precisão, então n_probe = 1 está bem.
|
||||||
|
|
||||||
|
## FastScan
|
||||||
|
O FastScan é um método que permite a aproximação de alta velocidade de distâncias por quantização de produto cartesiano, realizando-as em registros.
|
||||||
|
A quantização cartesiana do produto executa o agrupamento independentemente para cada dimensão d (geralmente d = 2) durante o aprendizado, calcula a distância entre os agrupamentos com antecedência e cria uma tabela de pesquisa. No momento da previsão, a distância de cada dimensão pode ser calculada em O(1) olhando para a tabela de pesquisa.
|
||||||
|
Portanto, o número que você especifica após PQ geralmente especifica metade da dimensão do vetor.
|
||||||
|
|
||||||
|
Para uma descrição mais detalhada do FastScan, consulte a documentação oficial.
|
||||||
|
https://github.com/facebookresearch/faiss/wiki/Fast-accumulation-of-PQ-and-AQ-codes-(FastScan)
|
||||||
|
|
||||||
|
## RFlat
|
||||||
|
RFlat é uma instrução para recalcular a distância aproximada calculada pelo FastScan com a distância exata especificada pelo terceiro argumento da Construção de Index.
|
||||||
|
Ao obter áreas k, os pontos k*k_factor são recalculados.
|
224
docs/pt-BR/faq_pt-BR.md
Normal file
224
docs/pt-BR/faq_pt-BR.md
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
# <b>FAQ AI HUB BRASIL</b>
|
||||||
|
## <span style="color: #337dff;">O que é epoch, quantos utilizar, quanto de dataset utilizar e qual à configuração interessante?</span>
|
||||||
|
Epochs basicamente quantas vezes o seu dataset foi treinado.
|
||||||
|
|
||||||
|
Recomendado ler Q8 e Q9 no final dessa página pra entender mais sobre dataset e epochs
|
||||||
|
|
||||||
|
__**Não é uma regra, mas opinião:**__
|
||||||
|
|
||||||
|
### **Mangio-Crepe Hop Length**
|
||||||
|
- 64 pra cantores e dubladores
|
||||||
|
- 128(padrão) para os demais (editado)
|
||||||
|
|
||||||
|
### **Epochs e dataset**
|
||||||
|
600epoch para cantores - --dataset entre 10 e 50 min desnecessario mais que 50 minutos--
|
||||||
|
300epoch para os demais - --dataset entre 10 e 50 min desnecessario mais que 50 minutos--
|
||||||
|
|
||||||
|
### **Tom**
|
||||||
|
magio-crepe se for audios extraído de alguma musica
|
||||||
|
harvest se for de estúdio<hr>
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">O que é index?</span>
|
||||||
|
Basicamente o que define o sotaque. Quanto maior o numero, mas próximo o sotaque fica do original. Porém, quando o modelo é bem, não é necessário um index.<hr>
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">O que significa cada sigla (pm, harvest, crepe, magio-crepe, RMVPE)?</span>
|
||||||
|
|
||||||
|
- pm = extração mais rápida, mas discurso de qualidade inferior;
|
||||||
|
- harvest = graves melhores, mas extremamente lentos;
|
||||||
|
- dio = conversão rápida mas pitch ruim;
|
||||||
|
- crepe = melhor qualidade, mas intensivo em GPU;
|
||||||
|
- crepe-tiny = mesma coisa que o crepe, só que com a qualidade um pouco inferior;
|
||||||
|
- **mangio-crepe = melhor qualidade, mais otimizado; (MELHOR OPÇÃO)**
|
||||||
|
- mangio-crepe-tiny = mesma coisa que o mangio-crepe, só que com a qualidade um pouco inferior;
|
||||||
|
- RMVPE: um modelo robusto para estimativa de afinação vocal em música polifônica;<hr>
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">Pra rodar localmente, quais os requisitos minimos?</span>
|
||||||
|
Já tivemos relatos de pessoas com GTX 1050 rodando inferencia, se for treinar numa 1050 vai demorar muito mesmo e inferior a isso, normalmente da tela azul
|
||||||
|
|
||||||
|
O mais importante é placa de vídeo, vram na verdade
|
||||||
|
Se você tiver 4GB ou mais, você tem uma chance.
|
||||||
|
|
||||||
|
**NOS DOIS CASOS NÃO É RECOMENDADO UTILIZAR O PC ENQUANTO ESTÁ UTILIZNDO, CHANCE DE TELA AZUL É ALTA**
|
||||||
|
### Inference
|
||||||
|
Não é algo oficial para requisitos minimos
|
||||||
|
- Placa de vídeo: nvidia de 4gb
|
||||||
|
- Memoria ram: 8gb
|
||||||
|
- CPU: ?
|
||||||
|
- Armanezamento: 20gb (sem modelos)
|
||||||
|
|
||||||
|
### Treinamento de voz
|
||||||
|
Não é algo oficial para requisitos minimos
|
||||||
|
- Placa de vídeo: nvidia de 6gb
|
||||||
|
- Memoria ram: 16gb
|
||||||
|
- CPU: ?
|
||||||
|
- Armanezamento: 20gb (sem modelos)<hr>
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">Limite de GPU no Google Colab excedido, apenas CPU o que fazer?</span>
|
||||||
|
Recomendamos esperar outro dia pra liberar mais 15gb ou 12 horas pra você. Ou você pode contribuir com o Google pagando algum dos planos, ai aumenta seu limite.<br>
|
||||||
|
Utilizar apenas CPU no Google Colab demora DEMAIS.<hr>
|
||||||
|
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">Google Colab desconectando com muita frequencia, o que fazer?</span>
|
||||||
|
Neste caso realmente não tem muito o que fazer. Apenas aguardar o proprietário do código corrigir ou a gente do AI HUB Brasil achar alguma solução. Isso acontece por diversos motivos, um incluindo a Google barrando o treinamento de voz.<hr>
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">O que é Batch Size/Tamanho de lote e qual numero utilizar?</span>
|
||||||
|
Batch Size/Tamanho do lote é basicamente quantos epoch faz ao mesmo tempo. Se por 20, ele fazer 20 epoch ao mesmo tempo e isso faz pesar mais na máquina e etc.<br>
|
||||||
|
|
||||||
|
No Google Colab você pode utilizar até 20 de boa.<br>
|
||||||
|
Se rodando localmente, depende da sua placa de vídeo, começa por baixo (6) e vai testando.<hr>
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">Sobre backup na hora do treinamento</span>
|
||||||
|
Backup vai de cada um. Eu quando uso a ``easierGUI`` utilizo a cada 100 epoch (meu caso isolado).
|
||||||
|
No colab, se instavel, coloque a cada 10 epoch
|
||||||
|
Recomendo utilizarem entre 25 e 50 pra garantir.
|
||||||
|
|
||||||
|
Lembrando que cada arquivo geral é por volta de 50mb, então tenha muito cuidado quanto você coloca. Pois assim pode acabar lotando seu Google Drive ou seu PC.
|
||||||
|
|
||||||
|
Depois de finalizado, da pra apagar os epoch de backup.<hr>
|
||||||
|
|
||||||
|
## <span style="color: #337dff;">Como continuar da onde parou pra fazer mais epochs?</span>
|
||||||
|
Primeira coisa que gostaria de lembrar, não necessariamente quanto mais epochs melhor. Se fizer epochs demais vai dar **overtraining** o que pode ser ruim.
|
||||||
|
|
||||||
|
### GUI NORMAL
|
||||||
|
- Inicie normalmente a GUI novamente.
|
||||||
|
- Na aba de treino utilize o MESMO nome que estava treinando, assim vai continuar o treino onde parou o ultimo backup.
|
||||||
|
- Ignore as opções ``Processar o Conjunto de dados`` e ``Extrair Tom``
|
||||||
|
- Antes de clicar pra treinar, arrume os epoch, bakcup e afins.
|
||||||
|
- Obviamente tem que ser um numero maior do qu estava em epoch.
|
||||||
|
- Backup você pode aumentar ou diminuir
|
||||||
|
- Agora você vai ver a opção ``Carregue o caminho G do modelo base pré-treinado:`` e ``Carregue o caminho D do modelo base pré-treinado:``
|
||||||
|
-Aqui você vai por o caminho dos modelos que estão em ``./logs/minha-voz``
|
||||||
|
- Vai ficar algo parecido com isso ``e:/RVC/logs/minha-voz/G_0000.pth`` e ``e:/RVC/logs/minha-voz/D_0000.pth``
|
||||||
|
-Coloque pra treinar
|
||||||
|
|
||||||
|
**Lembrando que a pasta logs tem que ter todos os arquivos e não somente o arquivo ``G`` e ``D``**
|
||||||
|
|
||||||
|
### EasierGUI
|
||||||
|
- Inicie normalmente a easierGUI novamente.
|
||||||
|
- Na aba de treino utilize o MESMO nome que estava treinando, assim vai continuar o treino onde parou o ultimo backup.
|
||||||
|
- Selecione 'Treinar modelo', pode pular os 2 primeiros passos já que vamos continuar o treino.<hr><br>
|
||||||
|
|
||||||
|
|
||||||
|
# <b>FAQ Original traduzido</b>
|
||||||
|
## <b><span style="color: #337dff;">Q1: erro ffmpeg/erro utf8.</span></b>
|
||||||
|
Provavelmente não é um problema do FFmpeg, mas sim um problema de caminho de áudio;
|
||||||
|
|
||||||
|
O FFmpeg pode encontrar um erro ao ler caminhos contendo caracteres especiais como spaces e (), o que pode causar um erro FFmpeg; e quando o áudio do conjunto de treinamento contém caminhos chineses, gravá-lo em filelist.txt pode causar um erro utf8.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q2:Não é possível encontrar o arquivo de Index após "Treinamento com um clique".</span></b>
|
||||||
|
Se exibir "O treinamento está concluído. O programa é fechado ", então o modelo foi treinado com sucesso e os erros subsequentes são falsos;
|
||||||
|
|
||||||
|
A falta de um arquivo de index 'adicionado' após o treinamento com um clique pode ser devido ao conjunto de treinamento ser muito grande, fazendo com que a adição do index fique presa; isso foi resolvido usando o processamento em lote para adicionar o index, o que resolve o problema de sobrecarga de memória ao adicionar o index. Como solução temporária, tente clicar no botão "Treinar Index" novamente.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q3:Não é possível encontrar o modelo em “Modelo de voz” após o treinamento</span></b>
|
||||||
|
Clique em "Atualizar lista de voz" ou "Atualizar na EasyGUI e verifique novamente; se ainda não estiver visível, verifique se há erros durante o treinamento e envie capturas de tela do console, da interface do usuário da Web e dos ``logs/experiment_name/*.log`` para os desenvolvedores para análise posterior.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q4:Como compartilhar um modelo/Como usar os modelos dos outros?</span></b>
|
||||||
|
Os arquivos ``.pth`` armazenados em ``*/logs/minha-voz`` não são destinados para compartilhamento ou inference, mas para armazenar os checkpoits do experimento para reprodutibilidade e treinamento adicional. O modelo a ser compartilhado deve ser o arquivo ``.pth`` de 60+MB na pasta **weights**;
|
||||||
|
|
||||||
|
No futuro, ``weights/minha-voz.pth`` e ``logs/minha-voz/added_xxx.index`` serão mesclados em um único arquivo de ``weights/minha-voz.zip`` para eliminar a necessidade de entrada manual de index; portanto, compartilhe o arquivo zip, não somente o arquivo .pth, a menos que você queira continuar treinando em uma máquina diferente;
|
||||||
|
|
||||||
|
Copiar/compartilhar os vários arquivos .pth de centenas de MB da pasta de logs para a pasta de weights para inference forçada pode resultar em erros como falta de f0, tgt_sr ou outras chaves. Você precisa usar a guia ckpt na parte inferior para manualmente ou automaticamente (se as informações forem encontradas nos ``logs/minha-voz``), selecione se deseja incluir informações de tom e opções de taxa de amostragem de áudio de destino e, em seguida, extrair o modelo menor. Após a extração, haverá um arquivo pth de 60+ MB na pasta de weights, e você pode atualizar as vozes para usá-lo.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q5 Erro de conexão:</span></b>
|
||||||
|
Para sermos otimistas, aperte F5/recarregue a página, pode ter sido apenas um bug da GUI
|
||||||
|
|
||||||
|
Se não...
|
||||||
|
Você pode ter fechado o console (janela de linha de comando preta).
|
||||||
|
Ou o Google Colab, no caso do Colab, as vezes pode simplesmente fechar<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q6: Pop-up WebUI 'Valor esperado: linha 1 coluna 1 (caractere 0)'.</span></b>
|
||||||
|
Desative o proxy LAN do sistema/proxy global e atualize.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q7:Como treinar e inferir sem a WebUI?</span></b>
|
||||||
|
Script de treinamento:
|
||||||
|
<br>Você pode executar o treinamento em WebUI primeiro, e as versões de linha de comando do pré-processamento e treinamento do conjunto de dados serão exibidas na janela de mensagens.<br>
|
||||||
|
|
||||||
|
Script de inference:
|
||||||
|
<br>https://huggingface.co/lj1995/VoiceConversionWebUI/blob/main/myinfer.py<br>
|
||||||
|
|
||||||
|
|
||||||
|
por exemplo<br>
|
||||||
|
|
||||||
|
``runtime\python.exe myinfer.py 0 "E:\audios\1111.wav" "E:\RVC\logs\minha-voz\added_IVF677_Flat_nprobe_7.index" harvest "test.wav" "weights/mi-test.pth" 0.6 cuda:0 True``<br>
|
||||||
|
|
||||||
|
|
||||||
|
f0up_key=sys.argv[1]<br>
|
||||||
|
input_path=sys.argv[2]<br>
|
||||||
|
index_path=sys.argv[3]<br>
|
||||||
|
f0method=sys.argv[4]#harvest or pm<br>
|
||||||
|
opt_path=sys.argv[5]<br>
|
||||||
|
model_path=sys.argv[6]<br>
|
||||||
|
index_rate=float(sys.argv[7])<br>
|
||||||
|
device=sys.argv[8]<br>
|
||||||
|
is_half=bool(sys.argv[9])<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q8: Erro Cuda/Cuda sem memória.</span></b>
|
||||||
|
Há uma pequena chance de que haja um problema com a configuração do CUDA ou o dispositivo não seja suportado; mais provavelmente, não há memória suficiente (falta de memória).<br>
|
||||||
|
|
||||||
|
Para treinamento, reduza o (batch size) tamanho do lote (se reduzir para 1 ainda não for suficiente, talvez seja necessário alterar a placa gráfica); para inference, ajuste as configurações x_pad, x_query, x_center e x_max no arquivo config.py conforme necessário. Cartões de memória 4G ou inferiores (por exemplo, 1060(3G) e várias placas 2G) podem ser abandonados, enquanto os placas de vídeo com memória 4G ainda têm uma chance.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q9:Quantos total_epoch são ótimos?</span></b>
|
||||||
|
Se a qualidade de áudio do conjunto de dados de treinamento for ruim e o nível de ruído for alto, **20-30 epochs** são suficientes. Defini-lo muito alto não melhorará a qualidade de áudio do seu conjunto de treinamento de baixa qualidade.<br>
|
||||||
|
|
||||||
|
Se a qualidade de áudio do conjunto de treinamento for alta, o nível de ruído for baixo e houver duração suficiente, você poderá aumentá-lo. **200 é aceitável** (uma vez que o treinamento é rápido e, se você puder preparar um conjunto de treinamento de alta qualidade, sua GPU provavelmente poderá lidar com uma duração de treinamento mais longa sem problemas).<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q10:Quanto tempo de treinamento é necessário?</span></b>
|
||||||
|
|
||||||
|
**Recomenda-se um conjunto de dados de cerca de 10 min a 50 min.**<br>
|
||||||
|
|
||||||
|
Com garantia de alta qualidade de som e baixo ruído de fundo, mais pode ser adicionado se o timbre do conjunto de dados for uniforme.<br>
|
||||||
|
|
||||||
|
Para um conjunto de treinamento de alto nível (limpo + distintivo), 5min a 10min é bom.<br>
|
||||||
|
|
||||||
|
Há algumas pessoas que treinaram com sucesso com dados de 1 a 2 minutos, mas o sucesso não é reproduzível por outros e não é muito informativo. <br>Isso requer que o conjunto de treinamento tenha um timbre muito distinto (por exemplo, um som de menina de anime arejado de alta frequência) e a qualidade do áudio seja alta;
|
||||||
|
Dados com menos de 1 minuto, já obtivemo sucesso. Mas não é recomendado.<hr>
|
||||||
|
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q11:Qual é a taxa do index e como ajustá-la?</span></b>
|
||||||
|
Se a qualidade do tom do modelo pré-treinado e da fonte de inference for maior do que a do conjunto de treinamento, eles podem trazer a qualidade do tom do resultado do inference, mas ao custo de um possível viés de tom em direção ao tom do modelo subjacente/fonte de inference, em vez do tom do conjunto de treinamento, que é geralmente referido como "vazamento de tom".<br>
|
||||||
|
|
||||||
|
A taxa de index é usada para reduzir/resolver o problema de vazamento de timbre. Se a taxa do index for definida como 1, teoricamente não há vazamento de timbre da fonte de inference e a qualidade do timbre é mais tendenciosa em relação ao conjunto de treinamento. Se o conjunto de treinamento tiver uma qualidade de som mais baixa do que a fonte de inference, uma taxa de index mais alta poderá reduzir a qualidade do som. Reduzi-lo a 0 não tem o efeito de usar a mistura de recuperação para proteger os tons definidos de treinamento.<br>
|
||||||
|
|
||||||
|
Se o conjunto de treinamento tiver boa qualidade de áudio e longa duração, aumente o total_epoch, quando o modelo em si é menos propenso a se referir à fonte inferida e ao modelo subjacente pré-treinado, e há pouco "vazamento de tom", o index_rate não é importante e você pode até não criar/compartilhar o arquivo de index.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q12:Como escolher o GPU ao inferir?</span></b>
|
||||||
|
No arquivo ``config.py``, selecione o número da placa em "device cuda:".<br>
|
||||||
|
|
||||||
|
O mapeamento entre o número da placa e a placa gráfica pode ser visto na seção de informações da placa gráfica da guia de treinamento.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q13:Como usar o modelo salvo no meio do treinamento?</span></b>
|
||||||
|
Salvar via extração de modelo na parte inferior da guia de processamento do ckpt.<hr>
|
||||||
|
|
||||||
|
## <b><span style="color: #337dff;">Q14: Erro de arquivo/memória (durante o treinamento)?</span></b>
|
||||||
|
Muitos processos e sua memória não é suficiente. Você pode corrigi-lo por:
|
||||||
|
|
||||||
|
1. Diminuir a entrada no campo "Threads da CPU".
|
||||||
|
2. Diminuir o tamanho do conjunto de dados.
|
||||||
|
|
||||||
|
## Q15: Como continuar treinando usando mais dados
|
||||||
|
|
||||||
|
passo 1: coloque todos os dados wav no path2.
|
||||||
|
|
||||||
|
etapa 2: exp_name2 + path2 -> processar conjunto de dados e extrair recurso.
|
||||||
|
|
||||||
|
passo 3: copie o arquivo G e D mais recente de exp_name1 (seu experimento anterior) para a pasta exp_name2.
|
||||||
|
|
||||||
|
passo 4: clique em "treinar o modelo" e ele continuará treinando desde o início da época anterior do modelo exp.
|
||||||
|
|
||||||
|
## Q16: erro sobre llvmlite.dll
|
||||||
|
|
||||||
|
OSError: Não foi possível carregar o arquivo de objeto compartilhado: llvmlite.dll
|
||||||
|
|
||||||
|
FileNotFoundError: Não foi possível encontrar o módulo lib\site-packages\llvmlite\binding\llvmlite.dll (ou uma de suas dependências). Tente usar o caminho completo com sintaxe de construtor.
|
||||||
|
|
||||||
|
O problema acontecerá no Windows, instale https://aka.ms/vs/17/release/vc_redist.x64.exe e será corrigido.
|
||||||
|
|
||||||
|
## Q17: RuntimeError: O tamanho expandido do tensor (17280) deve corresponder ao tamanho existente (0) na dimensão 1 não singleton. Tamanhos de destino: [1, 17280]. Tamanhos de tensor: [0]
|
||||||
|
|
||||||
|
Exclua os arquivos wav cujo tamanho seja significativamente menor que outros e isso não acontecerá novamente. Em seguida, clique em "treinar o modelo" e "treinar o índice".
|
||||||
|
|
||||||
|
## Q18: RuntimeError: O tamanho do tensor a (24) deve corresponder ao tamanho do tensor b (16) na dimensão não singleton 2
|
||||||
|
|
||||||
|
Não altere a taxa de amostragem e continue o treinamento. Caso seja necessário alterar, o nome do exp deverá ser alterado e o modelo será treinado do zero. Você também pode copiar o pitch e os recursos (pastas 0/1/2/2b) extraídos da última vez para acelerar o processo de treinamento.
|
||||||
|
|
65
docs/pt-BR/training_tips_pt-BR.md
Normal file
65
docs/pt-BR/training_tips_pt-BR.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
Instruções e dicas para treinamento RVC
|
||||||
|
======================================
|
||||||
|
Estas DICAS explicam como o treinamento de dados é feito.
|
||||||
|
|
||||||
|
# Fluxo de treinamento
|
||||||
|
Explicarei ao longo das etapas na guia de treinamento da GUI.
|
||||||
|
|
||||||
|
## Passo 1
|
||||||
|
Defina o nome do experimento aqui.
|
||||||
|
|
||||||
|
Você também pode definir aqui se o modelo deve levar em consideração o pitch.
|
||||||
|
Se o modelo não considerar o tom, o modelo será mais leve, mas não será adequado para cantar.
|
||||||
|
|
||||||
|
Os dados de cada experimento são colocados em `/logs/nome-do-seu-modelo/`.
|
||||||
|
|
||||||
|
## Passo 2a
|
||||||
|
Carrega e pré-processa áudio.
|
||||||
|
|
||||||
|
### Carregar áudio
|
||||||
|
Se você especificar uma pasta com áudio, os arquivos de áudio dessa pasta serão lidos automaticamente.
|
||||||
|
Por exemplo, se você especificar `C:Users\hoge\voices`, `C:Users\hoge\voices\voice.mp3` será carregado, mas `C:Users\hoge\voices\dir\voice.mp3` será Não carregado.
|
||||||
|
|
||||||
|
Como o ffmpeg é usado internamente para leitura de áudio, se a extensão for suportada pelo ffmpeg, ela será lida automaticamente.
|
||||||
|
Após converter para int16 com ffmpeg, converta para float32 e normalize entre -1 e 1.
|
||||||
|
|
||||||
|
### Eliminar ruído
|
||||||
|
O áudio é suavizado pelo filtfilt do scipy.
|
||||||
|
|
||||||
|
### Divisão de áudio
|
||||||
|
Primeiro, o áudio de entrada é dividido pela detecção de partes de silêncio que duram mais que um determinado período (max_sil_kept=5 segundos?). Após dividir o áudio no silêncio, divida o áudio a cada 4 segundos com uma sobreposição de 0,3 segundos. Para áudio separado em 4 segundos, após normalizar o volume, converta o arquivo wav para `/logs/nome-do-seu-modelo/0_gt_wavs` e, em seguida, converta-o para taxa de amostragem de 16k para `/logs/nome-do-seu-modelo/1_16k_wavs ` como um arquivo wav.
|
||||||
|
|
||||||
|
## Passo 2b
|
||||||
|
### Extrair pitch
|
||||||
|
Extraia informações de pitch de arquivos wav. Extraia as informações de pitch (=f0) usando o método incorporado em Parselmouth ou pyworld e salve-as em `/logs/nome-do-seu-modelo/2a_f0`. Em seguida, converta logaritmicamente as informações de pitch para um número inteiro entre 1 e 255 e salve-as em `/logs/nome-do-seu-modelo/2b-f0nsf`.
|
||||||
|
|
||||||
|
### Extrair feature_print
|
||||||
|
Converta o arquivo wav para incorporação antecipadamente usando HuBERT. Leia o arquivo wav salvo em `/logs/nome-do-seu-modelo/1_16k_wavs`, converta o arquivo wav em recursos de 256 dimensões com HuBERT e salve no formato npy em `/logs/nome-do-seu-modelo/3_feature256`.
|
||||||
|
|
||||||
|
## Passo 3
|
||||||
|
treinar o modelo.
|
||||||
|
### Glossário para iniciantes
|
||||||
|
No aprendizado profundo, o conjunto de dados é dividido e o aprendizado avança aos poucos. Em uma atualização do modelo (etapa), os dados batch_size são recuperados e previsões e correções de erros são realizadas. Fazer isso uma vez para um conjunto de dados conta como um epoch.
|
||||||
|
|
||||||
|
Portanto, o tempo de aprendizagem é o tempo de aprendizagem por etapa x (o número de dados no conjunto de dados/tamanho do lote) x o número de epoch. Em geral, quanto maior o tamanho do lote, mais estável se torna o aprendizado (tempo de aprendizado por etapa ÷ tamanho do lote) fica menor, mas usa mais memória GPU. A RAM da GPU pode ser verificada com o comando nvidia-smi. O aprendizado pode ser feito em pouco tempo aumentando o tamanho do lote tanto quanto possível de acordo com a máquina do ambiente de execução.
|
||||||
|
|
||||||
|
### Especifique o modelo pré-treinado
|
||||||
|
O RVC começa a treinar o modelo a partir de pesos pré-treinados em vez de 0, para que possa ser treinado com um pequeno conjunto de dados.
|
||||||
|
|
||||||
|
Por padrão
|
||||||
|
|
||||||
|
- Se você considerar o pitch, ele carrega `rvc-location/pretrained/f0G40k.pth` e `rvc-location/pretrained/f0D40k.pth`.
|
||||||
|
- Se você não considerar o pitch, ele carrega `rvc-location/pretrained/f0G40k.pth` e `rvc-location/pretrained/f0D40k.pth`.
|
||||||
|
|
||||||
|
Ao aprender, os parâmetros do modelo são salvos em `logs/nome-do-seu-modelo/G_{}.pth` e `logs/nome-do-seu-modelo/D_{}.pth` para cada save_every_epoch, mas especificando nesse caminho, você pode começar a aprender. Você pode reiniciar ou iniciar o treinamento a partir de weights de modelo aprendidos em um experimento diferente.
|
||||||
|
|
||||||
|
### Index de aprendizado
|
||||||
|
O RVC salva os valores de recursos do HuBERT usados durante o treinamento e, durante a inferência, procura valores de recursos que sejam semelhantes aos valores de recursos usados durante o aprendizado para realizar a inferência. Para realizar esta busca em alta velocidade, o index é aprendido previamente.
|
||||||
|
Para aprendizagem de index, usamos a biblioteca de pesquisa de associação de áreas aproximadas faiss. Leia o valor do recurso `logs/nome-do-seu-modelo/3_feature256` e use-o para aprender o index, e salve-o como `logs/nome-do-seu-modelo/add_XXX.index`.
|
||||||
|
|
||||||
|
(A partir da versão 20230428update, ele é lido do index e não é mais necessário salvar/especificar.)
|
||||||
|
|
||||||
|
### Descrição do botão
|
||||||
|
- Treinar modelo: Após executar o passo 2b, pressione este botão para treinar o modelo.
|
||||||
|
- Treinar índice de recursos: após treinar o modelo, execute o aprendizado do index.
|
||||||
|
- Treinamento com um clique: etapa 2b, treinamento de modelo e treinamento de index de recursos, tudo de uma vez.
|
190
gui_v1.py
190
gui_v1.py
@ -125,6 +125,8 @@ if __name__ == "__main__":
|
|||||||
self.index_rate: float = 0.0
|
self.index_rate: float = 0.0
|
||||||
self.n_cpu: int = min(n_cpu, 4)
|
self.n_cpu: int = min(n_cpu, 4)
|
||||||
self.f0method: str = "fcpe"
|
self.f0method: str = "fcpe"
|
||||||
|
self.sg_hostapi: str = ""
|
||||||
|
self.wasapi_exclusive: bool = False
|
||||||
self.sg_input_device: str = ""
|
self.sg_input_device: str = ""
|
||||||
self.sg_output_device: str = ""
|
self.sg_output_device: str = ""
|
||||||
|
|
||||||
@ -134,6 +136,7 @@ if __name__ == "__main__":
|
|||||||
self.config = Config()
|
self.config = Config()
|
||||||
self.function = "vc"
|
self.function = "vc"
|
||||||
self.delay_time = 0
|
self.delay_time = 0
|
||||||
|
self.hostapis = None
|
||||||
self.input_devices = None
|
self.input_devices = None
|
||||||
self.output_devices = None
|
self.output_devices = None
|
||||||
self.input_devices_indices = None
|
self.input_devices_indices = None
|
||||||
@ -153,11 +156,25 @@ if __name__ == "__main__":
|
|||||||
data["crepe"] = data["f0method"] == "crepe"
|
data["crepe"] = data["f0method"] == "crepe"
|
||||||
data["rmvpe"] = data["f0method"] == "rmvpe"
|
data["rmvpe"] = data["f0method"] == "rmvpe"
|
||||||
data["fcpe"] = data["f0method"] == "fcpe"
|
data["fcpe"] = data["f0method"] == "fcpe"
|
||||||
if data["sg_input_device"] not in self.input_devices:
|
if data["sg_hostapi"] in self.hostapis:
|
||||||
|
self.update_devices(hostapi_name=data["sg_hostapi"])
|
||||||
|
if (
|
||||||
|
data["sg_input_device"] not in self.input_devices
|
||||||
|
or data["sg_output_device"] not in self.output_devices
|
||||||
|
):
|
||||||
|
self.update_devices()
|
||||||
|
data["sg_hostapi"] = self.hostapis[0]
|
||||||
|
data["sg_input_device"] = self.input_devices[
|
||||||
|
self.input_devices_indices.index(sd.default.device[0])
|
||||||
|
]
|
||||||
|
data["sg_output_device"] = self.output_devices[
|
||||||
|
self.output_devices_indices.index(sd.default.device[1])
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
data["sg_hostapi"] = self.hostapis[0]
|
||||||
data["sg_input_device"] = self.input_devices[
|
data["sg_input_device"] = self.input_devices[
|
||||||
self.input_devices_indices.index(sd.default.device[0])
|
self.input_devices_indices.index(sd.default.device[0])
|
||||||
]
|
]
|
||||||
if data["sg_output_device"] not in self.output_devices:
|
|
||||||
data["sg_output_device"] = self.output_devices[
|
data["sg_output_device"] = self.output_devices[
|
||||||
self.output_devices_indices.index(sd.default.device[1])
|
self.output_devices_indices.index(sd.default.device[1])
|
||||||
]
|
]
|
||||||
@ -166,6 +183,8 @@ if __name__ == "__main__":
|
|||||||
data = {
|
data = {
|
||||||
"pth_path": "",
|
"pth_path": "",
|
||||||
"index_path": "",
|
"index_path": "",
|
||||||
|
"sg_hostapi": self.hostapis[0],
|
||||||
|
"sg_wasapi_exclusive": False,
|
||||||
"sg_input_device": self.input_devices[
|
"sg_input_device": self.input_devices[
|
||||||
self.input_devices_indices.index(sd.default.device[0])
|
self.input_devices_indices.index(sd.default.device[0])
|
||||||
],
|
],
|
||||||
@ -233,12 +252,30 @@ if __name__ == "__main__":
|
|||||||
[
|
[
|
||||||
sg.Frame(
|
sg.Frame(
|
||||||
layout=[
|
layout=[
|
||||||
|
[
|
||||||
|
sg.Text(i18n("设备类型")),
|
||||||
|
sg.Combo(
|
||||||
|
self.hostapis,
|
||||||
|
key="sg_hostapi",
|
||||||
|
default_value=data.get("sg_hostapi", ""),
|
||||||
|
enable_events=True,
|
||||||
|
size=(20, 1),
|
||||||
|
),
|
||||||
|
sg.Checkbox(
|
||||||
|
i18n("独占 WASAPI 设备"),
|
||||||
|
key="sg_wasapi_exclusive",
|
||||||
|
default=data.get("sg_wasapi_exclusive", False),
|
||||||
|
enable_events=True,
|
||||||
|
),
|
||||||
|
],
|
||||||
[
|
[
|
||||||
sg.Text(i18n("输入设备")),
|
sg.Text(i18n("输入设备")),
|
||||||
sg.Combo(
|
sg.Combo(
|
||||||
self.input_devices,
|
self.input_devices,
|
||||||
key="sg_input_device",
|
key="sg_input_device",
|
||||||
default_value=data.get("sg_input_device", ""),
|
default_value=data.get("sg_input_device", ""),
|
||||||
|
enable_events=True,
|
||||||
|
size=(45, 1),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@ -247,6 +284,8 @@ if __name__ == "__main__":
|
|||||||
self.output_devices,
|
self.output_devices,
|
||||||
key="sg_output_device",
|
key="sg_output_device",
|
||||||
default_value=data.get("sg_output_device", ""),
|
default_value=data.get("sg_output_device", ""),
|
||||||
|
enable_events=True,
|
||||||
|
size=(45, 1),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@ -269,7 +308,7 @@ if __name__ == "__main__":
|
|||||||
sg.Text("", key="sr_stream"),
|
sg.Text("", key="sr_stream"),
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
title=i18n("音频设备(请使用同种类驱动)"),
|
title=i18n("音频设备"),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@ -365,7 +404,7 @@ if __name__ == "__main__":
|
|||||||
[
|
[
|
||||||
sg.Text(i18n("采样长度")),
|
sg.Text(i18n("采样长度")),
|
||||||
sg.Slider(
|
sg.Slider(
|
||||||
range=(0.02, 2.4),
|
range=(0.02, 1.5),
|
||||||
key="block_time",
|
key="block_time",
|
||||||
resolution=0.01,
|
resolution=0.01,
|
||||||
orientation="h",
|
orientation="h",
|
||||||
@ -481,8 +520,13 @@ if __name__ == "__main__":
|
|||||||
if event == sg.WINDOW_CLOSED:
|
if event == sg.WINDOW_CLOSED:
|
||||||
self.stop_stream()
|
self.stop_stream()
|
||||||
exit()
|
exit()
|
||||||
if event == "reload_devices":
|
if event == "reload_devices" or event == "sg_hostapi":
|
||||||
self.update_devices()
|
self.gui_config.sg_hostapi = values["sg_hostapi"]
|
||||||
|
self.update_devices(hostapi_name=values["sg_hostapi"])
|
||||||
|
if self.gui_config.sg_hostapi not in self.hostapis:
|
||||||
|
self.gui_config.sg_hostapi = self.hostapis[0]
|
||||||
|
self.window["sg_hostapi"].Update(values=self.hostapis)
|
||||||
|
self.window["sg_hostapi"].Update(value=self.gui_config.sg_hostapi)
|
||||||
if self.gui_config.sg_input_device not in self.input_devices:
|
if self.gui_config.sg_input_device not in self.input_devices:
|
||||||
self.gui_config.sg_input_device = self.input_devices[0]
|
self.gui_config.sg_input_device = self.input_devices[0]
|
||||||
self.window["sg_input_device"].Update(values=self.input_devices)
|
self.window["sg_input_device"].Update(values=self.input_devices)
|
||||||
@ -502,6 +546,8 @@ if __name__ == "__main__":
|
|||||||
settings = {
|
settings = {
|
||||||
"pth_path": values["pth_path"],
|
"pth_path": values["pth_path"],
|
||||||
"index_path": values["index_path"],
|
"index_path": values["index_path"],
|
||||||
|
"sg_hostapi": values["sg_hostapi"],
|
||||||
|
"sg_wasapi_exclusive": values["sg_wasapi_exclusive"],
|
||||||
"sg_input_device": values["sg_input_device"],
|
"sg_input_device": values["sg_input_device"],
|
||||||
"sg_output_device": values["sg_output_device"],
|
"sg_output_device": values["sg_output_device"],
|
||||||
"sr_type": ["sr_model", "sr_device"][
|
"sr_type": ["sr_model", "sr_device"][
|
||||||
@ -544,7 +590,9 @@ if __name__ == "__main__":
|
|||||||
if values["I_noise_reduce"]:
|
if values["I_noise_reduce"]:
|
||||||
self.delay_time += min(values["crossfade_length"], 0.04)
|
self.delay_time += min(values["crossfade_length"], 0.04)
|
||||||
self.window["sr_stream"].update(self.gui_config.samplerate)
|
self.window["sr_stream"].update(self.gui_config.samplerate)
|
||||||
self.window["delay_time"].update(int(self.delay_time * 1000))
|
self.window["delay_time"].update(
|
||||||
|
int(np.round(self.delay_time * 1000))
|
||||||
|
)
|
||||||
# Parameter hot update
|
# Parameter hot update
|
||||||
if event == "threhold":
|
if event == "threhold":
|
||||||
self.gui_config.threhold = values["threhold"]
|
self.gui_config.threhold = values["threhold"]
|
||||||
@ -566,7 +614,9 @@ if __name__ == "__main__":
|
|||||||
self.delay_time += (
|
self.delay_time += (
|
||||||
1 if values["I_noise_reduce"] else -1
|
1 if values["I_noise_reduce"] else -1
|
||||||
) * min(values["crossfade_length"], 0.04)
|
) * min(values["crossfade_length"], 0.04)
|
||||||
self.window["delay_time"].update(int(self.delay_time * 1000))
|
self.window["delay_time"].update(
|
||||||
|
int(np.round(self.delay_time * 1000))
|
||||||
|
)
|
||||||
elif event == "O_noise_reduce":
|
elif event == "O_noise_reduce":
|
||||||
self.gui_config.O_noise_reduce = values["O_noise_reduce"]
|
self.gui_config.O_noise_reduce = values["O_noise_reduce"]
|
||||||
elif event == "use_pv":
|
elif event == "use_pv":
|
||||||
@ -594,6 +644,8 @@ if __name__ == "__main__":
|
|||||||
self.set_devices(values["sg_input_device"], values["sg_output_device"])
|
self.set_devices(values["sg_input_device"], values["sg_output_device"])
|
||||||
self.config.use_jit = False # values["use_jit"]
|
self.config.use_jit = False # values["use_jit"]
|
||||||
# self.device_latency = values["device_latency"]
|
# self.device_latency = values["device_latency"]
|
||||||
|
self.gui_config.sg_hostapi = values["sg_hostapi"]
|
||||||
|
self.gui_config.sg_wasapi_exclusive = values["sg_wasapi_exclusive"]
|
||||||
self.gui_config.sg_input_device = values["sg_input_device"]
|
self.gui_config.sg_input_device = values["sg_input_device"]
|
||||||
self.gui_config.sg_output_device = values["sg_output_device"]
|
self.gui_config.sg_output_device = values["sg_output_device"]
|
||||||
self.gui_config.pth_path = values["pth_path"]
|
self.gui_config.pth_path = values["pth_path"]
|
||||||
@ -644,6 +696,7 @@ if __name__ == "__main__":
|
|||||||
if self.gui_config.sr_type == "sr_model"
|
if self.gui_config.sr_type == "sr_model"
|
||||||
else self.get_device_samplerate()
|
else self.get_device_samplerate()
|
||||||
)
|
)
|
||||||
|
self.gui_config.channels = self.get_device_channels()
|
||||||
self.zc = self.gui_config.samplerate // 100
|
self.zc = self.gui_config.samplerate // 100
|
||||||
self.block_frame = (
|
self.block_frame = (
|
||||||
int(
|
int(
|
||||||
@ -686,19 +739,18 @@ if __name__ == "__main__":
|
|||||||
device=self.config.device,
|
device=self.config.device,
|
||||||
dtype=torch.float32,
|
dtype=torch.float32,
|
||||||
)
|
)
|
||||||
|
self.input_wav_denoise: torch.Tensor = self.input_wav.clone()
|
||||||
self.input_wav_res: torch.Tensor = torch.zeros(
|
self.input_wav_res: torch.Tensor = torch.zeros(
|
||||||
160 * self.input_wav.shape[0] // self.zc,
|
160 * self.input_wav.shape[0] // self.zc,
|
||||||
device=self.config.device,
|
device=self.config.device,
|
||||||
dtype=torch.float32,
|
dtype=torch.float32,
|
||||||
)
|
)
|
||||||
|
self.rms_buffer: np.ndarray = np.zeros(4 * self.zc, dtype="float32")
|
||||||
self.sola_buffer: torch.Tensor = torch.zeros(
|
self.sola_buffer: torch.Tensor = torch.zeros(
|
||||||
self.sola_buffer_frame, device=self.config.device, dtype=torch.float32
|
self.sola_buffer_frame, device=self.config.device, dtype=torch.float32
|
||||||
)
|
)
|
||||||
self.nr_buffer: torch.Tensor = self.sola_buffer.clone()
|
self.nr_buffer: torch.Tensor = self.sola_buffer.clone()
|
||||||
self.output_buffer: torch.Tensor = self.input_wav.clone()
|
self.output_buffer: torch.Tensor = self.input_wav.clone()
|
||||||
self.res_buffer: torch.Tensor = torch.zeros(
|
|
||||||
2 * self.zc, device=self.config.device, dtype=torch.float32
|
|
||||||
)
|
|
||||||
self.skip_head = self.extra_frame // self.zc
|
self.skip_head = self.extra_frame // self.zc
|
||||||
self.return_length = (
|
self.return_length = (
|
||||||
self.block_frame + self.sola_buffer_frame + self.sola_search_frame
|
self.block_frame + self.sola_buffer_frame + self.sola_search_frame
|
||||||
@ -740,13 +792,20 @@ if __name__ == "__main__":
|
|||||||
global flag_vc
|
global flag_vc
|
||||||
if not flag_vc:
|
if not flag_vc:
|
||||||
flag_vc = True
|
flag_vc = True
|
||||||
channels = 1 if sys.platform == "darwin" else 2
|
if (
|
||||||
|
"WASAPI" in self.gui_config.sg_hostapi
|
||||||
|
and self.gui_config.sg_wasapi_exclusive
|
||||||
|
):
|
||||||
|
extra_settings = sd.WasapiSettings(exclusive=True)
|
||||||
|
else:
|
||||||
|
extra_settings = None
|
||||||
self.stream = sd.Stream(
|
self.stream = sd.Stream(
|
||||||
channels=channels,
|
|
||||||
callback=self.audio_callback,
|
callback=self.audio_callback,
|
||||||
blocksize=self.block_frame,
|
blocksize=self.block_frame,
|
||||||
samplerate=self.gui_config.samplerate,
|
samplerate=self.gui_config.samplerate,
|
||||||
|
channels=self.gui_config.channels,
|
||||||
dtype="float32",
|
dtype="float32",
|
||||||
|
extra_settings=extra_settings,
|
||||||
)
|
)
|
||||||
self.stream.start()
|
self.stream.start()
|
||||||
|
|
||||||
@ -755,7 +814,7 @@ if __name__ == "__main__":
|
|||||||
if flag_vc:
|
if flag_vc:
|
||||||
flag_vc = False
|
flag_vc = False
|
||||||
if self.stream is not None:
|
if self.stream is not None:
|
||||||
self.stream.stop()
|
self.stream.abort()
|
||||||
self.stream.close()
|
self.stream.close()
|
||||||
self.stream = None
|
self.stream = None
|
||||||
|
|
||||||
@ -769,48 +828,54 @@ if __name__ == "__main__":
|
|||||||
start_time = time.perf_counter()
|
start_time = time.perf_counter()
|
||||||
indata = librosa.to_mono(indata.T)
|
indata = librosa.to_mono(indata.T)
|
||||||
if self.gui_config.threhold > -60:
|
if self.gui_config.threhold > -60:
|
||||||
|
indata = np.append(self.rms_buffer, indata)
|
||||||
rms = librosa.feature.rms(
|
rms = librosa.feature.rms(
|
||||||
y=indata, frame_length=4 * self.zc, hop_length=self.zc
|
y=indata, frame_length=4 * self.zc, hop_length=self.zc
|
||||||
)
|
)[:, 2:]
|
||||||
|
self.rms_buffer[:] = indata[-4 * self.zc :]
|
||||||
|
indata = indata[2 * self.zc - self.zc // 2 :]
|
||||||
db_threhold = (
|
db_threhold = (
|
||||||
librosa.amplitude_to_db(rms, ref=1.0)[0] < self.gui_config.threhold
|
librosa.amplitude_to_db(rms, ref=1.0)[0] < self.gui_config.threhold
|
||||||
)
|
)
|
||||||
for i in range(db_threhold.shape[0]):
|
for i in range(db_threhold.shape[0]):
|
||||||
if db_threhold[i]:
|
if db_threhold[i]:
|
||||||
indata[i * self.zc : (i + 1) * self.zc] = 0
|
indata[i * self.zc : (i + 1) * self.zc] = 0
|
||||||
|
indata = indata[self.zc // 2 :]
|
||||||
self.input_wav[: -self.block_frame] = self.input_wav[
|
self.input_wav[: -self.block_frame] = self.input_wav[
|
||||||
self.block_frame :
|
self.block_frame :
|
||||||
].clone()
|
].clone()
|
||||||
self.input_wav[-self.block_frame :] = torch.from_numpy(indata).to(
|
self.input_wav[-indata.shape[0] :] = torch.from_numpy(indata).to(
|
||||||
self.config.device
|
self.config.device
|
||||||
)
|
)
|
||||||
self.input_wav_res[: -self.block_frame_16k] = self.input_wav_res[
|
self.input_wav_res[: -self.block_frame_16k] = self.input_wav_res[
|
||||||
self.block_frame_16k :
|
self.block_frame_16k :
|
||||||
].clone()
|
].clone()
|
||||||
# input noise reduction and resampling
|
# input noise reduction and resampling
|
||||||
if self.gui_config.I_noise_reduce and self.function == "vc":
|
if self.gui_config.I_noise_reduce:
|
||||||
input_wav = self.input_wav[
|
self.input_wav_denoise[: -self.block_frame] = self.input_wav_denoise[
|
||||||
-self.sola_buffer_frame - self.block_frame - 2 * self.zc :
|
self.block_frame :
|
||||||
]
|
].clone()
|
||||||
|
input_wav = self.input_wav[-self.sola_buffer_frame - self.block_frame :]
|
||||||
input_wav = self.tg(
|
input_wav = self.tg(
|
||||||
input_wav.unsqueeze(0), self.input_wav.unsqueeze(0)
|
input_wav.unsqueeze(0), self.input_wav.unsqueeze(0)
|
||||||
)[0, 2 * self.zc :]
|
).squeeze(0)
|
||||||
input_wav[: self.sola_buffer_frame] *= self.fade_in_window
|
input_wav[: self.sola_buffer_frame] *= self.fade_in_window
|
||||||
input_wav[: self.sola_buffer_frame] += (
|
input_wav[: self.sola_buffer_frame] += (
|
||||||
self.nr_buffer * self.fade_out_window
|
self.nr_buffer * self.fade_out_window
|
||||||
)
|
)
|
||||||
|
self.input_wav_denoise[-self.block_frame :] = input_wav[
|
||||||
|
: self.block_frame
|
||||||
|
]
|
||||||
self.nr_buffer[:] = input_wav[self.block_frame :]
|
self.nr_buffer[:] = input_wav[self.block_frame :]
|
||||||
input_wav = torch.cat(
|
|
||||||
(self.res_buffer[:], input_wav[: self.block_frame])
|
|
||||||
)
|
|
||||||
self.res_buffer[:] = input_wav[-2 * self.zc :]
|
|
||||||
self.input_wav_res[-self.block_frame_16k - 160 :] = self.resampler(
|
self.input_wav_res[-self.block_frame_16k - 160 :] = self.resampler(
|
||||||
input_wav
|
self.input_wav_denoise[-self.block_frame - 2 * self.zc :]
|
||||||
)[160:]
|
)[160:]
|
||||||
else:
|
else:
|
||||||
self.input_wav_res[-self.block_frame_16k - 160 :] = self.resampler(
|
self.input_wav_res[
|
||||||
self.input_wav[-self.block_frame - 2 * self.zc :]
|
-160 * (indata.shape[0] // self.zc + 1) :
|
||||||
)[160:]
|
] = self.resampler(self.input_wav[-indata.shape[0] - 2 * self.zc :])[
|
||||||
|
160:
|
||||||
|
]
|
||||||
# infer
|
# infer
|
||||||
if self.function == "vc":
|
if self.function == "vc":
|
||||||
infer_wav = self.rvc.infer(
|
infer_wav = self.rvc.infer(
|
||||||
@ -822,14 +887,12 @@ if __name__ == "__main__":
|
|||||||
)
|
)
|
||||||
if self.resampler2 is not None:
|
if self.resampler2 is not None:
|
||||||
infer_wav = self.resampler2(infer_wav)
|
infer_wav = self.resampler2(infer_wav)
|
||||||
|
elif self.gui_config.I_noise_reduce:
|
||||||
|
infer_wav = self.input_wav_denoise[self.extra_frame :].clone()
|
||||||
else:
|
else:
|
||||||
infer_wav = self.input_wav[
|
infer_wav = self.input_wav[self.extra_frame :].clone()
|
||||||
-self.crossfade_frame - self.sola_search_frame - self.block_frame :
|
|
||||||
].clone()
|
|
||||||
# output noise reduction
|
# output noise reduction
|
||||||
if (self.gui_config.O_noise_reduce and self.function == "vc") or (
|
if self.gui_config.O_noise_reduce and self.function == "vc":
|
||||||
self.gui_config.I_noise_reduce and self.function == "im"
|
|
||||||
):
|
|
||||||
self.output_buffer[: -self.block_frame] = self.output_buffer[
|
self.output_buffer[: -self.block_frame] = self.output_buffer[
|
||||||
self.block_frame :
|
self.block_frame :
|
||||||
].clone()
|
].clone()
|
||||||
@ -839,16 +902,14 @@ if __name__ == "__main__":
|
|||||||
).squeeze(0)
|
).squeeze(0)
|
||||||
# volume envelop mixing
|
# volume envelop mixing
|
||||||
if self.gui_config.rms_mix_rate < 1 and self.function == "vc":
|
if self.gui_config.rms_mix_rate < 1 and self.function == "vc":
|
||||||
|
if self.gui_config.I_noise_reduce:
|
||||||
|
input_wav = self.input_wav_denoise[self.extra_frame :]
|
||||||
|
else:
|
||||||
|
input_wav = self.input_wav[self.extra_frame :]
|
||||||
rms1 = librosa.feature.rms(
|
rms1 = librosa.feature.rms(
|
||||||
y=self.input_wav_res[
|
y=input_wav[: infer_wav.shape[0]].cpu().numpy(),
|
||||||
160
|
frame_length=4 * self.zc,
|
||||||
* self.skip_head : 160
|
hop_length=self.zc,
|
||||||
* (self.skip_head + self.return_length)
|
|
||||||
]
|
|
||||||
.cpu()
|
|
||||||
.numpy(),
|
|
||||||
frame_length=640,
|
|
||||||
hop_length=160,
|
|
||||||
)
|
)
|
||||||
rms1 = torch.from_numpy(rms1).to(self.config.device)
|
rms1 = torch.from_numpy(rms1).to(self.config.device)
|
||||||
rms1 = F.interpolate(
|
rms1 = F.interpolate(
|
||||||
@ -907,19 +968,22 @@ if __name__ == "__main__":
|
|||||||
self.sola_buffer[:] = infer_wav[
|
self.sola_buffer[:] = infer_wav[
|
||||||
self.block_frame : self.block_frame + self.sola_buffer_frame
|
self.block_frame : self.block_frame + self.sola_buffer_frame
|
||||||
]
|
]
|
||||||
if sys.platform == "darwin":
|
outdata[:] = (
|
||||||
outdata[:] = infer_wav[: self.block_frame].cpu().numpy()[:, np.newaxis]
|
infer_wav[: self.block_frame]
|
||||||
else:
|
.repeat(self.gui_config.channels, 1)
|
||||||
outdata[:] = (
|
.t()
|
||||||
infer_wav[: self.block_frame].repeat(2, 1).t().cpu().numpy()
|
.cpu()
|
||||||
)
|
.numpy()
|
||||||
|
)
|
||||||
total_time = time.perf_counter() - start_time
|
total_time = time.perf_counter() - start_time
|
||||||
if flag_vc:
|
if flag_vc:
|
||||||
self.window["infer_time"].update(int(total_time * 1000))
|
self.window["infer_time"].update(int(total_time * 1000))
|
||||||
printt("Infer time: %.2f", total_time)
|
printt("Infer time: %.2f", total_time)
|
||||||
|
|
||||||
def update_devices(self):
|
def update_devices(self, hostapi_name=None):
|
||||||
"""获取设备列表"""
|
"""获取设备列表"""
|
||||||
|
global flag_vc
|
||||||
|
flag_vc = False
|
||||||
sd._terminate()
|
sd._terminate()
|
||||||
sd._initialize()
|
sd._initialize()
|
||||||
devices = sd.query_devices()
|
devices = sd.query_devices()
|
||||||
@ -927,25 +991,28 @@ if __name__ == "__main__":
|
|||||||
for hostapi in hostapis:
|
for hostapi in hostapis:
|
||||||
for device_idx in hostapi["devices"]:
|
for device_idx in hostapi["devices"]:
|
||||||
devices[device_idx]["hostapi_name"] = hostapi["name"]
|
devices[device_idx]["hostapi_name"] = hostapi["name"]
|
||||||
|
self.hostapis = [hostapi["name"] for hostapi in hostapis]
|
||||||
|
if hostapi_name not in self.hostapis:
|
||||||
|
hostapi_name = self.hostapis[0]
|
||||||
self.input_devices = [
|
self.input_devices = [
|
||||||
f"{d['name']} ({d['hostapi_name']})"
|
d["name"]
|
||||||
for d in devices
|
for d in devices
|
||||||
if d["max_input_channels"] > 0
|
if d["max_input_channels"] > 0 and d["hostapi_name"] == hostapi_name
|
||||||
]
|
]
|
||||||
self.output_devices = [
|
self.output_devices = [
|
||||||
f"{d['name']} ({d['hostapi_name']})"
|
d["name"]
|
||||||
for d in devices
|
for d in devices
|
||||||
if d["max_output_channels"] > 0
|
if d["max_output_channels"] > 0 and d["hostapi_name"] == hostapi_name
|
||||||
]
|
]
|
||||||
self.input_devices_indices = [
|
self.input_devices_indices = [
|
||||||
d["index"] if "index" in d else d["name"]
|
d["index"] if "index" in d else d["name"]
|
||||||
for d in devices
|
for d in devices
|
||||||
if d["max_input_channels"] > 0
|
if d["max_input_channels"] > 0 and d["hostapi_name"] == hostapi_name
|
||||||
]
|
]
|
||||||
self.output_devices_indices = [
|
self.output_devices_indices = [
|
||||||
d["index"] if "index" in d else d["name"]
|
d["index"] if "index" in d else d["name"]
|
||||||
for d in devices
|
for d in devices
|
||||||
if d["max_output_channels"] > 0
|
if d["max_output_channels"] > 0 and d["hostapi_name"] == hostapi_name
|
||||||
]
|
]
|
||||||
|
|
||||||
def set_devices(self, input_device, output_device):
|
def set_devices(self, input_device, output_device):
|
||||||
@ -964,4 +1031,13 @@ if __name__ == "__main__":
|
|||||||
sd.query_devices(device=sd.default.device[0])["default_samplerate"]
|
sd.query_devices(device=sd.default.device[0])["default_samplerate"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_device_channels(self):
|
||||||
|
max_input_channels = sd.query_devices(device=sd.default.device[0])[
|
||||||
|
"max_input_channels"
|
||||||
|
]
|
||||||
|
max_output_channels = sd.query_devices(device=sd.default.device[1])[
|
||||||
|
"max_output_channels"
|
||||||
|
]
|
||||||
|
return min(max_input_channels, max_output_channels, 2)
|
||||||
|
|
||||||
gui = GUI()
|
gui = GUI()
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "Version",
|
"版本": "Version",
|
||||||
"特征提取": "Feature extraction",
|
"特征提取": "Feature extraction",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "Path to the feature index file. Leave blank to use the selected result from the dropdown:",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "Path to the feature index file. Leave blank to use the selected result from the dropdown:",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Recommended +12 key for male to female conversion, and -12 key for female to male conversion. If the sound range goes too far and the voice is distorted, you can also adjust it to the appropriate range by yourself.",
|
||||||
"目标采样率": "Target sample rate:",
|
"目标采样率": "Target sample rate:",
|
||||||
"算法延迟(ms):": "Algorithmic delays(ms):",
|
"算法延迟(ms):": "Algorithmic delays(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "Train model",
|
"训练模型": "Train model",
|
||||||
"训练特征索引": "Train feature index",
|
"训练特征索引": "Train feature index",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Training complete. You can check the training logs in the console or the 'train.log' file under the experiment folder.",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Training complete. You can check the training logs in the console or the 'train.log' file under the experiment folder.",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "Please specify the speaker/singer ID:",
|
"请指定说话人id": "Please specify the speaker/singer ID:",
|
||||||
"请选择index文件": "Please choose the .index file",
|
"请选择index文件": "Please choose the .index file",
|
||||||
"请选择pth文件": "Please choose the .pth file",
|
"请选择pth文件": "Please choose the .pth file",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "Sample length",
|
"采样长度": "Sample length",
|
||||||
"重载设备列表": "Reload device list",
|
"重载设备列表": "Reload device list",
|
||||||
"音调设置": "Pitch settings",
|
"音调设置": "Pitch settings",
|
||||||
"音频设备(请使用同种类驱动)": "Audio device (please use the same type of driver)",
|
"音频设备": "Audio device",
|
||||||
"音高算法": "pitch detection algorithm",
|
"音高算法": "pitch detection algorithm",
|
||||||
"额外推理时长": "Extra inference time"
|
"额外推理时长": "Extra inference time"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "Versión",
|
"版本": "Versión",
|
||||||
"特征提取": "Extracción de características",
|
"特征提取": "Extracción de características",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "Ruta del archivo de la biblioteca de características, si está vacío, se utilizará el resultado de la selección desplegable",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "Ruta del archivo de la biblioteca de características, si está vacío, se utilizará el resultado de la selección desplegable",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Tecla +12 recomendada para conversión de voz de hombre a mujer, tecla -12 para conversión de voz de mujer a hombre. Si el rango de tono es demasiado amplio y causa distorsión, ajústelo usted mismo a un rango adecuado.",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Tecla +12 recomendada para conversión de voz de hombre a mujer, tecla -12 para conversión de voz de mujer a hombre. Si el rango de tono es demasiado amplio y causa distorsión, ajústelo usted mismo a un rango adecuado.",
|
||||||
"目标采样率": "Tasa de muestreo objetivo",
|
"目标采样率": "Tasa de muestreo objetivo",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "Entrenar Modelo",
|
"训练模型": "Entrenar Modelo",
|
||||||
"训练特征索引": "Índice de características",
|
"训练特征索引": "Índice de características",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Entrenamiento finalizado, puede ver el registro de entrenamiento en la consola o en el archivo train.log en la carpeta del experimento",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Entrenamiento finalizado, puede ver el registro de entrenamiento en la consola o en el archivo train.log en la carpeta del experimento",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "ID del modelo",
|
"请指定说话人id": "ID del modelo",
|
||||||
"请选择index文件": "Seleccione el archivo .index",
|
"请选择index文件": "Seleccione el archivo .index",
|
||||||
"请选择pth文件": "Seleccione el archivo .pth",
|
"请选择pth文件": "Seleccione el archivo .pth",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "Longitud de muestreo",
|
"采样长度": "Longitud de muestreo",
|
||||||
"重载设备列表": "Actualizar lista de dispositivos",
|
"重载设备列表": "Actualizar lista de dispositivos",
|
||||||
"音调设置": "Ajuste de tono",
|
"音调设置": "Ajuste de tono",
|
||||||
"音频设备(请使用同种类驱动)": "Dispositivo de audio (utilice el mismo tipo de controlador)",
|
"音频设备": "Dispositivo de audio",
|
||||||
"音高算法": "Algoritmo de tono",
|
"音高算法": "Algoritmo de tono",
|
||||||
"额外推理时长": "Tiempo de inferencia adicional"
|
"额外推理时长": "Tiempo de inferencia adicional"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "Version",
|
"版本": "Version",
|
||||||
"特征提取": "Extraction des caractéristiques",
|
"特征提取": "Extraction des caractéristiques",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "Chemin d'accès au fichier d'index des caractéristiques. Laisser vide pour utiliser le résultat sélectionné dans la liste déroulante :",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "Chemin d'accès au fichier d'index des caractéristiques. Laisser vide pour utiliser le résultat sélectionné dans la liste déroulante :",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Il est recommandé d'utiliser la clé +12 pour la conversion homme-femme et la clé -12 pour la conversion femme-homme. Si la plage sonore est trop large et que la voix est déformée, vous pouvez également l'ajuster vous-même à la plage appropriée.",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Il est recommandé d'utiliser la clé +12 pour la conversion homme-femme et la clé -12 pour la conversion femme-homme. Si la plage sonore est trop large et que la voix est déformée, vous pouvez également l'ajuster vous-même à la plage appropriée.",
|
||||||
"目标采样率": "Taux d'échantillonnage cible :",
|
"目标采样率": "Taux d'échantillonnage cible :",
|
||||||
"算法延迟(ms):": "Délais algorithmiques (ms):",
|
"算法延迟(ms):": "Délais algorithmiques (ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "Entraîner le modèle",
|
"训练模型": "Entraîner le modèle",
|
||||||
"训练特征索引": "Entraîner l'index des caractéristiques",
|
"训练特征索引": "Entraîner l'index des caractéristiques",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Entraînement terminé. Vous pouvez consulter les rapports d'entraînement dans la console ou dans le fichier 'train.log' situé dans le dossier de l'expérience.",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Entraînement terminé. Vous pouvez consulter les rapports d'entraînement dans la console ou dans le fichier 'train.log' situé dans le dossier de l'expérience.",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "Veuillez spécifier l'ID de l'orateur ou du chanteur :",
|
"请指定说话人id": "Veuillez spécifier l'ID de l'orateur ou du chanteur :",
|
||||||
"请选择index文件": "Veuillez sélectionner le fichier d'index",
|
"请选择index文件": "Veuillez sélectionner le fichier d'index",
|
||||||
"请选择pth文件": "Veuillez sélectionner le fichier pth",
|
"请选择pth文件": "Veuillez sélectionner le fichier pth",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "Longueur de l'échantillon",
|
"采样长度": "Longueur de l'échantillon",
|
||||||
"重载设备列表": "Recharger la liste des dispositifs",
|
"重载设备列表": "Recharger la liste des dispositifs",
|
||||||
"音调设置": "Réglages de la hauteur",
|
"音调设置": "Réglages de la hauteur",
|
||||||
"音频设备(请使用同种类驱动)": "Périphérique audio (veuillez utiliser le même type de pilote)",
|
"音频设备": "Périphérique audio",
|
||||||
"音高算法": "algorithme de détection de la hauteur",
|
"音高算法": "algorithme de détection de la hauteur",
|
||||||
"额外推理时长": "Temps d'inférence supplémentaire"
|
"额外推理时长": "Temps d'inférence supplémentaire"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "Versione",
|
"版本": "Versione",
|
||||||
"特征提取": "Estrazione delle caratteristiche",
|
"特征提取": "Estrazione delle caratteristiche",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "Percorso del file di indice delle caratteristiche. ",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "Percorso del file di indice delle caratteristiche. ",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Tonalità +12 consigliata per la conversione da maschio a femmina e tonalità -12 per la conversione da femmina a maschio. ",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Tonalità +12 consigliata per la conversione da maschio a femmina e tonalità -12 per la conversione da femmina a maschio. ",
|
||||||
"目标采样率": "Frequenza di campionamento target:",
|
"目标采样率": "Frequenza di campionamento target:",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "Addestra modello",
|
"训练模型": "Addestra modello",
|
||||||
"训练特征索引": "Addestra indice delle caratteristiche",
|
"训练特征索引": "Addestra indice delle caratteristiche",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Addestramento completato. ",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Addestramento completato. ",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "Si prega di specificare l'ID del locutore/cantante:",
|
"请指定说话人id": "Si prega di specificare l'ID del locutore/cantante:",
|
||||||
"请选择index文件": "请选择index文件",
|
"请选择index文件": "请选择index文件",
|
||||||
"请选择pth文件": "请选择pth 文件",
|
"请选择pth文件": "请选择pth 文件",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "Lunghezza del campione",
|
"采样长度": "Lunghezza del campione",
|
||||||
"重载设备列表": "Ricaricare l'elenco dei dispositivi",
|
"重载设备列表": "Ricaricare l'elenco dei dispositivi",
|
||||||
"音调设置": "Impostazioni del tono",
|
"音调设置": "Impostazioni del tono",
|
||||||
"音频设备(请使用同种类驱动)": "Dispositivo audio (utilizzare lo stesso tipo di driver)",
|
"音频设备": "Dispositivo audio",
|
||||||
"音高算法": "音高算法",
|
"音高算法": "音高算法",
|
||||||
"额外推理时长": "Tempo di inferenza extra"
|
"额外推理时长": "Tempo di inferenza extra"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "バージョン",
|
"版本": "バージョン",
|
||||||
"特征提取": "特徴抽出",
|
"特征提取": "特徴抽出",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "特徴検索ライブラリへのパス 空の場合はドロップダウンで選択",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "特徴検索ライブラリへのパス 空の場合はドロップダウンで選択",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性から女性へは+12キーをお勧めします。女性から男性へは-12キーをお勧めします。音域が広すぎて音質が劣化した場合は、適切な音域に自分で調整してください。",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性から女性へは+12キーをお勧めします。女性から男性へは-12キーをお勧めします。音域が広すぎて音質が劣化した場合は、適切な音域に自分で調整してください。",
|
||||||
"目标采样率": "目標サンプリングレート",
|
"目标采样率": "目標サンプリングレート",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "モデルのトレーニング",
|
"训练模型": "モデルのトレーニング",
|
||||||
"训练特征索引": "特徴インデックスのトレーニング",
|
"训练特征索引": "特徴インデックスのトレーニング",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "トレーニング終了時に、トレーニングログやフォルダ内のtrain.logを確認することができます",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "トレーニング終了時に、トレーニングログやフォルダ内のtrain.logを確認することができます",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "話者IDを指定してください",
|
"请指定说话人id": "話者IDを指定してください",
|
||||||
"请选择index文件": "indexファイルを選択してください",
|
"请选择index文件": "indexファイルを選択してください",
|
||||||
"请选择pth文件": "pthファイルを選択してください",
|
"请选择pth文件": "pthファイルを選択してください",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "サンプル長",
|
"采样长度": "サンプル長",
|
||||||
"重载设备列表": "デバイスリストをリロードする",
|
"重载设备列表": "デバイスリストをリロードする",
|
||||||
"音调设置": "音程設定",
|
"音调设置": "音程設定",
|
||||||
"音频设备(请使用同种类驱动)": "オーディオデバイス(同じ種類のドライバーを使用してください)",
|
"音频设备": "オーディオデバイス",
|
||||||
"音高算法": "ピッチアルゴリズム",
|
"音高算法": "ピッチアルゴリズム",
|
||||||
"额外推理时长": "追加推論時間"
|
"额外推理时长": "追加推論時間"
|
||||||
}
|
}
|
||||||
|
188
i18n/locale/pt_BR.json
Normal file
188
i18n/locale/pt_BR.json
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
{
|
||||||
|
"很遗憾您这没有能用的显卡来支持您训练": "Infelizmente, não há GPU compatível disponível para apoiar o seu treinamento.",
|
||||||
|
"是": "Sim",
|
||||||
|
"step1:正在处理数据": "Etapa 1: Processamento de dados",
|
||||||
|
"step2a:无需提取音高": "Etapa 2a: Ignorando a extração de tom",
|
||||||
|
"step2b:正在提取特征": "Etapa 2b: Extraindo recursos",
|
||||||
|
"step3a:正在训练模型": "Etapa 3a: Treinamento do modelo iniciado",
|
||||||
|
"全流程结束!": "Todos os processos foram concluídos!",
|
||||||
|
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>使用需遵守的协议-LICENSE.txt</b>." :"<center>Este software é de código aberto sob a licença MIT. O autor não tem nenhum controle sobre o software. Os usuários que usam o software e distribuem os sons exportados pelo software são os únicos responsáveis. <br>Se você não concordar com esta cláusula, você não pode usar ou fazer referência a quaisquer códigos e arquivos dentro do pacote de software. Consulte o diretório raiz <a href='https://raw.githubusercontent.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/main/LICENSE' target='_blank'>LICENSE</a> para obter detalhes.</center>",
|
||||||
|
"模型推理": "Inference",
|
||||||
|
"推理音色": "Escolha o seu Modelo:",
|
||||||
|
"刷新音色列表和索引路径": "Atualizar lista de voz e caminho do Index",
|
||||||
|
"卸载音色省显存": "Descarregue a voz para liberar a memória da GPU:",
|
||||||
|
"请选择说话人id": "Selecione Palestrantes/Cantores ID:",
|
||||||
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Recomendado +12 chave para conversão de homem para mulher e -12 chave para conversão de mulher para homem. Se a faixa de som for muito longe e a voz estiver distorcida, você também pode ajustá-la à faixa apropriada por conta própria.",
|
||||||
|
"变调(整数, 半音数量, 升八度12降八度-12)": "Mude o tom aqui. Se a voz for do mesmo sexo, não é necessario alterar (12 caso seja Masculino para feminino, -12 caso seja ao contrário).",
|
||||||
|
"Add audio's name to the path to the audio file to be processed (default is the correct format example) Remove the path to use an audio from the dropdown list:": "Caminho do arquivo de áudio a ser processado (o padrão é o exemplo de formato abaixo):",
|
||||||
|
"Auto detect audio path and select from the dropdown:": "Auto detect audio path and select from the dropdown:",
|
||||||
|
"选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢,rmvpe效果最好且微吃CPU/GPU": "Selecione o algoritmo de extração de tom \n'pm': extração mais rápida, mas discurso de qualidade inferior; \n'harvest': graves melhores, mas extremamente lentos; \n'crepe': melhor qualidade (mas intensivo em GPU);\n rmvpe tem o melhor efeito e consome menos CPU/GPU.",
|
||||||
|
"crepe_hop_length": "Mangio-Crepe Hop Length. Números mais altos reduzirão a chance de mudanças extremas de tom, mas números mais baixos aumentarão a precisão.",
|
||||||
|
"特征检索库文件路径": "Caminho do arquivo do banco de dados de pesquisa de recursos",
|
||||||
|
">=3则使用对harvest音高识别的结果使用中值滤波,数值为滤波半径,使用可以削弱哑音": ">=3, use o filtro mediano para o resultado do reconhecimento do tom da heverst, e o valor é o raio do filtro, que pode enfraquecer o mudo.",
|
||||||
|
"特征检索库文件路径,为空则使用下拉的选择结果": "Caminho para o arquivo de Index. Deixe em branco para usar o resultado selecionado no menu debaixo:",
|
||||||
|
"特征文件路径": "Caminho para o arquivo de feição:",
|
||||||
|
"检索特征占比": "Taxa de recurso de recuperação:",
|
||||||
|
"后处理重采样至最终采样率,0为不进行重采样": "Reamostragem pós-processamento para a taxa de amostragem final, 0 significa sem reamostragem:",
|
||||||
|
"输入源音量包络替换输出音量包络融合比例,越靠近1越使用输出包络": "O envelope de volume da fonte de entrada substitui a taxa de fusão do envelope de volume de saída, quanto mais próximo de 1, mais o envelope de saída é usado:",
|
||||||
|
"保护清辅音和呼吸声,防止电音撕裂等artifact,拉满0.5不开启,调低加大保护力度但可能降低索引效果": "Proteja consoantes sem voz e sons respiratórios, evite artefatos como quebra de som eletrônico e desligue-o quando estiver cheio de 0,5. Diminua-o para aumentar a proteção, mas pode reduzir o efeito de indexação:",
|
||||||
|
"F0曲线文件, 可选, 一行一个音高, 代替默认F0及升降调": "Arquivo de curva F0 (opcional). Um arremesso por linha. Substitui a modulação padrão F0 e tom:",
|
||||||
|
"转换": "Converter",
|
||||||
|
"输出信息": "Informação de saída",
|
||||||
|
"输出音频(右下角三个点,点了可以下载)": "Exportar áudio (clique nos três pontos no canto inferior direito para baixar)",
|
||||||
|
"批量转换, 输入待转换音频文件夹, 或上传多个音频文件, 在指定文件夹(默认opt)下输出转换的音频. ": "Conversão em Massa.",
|
||||||
|
"指定输出文件夹": "Especifique a pasta de saída:",
|
||||||
|
"输入待处理音频文件夹路径(去文件管理器地址栏拷就行了)": "Caminho da pasta de áudio a ser processada (copie-o da barra de endereços do gerenciador de arquivos):",
|
||||||
|
"也可批量输入音频文件, 二选一, 优先读文件夹": "Você também pode inserir arquivos de áudio em lotes. Escolha uma das duas opções. É dada prioridade à leitura da pasta.",
|
||||||
|
"导出文件格式": "Qual formato de arquivo você prefere?",
|
||||||
|
"伴奏人声分离&去混响&去回声": "UVR5",
|
||||||
|
"输入待处理音频文件夹路径": "Caminho da pasta de áudio a ser processada:",
|
||||||
|
"模型": "Modelo",
|
||||||
|
"指定输出主人声文件夹": "Especifique a pasta de saída para vocais:",
|
||||||
|
"指定输出非主人声文件夹": "Informar a pasta de saída para acompanhamento:",
|
||||||
|
"训练": "Treinar",
|
||||||
|
"step1: 填写实验配置. 实验数据放在logs下, 每个实验一个文件夹, 需手工输入实验名路径, 内含实验配置, 日志, 训练得到的模型文件. ": "Etapa 1: Preencha a configuração experimental. Os dados experimentais são armazenados na pasta 'logs', com cada experimento tendo uma pasta separada. Digite manualmente o caminho do nome do experimento, que contém a configuração experimental, os logs e os arquivos de modelo treinados.",
|
||||||
|
"输入实验名": "Nome da voz:",
|
||||||
|
"目标采样率": "Taxa de amostragem:",
|
||||||
|
"模型是否带音高指导(唱歌一定要, 语音可以不要)": "Se o modelo tem orientação de tom (necessário para cantar, opcional para fala):",
|
||||||
|
"版本": "Versão",
|
||||||
|
"提取音高和处理数据使用的CPU进程数": "Número de processos de CPU usados para extração de tom e processamento de dados:",
|
||||||
|
"step2a: 自动遍历训练文件夹下所有可解码成音频的文件并进行切片归一化, 在实验目录下生成2个wav文件夹; 暂时只支持单人训练. ": "Etapa 2a: Percorra automaticamente todos os arquivos na pasta de treinamento que podem ser decodificados em áudio e execute a normalização da fatia. Gera 2 pastas wav no diretório do experimento. Atualmente, apenas o treinamento de um único cantor/palestrante é suportado.",
|
||||||
|
"输入训练文件夹路径": "Caminho da pasta de treinamento:",
|
||||||
|
"请指定说话人id": "Especifique o ID do locutor/cantor:",
|
||||||
|
"处理数据": "Processar o Conjunto de Dados",
|
||||||
|
"step2b: 使用CPU提取音高(如果模型带音高), 使用GPU提取特征(选择卡号)": "Etapa 2b: Use a CPU para extrair o tom (se o modelo tiver tom), use a GPU para extrair recursos (selecione o índice da GPU):",
|
||||||
|
"以-分隔输入使用的卡号, 例如 0-1-2 使用卡0和卡1和卡2": "Digite o (s) índice(s) da GPU separados por '-', por exemplo, 0-1-2 para usar a GPU 0, 1 e 2:",
|
||||||
|
"显卡信息": "Informações da GPU",
|
||||||
|
"选择音高提取算法:输入歌声可用pm提速,高质量语音但CPU差可用dio提速,harvest质量更好但慢": "Selecione o algoritmo de extração de tom ('pm': extração mais rápida, mas fala de baixa qualidade; 'dio': fala melhorada, mas extração mais lenta; 'harvest': melhor qualidade, mas extração mais lenta):",
|
||||||
|
"特征提取": "Extrair Tom",
|
||||||
|
"step3: 填写训练设置, 开始训练模型和索引": "Etapa 3: Preencha as configurações de treinamento e comece a treinar o modelo e o Index",
|
||||||
|
"保存频率save_every_epoch": "Faça backup a cada # de Epoch:",
|
||||||
|
"总训练轮数total_epoch": "Número total de ciclos(epoch) de treino (se escolher um valor alto demais, o seu modelo parecerá terrivelmente sobretreinado):",
|
||||||
|
"每张显卡的batch_size": "Batch Size (DEIXE COMO ESTÁ a menos que saiba o que está fazendo, no Colab pode deixar até 20!):",
|
||||||
|
"是否仅保存最新的ckpt文件以节省硬盘空间": "Só deve salvar apenas o arquivo ckpt mais recente para economizar espaço em disco:",
|
||||||
|
"否": "Não",
|
||||||
|
"是否缓存所有训练集至显存. 10min以下小数据可缓存以加速训练, 大数据缓存会炸显存也加不了多少速": "Se deve armazenar em cache todos os conjuntos de treinamento na memória de vídeo. Pequenos dados com menos de 10 minutos podem ser armazenados em cache para acelerar o treinamento, e um cache de dados grande irá explodir a memória de vídeo e não aumentar muito a velocidade:",
|
||||||
|
"是否在每次保存时间点将最终小模型保存至weights文件夹": "Salve um pequeno modelo final na pasta 'weights' em cada ponto de salvamento:",
|
||||||
|
"加载预训练底模G路径": "Carregue o caminho G do modelo base pré-treinado:",
|
||||||
|
"加载预训练底模D路径": "Carregue o caminho D do modelo base pré-treinado:",
|
||||||
|
"训练模型": "Treinar Modelo",
|
||||||
|
"训练特征索引": "Treinar Index",
|
||||||
|
"一键训练": "Treinamento com um clique",
|
||||||
|
"ckpt处理": "processamento ckpt",
|
||||||
|
"模型融合, 可用于测试音色融合": "A fusão modelo, pode ser usada para testar a fusão do timbre",
|
||||||
|
"A模型路径": "Caminho para o Modelo A:",
|
||||||
|
"B模型路径": "Caminho para o Modelo B:",
|
||||||
|
"A模型权重": "Peso (w) para o modelo A:",
|
||||||
|
"模型是否带音高指导": "Se o modelo tem orientação de tom:",
|
||||||
|
"要置入的模型信息": "Informações do modelo a ser colocado:",
|
||||||
|
"保存的模型名不带后缀": "Nome do modelo salvo (sem extensão):",
|
||||||
|
"模型版本型号": "Versão:",
|
||||||
|
"融合": "Fusão",
|
||||||
|
"修改模型信息(仅支持weights文件夹下提取的小模型文件)": "Modificar informações do modelo (suportado apenas para arquivos de modelo pequenos extraídos da pasta 'weights')",
|
||||||
|
"模型路径": "Caminho para o Modelo:",
|
||||||
|
"要改的模型信息": "Informações do modelo a ser modificado:",
|
||||||
|
"保存的文件名, 默认空为和源文件同名": "Salvar nome do arquivo (padrão: igual ao arquivo de origem):",
|
||||||
|
"修改": "Editar",
|
||||||
|
"查看模型信息(仅支持weights文件夹下提取的小模型文件)": "Exibir informações do modelo (suportado apenas para arquivos de modelo pequenos extraídos da pasta 'weights')",
|
||||||
|
"查看": "Visualizar",
|
||||||
|
"模型提取(输入logs文件夹下大文件模型路径),适用于训一半不想训了模型没有自动提取保存小文件模型,或者想测试中间模型的情况": "Extração do modelo (insira o caminho do modelo de arquivo grande na pasta 'logs'). Isso é útil se você quiser interromper o treinamento no meio do caminho e extrair e salvar manualmente um arquivo de modelo pequeno, ou se quiser testar um modelo intermediário:",
|
||||||
|
"保存名": "Salvar nome",
|
||||||
|
"模型是否带音高指导,1是0否": "Se o modelo tem orientação de passo (1: sim, 0: não):",
|
||||||
|
"提取": "Extrato",
|
||||||
|
"Onnx导出": "Exportar Onnx",
|
||||||
|
"RVC模型路径": "Caminho do Modelo RVC:",
|
||||||
|
"Onnx输出路径": "Caminho de exportação ONNX:",
|
||||||
|
"MoeVS模型": "Modelo MoeVS",
|
||||||
|
"导出Onnx模型": "Exportar Modelo Onnx",
|
||||||
|
"常见问题解答": "FAQ (Perguntas frequentes)",
|
||||||
|
"招募音高曲线前端编辑器": "Recrutamento de editores front-end para curvas de tom",
|
||||||
|
"加开发群联系我xxxxx": "Junte-se ao grupo de desenvolvimento e entre em contato comigo em xxxxx",
|
||||||
|
"点击查看交流、问题反馈群号": "Clique para ver o número do grupo de comunicação e feedback do problema",
|
||||||
|
"xxxxx": "xxxxx",
|
||||||
|
"加载模型": "Modelo",
|
||||||
|
"Hubert模型": "Modelo Hubert",
|
||||||
|
"选择.pth文件": "Selecione o Arquivo",
|
||||||
|
"选择.index文件": "Selecione o Index",
|
||||||
|
"选择.npy文件": "Selecione o Arquivo",
|
||||||
|
"输入设备": "Dispositivo de entrada",
|
||||||
|
"输出设备": "Dispositivo de saída",
|
||||||
|
"音频设备(请使用同种类驱动)": "Dispositivo de áudio (use o mesmo tipo de driver)",
|
||||||
|
"响应阈值": "Limiar de resposta",
|
||||||
|
"音调设置": "Configurações de tom",
|
||||||
|
"Index Rate": "Taxa do Index",
|
||||||
|
"常规设置": "Configurações gerais",
|
||||||
|
"采样长度": "Comprimento da Amostra",
|
||||||
|
"淡入淡出长度": "Comprimento de desvanecimento",
|
||||||
|
"额外推理时长": "Tempo extra de inferência",
|
||||||
|
"输入降噪": "Redução de ruído de entrada",
|
||||||
|
"输出降噪": "Redução de ruído de saída",
|
||||||
|
"性能设置": "Configurações de desempenho.",
|
||||||
|
"开始音频转换": "Iniciar conversão de áudio",
|
||||||
|
"停止音频转换": "Conversão de áudio",
|
||||||
|
"推理时间(ms):": "Tempo de inferência (ms):",
|
||||||
|
"人声伴奏分离批量处理, 使用UVR5模型。 <br>合格的文件夹路径格式举例: E:\\codes\\py39\\vits_vc_gpu\\白鹭霜华测试样例(去文件管理器地址栏拷就行了)。 <br>模型分为三类: <br>1、保留人声:不带和声的音频选这个,对主人声保留比HP5更好。内置HP2和HP3两个模型,HP3可能轻微漏伴奏但对主人声保留比HP2稍微好一丁点; <br>2、仅保留主人声:带和声的音频选这个,对主人声可能有削弱。内置HP5一个模型; <br> 3、去混响、去延迟模型(by FoxJoy):<br> (1)MDX-Net(onnx_dereverb):对于双通道混响是最好的选择,不能去除单通道混响;<br> (234)DeEcho:去除延迟效果。Aggressive比Normal去除得更彻底,DeReverb额外去除混响,可去除单声道混响,但是对高频重的板式混响去不干净。<br>去混响/去延迟,附:<br>1、DeEcho-DeReverb模型的耗时是另外2个DeEcho模型的接近2倍;<br>2、MDX-Net-Dereverb模型挺慢的;<br>3、个人推荐的最干净的配置是先MDX-Net再DeEcho-Aggressive。":"Processamento em lote para separação de acompanhamento vocal usando o modelo UVR5.<br>Exemplo de um formato de caminho de pasta válido: D:\\caminho\\para a pasta\\entrada\\ (copie-o da barra de endereços do gerenciador de arquivos).<br>O modelo é dividido em três categorias:<br>1. Preservar vocais: Escolha esta opção para áudio sem harmonias. Ele preserva os vocais melhor do que o HP5. Inclui dois modelos integrados: HP2 e HP3. O HP3 pode vazar ligeiramente o acompanhamento, mas preserva os vocais um pouco melhor do que o HP2.<br>2 Preservar apenas os vocais principais: Escolha esta opção para áudio com harmonias. Isso pode enfraquecer os vocais principais. Ele inclui um modelo embutido: HP5.<br>3. Modelos de de-reverb e de-delay (por FoxJoy):<br> (1) MDX-Net: A melhor escolha para remoção de reverb estéreo, mas não pode remover reverb mono;<br> (234) DeEcho: Remove efeitos de atraso. O modo agressivo remove mais completamente do que o modo normal. O DeReverb também remove reverb e pode remover reverb mono, mas não de forma muito eficaz para conteúdo de alta frequência fortemente reverberado.<br>Notas de de-reverb/de-delay:<br>1. O tempo de processamento para o modelo DeEcho-DeReverb é aproximadamente duas vezes maior que os outros dois modelos DeEcho.<br>2 O modelo MDX-Net-Dereverb é bastante lento.<br>3. A configuração mais limpa recomendada é aplicar MDX-Net primeiro e depois DeEcho-Aggressive.",
|
||||||
|
"本软件以MIT协议开源, 作者不对软件具备任何控制力, 使用软件者、传播软件导出的声音者自负全责. <br>如不认可该条款, 则不能使用或引用软件包内任何代码和文件. 详见根目录<b>LICENSE</b>.": "<center>The Mangio-RVC 💻 | Tradução por Krisp e Rafael Godoy Ebert | AI HUB BRASIL<br> Este software é de código aberto sob a licença MIT. O autor não tem qualquer controle sobre o software. Aqueles que usam o software e divulgam os sons exportados pelo software são totalmente responsáveis. <br>Se você não concorda com este termo, você não pode usar ou citar nenhum código e arquivo no pacote de software. Para obter detalhes, consulte o diretório raiz <b>O acordo a ser seguido para uso <a href='https://raw.githubusercontent.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/main/LICENSE' target='_blank'>LICENSE</a></b></center>",
|
||||||
|
"mi-test": "Minha-Voz",
|
||||||
|
"You need to upload an audio": "Você precisa enviar um áudio",
|
||||||
|
"Using index:%s.": "Usando index:%s.",
|
||||||
|
"Index not used.": "Index não utilizado.",
|
||||||
|
"Success.\n %s\nTime:\n npy:%ss, f0:%ss, infer:%ss": "Sucesso.<br> %s<br>Tempo:<br> npy:%ss, f0:%ss, inferir:%ss",
|
||||||
|
"not exist, will not use pretrained model": "Não existe, não usará o modelo pré-treinado",
|
||||||
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Após o término do treinamento, você pode verificar o log de treinamento do console ou train.log na pasta de experimentos",
|
||||||
|
"请先进行特征提取!": "Execute a extração de recursos primeiro!",
|
||||||
|
"Trying doing kmeans %s shape to 10k centers.": "Tentando fazer a forma kmeans %s para 10k centros.",
|
||||||
|
"成功构建索引,added_IVF%s_Flat_nprobe_%s_%s_%s.index": "Index criado com sucesso, adicionado_IVF%s_Flat_nprobe_%s_%s_%s.index",
|
||||||
|
"step2a:正在提取音高": "step2a: extraindo tom",
|
||||||
|
"training index": "treinando index",
|
||||||
|
"adding index": "adicionando index",
|
||||||
|
"成功构建索引, added_IVF%s_Flat_nprobe_%s_%s_%s.index": "Index criado com sucesso, added_IVF%s_Flat_nprobe_%s_%s_%s.index",
|
||||||
|
"E:\\codes\\py39\\test-20230416b\\todo-songs": "E:\\todos-meus-audios",
|
||||||
|
"E:\\语音音频+标注\\米津玄师\\src": "E:\\meu-dataset",
|
||||||
|
"人声提取激进程度": "Agressividade da extração vocal",
|
||||||
|
"[EXPERIMENTAL] Formant shift inference audio": "[EXPERIMENTAL] Áudio para inferência de mudança de formantes",
|
||||||
|
"Used for male to female and vice-versa conversions": "Usado para conversões de homem para mulher e vice-versa",
|
||||||
|
"browse presets for formanting": "procurar predefinições para formatação",
|
||||||
|
"Quefrency for formant shifting": "Quefrency para mudança de formante",
|
||||||
|
"Timbre for formant shifting": "Timbre para mudança de formante",
|
||||||
|
"自动检测index路径,下拉式选择(dropdown)": "Detecte automaticamente o caminho do Index e selecione no menu suspenso:",
|
||||||
|
"Stop Training": "Parar de Treinar",
|
||||||
|
"Whether the model has pitch guidance.": "Se o modelo tem orientação de inclinação.",
|
||||||
|
"Whether to save only the latest .ckpt file to save hard drive space": "Se deve salvar apenas o arquivo .ckpt mais recente para economizar espaço no disco rígido",
|
||||||
|
"Cache all training sets to GPU memory. Caching small datasets (less than 10 minutes) can speed up training, but caching large datasets will consume a lot of GPU memory and may not provide much speed improvement": "Armazene em cache todos os conjuntos de treinamento na memória da GPU. O armazenamento em cache de pequenos conjuntos de dados (menos de 10 minutos) pode acelerar o treinamento, mas o armazenamento em cache de grandes conjuntos de dados consome muita memória da GPU e pode não fornecer muita melhoria de velocidade",
|
||||||
|
"Save a small final model to the 'weights' folder at each save point": "Salve um pequeno modelo final na pasta 'pesos' em cada ponto de salvamento",
|
||||||
|
"Path to your model A.": "Caminho para o seu modelo A.",
|
||||||
|
"Path to your model B.": "Caminho para o seu modelo B.",
|
||||||
|
"Path to your Model.": "Caminho para o seu modelo.",
|
||||||
|
"Model information to be changed.": "Informações do modelo a serem alteradas.",
|
||||||
|
"Name for saving.": "Nome para salvar.",
|
||||||
|
"Either leave empty or put in the Name of the Model to be saved.": "Deixe em branco ou coloque o Nome do Modelo a ser salvo.",
|
||||||
|
"Model path here.": "Caminho do modelo aqui.",
|
||||||
|
"Your filename here.": "Seu nome de arquivo aqui.",
|
||||||
|
"Model info here.": "Informações do modelo aqui.",
|
||||||
|
"RVC model path.": "Caminho do modelo RVC.",
|
||||||
|
"Onnx model output path.": "Caminho de saída do modelo Onnx.",
|
||||||
|
"Default value is 1.0": "O valor padrão é 1,0",
|
||||||
|
"Apply": "Aplicar",
|
||||||
|
"单次推理": "Único",
|
||||||
|
"rmvpe卡号配置:以-分隔输入使用的不同进程卡号,例如0-0-1使用在卡0上跑2个进程并在卡1上跑1个进程": "Configuração do número do cartão rmvpe: Use - para separar os números dos cartões de entrada de diferentes processos. Por exemplo, 0-0-1 é usado para executar 2 processos no cartão 0 e 1 processo no cartão 1.",
|
||||||
|
"选择音高提取算法,输入歌声可用pm提速,harvest低音好但巨慢无比,crepe效果好但吃GPU,rmvpe效果最好且微吃GPU": "Selecione o algoritmo de extração de tom \n'pm': extração mais rápida, mas discurso de qualidade inferior; \n'harvest': graves melhores, mas extremamente lentos; \n'harvest': melhor qualidade, mas extração mais lenta); 'crepe': melhor qualidade, mas intensivo em GPU; 'magio-crepe': melhor opção; 'RMVPE': um modelo robusto para estimativa de afinação vocal em música polifônica;",
|
||||||
|
"输入待处理音频文件路径(默认是正确格式示例)": "Caminho para o seu conjunto de dados (áudios, não zipado):",
|
||||||
|
"批量推理": "Conversão em Lote",
|
||||||
|
"重载设备列表": "Recarregar lista de dispositivos",
|
||||||
|
"harvest进程数": "Número de processos harvest",
|
||||||
|
"输入监听": "Monitoramento de entrada",
|
||||||
|
"输出变声": "Mudança de voz de saída",
|
||||||
|
"算法延迟(ms)": "Atraso do algoritmo(ms)",
|
||||||
|
"请选择pth文件": "Selecione o arquivo pth",
|
||||||
|
"请选择index文件": "Selecione o arquivo de Index",
|
||||||
|
"pth文件路径不可包含中文": "o caminho do arquivo pth não pode conter caracteres chineses",
|
||||||
|
"index文件路径不可包含中文": "O caminho do arquivo de Index não pode conter caracteres chineses",
|
||||||
|
"接受音频输入": "Aceitar entrada de áudio",
|
||||||
|
"音频处理": "Processamento de áudio",
|
||||||
|
"获取设备列表": "Obtenha lista de dispositivos",
|
||||||
|
"设置输出设备": "Configurar dispositivo de saída",
|
||||||
|
"音高算法": "Algoritmo de detecção de pitch",
|
||||||
|
"算法延迟(ms):": "Atrasos algorítmicos (ms):",
|
||||||
|
"响度因子": "Fator de volume"
|
||||||
|
}
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "Версия архитектуры модели:",
|
"版本": "Версия архитектуры модели:",
|
||||||
"特征提取": "Извлечь черты",
|
"特征提取": "Извлечь черты",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "Путь к файлу индекса черт. Оставьте пустым, чтобы использовать выбранный вариант из списка ниже:",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "Путь к файлу индекса черт. Оставьте пустым, чтобы использовать выбранный вариант из списка ниже:",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Рекомендуется выбрать +12 для конвертирования мужского голоса в женский и -12 для конвертирования женского в мужской. Если диапазон голоса слишком велик, и голос искажается, можно выбрать значение на свой вкус.",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Рекомендуется выбрать +12 для конвертирования мужского голоса в женский и -12 для конвертирования женского в мужской. Если диапазон голоса слишком велик, и голос искажается, можно выбрать значение на свой вкус.",
|
||||||
"目标采样率": "Частота дискретизации аудио:",
|
"目标采样率": "Частота дискретизации аудио:",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "Обучить модель",
|
"训练模型": "Обучить модель",
|
||||||
"训练特征索引": "Обучить индекс черт",
|
"训练特征索引": "Обучить индекс черт",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Обучение модели завершено. Журнал обучения можно просмотреть в консоли или в файле 'train.log' в папке с моделью.",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Обучение модели завершено. Журнал обучения можно просмотреть в консоли или в файле 'train.log' в папке с моделью.",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "Номер говорящего/поющего:",
|
"请指定说话人id": "Номер говорящего/поющего:",
|
||||||
"请选择index文件": "Пожалуйста, выберите файл индекса",
|
"请选择index文件": "Пожалуйста, выберите файл индекса",
|
||||||
"请选择pth文件": "Пожалуйста, выберите файл pth",
|
"请选择pth文件": "Пожалуйста, выберите файл pth",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "Длина сэмпла",
|
"采样长度": "Длина сэмпла",
|
||||||
"重载设备列表": "Обновить список устройств",
|
"重载设备列表": "Обновить список устройств",
|
||||||
"音调设置": "Настройка высоты звука",
|
"音调设置": "Настройка высоты звука",
|
||||||
"音频设备(请使用同种类驱动)": "Аудиоустройство (пожалуйста, используйте такой же тип драйвера)",
|
"音频设备": "Аудиоустройство",
|
||||||
"音高算法": "Алгоритм оценки высоты звука",
|
"音高算法": "Алгоритм оценки высоты звука",
|
||||||
"额外推理时长": "Доп. время переработки"
|
"额外推理时长": "Доп. время переработки"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "Sürüm",
|
"版本": "Sürüm",
|
||||||
"特征提取": "Özellik çıkartma",
|
"特征提取": "Özellik çıkartma",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "Özellik indeksi dosyasının yolunu belirtin. Seçilen sonucu kullanmak için boş bırakın veya açılır menüden seçim yapın.",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "Özellik indeksi dosyasının yolunu belirtin. Seçilen sonucu kullanmak için boş bırakın veya açılır menüden seçim yapın.",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Erkekten kadına çevirmek için +12 tuş önerilir, kadından erkeğe çevirmek için ise -12 tuş önerilir. Eğer ses aralığı çok fazla genişler ve ses bozulursa, isteğe bağlı olarak uygun aralığa kendiniz de ayarlayabilirsiniz.",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "Erkekten kadına çevirmek için +12 tuş önerilir, kadından erkeğe çevirmek için ise -12 tuş önerilir. Eğer ses aralığı çok fazla genişler ve ses bozulursa, isteğe bağlı olarak uygun aralığa kendiniz de ayarlayabilirsiniz.",
|
||||||
"目标采样率": "Hedef örnekleme oranı:",
|
"目标采样率": "Hedef örnekleme oranı:",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "Modeli Eğit",
|
"训练模型": "Modeli Eğit",
|
||||||
"训练特征索引": "Özellik Dizinini Eğit",
|
"训练特征索引": "Özellik Dizinini Eğit",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Eğitim tamamlandı. Eğitim günlüklerini konsolda veya deney klasörü altındaki train.log dosyasında kontrol edebilirsiniz.",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "Eğitim tamamlandı. Eğitim günlüklerini konsolda veya deney klasörü altındaki train.log dosyasında kontrol edebilirsiniz.",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "Lütfen konuşmacı/sanatçı no belirtin:",
|
"请指定说话人id": "Lütfen konuşmacı/sanatçı no belirtin:",
|
||||||
"请选择index文件": "Lütfen .index dosyası seçin",
|
"请选择index文件": "Lütfen .index dosyası seçin",
|
||||||
"请选择pth文件": "Lütfen .pth dosyası seçin",
|
"请选择pth文件": "Lütfen .pth dosyası seçin",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "Örnekleme uzunluğu",
|
"采样长度": "Örnekleme uzunluğu",
|
||||||
"重载设备列表": "Cihaz listesini yeniden yükle",
|
"重载设备列表": "Cihaz listesini yeniden yükle",
|
||||||
"音调设置": "Pitch ayarları",
|
"音调设置": "Pitch ayarları",
|
||||||
"音频设备(请使用同种类驱动)": "Ses cihazı (aynı tür sürücüyü kullanın)",
|
"音频设备": "Ses cihazı",
|
||||||
"音高算法": "音高算法",
|
"音高算法": "音高算法",
|
||||||
"额外推理时长": "Ekstra çıkartma süresi"
|
"额外推理时长": "Ekstra çıkartma süresi"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "版本",
|
"版本": "版本",
|
||||||
"特征提取": "特征提取",
|
"特征提取": "特征提取",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "特征检索库文件路径,为空则使用下拉的选择结果",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ",
|
||||||
"目标采样率": "目标采样率",
|
"目标采样率": "目标采样率",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "训练模型",
|
"训练模型": "训练模型",
|
||||||
"训练特征索引": "训练特征索引",
|
"训练特征索引": "训练特征索引",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "请指定说话人id",
|
"请指定说话人id": "请指定说话人id",
|
||||||
"请选择index文件": "请选择index文件",
|
"请选择index文件": "请选择index文件",
|
||||||
"请选择pth文件": "请选择pth文件",
|
"请选择pth文件": "请选择pth文件",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "采样长度",
|
"采样长度": "采样长度",
|
||||||
"重载设备列表": "重载设备列表",
|
"重载设备列表": "重载设备列表",
|
||||||
"音调设置": "音调设置",
|
"音调设置": "音调设置",
|
||||||
"音频设备(请使用同种类驱动)": "音频设备(请使用同种类驱动)",
|
"音频设备": "音频设备",
|
||||||
"音高算法": "音高算法",
|
"音高算法": "音高算法",
|
||||||
"额外推理时长": "额外推理时长"
|
"额外推理时长": "额外推理时长"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "版本",
|
"版本": "版本",
|
||||||
"特征提取": "特徵提取",
|
"特征提取": "特徵提取",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。",
|
||||||
"目标采样率": "目標取樣率",
|
"目标采样率": "目標取樣率",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "訓練模型",
|
"训练模型": "訓練模型",
|
||||||
"训练特征索引": "訓練特徵索引",
|
"训练特征索引": "訓練特徵索引",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "請指定說話人id",
|
"请指定说话人id": "請指定說話人id",
|
||||||
"请选择index文件": "请选择index文件",
|
"请选择index文件": "请选择index文件",
|
||||||
"请选择pth文件": "请选择pth文件",
|
"请选择pth文件": "请选择pth文件",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "取樣長度",
|
"采样长度": "取樣長度",
|
||||||
"重载设备列表": "重載設備列表",
|
"重载设备列表": "重載設備列表",
|
||||||
"音调设置": "音調設定",
|
"音调设置": "音調設定",
|
||||||
"音频设备(请使用同种类驱动)": "音訊設備 (請使用同種類驅動)",
|
"音频设备": "音訊設備",
|
||||||
"音高算法": "音高演算法",
|
"音高算法": "音高演算法",
|
||||||
"额外推理时长": "額外推理時長"
|
"额外推理时长": "額外推理時長"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "版本",
|
"版本": "版本",
|
||||||
"特征提取": "特徵提取",
|
"特征提取": "特徵提取",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。",
|
||||||
"目标采样率": "目標取樣率",
|
"目标采样率": "目標取樣率",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "訓練模型",
|
"训练模型": "訓練模型",
|
||||||
"训练特征索引": "訓練特徵索引",
|
"训练特征索引": "訓練特徵索引",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "請指定說話人id",
|
"请指定说话人id": "請指定說話人id",
|
||||||
"请选择index文件": "请选择index文件",
|
"请选择index文件": "请选择index文件",
|
||||||
"请选择pth文件": "请选择pth文件",
|
"请选择pth文件": "请选择pth文件",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "取樣長度",
|
"采样长度": "取樣長度",
|
||||||
"重载设备列表": "重載設備列表",
|
"重载设备列表": "重載設備列表",
|
||||||
"音调设置": "音調設定",
|
"音调设置": "音調設定",
|
||||||
"音频设备(请使用同种类驱动)": "音訊設備 (請使用同種類驅動)",
|
"音频设备": "音訊設備",
|
||||||
"音高算法": "音高演算法",
|
"音高算法": "音高演算法",
|
||||||
"额外推理时长": "額外推理時長"
|
"额外推理时长": "額外推理時長"
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,7 @@
|
|||||||
"版本": "版本",
|
"版本": "版本",
|
||||||
"特征提取": "特徵提取",
|
"特征提取": "特徵提取",
|
||||||
"特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果",
|
"特征检索库文件路径,为空则使用下拉的选择结果": "特徵檢索庫檔路徑,為空則使用下拉的選擇結果",
|
||||||
|
"独占 WASAPI 设备": "独占 WASAPI 设备",
|
||||||
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。",
|
"男转女推荐+12key, 女转男推荐-12key, 如果音域爆炸导致音色失真也可以自己调整到合适音域. ": "男性轉女性推薦+12key,女性轉男性推薦-12key,如果音域爆炸導致音色失真也可以自己調整到合適音域。",
|
||||||
"目标采样率": "目標取樣率",
|
"目标采样率": "目標取樣率",
|
||||||
"算法延迟(ms):": "算法延迟(ms):",
|
"算法延迟(ms):": "算法延迟(ms):",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"训练模型": "訓練模型",
|
"训练模型": "訓練模型",
|
||||||
"训练特征索引": "訓練特徵索引",
|
"训练特征索引": "訓練特徵索引",
|
||||||
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
"训练结束, 您可查看控制台训练日志或实验文件夹下的train.log": "训练结束, 您可查看控制台训练日志或实验文件夹下的train.log",
|
||||||
|
"设备类型": "设备类型",
|
||||||
"请指定说话人id": "請指定說話人id",
|
"请指定说话人id": "請指定說話人id",
|
||||||
"请选择index文件": "请选择index文件",
|
"请选择index文件": "请选择index文件",
|
||||||
"请选择pth文件": "请选择pth文件",
|
"请选择pth文件": "请选择pth文件",
|
||||||
@ -129,7 +131,7 @@
|
|||||||
"采样长度": "取樣長度",
|
"采样长度": "取樣長度",
|
||||||
"重载设备列表": "重載設備列表",
|
"重载设备列表": "重載設備列表",
|
||||||
"音调设置": "音調設定",
|
"音调设置": "音調設定",
|
||||||
"音频设备(请使用同种类驱动)": "音訊設備 (請使用同種類驅動)",
|
"音频设备": "音訊設備",
|
||||||
"音高算法": "音高演算法",
|
"音高算法": "音高演算法",
|
||||||
"额外推理时长": "額外推理時長"
|
"额外推理时长": "額外推理時長"
|
||||||
}
|
}
|
||||||
|
@ -104,10 +104,11 @@ def main():
|
|||||||
os.environ["MASTER_ADDR"] = "localhost"
|
os.environ["MASTER_ADDR"] = "localhost"
|
||||||
os.environ["MASTER_PORT"] = str(randint(20000, 55555))
|
os.environ["MASTER_PORT"] = str(randint(20000, 55555))
|
||||||
children = []
|
children = []
|
||||||
|
logger = utils.get_logger(hps.model_dir)
|
||||||
for i in range(n_gpus):
|
for i in range(n_gpus):
|
||||||
subproc = mp.Process(
|
subproc = mp.Process(
|
||||||
target=run,
|
target=run,
|
||||||
args=(i, n_gpus, hps),
|
args=(i, n_gpus, hps, logger),
|
||||||
)
|
)
|
||||||
children.append(subproc)
|
children.append(subproc)
|
||||||
subproc.start()
|
subproc.start()
|
||||||
@ -116,14 +117,10 @@ def main():
|
|||||||
children[i].join()
|
children[i].join()
|
||||||
|
|
||||||
|
|
||||||
def run(
|
def run(rank, n_gpus, hps, logger: logging.Logger):
|
||||||
rank,
|
|
||||||
n_gpus,
|
|
||||||
hps,
|
|
||||||
):
|
|
||||||
global global_step
|
global global_step
|
||||||
if rank == 0:
|
if rank == 0:
|
||||||
logger = utils.get_logger(hps.model_dir)
|
# logger = utils.get_logger(hps.model_dir)
|
||||||
logger.info(hps)
|
logger.info(hps)
|
||||||
# utils.check_git_hash(hps.model_dir)
|
# utils.check_git_hash(hps.model_dir)
|
||||||
writer = SummaryWriter(log_dir=hps.model_dir)
|
writer = SummaryWriter(log_dir=hps.model_dir)
|
||||||
|
@ -1,566 +1,81 @@
|
|||||||
#!/bin/bash
|
#!/bin/sh
|
||||||
|
|
||||||
echo working dir is $(pwd)
|
printf "working dir is %s\n" "$PWD"
|
||||||
echo downloading requirement aria2 check.
|
echo "downloading requirement aria2 check."
|
||||||
|
|
||||||
if command -v aria2c &> /dev/null
|
if command -v aria2c > /dev/null 2>&1
|
||||||
then
|
then
|
||||||
echo "aria2c command found"
|
echo "aria2 command found"
|
||||||
else
|
else
|
||||||
echo failed. please install aria2
|
echo "failed. please install aria2"
|
||||||
sleep 5
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
d32="f0D32k.pth"
|
echo "dir check start."
|
||||||
d40="f0D40k.pth"
|
|
||||||
d48="f0D48k.pth"
|
|
||||||
g32="f0G32k.pth"
|
|
||||||
g40="f0G40k.pth"
|
|
||||||
g48="f0G48k.pth"
|
|
||||||
|
|
||||||
d40v2="f0D40k.pth"
|
check_dir() {
|
||||||
g40v2="f0G40k.pth"
|
[ -d "$1" ] && printf "dir %s checked\n" "$1" || \
|
||||||
|
printf "failed. generating dir %s\n" "$1" && mkdir -p "$1"
|
||||||
|
}
|
||||||
|
|
||||||
dld32="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D32k.pth"
|
check_dir "./assets/pretrained"
|
||||||
dld40="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D40k.pth"
|
check_dir "./assets/pretrained_v2"
|
||||||
dld48="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D48k.pth"
|
check_dir "./assets/uvr5_weights"
|
||||||
dlg32="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G32k.pth"
|
check_dir "./assets/uvr5_weights/onnx_dereverb_By_FoxJoy"
|
||||||
dlg40="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G40k.pth"
|
|
||||||
dlg48="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G48k.pth"
|
|
||||||
|
|
||||||
dld40v2="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D40k.pth"
|
echo "dir check finished."
|
||||||
dlg40v2="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G40k.pth"
|
|
||||||
|
|
||||||
hp2_all="HP2_all_vocals.pth"
|
echo "required files check start."
|
||||||
hp3_all="HP3_all_vocals.pth"
|
check_file_pretrained() {
|
||||||
hp5_only="HP5_only_main_vocal.pth"
|
printf "checking %s\n" "$2"
|
||||||
VR_DeEchoAggressive="VR-DeEchoAggressive.pth"
|
if [ -f "./assets/""$1""/""$2""" ]; then
|
||||||
VR_DeEchoDeReverb="VR-DeEchoDeReverb.pth"
|
printf "%s in ./assets/%s checked.\n" "$2" "$1"
|
||||||
VR_DeEchoNormal="VR-DeEchoNormal.pth"
|
else
|
||||||
onnx_dereverb="vocals.onnx"
|
echo failed. starting download from huggingface.
|
||||||
rmvpe="rmvpe.pt"
|
if command -v aria2c > /dev/null 2>&1; then
|
||||||
|
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/"$1"/"$2" -d ./assets/"$1" -o "$2"
|
||||||
|
[ -f "./assets/""$1""/""$2""" ] && echo "download successful." || echo "please try again!" && exit 1
|
||||||
|
else
|
||||||
|
echo "aria2c command not found. Please install aria2c and try again."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
dlhp2_all="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2_all_vocals.pth"
|
check_file_special() {
|
||||||
dlhp3_all="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP3_all_vocals.pth"
|
printf "checking %s\n" "$2"
|
||||||
dlhp5_only="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5_only_main_vocal.pth"
|
if [ -f "./assets/""$1""/""$2""" ]; then
|
||||||
dlVR_DeEchoAggressive="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoAggressive.pth"
|
printf "%s in ./assets/%s checked.\n" "$2" "$1"
|
||||||
dlVR_DeEchoDeReverb="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoDeReverb.pth"
|
else
|
||||||
dlVR_DeEchoNormal="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/VR-DeEchoNormal.pth"
|
echo failed. starting download from huggingface.
|
||||||
dlonnx_dereverb="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/onnx_dereverb_By_FoxJoy/vocals.onnx"
|
if command -v aria2c > /dev/null 2>&1; then
|
||||||
dlrmvpe="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/rmvpe.pt"
|
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/"$2" -d ./assets/"$1" -o "$2"
|
||||||
|
[ -f "./assets/""$1""/""$2""" ] && echo "download successful." || echo "please try again!" && exit 1
|
||||||
|
else
|
||||||
|
echo "aria2c command not found. Please install aria2c and try again."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
hb="hubert_base.pt"
|
check_file_pretrained pretrained D32k.pth
|
||||||
|
check_file_pretrained pretrained D40k.pth
|
||||||
|
check_file_pretrained pretrained D48k.pth
|
||||||
|
check_file_pretrained pretrained G32k.pth
|
||||||
|
check_file_pretrained pretrained G40k.pth
|
||||||
|
check_file_pretrained pretrained G48k.pth
|
||||||
|
check_file_pretrained pretrained_v2 f0D40k.pth
|
||||||
|
check_file_pretrained pretrained_v2 f0G40k.pth
|
||||||
|
check_file_pretrained pretrained_v2 D40k.pth
|
||||||
|
check_file_pretrained pretrained_v2 G40k.pth
|
||||||
|
check_file_pretrained uvr5_weights HP2_all_vocals.pth
|
||||||
|
check_file_pretrained uvr5_weights HP3_all_vocals.pth
|
||||||
|
check_file_pretrained uvr5_weights HP5_only_main_vocal.pth
|
||||||
|
check_file_pretrained uvr5_weights VR-DeEchoAggressive.pth
|
||||||
|
check_file_pretrained uvr5_weights VR-DeEchoDeReverb.pth
|
||||||
|
check_file_pretrained uvr5_weights VR-DeEchoNormal.pth
|
||||||
|
check_file_pretrained uvr5_weights "onnx_dereverb_By_FoxJoy/vocals.onnx"
|
||||||
|
check_file_special rmvpe rmvpe.pt
|
||||||
|
check_file_special hubert hubert_base.pt
|
||||||
|
|
||||||
dlhb="https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt"
|
echo "required files check finished."
|
||||||
|
|
||||||
echo dir check start.
|
|
||||||
|
|
||||||
if [ -d "./assets/pretrained" ]; then
|
|
||||||
echo dir ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. generating dir ./assets/pretrained.
|
|
||||||
mkdir pretrained
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "./assets/pretrained_v2" ]; then
|
|
||||||
echo dir ./assets/pretrained_v2 checked.
|
|
||||||
else
|
|
||||||
echo failed. generating dir ./assets/pretrained_v2.
|
|
||||||
mkdir pretrained_v2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "./assets/uvr5_weights" ]; then
|
|
||||||
echo dir ./assets/uvr5_weights checked.
|
|
||||||
else
|
|
||||||
echo failed. generating dir ./assets/uvr5_weights.
|
|
||||||
mkdir uvr5_weights
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "./assets/uvr5_weights/onnx_dereverb_By_FoxJoy" ]; then
|
|
||||||
echo dir ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy checked.
|
|
||||||
else
|
|
||||||
echo failed. generating dir ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy.
|
|
||||||
mkdir uvr5_weights/onnx_dereverb_By_FoxJoy
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo dir check finished.
|
|
||||||
|
|
||||||
echo required files check start.
|
|
||||||
|
|
||||||
echo checking D32k.pth
|
|
||||||
if [ -f "./assets/pretrained/D32k.pth" ]; then
|
|
||||||
echo D32k.pth in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D32k.pth -d ./assets/pretrained -o D32k.pth
|
|
||||||
if [ -f "./assets/pretrained/D32k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking D40k.pth
|
|
||||||
if [ -f "./assets/pretrained/D40k.pth" ]; then
|
|
||||||
echo D40k.pth in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D40k.pth -d ./assets/pretrained -o D40k.pth
|
|
||||||
if [ -f "./assets/pretrained/D40k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking D40k.pth
|
|
||||||
if [ -f "./assets/pretrained_v2/D40k.pth" ]; then
|
|
||||||
echo D40k.pth in ./assets/pretrained_v2 checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D40k.pth -d ./assets/pretrained_v2 -o D40k.pth
|
|
||||||
if [ -f "./assets/pretrained_v2/D40k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking D48k.pth
|
|
||||||
if [ -f "./assets/pretrained/D48k.pth" ]; then
|
|
||||||
echo D48k.pth in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D48k.pth -d ./assets/pretrained -o D48k.pth
|
|
||||||
if [ -f "./assets/pretrained/D48k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking G32k.pth
|
|
||||||
if [ -f "./assets/pretrained/G32k.pth" ]; then
|
|
||||||
echo G32k.pth in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G32k.pth -d ./assets/pretrained -o G32k.pth
|
|
||||||
if [ -f "./assets/pretrained/G32k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking G40k.pth
|
|
||||||
if [ -f "./assets/pretrained/G40k.pth" ]; then
|
|
||||||
echo G40k.pth in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G40k.pth -d ./assets/pretrained -o G40k.pth
|
|
||||||
if [ -f "./assets/pretrained/G40k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking G40k.pth
|
|
||||||
if [ -f "./assets/pretrained_v2/G40k.pth" ]; then
|
|
||||||
echo G40k.pth in ./assets/pretrained_v2 checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G40k.pth -d ./assets/pretrained_v2 -o G40k.pth
|
|
||||||
if [ -f "./assets/pretrained_v2/G40k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking G48k.pth
|
|
||||||
if [ -f "./assets/pretrained/G48k.pth" ]; then
|
|
||||||
echo G48k.pth in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G48k.pth -d ./assets/pretrained -o G48k.pth
|
|
||||||
if [ -f "./assets/pretrained/G48k.pth" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $d32
|
|
||||||
if [ -f "./assets/pretrained/$d32" ]; then
|
|
||||||
echo $d32 in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld32 -d ./assets/pretrained -o $d32
|
|
||||||
if [ -f "./assets/pretrained/$d32" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $d40
|
|
||||||
if [ -f "./assets/pretrained/$d40" ]; then
|
|
||||||
echo $d40 in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld40 -d ./assets/pretrained -o $d40
|
|
||||||
if [ -f "./assets/pretrained/$d40" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $d40v2
|
|
||||||
if [ -f "./assets/pretrained_v2/$d40v2" ]; then
|
|
||||||
echo $d40v2 in ./assets/pretrained_v2 checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld40v2 -d ./assets/pretrained_v2 -o $d40v2
|
|
||||||
if [ -f "./assets/pretrained_v2/$d40v2" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $d48
|
|
||||||
if [ -f "./assets/pretrained/$d48" ]; then
|
|
||||||
echo $d48 in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dld48 -d ./assets/pretrained -o $d48
|
|
||||||
if [ -f "./assets/pretrained/$d48" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $g32
|
|
||||||
if [ -f "./assets/pretrained/$g32" ]; then
|
|
||||||
echo $g32 in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg32 -d ./assets/pretrained -o $g32
|
|
||||||
if [ -f "./assets/pretrained/$g32" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $g40
|
|
||||||
if [ -f "./assets/pretrained/$g40" ]; then
|
|
||||||
echo $g40 in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg40 -d ./assets/pretrained -o $g40
|
|
||||||
if [ -f "./assets/pretrained/$g40" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $g40v2
|
|
||||||
if [ -f "./assets/pretrained_v2/$g40v2" ]; then
|
|
||||||
echo $g40v2 in ./assets/pretrained_v2 checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg40v2 -d ./assets/pretrained_v2 -o $g40v2
|
|
||||||
if [ -f "./assets/pretrained_v2/$g40v2" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $g48
|
|
||||||
if [ -f "./assets/pretrained/$g48" ]; then
|
|
||||||
echo $g48 in ./assets/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlg48 -d ./assets/pretrained -o $g48
|
|
||||||
if [ -f "./assets/pretrained/$g48" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $hp2_all
|
|
||||||
if [ -f "./assets/uvr5_weights/$hp2_all" ]; then
|
|
||||||
echo $hp2_all in ./assets/uvr5_weights checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhp2_all -d ./assets/uvr5_weights -o $hp2_all
|
|
||||||
if [ -f "./assets/uvr5_weights/$hp2_all" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $hp3_all
|
|
||||||
if [ -f "./assets/uvr5_weights/$hp3_all" ]; then
|
|
||||||
echo $hp3_all in ./assets/uvr5_weights checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhp3_all -d ./assets/uvr5_weights -o $hp3_all
|
|
||||||
if [ -f "./assets/uvr5_weights/$hp3_all" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $hp5_only
|
|
||||||
if [ -f "./assets/uvr5_weights/$hp5_only" ]; then
|
|
||||||
echo $hp5_only in ./assets/uvr5_weights checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhp5_only -d ./assets/uvr5_weights -o $hp5_only
|
|
||||||
if [ -f "./assets/uvr5_weights/$hp5_only" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $VR_DeEchoAggressive
|
|
||||||
if [ -f "./assets/uvr5_weights/$VR_DeEchoAggressive" ]; then
|
|
||||||
echo $VR_DeEchoAggressive in ./assets/uvr5_weights checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlVR_DeEchoAggressive -d ./assets/uvr5_weights -o $VR_DeEchoAggressive
|
|
||||||
if [ -f "./assets/uvr5_weights/$VR_DeEchoAggressive" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $VR_DeEchoDeReverb
|
|
||||||
if [ -f "./assets/uvr5_weights/$VR_DeEchoDeReverb" ]; then
|
|
||||||
echo $VR_DeEchoDeReverb in ./assets/uvr5_weights checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlVR_DeEchoDeReverb -d ./assets/uvr5_weights -o $VR_DeEchoDeReverb
|
|
||||||
if [ -f "./assets/uvr5_weights/$VR_DeEchoDeReverb" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $VR_DeEchoNormal
|
|
||||||
if [ -f "./assets/uvr5_weights/$VR_DeEchoNormal" ]; then
|
|
||||||
echo $VR_DeEchoNormal in ./assets/uvr5_weights checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlVR_DeEchoNormal -d ./assets/uvr5_weights -o $VR_DeEchoNormal
|
|
||||||
if [ -f "./assets/uvr5_weights/$VR_DeEchoNormal" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $onnx_dereverb
|
|
||||||
if [ -f "./assets/uvr5_weights/onnx_dereverb_By_FoxJoy/$onnx_dereverb" ]; then
|
|
||||||
echo $onnx_dereverb in ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlonnx_dereverb -d ./assets/uvr5_weights/onnx_dereverb_By_FoxJoy -o $onnx_dereverb
|
|
||||||
if [ -f "./assets/uvr5_weights/onnx_dereverb_By_FoxJoy/$onnx_dereverb" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $rmvpe
|
|
||||||
if [ -f "./assets/rmvpe/$rmvpe" ]; then
|
|
||||||
echo $rmvpe in ./assets/rmvpe checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlrmvpe -d ./assets/rmvpe -o $rmvpe
|
|
||||||
if [ -f "./assets/rmvpe/$rmvpe" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo checking $hb
|
|
||||||
if [ -f "./assets/hubert/$hb" ]; then
|
|
||||||
echo $hb in ./assets/hubert/pretrained checked.
|
|
||||||
else
|
|
||||||
echo failed. starting download from huggingface.
|
|
||||||
if command -v aria2c &> /dev/null; then
|
|
||||||
aria2c --console-log-level=error -c -x 16 -s 16 -k 1M $dlhb -d ./assets/hubert/ -o $hb
|
|
||||||
if [ -f "./assets/hubert/$hb" ]; then
|
|
||||||
echo download successful.
|
|
||||||
else
|
|
||||||
echo please try again!
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo aria2c command not found. Please install aria2c and try again.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo required files check finished.
|
|
||||||
|
@ -91,8 +91,12 @@ class RVC:
|
|||||||
self.pth_path: str = pth_path
|
self.pth_path: str = pth_path
|
||||||
self.index_path = index_path
|
self.index_path = index_path
|
||||||
self.index_rate = index_rate
|
self.index_rate = index_rate
|
||||||
self.cache_pitch: np.ndarray = np.zeros(1024, dtype="int32")
|
self.cache_pitch: torch.Tensor = torch.zeros(
|
||||||
self.cache_pitchf = np.zeros(1024, dtype="float32")
|
1024, device=self.device, dtype=torch.long
|
||||||
|
)
|
||||||
|
self.cache_pitchf = torch.zeros(
|
||||||
|
1024, device=self.device, dtype=torch.float32
|
||||||
|
)
|
||||||
|
|
||||||
if last_rvc is None:
|
if last_rvc is None:
|
||||||
models, _, _ = fairseq.checkpoint_utils.load_model_ensemble_and_task(
|
models, _, _ = fairseq.checkpoint_utils.load_model_ensemble_and_task(
|
||||||
@ -199,15 +203,17 @@ class RVC:
|
|||||||
self.index_rate = new_index_rate
|
self.index_rate = new_index_rate
|
||||||
|
|
||||||
def get_f0_post(self, f0):
|
def get_f0_post(self, f0):
|
||||||
f0bak = f0.copy()
|
if not torch.is_tensor(f0):
|
||||||
f0_mel = 1127 * np.log(1 + f0 / 700)
|
f0 = torch.from_numpy(f0)
|
||||||
|
f0 = f0.float().to(self.device).squeeze()
|
||||||
|
f0_mel = 1127 * torch.log(1 + f0 / 700)
|
||||||
f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - self.f0_mel_min) * 254 / (
|
f0_mel[f0_mel > 0] = (f0_mel[f0_mel > 0] - self.f0_mel_min) * 254 / (
|
||||||
self.f0_mel_max - self.f0_mel_min
|
self.f0_mel_max - self.f0_mel_min
|
||||||
) + 1
|
) + 1
|
||||||
f0_mel[f0_mel <= 1] = 1
|
f0_mel[f0_mel <= 1] = 1
|
||||||
f0_mel[f0_mel > 255] = 255
|
f0_mel[f0_mel > 255] = 255
|
||||||
f0_coarse = np.rint(f0_mel).astype(np.int32)
|
f0_coarse = torch.round(f0_mel).long()
|
||||||
return f0_coarse, f0bak
|
return f0_coarse, f0
|
||||||
|
|
||||||
def get_f0(self, x, f0_up_key, n_cpu, method="harvest"):
|
def get_f0(self, x, f0_up_key, n_cpu, method="harvest"):
|
||||||
n_cpu = int(n_cpu)
|
n_cpu = int(n_cpu)
|
||||||
@ -299,7 +305,6 @@ class RVC:
|
|||||||
pd = torchcrepe.filter.median(pd, 3)
|
pd = torchcrepe.filter.median(pd, 3)
|
||||||
f0 = torchcrepe.filter.mean(f0, 3)
|
f0 = torchcrepe.filter.mean(f0, 3)
|
||||||
f0[pd < 0.1] = 0
|
f0[pd < 0.1] = 0
|
||||||
f0 = f0[0].cpu().numpy()
|
|
||||||
f0 *= pow(2, f0_up_key / 12)
|
f0 *= pow(2, f0_up_key / 12)
|
||||||
return self.get_f0_post(f0)
|
return self.get_f0_post(f0)
|
||||||
|
|
||||||
@ -335,7 +340,6 @@ class RVC:
|
|||||||
threshold=0.006,
|
threshold=0.006,
|
||||||
)
|
)
|
||||||
f0 *= pow(2, f0_up_key / 12)
|
f0 *= pow(2, f0_up_key / 12)
|
||||||
f0 = f0.squeeze().cpu().numpy()
|
|
||||||
return self.get_f0_post(f0)
|
return self.get_f0_post(f0)
|
||||||
|
|
||||||
def infer(
|
def infer(
|
||||||
@ -383,6 +387,7 @@ class RVC:
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
printt("Index search FAILED")
|
printt("Index search FAILED")
|
||||||
t3 = ttime()
|
t3 = ttime()
|
||||||
|
p_len = input_wav.shape[0] // 160
|
||||||
if self.if_f0 == 1:
|
if self.if_f0 == 1:
|
||||||
f0_extractor_frame = block_frame_16k + 800
|
f0_extractor_frame = block_frame_16k + 800
|
||||||
if f0method == "rmvpe":
|
if f0method == "rmvpe":
|
||||||
@ -390,25 +395,14 @@ class RVC:
|
|||||||
pitch, pitchf = self.get_f0(
|
pitch, pitchf = self.get_f0(
|
||||||
input_wav[-f0_extractor_frame:], self.f0_up_key, self.n_cpu, f0method
|
input_wav[-f0_extractor_frame:], self.f0_up_key, self.n_cpu, f0method
|
||||||
)
|
)
|
||||||
start_frame = block_frame_16k // 160
|
shift = block_frame_16k // 160
|
||||||
end_frame = len(self.cache_pitch) - (pitch.shape[0] - 4) + start_frame
|
self.cache_pitch[:-shift] = self.cache_pitch[shift:].clone()
|
||||||
self.cache_pitch[:] = np.append(
|
self.cache_pitchf[:-shift] = self.cache_pitchf[shift:].clone()
|
||||||
self.cache_pitch[start_frame:end_frame], pitch[3:-1]
|
self.cache_pitch[4 - pitch.shape[0] :] = pitch[3:-1]
|
||||||
)
|
self.cache_pitchf[4 - pitch.shape[0] :] = pitchf[3:-1]
|
||||||
self.cache_pitchf[:] = np.append(
|
cache_pitch = self.cache_pitch[None, -p_len:]
|
||||||
self.cache_pitchf[start_frame:end_frame], pitchf[3:-1]
|
cache_pitchf = self.cache_pitchf[None, -p_len:]
|
||||||
)
|
|
||||||
t4 = ttime()
|
t4 = ttime()
|
||||||
p_len = input_wav.shape[0] // 160
|
|
||||||
if self.if_f0 == 1:
|
|
||||||
cache_pitch = (
|
|
||||||
torch.LongTensor(self.cache_pitch[-p_len:]).to(self.device).unsqueeze(0)
|
|
||||||
)
|
|
||||||
cache_pitchf = (
|
|
||||||
torch.FloatTensor(self.cache_pitchf[-p_len:])
|
|
||||||
.to(self.device)
|
|
||||||
.unsqueeze(0)
|
|
||||||
)
|
|
||||||
feats = F.interpolate(feats.permute(0, 2, 1), scale_factor=2).permute(0, 2, 1)
|
feats = F.interpolate(feats.permute(0, 2, 1), scale_factor=2).permute(0, 2, 1)
|
||||||
feats = feats[:, :p_len, :]
|
feats = feats[:, :p_len, :]
|
||||||
p_len = torch.LongTensor([p_len]).to(self.device)
|
p_len = torch.LongTensor([p_len]).to(self.device)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user