vaaksiddhi / backend /scripts /test_eval.py
Ananya Sridhar
initial commit - backend complete, frontend scaffolded
f03a634
Raw
History Blame Contribute Delete
3.86 kB
#!/usr/bin/env python3
"""
Quick backend test — record voice and see full evaluation.
Run: python3 scripts/test_eval.py
"""
import sounddevice as sd
import soundfile as sf
import requests
import json
import tempfile
import base64
import os
BASE_URL = "http://127.0.0.1:8000"
def record_audio(seconds=4, sr=16000):
print(f"Recording for {seconds} seconds...")
audio = sd.rec(int(seconds * sr), samplerate=sr, channels=1, dtype="float32")
sd.wait()
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
sf.write(tmp.name, audio, sr)
return tmp.name
def test_input_word(word, character="BOLT"):
print(f"\n--- Testing /input-word with word: {word} ---")
res = requests.post(f"{BASE_URL}/input-word", data={
"text": word, "character": character, "mood": "instruction"
})
d = res.json()
print(f"Word: {d.get('word')}")
print(f"Phonemes: {d.get('phonemes')}")
print(f"Image found: {d.get('image_found')}")
print(f"Audio generated: {len(d.get('character_audio_base64','')) > 0}")
# Play the character audio
if d.get("character_audio_base64"):
audio_bytes = base64.b64decode(d["character_audio_base64"])
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
tmp.write(audio_bytes)
tmp.close()
os.system(f"afplay {tmp.name}")
os.unlink(tmp.name)
def test_evaluate(word, character="BOLT"):
print(f"\n--- Testing /evaluate ---")
print(f"Target word: {word}")
input("Press Enter then say the word...")
audio_path = record_audio(seconds=4)
with open(audio_path, "rb") as f:
res = requests.post(f"{BASE_URL}/evaluate", data={
"target_word": word,
"character": character,
"condition": "autism",
"attempt_number": 1,
}, files={"audio": ("recording.wav", f, "audio/wav")})
d = res.json()
print(f"\nTranscript: {d.get('transcript')}")
print(f"Expected phonemes: {d.get('target_phonemes')}")
print(f"Detected phonemes: {d.get('detected_phonemes')}")
print(f"Composite score: {d.get('composite_score')}%")
print(f"Phoneme accuracy: {d.get('phoneme_scores', {}).get('accuracy')}%")
acoustic = d.get("acoustic", {})
print(f"\nAcoustic metrics:")
print(f" Loudness: {acoustic.get('loudness_db')} dB")
print(f" Pitch: {acoustic.get('pitch_mean_hz')} Hz")
print(f" Speaking rate: {acoustic.get('speaking_rate')} syl/sec")
print(f" HNR: {acoustic.get('hnr_db')} dB")
print(f" Jitter: {acoustic.get('jitter_percent')}%")
print(f"\nEncouragement: {d.get('encouragement', {}).get('message')}")
print(f"Action: {d.get('encouragement', {}).get('action')}")
print(f"Drill mode: {d.get('enter_drill_mode')}")
if d.get("acoustic_tips"):
print(f"\nAcoustic tips:")
for tip in d["acoustic_tips"]:
print(f" - {tip['tip']}")
if d.get("drill_sequence"):
print(f"\nDrill sequence ({len(d['drill_sequence'])} phonemes):")
for ph in d["drill_sequence"]:
print(f" - {ph['phoneme']}: {ph['tip']}")
# Play character response
if d.get("character_response_audio"):
audio_bytes = base64.b64decode(d["character_response_audio"])
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
tmp.write(audio_bytes)
tmp.close()
print("\nPlaying character response...")
os.system(f"afplay {tmp.name}")
os.unlink(tmp.name)
os.unlink(audio_path)
if __name__ == "__main__":
print("VaakSiddhi Autism — Backend Test")
print("=" * 40)
word = input("Enter a target word to test: ").strip() or "ball"
char = input("Choose character (BOLT/ZARA/NOVA/BEEP/ECHO/MIRA) [BOLT]: ").strip() or "BOLT"
test_input_word(word, char)
test_evaluate(word, char)