| import os | |
| import json | |
| import base64 | |
| import requests | |
| def wav_to_base64_url(wav_path): | |
| with open(wav_path, "rb") as f: | |
| b64_audio = base64.b64encode(f.read()).decode() | |
| return f"data:audio/wav;base64,{b64_audio}" | |
| def is_api_available(api_url): | |
| try: | |
| response = requests.get(api_url) | |
| return response.status_code < 500 | |
| except Exception as e: | |
| print("[Error] Cannot reach API:", e) | |
| return False | |
| def annotate_mispronunciation(session_id, api_url="http://localhost:8080", base_dir="session_data"): | |
| json_path = os.path.join(base_dir, session_id, f"{session_id}_transcriptionCW.json") | |
| if not os.path.exists(json_path): | |
| print(f"[Error] File not found: {json_path}") | |
| return | |
| if not is_api_available(api_url): | |
| print(f"[Error] API not available at {api_url}") | |
| return | |
| with open(json_path, "r", encoding="utf-8") as f: | |
| data = json.load(f) | |
| segments = data.get("segments", []) | |
| for segment in segments: | |
| start = segment["start"] | |
| end = segment["end"] | |
| speaker = segment["speaker"] | |
| filename = f"{session_id}-{start:.2f}-{end:.2f}-{speaker}.wav" | |
| filepath = os.path.join(base_dir, session_id, filename) | |
| if not os.path.exists(filepath): | |
| print(f"[Warning] Audio file missing: {filename}") | |
| continue | |
| audio_url = wav_to_base64_url(filepath) | |
| try: | |
| resp = requests.post( | |
| f"{api_url}/vocallens/api/analyze", | |
| headers={"Content-Type": "application/json"}, | |
| data=json.dumps([audio_url]) | |
| ) | |
| if resp.status_code == 200: | |
| result = resp.json() | |
| segment["mispronunciation"] = result.get("ce", "") | |
| else: | |
| print(f"[Warning] API error {resp.status_code} for {filename}") | |
| segment["mispronunciation"] = "" | |
| except Exception as e: | |
| print(f"[Error] Exception during API call for {filename}:", e) | |
| segment["mispronunciation"] = "" | |
| with open(json_path, "w", encoding="utf-8") as f: | |
| json.dump(data, f, indent=4, ensure_ascii=False) | |
| print(f"Session {session_id} mispronunciation annotation done: {json_path}") | |
| return data | |
| if __name__ == "__main__": | |
| annotate_mispronunciation("000030") | |