| |
| """ |
| Test script for the optimized server to verify model loading and functionality. |
| """ |
|
|
| import requests |
| import json |
| import numpy as np |
| import base64 |
| import io |
| import soundfile as sf |
| import tempfile |
| import os |
|
|
| def create_test_audio(duration=2.0, sample_rate=16000): |
| """Create a simple test audio signal.""" |
| t = np.linspace(0, duration, int(sample_rate * duration), False) |
| |
| frequency = 440 |
| audio = 0.3 * np.sin(2 * np.pi * frequency * t) |
| return audio.astype(np.float32) |
|
|
| def audio_to_base64(audio, sample_rate): |
| """Convert audio array to base64 string.""" |
| buf = io.BytesIO() |
| np.save(buf, audio.astype(np.float32)) |
| return base64.b64encode(buf.getvalue()).decode() |
|
|
| def test_health_check(): |
| """Test the health check endpoint.""" |
| try: |
| response = requests.get("http://localhost:8000/api/v1/health") |
| if response.status_code == 200: |
| data = response.json() |
| print(f"โ Health check passed: {data}") |
| |
| |
| if "language_model_device" in data: |
| print(f" ๐ฑ Language Model Device: {data['language_model_device']}") |
| print(f" ๐ข Model Dtype: {data['language_model_dtype']}") |
| if data.get("cuda_available"): |
| print(f" ๐ฎ CUDA Device: {data.get('cuda_device_name', 'Unknown')}") |
| print(f" ๐พ Memory Allocated: {data.get('cuda_memory_allocated', 'Unknown')}") |
| print(f" ๐พ Memory Reserved: {data.get('cuda_memory_reserved', 'Unknown')}") |
| else: |
| print(" โ CUDA not available - running on CPU") |
| |
| return data.get("model_loaded", False) |
| else: |
| print(f"โ Health check failed: {response.status_code}") |
| return False |
| except Exception as e: |
| print(f"โ Health check error: {e}") |
| return False |
|
|
| def test_v2t_endpoint(): |
| """Test the voice-to-text endpoint.""" |
| try: |
| |
| audio = create_test_audio() |
| audio_b64 = audio_to_base64(audio, 16000) |
| |
| payload = { |
| "audio_data": audio_b64, |
| "sample_rate": 16000 |
| } |
| |
| response = requests.post( |
| "http://localhost:8000/api/v1/v2t", |
| json=payload, |
| headers={"Content-Type": "application/json"} |
| ) |
| |
| if response.status_code == 200: |
| data = response.json() |
| print(f"โ V2T endpoint working: {data.get('text', 'No text')[:100]}...") |
| return True |
| else: |
| print(f"โ V2T endpoint failed: {response.status_code} - {response.text}") |
| return False |
| |
| except Exception as e: |
| print(f"โ V2T endpoint error: {e}") |
| return False |
|
|
| def test_error_scenarios(): |
| """Test error scenarios to ensure proper responses.""" |
| print("\n4. Testing error scenarios...") |
| |
| |
| try: |
| payload = { |
| "audio_data": "invalid_base64_data", |
| "sample_rate": 16000 |
| } |
| |
| response = requests.post( |
| "http://localhost:8000/api/v1/v2t", |
| json=payload, |
| headers={"Content-Type": "application/json"} |
| ) |
| |
| if response.status_code == 200: |
| data = response.json() |
| print(f"โ Error handling working: {data.get('text', 'No text')[:100]}...") |
| else: |
| print(f"โ Error handling failed: {response.status_code} - {response.text}") |
| |
| except Exception as e: |
| print(f"โ Error scenario test failed: {e}") |
| |
| |
| try: |
| payload = { |
| "audio_data": "", |
| "sample_rate": 16000 |
| } |
| |
| response = requests.post( |
| "http://localhost:8000/api/v1/v2t", |
| json=payload, |
| headers={"Content-Type": "application/json"} |
| ) |
| |
| if response.status_code == 200: |
| data = response.json() |
| print(f"โ Empty input handling working: {data.get('text', 'No text')[:100]}...") |
| else: |
| print(f"โ Empty input handling failed: {response.status_code} - {response.text}") |
| |
| except Exception as e: |
| print(f"โ Empty input test failed: {e}") |
| |
| return True |
|
|
| def test_authentication(): |
| """Test authentication functionality.""" |
| print("\n5. Testing authentication...") |
| |
| |
| try: |
| audio = create_test_audio() |
| audio_b64 = audio_to_base64(audio, 16000) |
| |
| payload = { |
| "audio_data": audio_b64, |
| "sample_rate": 16000 |
| } |
| |
| response = requests.post( |
| "http://localhost:8000/api/v1/v2t", |
| json=payload, |
| headers={"Content-Type": "application/json"} |
| ) |
| |
| if response.status_code == 200: |
| data = response.json() |
| text = data.get('text', '') |
| if "Authentication failed" in text: |
| print(f"โ Authentication check working: {text}") |
| else: |
| print(f"โ Authentication passed: {text[:100]}...") |
| return True |
| else: |
| print(f"โ Authentication test failed: {response.status_code} - {response.text}") |
| return False |
| |
| except Exception as e: |
| print(f"โ Authentication test error: {e}") |
| return False |
|
|
| def test_inference_endpoint(): |
| """Test the inference endpoint (if INTERFACE is available).""" |
| try: |
| |
| audio = create_test_audio() |
| audio_b64 = audio_to_base64(audio, 16000) |
| |
| payload = { |
| "audio_data": audio_b64, |
| "sample_rate": 16000 |
| } |
| |
| response = requests.post( |
| "http://localhost:8000/api/v1/inference", |
| json=payload, |
| headers={"Content-Type": "application/json"} |
| ) |
| |
| if response.status_code == 200: |
| data = response.json() |
| print(f"โ Inference endpoint working: Audio data length {len(data.get('audio_data', ''))}") |
| return True |
| elif response.status_code == 503: |
| print(f"โ Inference endpoint not available (expected if outetts models not loaded): {response.text}") |
| return True |
| else: |
| print(f"โ Inference endpoint failed: {response.status_code} - {response.text}") |
| return False |
| |
| except Exception as e: |
| print(f"โ Inference endpoint error: {e}") |
| return False |
|
|
| def main(): |
| """Run all tests.""" |
| print("Testing optimized server...") |
| print("=" * 50) |
| |
| |
| print("\n1. Testing health check...") |
| models_loaded = test_health_check() |
| |
| if not models_loaded: |
| print("โ Models not loaded. Some tests may fail.") |
| |
| |
| print("\n2. Testing voice-to-text endpoint...") |
| v2t_success = test_v2t_endpoint() |
| |
| |
| print("\n3. Testing inference endpoint...") |
| inference_success = test_inference_endpoint() |
| |
| |
| error_success = test_error_scenarios() |
| |
| |
| auth_success = test_authentication() |
| |
| |
| print("\n" + "=" * 50) |
| print("Test Summary:") |
| print(f"Health Check: {'โ' if models_loaded else 'โ'}") |
| print(f"V2T Endpoint: {'โ' if v2t_success else 'โ'}") |
| print(f"Inference Endpoint: {'โ' if inference_success else 'โ'}") |
| print(f"Error Handling: {'โ' if error_success else 'โ'}") |
| print(f"Authentication: {'โ' if auth_success else 'โ'}") |
| |
| if models_loaded and v2t_success and error_success and auth_success: |
| print("\n๐ Server is working correctly with authentication and error handling!") |
| else: |
| print("\nโ Some issues detected. Check the logs above.") |
|
|
| if __name__ == "__main__": |
| main() |
|
|