Run_code_api / test_new_ipa_api.py
ABAO77's picture
feat: implement new IPA assessment API with detailed phoneme analysis and Vietnamese-specific feedback
45a0e83
raw
history blame
4.77 kB
#!/usr/bin/env python3
"""
Test script for the new IPA assessment API
"""
import requests
import json
import os
# API endpoint
API_BASE = "http://localhost:8000"
ENDPOINT = f"{API_BASE}/speaking/assess-ipa"
def test_ipa_assessment():
"""Test the new IPA assessment endpoint"""
# Create a test audio file (mock)
test_audio_path = "test_audio.wav"
# Create a minimal WAV file for testing
with open(test_audio_path, "wb") as f:
# Write minimal WAV header (44 bytes)
f.write(b'RIFF')
f.write((36).to_bytes(4, 'little')) # file size - 8
f.write(b'WAVE')
f.write(b'fmt ')
f.write((16).to_bytes(4, 'little')) # fmt chunk size
f.write((1).to_bytes(2, 'little')) # audio format (PCM)
f.write((1).to_bytes(2, 'little')) # num channels
f.write((44100).to_bytes(4, 'little')) # sample rate
f.write((88200).to_bytes(4, 'little')) # byte rate
f.write((2).to_bytes(2, 'little')) # block align
f.write((16).to_bytes(2, 'little')) # bits per sample
f.write(b'data')
f.write((0).to_bytes(4, 'little')) # data size
try:
# Test data
test_cases = [
{
"target_word": "bed",
"target_ipa": "/bɛd/",
"focus_phonemes": "ɛ,b,d"
},
{
"target_word": "cat",
"target_ipa": "/kæt/",
"focus_phonemes": "æ"
},
{
"target_word": "think",
"target_ipa": "/θɪŋk/",
"focus_phonemes": "θ"
}
]
for i, test_case in enumerate(test_cases, 1):
print(f"\n{'='*50}")
print(f"Test Case {i}: {test_case['target_word']}")
print(f"{'='*50}")
# Prepare the request
files = {
'audio_file': ('test.wav', open(test_audio_path, 'rb'), 'audio/wav')
}
data = {
'target_word': test_case['target_word'],
'target_ipa': test_case['target_ipa'],
'focus_phonemes': test_case['focus_phonemes']
}
print(f"Request data: {data}")
# Make the request
response = requests.post(ENDPOINT, files=files, data=data)
# Close the file
files['audio_file'][1].close()
print(f"Response status: {response.status_code}")
if response.status_code == 200:
result = response.json()
print("✅ Success!")
print(f"Overall Score: {result.get('overall_score', 0) * 100:.1f}%")
print(f"Character Analysis: {len(result.get('character_analysis', []))} characters")
print(f"Phoneme Scores: {len(result.get('phoneme_scores', []))} phonemes")
print(f"Focus Phonemes: {len(result.get('focus_phonemes_analysis', []))} analyzed")
print(f"Vietnamese Tips: {len(result.get('vietnamese_tips', []))} tips")
print(f"Recommendations: {len(result.get('practice_recommendations', []))} recommendations")
# Print sample character analysis
if result.get('character_analysis'):
print("\nCharacter Analysis Sample:")
for char_analysis in result['character_analysis'][:3]:
print(f" '{char_analysis['character']}' -> /{char_analysis['phoneme']}/ ({char_analysis['score']*100:.1f}%)")
# Print focus phonemes
if result.get('focus_phonemes_analysis'):
print("\nFocus Phonemes Analysis:")
for phoneme_analysis in result['focus_phonemes_analysis']:
print(f" /{phoneme_analysis['phoneme']}/ - {phoneme_analysis['score']*100:.1f}% ({phoneme_analysis['status']})")
print(f" Tip: {phoneme_analysis['vietnamese_tip']}")
else:
print(f"❌ Failed: {response.text}")
except requests.exceptions.ConnectionError:
print("❌ Connection Error: Make sure the API server is running on port 8000")
print("Start the server with: uvicorn app:app --host 0.0.0.0 --port 8000")
except Exception as e:
print(f"❌ Error: {e}")
finally:
# Clean up test file
if os.path.exists(test_audio_path):
os.remove(test_audio_path)
if __name__ == "__main__":
print("Testing New IPA Assessment API")
print("=" * 50)
test_ipa_assessment()