66 lines
2.7 KiB
Python
66 lines
2.7 KiB
Python
import re
|
|
|
|
# Common Indian phonetic variations & clinical abbreviations
|
|
PHONETIC_REPLACEMENTS = {
|
|
# Medical terms & symptoms
|
|
r"\b(suger|shugar|sugur)\b": "sugar (diabetes)",
|
|
r"\b(presure|presur|blood preser)\b": "blood pressure",
|
|
r"\b(bp)\b": "BP",
|
|
r"\b(chest painu|chestpain|chst pain)\b": "chest pain",
|
|
r"\b(hart attack|heart attacku)\b": "heart attack",
|
|
r"\b(stomech pain|stomach painu)\b": "stomach pain",
|
|
r"\b(head ache|hedache|headacheu)\b": "headache",
|
|
r"\b(breath kashtam|breathing problem|moochu thinaral)\b": "breathing difficulty",
|
|
r"\b(injekshan|injaction|injecshun)\b": "injection",
|
|
r"\b(opration|oparation)\b": "operation",
|
|
r"\b(tablat|tablit|mathirai|goli)\b": "tablets",
|
|
r"\b(alargy|alergi)\b": "allergy",
|
|
r"\b(fevar|favar)\b": "fever",
|
|
r"\b(coughu|coff)\b": "cough",
|
|
r"\b(vomit|vomitingu|vomitin)\b": "vomiting",
|
|
|
|
# Common Indian Medicines (Phonetic normalization)
|
|
r"\b(parasetamal|paracitamol|paracetamol 650|dolo 650|dolo)\b": "Paracetamol (Dolo 650)",
|
|
r"\b(metformin|methformin|glycomet)\b": "Metformin",
|
|
r"\b(telmisartan|telma|telmikind)\b": "Telmisartan",
|
|
r"\b(amlodipine|amlong|amlo)\b": "Amlodipine",
|
|
r"\b(pantoprazole|pantocid|pan d|pan 40)\b": "Pantoprazole",
|
|
r"\b(omeprazole|omez)\b": "Omeprazole",
|
|
r"\b(atorvastatin|atorva|atorlip)\b": "Atorvastatin",
|
|
r"\b(cetirizine|cetzine|citrizin)\b": "Cetirizine",
|
|
r"\b(azithromycin|azithral|azithro)\b": "Azithromycin",
|
|
r"\b(amoxicillin|mox|augmentin)\b": "Amoxicillin",
|
|
r"\b(insulin injection|insuline)\b": "Insulin",
|
|
}
|
|
|
|
|
|
def normalize_medical_speech(transcript: str, language_code: str = "en-IN") -> str:
|
|
"""
|
|
Cleans, sanitizes, and normalizes spoken transcripts from STT models
|
|
to ensure high clinical fidelity while retaining the patient's original meaning.
|
|
"""
|
|
if not transcript or not transcript.strip():
|
|
return ""
|
|
|
|
cleaned = transcript.strip()
|
|
|
|
# Remove repeated filler words or audio stutter artifacts
|
|
cleaned = re.sub(r"\b(um+|uh+|ah+|erm+|er+)\b", "", cleaned, flags=re.IGNORECASE)
|
|
cleaned = re.sub(r"\s+", " ", cleaned).strip()
|
|
|
|
# If it's English or Romanized Indic code-mixed speech, apply phonetic dictionary
|
|
lang_lower = language_code.lower()
|
|
if lang_lower.startswith("en") or any(c.isascii() for c in cleaned):
|
|
for pattern, replacement in PHONETIC_REPLACEMENTS.items():
|
|
cleaned = re.sub(pattern, replacement, cleaned, flags=re.IGNORECASE)
|
|
|
|
# Standardize spaces and punctuation
|
|
cleaned = re.sub(r"\s+([.,!?])", r"\1", cleaned)
|
|
cleaned = re.sub(r"\s+", " ", cleaned).strip()
|
|
|
|
# Capitalize first letter if needed
|
|
if cleaned and len(cleaned) > 1:
|
|
cleaned = cleaned[0].upper() + cleaned[1:]
|
|
|
|
return cleaned
|