File size: 3,699 Bytes
fcb2b04
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import requests
from typing import Optional, BinaryIO
import io

class VoiceClient:
    def __init__(self, base_url: str = "http://localhost:8000"):
        self.base_url = base_url
        self.session = requests.Session()
    
    def clone_voice(self, audio_sample_path: str, voice_name: str) -> dict:
        """Clone voice from audio sample file"""
        try:
            with open(audio_sample_path, 'rb') as audio_file:
                files = {'file': audio_file}
                data = {"voice_name": voice_name}
                
                response = self.session.post(
                    f"{self.base_url}/clone",
                    files=files,
                    data=data
                )
                response.raise_for_status()
                
                return response.json()
                
        except requests.RequestException as e:
            raise Exception(f"Voice cloning failed: {str(e)}")
    
    def synthesize(self, text: str, voice_name: str, stream: bool = False) -> Optional[bytes]:
        """Generate speech with cloned voice"""
        try:
            data = {
                "text": text,
                "voice_name": voice_name
            }
            
            if stream:
                # For streaming, you might want to use Response.iter_content()
                # This is a placeholder for actual streaming implementation
                response = self.session.post(
                    f"{self.base_url}/synthesize_stream",
                    json=data,
                    stream=True
                )
                response.raise_for_status()
                
                # Collect all chunks (for demonstration)
                audio_data = b""
                for chunk in response.iter_content(chunk_size=8192):
                    if chunk:
                        audio_data += chunk
                return audio_data
                
            else:
                response = self.session.post(
                    f"{self.base_url}/synthesize",
                    json=data
                )
                response.raise_for_status()
                
                return response.content
                
        except requests.RequestException as e:
            raise Exception(f"Text-to-speech failed: {str(e)}")
    
    def list_voices(self) -> list:
        """List available voice models"""
        try:
            response = self.session.get(f"{self.base_url}/voices")
            response.raise_for_status()
            
            data = response.json()
            return data.get("voices", [])
            
        except requests.RequestException as e:
            raise Exception(f"Failed to list voices: {str(e)}")
    
    def download_audio(self, audio_data: bytes, output_path: str) -> None:
        """Save audio data to file"""
        try:
            with open(output_path, 'wb') as f:
                f.write(audio_data)
        except Exception as e:
            raise Exception(f"Failed to save audio file: {str(e)}")

# Example usage
if __name__ == "__main__":
    client = VoiceClient()
    
    print("Testing voice client...")
    
    # List available voices
    voices = client.list_voices()
    print(f"Available voices: {voices}")
    
    # Clone a voice (you need to provide an actual audio file)
    # result = client.clone_voice("sample_audio.wav", "my_voice")
    # print(f"Clone result: {result}")
    
    # Synthesize speech
    # audio_data = client.synthesize("Hello, this is a test of the voice cloning system.", "my_voice")
    # if audio_data:
    #     client.download_audio(audio_data, "output.wav")
    #     print("Audio saved to output.wav")