sakhi / scripts /generate_test_audio.py
Tushar9802's picture
HF Space deploy — initial
745f62a
"""
Generate synthetic Hindi ASHA conversation audio for end-to-end pipeline testing.
Each clip has known ground truth values, enabling automated validation.
Uses Google TTS (Hindi) — not perfectly natural but has correct words/numbers
that Whisper must transcribe, normalize, and the LLM must extract.
"""
import json
import os
from gtts import gTTS
OUT_DIR = "test_audio/synthetic"
os.makedirs(OUT_DIR, exist_ok=True)
# Each test case: (filename, transcript_hindi, expected_values)
# expected_values used by test_pipeline.py for validation
TEST_CASES = [
# ── ANC CASES ──
(
"anc_normal_vitals",
"नमस्ते दीदी, मैं आशा कार्यकर्ता हूँ। आज आपका चेकअप करती हूँ। "
"आपका नाम रीना है ना? आपकी उम्र 22 साल है। "
"चलिए BP चेक करते हैं। आपका BP 110 बटा 70 है, बिल्कुल ठीक है। "
"वजन 55 किलो है। Hb रिपोर्ट में 11 पॉइंट 5 आया। "
"आप 24 हफ्ते की गर्भवती हैं। IFA की गोलियाँ रोज़ लो। "
"TT का पहला टीका लग गया है। "
"डिलीवरी के लिए PHC में जाएँगी। सब ठीक चल रहा है।",
{
"visit_type": "anc_visit",
"checks": {
"patient.name": "रीना",
"patient.age": 22,
"vitals.bp_systolic": 110,
"vitals.bp_diastolic": 70,
"vitals.weight_kg": 55,
"vitals.hemoglobin_gm_percent": 11.5,
"pregnancy.gestational_weeks": 24,
},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": ["lab_results.blood_group", "lab_results.hiv_status"],
},
),
(
"anc_preeclampsia_danger",
"दीदी आज मुझे बहुत सिरदर्द हो रहा है। आँखों के सामने धुंधला दिखता है। "
"चेहरे पर सूजन आ गई है। पैरों में भी सूजन है। "
"मैं आपका BP चेक करती हूँ। BP 160 बटा 105 है। ये बहुत ज़्यादा है। "
"आप 32 हफ्ते की हैं। ये danger signs हैं। तुरंत hospital जाना होगा।",
{
"visit_type": "anc_visit",
"checks": {
"vitals.bp_systolic": 160,
"vitals.bp_diastolic": 105,
"pregnancy.gestational_weeks": 32,
},
"danger_count": [2, 5],
"referral": "refer_immediately",
"must_be_null": ["patient.name"],
},
),
(
"anc_severe_anemia",
"Hb की रिपोर्ट आई है। Hb 6 पॉइंट 2 है, बहुत कम है। "
"मुझे बहुत चक्कर आते हैं। साँस लेने में तकलीफ़ होती है। "
"BP 95 बटा 60 है। वजन 42 किलो है। आप 18 हफ्ते की हैं। "
"आपको तुरंत PHC जाकर iron injection लेना होगा।",
{
"visit_type": "anc_visit",
"checks": {
"vitals.bp_systolic": 95,
"vitals.bp_diastolic": 60,
"vitals.weight_kg": 42,
"vitals.hemoglobin_gm_percent": 6.2,
"pregnancy.gestational_weeks": 18,
},
"danger_count": [1, 3],
"referral": "refer_immediately",
"must_be_null": ["patient.name", "lab_results.blood_group"],
},
),
(
"anc_minimal_info",
"BP ठीक है, 118 बटा 76 है। बाकी सब ठीक है दीदी।",
{
"visit_type": "anc_visit",
"checks": {
"vitals.bp_systolic": 118,
"vitals.bp_diastolic": 76,
},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": ["patient.name", "patient.age", "vitals.weight_kg",
"vitals.hemoglobin_gm_percent", "lab_results.blood_group"],
},
),
(
"anc_hinglish_codeswitching",
"Hello didi, aaj check-up hai. BP check karti hoon. "
"BP 135 by 88 hai, thoda high side pe hai. "
"Weight 64 kg hai. Hb report mein 9 point 5 aaya hai. "
"Aap 30 weeks ki hain. Baby movement acchi hai. "
"Delivery ke liye district hospital jaayengi.",
{
"visit_type": "anc_visit",
"checks": {
"vitals.bp_systolic": 135,
"vitals.bp_diastolic": 88,
"vitals.weight_kg": 64,
"vitals.hemoglobin_gm_percent": 9.5,
"pregnancy.gestational_weeks": 30,
},
"danger_count": [0, 1],
"referral": "routine_followup",
"must_be_null": ["patient.name", "lab_results.blood_group"],
},
),
# ── PNC CASES ──
(
"pnc_normal_day3",
"नमस्ते दीदी, डिलीवरी को 3 दिन हो गए। कैसे हैं आप? "
"मैं ठीक हूँ। बच्चा अच्छे से दूध पी रहा है। "
"बच्चे का वजन 2 पॉइंट 9 kg है। नाभि सूखी है। "
"बच्चे का तापमान सामान्य है। "
"आपका BP 120 बटा 78 है। खून बहना बंद हो गया है।",
{
"visit_type": "pnc_visit",
"checks": {
"infant_assessment.weight_kg": 2.9,
},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": [],
},
),
(
"pnc_newborn_danger",
"दीदी, बच्चा बहुत सुस्त है। दूध नहीं पी रहा है। "
"12 घंटे से दूध नहीं पिया है। बहुत कमज़ोर आवाज़ में रोता है। "
"बच्चे का तापमान 101 डिग्री है। बुखार है। "
"ये danger signs हैं। तुरंत PHC ले जाना होगा।",
{
"visit_type": "pnc_visit",
"checks": {},
"danger_count": [1, 4],
"referral": "refer_immediately",
"must_be_null": [],
},
),
(
"pnc_postpartum_hemorrhage",
"डिलीवरी को 2 दिन हुए हैं। बहुत ज़्यादा खून आ रहा है। "
"pad 1 घंटे में भीग जाता है। चक्कर आ रहे हैं। "
"बहुत कमज़ोरी लग रही है। ये गंभीर है। तुरंत hospital जाना होगा।",
{
"visit_type": "pnc_visit",
"checks": {},
"danger_count": [1, 3],
"referral": "refer_immediately",
"must_be_null": [],
},
),
# ── DELIVERY CASES ──
(
"delivery_normal_institutional",
"डिलीवरी कब हुई? कल रात 2 बजे। लड़का हुआ है। "
"कहाँ हुई डिलीवरी? PHC में, normal delivery थी। "
"बच्चे का वजन 3 पॉइंट 1 kg है। "
"स्तनपान तुरंत शुरू किया, 1 घंटे के अंदर। "
"बच्चे ने जन्म के समय रोया था।",
{
"visit_type": "delivery",
"checks": {
"infant.birth_weight_kg": 3.1,
},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": [],
},
),
(
"delivery_home_lbw",
"बच्चा घर पर ही हो गया। दाई ने करवाया। लड़की हुई है। "
"बच्ची का वजन 1 पॉइंट 7 kg है। बहुत कम है। ये low birth weight है। "
"बच्ची ने जन्म के समय रोया था। "
"बच्ची को गर्म रखना ज़रूरी है। PHC में चेकअप करवाना होगा।",
{
"visit_type": "delivery",
"checks": {
"infant.birth_weight_kg": 1.7,
},
"danger_count": [1, 2],
"referral": "refer_immediately",
"must_be_null": [],
},
),
# ── CHILD HEALTH CASES ──
(
"child_health_routine",
"बच्चा कैसा है? बिल्कुल ठीक है दीदी। खूब खाता है, खेलता है। "
"बच्चे का वजन 8 पॉइंट 2 kg है। उम्र 9 महीने है। "
"Vitamin A की पहली dose 6 महीने में दी थी। "
"सारे टीके लगे हैं। बच्चा बैठता है, घुटनों पर चलता है।",
{
"visit_type": "child_health",
"checks": {
"child.age_months": 9,
"growth_assessment.weight_kg": 8.2,
},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": [],
},
),
(
"child_diarrhea_dehydration",
"बच्चे को 4 दिन से दस्त लग रहे हैं। बहुत पतले पानी जैसे। "
"खाना पीना बंद कर दिया है। बहुत सुस्त हो गया है। "
"बच्चे का वजन 5 पॉइंट 8 kg है। उम्र 10 महीने है। "
"आँखें धँसी हुई हैं। ये dehydration के signs हैं। तुरंत PHC जाना होगा।",
{
"visit_type": "child_health",
"checks": {
"child.age_months": 10,
"growth_assessment.weight_kg": 5.8,
},
"danger_count": [1, 3],
"referral": "refer_immediately",
"must_be_null": [],
},
),
# ── EDGE CASES ──
(
"edge_zero_findings",
"नमस्ते दीदी, सब कैसा है? बिल्कुल ठीक है, कोई तकलीफ़ नहीं। "
"बहुत अच्छा। अगली बार आऊँगी। कोई तकलीफ़ हो तो फ़ोन कर दीजिए।",
{
"visit_type": "anc_visit",
"checks": {},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": ["patient.name", "patient.age", "vitals.bp_systolic",
"vitals.weight_kg", "vitals.hemoglobin_gm_percent",
"lab_results.blood_group", "lab_results.hiv_status"],
},
),
(
"edge_hindi_numbers_only",
"आपका BP एक सौ बीस बटा अस्सी है। वजन बावन किलो है। "
"Hb दस पॉइंट आठ है। आप छब्बीस हफ्ते की हैं।",
{
"visit_type": "anc_visit",
"checks": {
"vitals.bp_systolic": 120,
"vitals.bp_diastolic": 80,
"vitals.weight_kg": 52,
"vitals.hemoglobin_gm_percent": 10.8,
"pregnancy.gestational_weeks": 26,
},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": [],
},
),
(
"edge_noisy_nonmedical",
"हाँ दीदी बच्चों को स्कूल भेजना है। राशन की दुकान बंद थी आज। "
"बिजली भी नहीं आ रही। पानी का भी problem है गाँव में।",
{
"visit_type": "anc_visit",
"checks": {},
"danger_count": [0, 0],
"referral": "routine_followup",
"must_be_null": ["patient.name", "patient.age", "vitals.bp_systolic",
"vitals.weight_kg"],
},
),
]
def main():
manifest = []
for filename, transcript, expected in TEST_CASES:
out_path = os.path.join(OUT_DIR, f"{filename}.mp3")
print(f"Generating {out_path}...")
tts = gTTS(text=transcript, lang="hi", slow=False)
tts.save(out_path)
manifest.append({
"file": f"{filename}.mp3",
"transcript_source": transcript,
"expected": expected,
})
manifest_path = os.path.join(OUT_DIR, "manifest.json")
with open(manifest_path, "w", encoding="utf-8") as f:
json.dump(manifest, f, ensure_ascii=False, indent=2)
print(f"\nGenerated {len(manifest)} test audio files + manifest.json")
if __name__ == "__main__":
main()