|
import requests |
|
import base64 |
|
import json |
|
from pathlib import Path |
|
|
|
class TTSClient: |
|
def __init__(self, base_url="http://localhost:7860"): |
|
self.base_url = base_url.rstrip("/") |
|
|
|
def health_check(self): |
|
"""APIの健康状態をチェック""" |
|
try: |
|
response = requests.get(f"{self.base_url}/health") |
|
return response.status_code == 200, response.json() |
|
except Exception as e: |
|
return False, str(e) |
|
|
|
def synthesize_to_file(self, text, output_path="output.wav", sample_rate=22050): |
|
"""テキストを音声に変換してファイルに保存""" |
|
try: |
|
response = requests.post( |
|
f"{self.base_url}/synthesize", |
|
json={"text": text, "sample_rate": sample_rate} |
|
) |
|
|
|
if response.status_code == 200: |
|
with open(output_path, "wb") as f: |
|
f.write(response.content) |
|
return True, f"Audio saved to {output_path}" |
|
else: |
|
return False, f"Error: {response.status_code} - {response.text}" |
|
|
|
except Exception as e: |
|
return False, str(e) |
|
|
|
def synthesize_to_base64(self, text, sample_rate=22050): |
|
"""テキストを音声に変換してBase64形式で取得""" |
|
try: |
|
response = requests.post( |
|
f"{self.base_url}/synthesize_base64", |
|
json={"text": text, "sample_rate": sample_rate} |
|
) |
|
|
|
if response.status_code == 200: |
|
return True, response.json() |
|
else: |
|
return False, f"Error: {response.status_code} - {response.text}" |
|
|
|
except Exception as e: |
|
return False, str(e) |
|
|
|
def save_base64_audio(self, audio_base64, output_path="output_from_base64.wav"): |
|
"""Base64形式の音声データをファイルに保存""" |
|
try: |
|
audio_data = base64.b64decode(audio_base64) |
|
with open(output_path, "wb") as f: |
|
f.write(audio_data) |
|
return True, f"Audio saved to {output_path}" |
|
except Exception as e: |
|
return False, str(e) |
|
|
|
def main(): |
|
|
|
client = TTSClient("http://localhost:7860") |
|
|
|
|
|
|
|
|
|
print("=== SpeechBrain TTS API Client Test ===\n") |
|
|
|
|
|
print("1. Health Check:") |
|
is_healthy, health_result = client.health_check() |
|
print(f" Status: {'✓ Healthy' if is_healthy else '✗ Unhealthy'}") |
|
print(f" Response: {health_result}\n") |
|
|
|
if not is_healthy: |
|
print("API is not available. Please check if the server is running.") |
|
return |
|
|
|
|
|
test_texts = [ |
|
"Hello, this is a test of the SpeechBrain TTS API.", |
|
"The quick brown fox jumps over the lazy dog.", |
|
"Welcome to Hugging Face Spaces!" |
|
] |
|
|
|
|
|
print("2. Testing direct WAV file synthesis:") |
|
for i, text in enumerate(test_texts): |
|
print(f" Testing: '{text}'") |
|
success, result = client.synthesize_to_file( |
|
text, |
|
f"test_output_{i+1}.wav", |
|
sample_rate=22050 |
|
) |
|
print(f" Result: {'✓ Success' if success else '✗ Failed'} - {result}") |
|
print() |
|
|
|
|
|
print("3. Testing Base64 synthesis:") |
|
for i, text in enumerate(test_texts): |
|
print(f" Testing: '{text}'") |
|
success, result = client.synthesize_to_base64(text, sample_rate=22050) |
|
|
|
if success: |
|
print(f" ✓ Success - Audio length: {len(result['audio_base64'])} chars") |
|
|
|
|
|
save_success, save_result = client.save_base64_audio( |
|
result['audio_base64'], |
|
f"test_base64_{i+1}.wav" |
|
) |
|
print(f" Save result: {'✓ Success' if save_success else '✗ Failed'} - {save_result}") |
|
else: |
|
print(f" ✗ Failed - {result}") |
|
print() |
|
|
|
|
|
print("4. Testing error handling:") |
|
|
|
|
|
print(" Testing empty text:") |
|
success, result = client.synthesize_to_file("", "empty_test.wav") |
|
print(f" Result: {'✓ Success' if success else '✗ Expected failure'} - {result}") |
|
|
|
|
|
print(" Testing too long text:") |
|
long_text = "This is a very long text. " * 50 |
|
success, result = client.synthesize_to_file(long_text, "long_test.wav") |
|
print(f" Result: {'✓ Success' if success else '✗ Expected failure'} - {result}") |
|
|
|
print("\n=== Test Complete ===") |
|
print("Check the generated audio files:") |
|
for i in range(len(test_texts)): |
|
print(f" - test_output_{i+1}.wav") |
|
print(f" - test_base64_{i+1}.wav") |
|
|
|
if __name__ == "__main__": |
|
main() |