| 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: |
| |
| |
| response = self.session.post( |
| f"{self.base_url}/synthesize_stream", |
| json=data, |
| stream=True |
| ) |
| response.raise_for_status() |
| |
| |
| 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)}") |
|
|
| |
| if __name__ == "__main__": |
| client = VoiceClient() |
| |
| print("Testing voice client...") |
| |
| |
| voices = client.list_voices() |
| print(f"Available voices: {voices}") |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |