Spaces:
Configuration error
Configuration error
#!/usr/bin/env python3 | |
import sys | |
sys.path.append('third_party/Matcha-TTS') | |
print("=== Teste de TTS em Português Melhorado ===\n") | |
try: | |
from cosyvoice.cli.cosyvoice import CosyVoice | |
from cosyvoice.utils.file_utils import load_wav | |
import torchaudio | |
import os | |
# Teste 1: Usar o modelo SFT que tem vozes pré-treinadas | |
print("1. Testando com modelo SFT (vozes pré-treinadas)") | |
print("-" * 50) | |
sft_path = 'pretrained_models/CosyVoice-300M-SFT' | |
# Verificar se o modelo SFT está completo | |
if os.path.exists(f'{sft_path}/llm.pt'): | |
print("Modelo SFT encontrado!") | |
else: | |
# Copiar arquivos necessários | |
print("Preparando modelo SFT...") | |
os.system(f'cp pretrained_models/CosyVoice-300M-direct/*.pt {sft_path}/') | |
os.system(f'cp pretrained_models/CosyVoice-300M-direct/*.onnx {sft_path}/') | |
cosyvoice_sft = CosyVoice(sft_path, load_jit=False, load_trt=False, fp16=False) | |
# Listar vozes disponíveis | |
print("\nVozes disponíveis no modelo SFT:") | |
speakers = cosyvoice_sft.list_available_spks() | |
for i, spk in enumerate(speakers[:10]): # Mostrar primeiras 10 | |
print(f" {i}: {spk}") | |
# Testar com diferentes vozes | |
test_text = "Olá! Este é um teste de síntese de voz em português brasileiro. Espero que a qualidade esteja melhor agora." | |
# Tentar vozes que podem ser mais adequadas para português | |
voice_tests = [] | |
# Procurar vozes femininas/masculinas em chinês que podem soar melhor | |
for spk in speakers: | |
if '中文女' in spk or '中文男' in spk or 'Chinese' in spk.lower(): | |
voice_tests.append(spk) | |
if len(voice_tests) >= 3: | |
break | |
for i, voice in enumerate(voice_tests): | |
print(f"\nTestando com voz: {voice}") | |
for j, audio in enumerate(cosyvoice_sft.inference_sft(test_text, voice, stream=False)): | |
output_file = f'output_pt_sft_{i}.wav' | |
torchaudio.save(output_file, audio['tts_speech'], cosyvoice_sft.sample_rate) | |
duration = audio['tts_speech'].shape[1] / cosyvoice_sft.sample_rate | |
print(f"✓ Gerado: {output_file} ({duration:.2f}s)") | |
# Teste 2: Usar áudio de referência diferente | |
print("\n\n2. Testando com áudio de referência cross-lingual") | |
print("-" * 50) | |
# Usar o modelo base com cross-lingual prompt | |
cosyvoice_base = CosyVoice('pretrained_models/CosyVoice-300M-direct', load_jit=False, load_trt=False, fp16=False) | |
# Usar o prompt cross-lingual que pode ter melhor qualidade | |
if os.path.exists('asset/cross_lingual_prompt.wav'): | |
prompt_cross = load_wav('asset/cross_lingual_prompt.wav', 16000) | |
# Teste com prompt em inglês para gerar português | |
for i, audio in enumerate(cosyvoice_base.inference_cross_lingual( | |
'<|pt|>' + test_text, # Indicar idioma português | |
prompt_cross, | |
stream=False | |
)): | |
output_file = 'output_pt_crosslingual.wav' | |
torchaudio.save(output_file, audio['tts_speech'], cosyvoice_base.sample_rate) | |
duration = audio['tts_speech'].shape[1] / cosyvoice_base.sample_rate | |
print(f"✓ Gerado: {output_file} ({duration:.2f}s)") | |
# Teste 3: Ajustar o texto de prompt | |
print("\n\n3. Testando com prompts otimizados") | |
print("-" * 50) | |
# Usar prompts mais curtos e simples | |
prompt_speech = load_wav('asset/zero_shot_prompt.wav', 16000) | |
prompts_test = [ | |
"Olá.", # Prompt muito curto | |
"Teste de voz.", # Prompt médio | |
"Esta é uma voz brasileira." # Prompt com contexto | |
] | |
for i, prompt_text in enumerate(prompts_test): | |
print(f"\nPrompt: '{prompt_text}'") | |
for j, audio in enumerate(cosyvoice_base.inference_zero_shot( | |
test_text, | |
prompt_text, | |
prompt_speech, | |
stream=False | |
)): | |
output_file = f'output_pt_prompt_{i}.wav' | |
torchaudio.save(output_file, audio['tts_speech'], cosyvoice_base.sample_rate) | |
duration = audio['tts_speech'].shape[1] / cosyvoice_base.sample_rate | |
print(f"✓ Gerado: {output_file} ({duration:.2f}s)") | |
print("\n✅ Testes concluídos!") | |
print("\nArquivos gerados:") | |
for f in sorted(os.listdir('.')): | |
if f.startswith('output_pt_') and f.endswith('.wav'): | |
size = os.path.getsize(f) / 1024 | |
print(f" - {f} ({size:.1f} KB)") | |
print("\n💡 Dicas para melhorar a qualidade:") | |
print("1. Use um áudio de referência de um falante nativo de português") | |
print("2. O modelo CosyVoice2-0.5B pode ter melhor suporte multilíngue") | |
print("3. Fine-tuning com dados em português melhoraria significativamente") | |
except Exception as e: | |
print(f"\n❌ Erro: {e}") | |
import traceback | |
traceback.print_exc() |