File size: 4,949 Bytes
0ea7b2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/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()