Files
AI-Profile-Router/scripts/speech-roundtrip.py
T

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'
"qwen3-asr\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())