Files
caption-local/scripts/condition_probe.py
kawaiipunk 9f1365a3ef Add per-user keys and invites with derived relay rooms
Replace the shared CAPTION_API_KEY with an optional per-user registry.
keys.py stores 64-character keys and single-use invites as SHA-256 digests
and derives each user's source/output rooms and capability tokens from a
shared master secret. /relay-config now returns those per-key values,
/claim.html redeems invites, and /admin.html (gated by CAPTION_ADMIN_KEY)
mints invites and revokes keys. /health and the static pages are public.
2026-10-16 13:10:59 +00:00

39 lines
2.1 KiB
Python

"""Explore clean, quiet and noisy synthetic speech without weakening quality gates."""
import argparse
import json
import os
from pathlib import Path
from urllib.parse import urlsplit
import httpx
import numpy as np
from faster_whisper.audio import decode_audio
from multilingual_load import wer
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--url',default='http://127.0.0.1:8772')
parser.add_argument('--output',type=Path,required=True)
args=parser.parse_args()
if urlsplit(args.url).hostname not in ('127.0.0.1','localhost','::1'):
parser.error('Use localhost or a local SSH tunnel')
root=Path(__file__).resolve().parents[1]
fixtures=json.loads((root/'samples/multilingual/manifest.json').read_text(encoding='utf-8'))
headers={'X-Caption-Local':'1','Content-Type':'application/octet-stream'}
if os.environ.get('CAPTION_KEY'): headers['Authorization']='Bearer '+os.environ['CAPTION_KEY']
results=[]
with httpx.Client(timeout=60,headers=headers) as client:
ready=client.get(args.url+'/health'); ready.raise_for_status()
health=ready.json()
for item in fixtures:
audio=decode_audio(str(root/item['path']))
noise=np.random.default_rng(42).normal(0,float(np.sqrt(np.mean(audio**2)))/3.1623,len(audio))
for condition,data in [('clean',audio),('quiet_26db',audio*.05),('noise_10db_snr',np.clip(audio+noise,-1,1))]:
response=client.post(args.url+'/transcribe',params={'language':item['language'],'mode':'both'},content=data.astype('<f4').tobytes())
result=response.json()
results.append({'language':item['language'],'condition':condition,'status':response.status_code,
'wer':wer(item['text'],result.get('transcript','')),'result':result})
client.delete(args.url+'/streams/legacy')
args.output.parent.mkdir(parents=True,exist_ok=True)
args.output.write_text(json.dumps({'health':health,'seed':42,'results':results,'scope':'Synthetic robustness observations; not a new acceptance gate'},indent=2,ensure_ascii=False),encoding='utf-8')
assert all(result['status']==200 for result in results)
print('Condition probe recorded all 18 real inference results')