71 lines
1.9 KiB
Python
71 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
"""End-to-end smoke test for Athena's OpenAI-compatible TTS and STT APIs."""
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
import urllib.request
|
|
import uuid
|
|
|
|
|
|
BASE_URL = os.environ.get("ROUTER_URL", "http://127.0.0.1:8081/v1").rstrip("/")
|
|
API_KEY = os.environ.get("ROUTER_API_KEY", "")
|
|
TEST_TEXT = "Dies ist ein lokaler Test der Spracherkennung auf Athena."
|
|
|
|
|
|
def request(path: str, data: bytes, content_type: str) -> bytes:
|
|
req = urllib.request.Request(
|
|
f"{BASE_URL}{path}",
|
|
data=data,
|
|
headers={
|
|
"Authorization": f"Bearer {API_KEY}",
|
|
"Content-Type": content_type,
|
|
},
|
|
method="POST",
|
|
)
|
|
with urllib.request.urlopen(req, timeout=360) as response:
|
|
return response.read()
|
|
|
|
|
|
def main() -> int:
|
|
if not API_KEY:
|
|
print("ROUTER_API_KEY is required", file=sys.stderr)
|
|
return 2
|
|
|
|
speech = request(
|
|
"/audio/speech",
|
|
json.dumps({
|
|
"model": "qwen3-tts",
|
|
"voice": "alloy",
|
|
"response_format": "wav",
|
|
"input": TEST_TEXT,
|
|
}).encode(),
|
|
"application/json",
|
|
)
|
|
|
|
boundary = f"speech-{uuid.uuid4().hex}"
|
|
body = (
|
|
f"--{boundary}\r\n"
|
|
'Content-Disposition: form-data; name="model"\r\n\r\n'
|
|
"whisper-1\r\n"
|
|
f"--{boundary}\r\n"
|
|
'Content-Disposition: form-data; name="language"\r\n\r\n'
|
|
"de\r\n"
|
|
f"--{boundary}\r\n"
|
|
'Content-Disposition: form-data; name="file"; filename="test.wav"\r\n'
|
|
"Content-Type: audio/wav\r\n\r\n"
|
|
).encode() + speech + f"\r\n--{boundary}--\r\n".encode()
|
|
|
|
result = json.loads(request(
|
|
"/audio/transcriptions",
|
|
body,
|
|
f"multipart/form-data; boundary={boundary}",
|
|
))
|
|
transcript = result.get("text", "").strip()
|
|
print(transcript)
|
|
return 0 if transcript else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|