SwitchAlpha commited on
Commit
e0e8859
·
1 Parent(s): f40cd47
Files changed (1) hide show
  1. app.py +49 -16
app.py CHANGED
@@ -3,8 +3,9 @@ os.environ["NUMBA_DISABLE_CACHING"] = "1"
3
  import torch
4
  import torch.nn as nn
5
  import numpy as np
6
- from fastapi import FastAPI, File, UploadFile, HTTPException
7
  from fastapi.responses import JSONResponse
 
8
  import io
9
  import torchaudio
10
  import librosa
@@ -49,14 +50,39 @@ class Config:
49
 
50
  cfg = Config()
51
 
52
- # --- 3. Bakım Noktaları "Veritabanı" ---
53
- CARE_POINTS_DB_RAW = {
54
- "belly_pain": """Bebek olabilir: Karnı rahatsız. [Ana Neden] Hava yutma. Beslendikten hemen sonra geğirme, muhtemelen şişkinlikle birlikte; [Bakım Noktası] Besledikten sonra bebeği dik tutun ve 10-15 dakika dik pozisyonda tutarak gazını çıkarın.---Bebek olabilir: Karnı rahatsız. [Ana Neden] Olgunlaşmamış sindirim sistemi. Yenidoğanlarda sık geğirme, özellikle beslendikten sonra; [Bakım Noktası] Düzenli beslenmeyi sürdürün, aşırı beslemekten kaçının; gaz çıkarmasına yardımcı olmak için beslendikten sonra sırtına hafifçe vurun.---Bebek olabilir: Karnı rahatsız. [Ana Neden] Çok hızlı veya çok fazla yemek. Geğirme, huysuzluk, kusma eşliğinde; [Bakım Noktası] Besleme hızını kontrol edin, daha küçük, daha sık öğünler benimseyin; besleme sırasında uygun şekilde duraklayın.---Bebek olabilir: Karnı rahatsız. [Ana Neden] Duygusal değişiklikler. Ağladıktan veya güldükten sonra geğirme; [Bakım Noktası] Bebeğin duygularını yatıştırın, yoğun ağlama veya heyecandan kaçının; beslenmeden önce ve sonra sakin bir ortam sağlayın.---Bebek olabilir: Karnı rahatsız. [AnaNeden] Sıcaklık değişiklikleri. Ani ortam sıcaklığı değişikliklerinden veya bebek üşüdüğünde geğirme; [Bakım Noktası] Oda sıcaklığını sabit tutun, bebeğin karnının üşümesini önleyin; sıcak tutmaya dikkat edin.""",
55
- "burping": """Besledikten sonra daima bebeğin gazını çıkarın.---Geğirme pozisyonlarını değiştirin, birden fazla yöntem deneyin.---Çok fazla hava yutmasını önlemek için biberon emziği akış hızının uygun olup olmadığını kontrol edin.---Bir seferde yutulan hava miktarını azaltmak için daha küçük, daha sık öğünler sunun.---Eğer bebek sık sık geğiriyorsa, beslenme alışkanlıklarının ayarlanması gerekebilir.""",
56
- "discomfort": """Bezin ıslak veya kirli olup olmadığını kontrol edin.---Oda sıcaklığının rahat olup olmadığını, bebeğin çok sıcak veya çok soğuk giydirilip giydirilmediğini onaylayın.---Bebeğin kıyafetlerinin çok sıkı olup olmadığını veya rahatsızlık verip vermediğini kontrol edin.---Bebeğin böcekler tarafından ısırılmadığından veya cildinin kaşınmadığından emin olun.---Rahatsızlığı hafifletip hafifletmediğini görmek için bebeğin pozisyonunu değiştirmeyi deneyin.""",
57
- "hungry": """Bebek acıkmış olabilir, lütfen zamanında besleyin.---Son beslenme zamanını kontrol edin, yemek zamanı mı?---Biberon veya emzirmeyi deneyin, bebeğin aranma refleksi gösterip göstermediğine bakın.---Bebeğin doyduğundan emin olun, beslendikten sonra bebeğin tepkisini gözlemleyin.---Eğer bebek kontrolsüzce ağlıyorsa, küçük bir ek beslenme gerekebilir."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
- # (Not: Veritabanı metinlerini daha iyi anlaşılması için İngilizce'den Türkçe'ye çevirdim)
60
 
61
  # --- 4. Model Tanımı (Değişmedi) ---
62
  # ... (ResidualBlock ve CryNetMultiBranch sınıflarınız burada, değişiklik yok) ...
@@ -151,11 +177,14 @@ async def lifespan(app: FastAPI):
151
  ).to(cfg.DEVICE)
152
  logging.info("✅ Ses dönüştürücüleri başarıyla başlatıldı!")
153
 
154
- app_globals["CARE_POINTS_DB"] = {}
155
- for category, raw_text in CARE_POINTS_DB_RAW.items():
156
- points = [point.strip() for point in raw_text.strip().split('---') if point.strip()]
157
- app_globals["CARE_POINTS_DB"][category] = points
158
- logging.info("✅ Bakım bilgi bankası başarıyla ayrıştırıldı!")
 
 
 
159
 
160
  app_globals["resampler_cache"] = {}
161
  # [YENİ EKLEME] ESC-50 modeli için ayrı bir yeniden örnekleyici önbelleği
@@ -187,9 +216,13 @@ def get_resampler(cache, orig_freq, new_freq, device):
187
  return cache[orig_freq][new_freq]
188
 
189
  @app.post("/predict_cry_audio")
190
- async def predict_cry_audio(file: UploadFile = File(...)):
191
  if not app_globals.get("loaded_model") or not app_globals.get("esc50_model"):
192
  raise HTTPException(status_code=503, detail="Modeller yüklenmedi, hizmet geçici olarak kullanılamıyor.")
 
 
 
 
193
 
194
  try:
195
  audio_bytes = await file.read()
@@ -282,9 +315,9 @@ async def predict_cry_audio(file: UploadFile = File(...)):
282
  logging.error(f"Ses dosyası işlenirken kritik hata: {e}", exc_info=True)
283
  raise HTTPException(status_code=500, detail="Ses dosyası işlenemedi, lütfen tekrar deneyin veya dosya formatını kontrol edin.")
284
 
285
- # Orijinal JSON yanıt mantığınız (hiç değişmedi)
286
  response_data = {}
287
- CARE_POINTS_DB = app_globals["CARE_POINTS_DB"]
288
 
289
  if top1_score > cfg.THRESHOLD_HIGH_CONFIDENCE:
290
  care_points = CARE_POINTS_DB.get(top1_label, [])
 
3
  import torch
4
  import torch.nn as nn
5
  import numpy as np
6
+ from fastapi import FastAPI, File, UploadFile, HTTPException, Form
7
  from fastapi.responses import JSONResponse
8
+ from typing import Optional
9
  import io
10
  import torchaudio
11
  import librosa
 
50
 
51
  cfg = Config()
52
 
53
+ # --- 3. Bakım Noktaları "Veritabanı" (Çok Dilli) ---
54
+ CARE_POINTS_DB_MULTILANG = {
55
+ "tr": {
56
+ "belly_pain": """Bebek olabilir: Karnı rahatsız. [Ana Neden] Hava yutma. Beslendikten hemen sonra geğirme, muhtemelen şişkinlikle birlikte; [Bakım Noktası] Besledikten sonra bebeği dik tutun ve 10-15 dakika dik pozisyonda tutarak gazını çıkarın.---Bebek olabilir: Karnı rahatsız. [Ana Neden] Olgunlaşmamış sindirim sistemi. Yenidoğanlarda sık geğirme, özellikle beslendikten sonra; [Bakım Noktası] Düzenli beslenmeyi sürdürün, aşırı beslemekten kaçının; gaz çıkarmasına yardımcı olmak için beslendikten sonra sırtına hafifçe vurun.---Bebek olabilir: Karnı rahatsız. [Ana Neden] Çok hızlı veya çok fazla yemek. Geğirme, huysuzluk, kusma eşliğinde; [Bakım Noktası] Besleme hızını kontrol edin, daha küçük, daha sık öğünler benimseyin; besleme sırasında uygun şekilde duraklayın.---Bebek olabilir: Karnı rahatsız. [Ana Neden] Duygusal değişiklikler. Ağladıktan veya güldükten sonra geğirme; [Bakım Noktası] Bebeğin duygularını yatıştırın, yoğun ağlama veya heyecandan kaçının; beslenmeden önce ve sonra sakin bir ortam sağlayın.---Bebek olabilir: Karnı rahatsız. [AnaNeden] Sıcaklık değişiklikleri. Ani ortam sıcaklığı değişiklerinden veya bebek üşüdüğünde geğirme; [Bakım Noktası] Oda sıcaklığını sabit tutun, bebeğin karnının üşümesini önleyin; sıcak tutmaya dikkat edin.""",
57
+ "burping": """Besledikten sonra daima bebeğin gazını çıkarın.---Geğirme pozisyonlarını değiştirin, birden fazla yöntem deneyin.---Çok fazla hava yutmasını önlemek için biberon emziği akış hızının uygun olup olmadığını kontrol edin.---Bir seferde yutulan hava miktarını azaltmak için daha küçük, daha sık öğünler sunun.---Eğer bebek sık sık geğiriyorsa, beslenme alışkanlıklarının ayarlanması gerekebilir.""",
58
+ "discomfort": """Bezin ıslak veya kirli olup olmadığını kontrol edin.---Oda sıcaklığının rahat olup olmadığını, bebeğin çok sıcak veya çok soğuk giydirilip giydirilmediğini onaylayın.---Bebeğin kıyafetlerinin çok sıkı olup olmadığını veya rahatsızlık verip vermediğini kontrol edin.---Bebeğin böcekler tarafından ısırılmadığından veya cildinin kaşınmadığından emin olun.---Rahatsızlığı hafifletip hafifletmediğini görmek için bebeğin pozisyonunu değiştirmeyi deneyin.""",
59
+ "hungry": """Bebek acıkmış olabilir, lütfen zamanında besleyin.---Son beslenme zamanını kontrol edin, yemek zamanı mı?---Biberon veya emzirmeyi deneyin, bebeğin aranma refleksi gösterip göstermediğine bakın.---Bebeğin doyduğundan emin olun, beslendikten sonra bebeğin tepkisini gözlemleyin.---Eğer bebek kontrolsüzce ağlıyorsa, küçük bir ek beslenme gerekebilir."""
60
+ },
61
+ "en": {
62
+ "belly_pain": """Baby may have: Belly pain. [Main Cause] Swallowing air. Burping immediately after feeding, possibly with bloating; [Care Point] Keep the baby upright after feeding and hold in an upright position for 10-15 minutes to help release gas.---Baby may have: Belly pain. [Main Cause] Immature digestive system. Frequent burping in newborns, especially after feeding; [Care Point] Continue regular feeding, avoid overfeeding; gently pat the back after feeding to help release gas.---Baby may have: Belly pain. [Main Cause] Eating too fast or too much. Burping accompanied by fussiness and vomiting; [Care Point] Control feeding pace, adopt smaller, more frequent meals; pause appropriately during feeding.---Baby may have: Belly pain. [Main Cause] Emotional changes. Burping after crying or laughing; [Care Point] Calm the baby's emotions, avoid intense crying or excitement; provide a calm environment before and after feeding.---Baby may have: Belly pain. [Main Cause] Temperature changes. Burping from sudden ambient temperature changes or when baby gets cold; [Care Point] Keep room temperature stable, prevent baby's belly from getting cold; pay attention to keeping warm.""",
63
+ "burping": """Always burp the baby after feeding.---Change burping positions, try multiple methods.---Check if the bottle nipple flow rate is appropriate to prevent swallowing too much air.---Offer smaller, more frequent meals to reduce the amount of air swallowed at once.---If the baby burps frequently, feeding habits may need to be adjusted.""",
64
+ "discomfort": """Check if the diaper is wet or dirty.---Confirm if the room temperature is comfortable, whether the baby is dressed too warm or too cold.---Check if the baby's clothes are too tight or causing discomfort.---Make sure the baby has not been bitten by insects or has itchy skin.---Try changing the baby's position to see if it relieves the discomfort.""",
65
+ "hungry": """Baby may be hungry, please feed in time.---Check the last feeding time, is it mealtime?---Try bottle or breastfeeding, see if the baby shows rooting reflex.---Make sure the baby is full, observe the baby's response after feeding.---If the baby cries uncontrollably, a small supplementary feeding may be needed."""
66
+ },
67
+ "de": {
68
+ "belly_pain": """Baby könnte haben: Bauchschmerzen. [Hauptursache] Luft schlucken. Aufstoßen unmittelbar nach dem Füttern, möglicherweise mit Blähungen; [Pflegepunkt] Halten Sie das Baby nach dem Füttern aufrecht und halten Sie es 10-15 Minuten in aufrechter Position, um Gas freizusetzen.---Baby könnte haben: Bauchschmerzen. [Hauptursache] Unreifes Verdauungssystem. Häufiges Aufstoßen bei Neugeborenen, besonders nach dem Füttern; [Pflegepunkt] Regelmäßige Fütterung fortsetzen, Überfütterung vermeiden; sanft auf den Rücken klopfen nach dem Füttern, um Gas freizusetzen.---Baby könnte haben: Bauchschmerzen. [Hauptursache] Zu schnell oder zu viel essen. Aufstoßen begleitet von Unruhe und Erbrechen; [Pflegepunkt] Fütterungstempo kontrollieren, kleinere, häufigere Mahlzeiten einführen; während des Fütterns angemessen pausieren.---Baby könnte haben: Bauchschmerzen. [Hauptursache] Emotionale Veränderungen. Aufstoßen nach Weinen oder Lachen; [Pflegepunkt] Babys Emotionen beruhigen, intensives Weinen oder Aufregung vermeiden; ruhige Umgebung vor und nach dem Füttern schaffen.---Baby könnte haben: Bauchschmerzen. [Hauptursache] Temperaturveränderungen. Aufstoßen durch plötzliche Umgebungstemperaturänderungen oder wenn Baby friert; [Pflegepunkt] Raumtemperatur stabil halten, Babys Bauch vor Kälte schützen; auf Warmhalten achten.""",
69
+ "burping": """Baby nach dem Füttern immer aufstoßen lassen.---Aufstoßpositionen ändern, mehrere Methoden ausprobieren.---Überprüfen, ob die Flaschensauger-Durchflussrate angemessen ist, um zu verhindern, dass zu viel Luft geschluckt wird.---Kleinere, häufigere Mahlzeiten anbieten, um die auf einmal geschluckte Luftmenge zu reduzieren.---Wenn das Baby häufig aufstößt, müssen möglicherweise Fütterungsgewohnheiten angepasst werden.""",
70
+ "discomfort": """Überprüfen, ob die Windel nass oder schmutzig ist.---Bestätigen, ob die Raumtemperatur angenehm ist, ob das Baby zu warm oder zu kalt angezogen ist.---Überprüfen, ob die Kleidung des Babys zu eng ist oder Unbehagen verursacht.---Sicherstellen, dass das Baby nicht von Insekten gebissen wurde oder juckende Haut hat.---Versuchen, die Position des Babys zu ändern, um zu sehen, ob es das Unbehagen lindert.""",
71
+ "hungry": """Baby könnte hungrig sein, bitte rechtzeitig füttern.---Letzte Fütterungszeit überprüfen, ist es Essenszeit?---Flasche oder Stillen versuchen, sehen, ob Baby Suchreflex zeigt.---Sicherstellen, dass Baby satt ist, Reaktion des Babys nach dem Füttern beobachten.---Wenn Baby unkontrolliert weint, könnte eine kleine Zusatzfütterung erforderlich sein."""
72
+ },
73
+ "ru": {
74
+ "belly_pain": """У ребенка может быть: Боль в животе. [Основная причина] Заглатывание воздуха. Отрыжка сразу после кормления, возможно с вздутием; [Уход] Держите ребенка в вертикальном положении после кормления в течение 10-15 минут, чтобы помочь выпустить газы.---У ребенка может быть: Боль в животе. [Основная причина] Незрелая пищеварительная система. Частая отрыжка у новорожденных, особенно после кормления; [Уход] Продолжайте регулярное кормление, избегайте перекармливания; осторожно похлопывайте по спине после кормления для выпуска газов.---У ребенка может быть: Боль в животе. [Основная причина] Слишком быстрое или чрезмерное питание. Отрыжка, сопровождаемая беспокойством и рвотой; [Уход] Контролируйте темп кормления, вводите меньшие, более частые приемы пищи; делайте соответствующие паузы во время кормления.---У ребенка может быть: Боль в животе. [Основная причина] Эмоциональные изменения. Отрыжка после плача или смеха; [Уход] Успокойте эмоции ребенка, избегайте интенсивного плача или возбуждения; обеспечьте спокойную обстановку до и после кормления.---У ребенка может быть: Боль в животе. [Основная причина] Изменения температуры. Отрыжка от резких изменений температуры окружающей среды или когда ребенок мерзнет; [Уход] Поддерживайте стабильную температуру в комнате, предотвращайте переохлаждение живота ребенка; обращайте внимание на сохранение тепла.""",
75
+ "burping": """Всегда помогайте ребенку отрыгнуть после кормления.---Меняйте позиции для отрыжки, пробуйте несколько методов.---Проверьте, подходит ли скорость потока соски бутылочки, чтобы предотвратить заглатывание слишком большого количества воздуха.---Предлагайте меньшие, более частые приемы пищи, чтобы уменьшить количество проглоченного воздуха за раз.---Если ребенок часто отрыгивает, возможно, необходимо скорректировать привычки кормления.""",
76
+ "discomfort": """Проверьте, мокрый или грязный подгузник.---Убедитесь, что температура в комнате комфортная, не одет ли ребенок слишком тепло или холодно.---Проверьте, не слишком ли тесная одежда ребенка или вызывает дискомфорт.---Убедитесь, что ребенка не укусили насекомые или у него нет зудящей кожи.---Попробуйте изменить положение ребенка, чтобы увидеть, облегчает ли это дискомфорт.""",
77
+ "hungry": """Ребенок может быть голоден, пожалуйста, покормите вовремя.---Проверьте время последнего кормления, не пора ли кормить?---Попробуйте бутылочку или грудное вскармливание, посмотрите, проявляет ли ребенок поисковый рефлекс.---Убедитесь, что ребенок сыт, наблюдайте за реакцией ребенка после кормления.---Если ребенок плачет неконтролируемо, может потребоваться небольшое дополнительное кормление."""
78
+ },
79
+ "ko": {
80
+ "belly_pain": """아기가 겪을 수 있는 증상: 복통. [주요 원因] 공기 삼킴. 수유 직후 트림, 복부 팽만 가능; [돌봄 요령] 수유 후 아기를 세워서 10-15분간 똑바로 세워 가스 배출을 돕습니다.---아기가 겪을 수 있는 증상: 복통. [주요 원因] 미성숙한 소화 시스템. 신생아의 잦은 트림, 특히 수유 후; [돌봄 요령] 규칙적인 수유를 유지하고 과식을 피하며, 수유 후 등을 부드럽게 두드려 가스 배출을 돕습니다.---아기가 겪을 수 있는 증상: 복통. [주요 원因] 너무 빠르거나 과도한 수유. 트림과 함께 보챔과 구토; [돌봄 요령] 수유 속도를 조절하고 소량씩 자주 먹이며, 수유 중 적절히 멈춥니다.---아기가 겪을 수 있는 증상: 복통. [주요 원因] 감정 변화. 울거나 웃은 후 트림; [돌봄 요령] 아기의 감정을 진정시키고 과도한 울음이나 흥분을 피하며, 수유 전후 차분한 환경을 제공합니다.---아기가 겪을 수 있는 증상: 복통. [주요 원因] 온도 변화. 급격한 주변 온도 변화나 아기가 추울 때 트림; [돌봄 요령] 실내 온도를 안정적으로 유지하고 아기 배가 차가워지지 않도록 하며, 보온에 주의합니다.""",
81
+ "burping": """수유 후 항상 아기의 트림을 시킵니다.---트림 자세를 바꾸고 여러 방법을 시도합니다.---젖병 젖꼭지 유속이 적절한지 확인하여 공기를 너무 많이 삼키지 않도록 합니다.---한 번에 삼키는 공기량을 줄이기 위해 소량씩 자주 수유합니다.---아기가 자주 트림을 한다면 수유 습관을 조정해야 할 수 있습니다.""",
82
+ "discomfort": """기저귀가 젖었거나 더러운지 확인합니다.---실내 온도가 편안한지, 아기가 너무 덥거나 춥게 입혀졌는지 확인합니다.---아기의 옷이 너무 꽉 끼거나 불편함을 주는지 확인합니다.---아기가 벌레에 물리지 않았는지 또는 피부가 가렵지 않은지 확인합니다.---아기의 자세를 바꿔보고 불편함이 완화되는지 확인합니다.""",
83
+ "hungry": """아기가 배고플 수 있으니 제때 수유하세요.---마지막 수유 시간을 확인하고 식사 시간인지 확인합니다.---젖병이나 모유 수유를 시도하고 아기가 빨기 반사를 보이는지 확인합니다.---아기가 배부른지 확인하고 수유 후 아기의 반응을 관찰합니다.---아기가 통제할 수 없이 운다면 소량의 추가 수유가 필요할 수 있습니다."""
84
+ }
85
  }
 
86
 
87
  # --- 4. Model Tanımı (Değişmedi) ---
88
  # ... (ResidualBlock ve CryNetMultiBranch sınıflarınız burada, değişiklik yok) ...
 
177
  ).to(cfg.DEVICE)
178
  logging.info("✅ Ses dönüştürücüleri başarıyla başlatıldı!")
179
 
180
+ # Çok dilli bakım noktalarını parse et
181
+ app_globals["CARE_POINTS_DB_MULTILANG"] = {}
182
+ for lang, categories in CARE_POINTS_DB_MULTILANG.items():
183
+ app_globals["CARE_POINTS_DB_MULTILANG"][lang] = {}
184
+ for category, raw_text in categories.items():
185
+ points = [point.strip() for point in raw_text.strip().split('---') if point.strip()]
186
+ app_globals["CARE_POINTS_DB_MULTILANG"][lang][category] = points
187
+ logging.info("✅ Çok dilli bakım bilgi bankası başarıyla ayrıştırıldı!")
188
 
189
  app_globals["resampler_cache"] = {}
190
  # [YENİ EKLEME] ESC-50 modeli için ayrı bir yeniden örnekleyici önbelleği
 
216
  return cache[orig_freq][new_freq]
217
 
218
  @app.post("/predict_cry_audio")
219
+ async def predict_cry_audio(file: UploadFile = File(...), language: Optional[str] = Form("tr")):
220
  if not app_globals.get("loaded_model") or not app_globals.get("esc50_model"):
221
  raise HTTPException(status_code=503, detail="Modeller yüklenmedi, hizmet geçici olarak kullanılamıyor.")
222
+
223
+ # Dil validasyonu
224
+ if language not in ["en", "de", "tr", "ru", "ko"]:
225
+ language = "tr" # Varsayılan dil
226
 
227
  try:
228
  audio_bytes = await file.read()
 
315
  logging.error(f"Ses dosyası işlenirken kritik hata: {e}", exc_info=True)
316
  raise HTTPException(status_code=500, detail="Ses dosyası işlenemedi, lütfen tekrar deneyin veya dosya formatını kontrol edin.")
317
 
318
+ # Orijinal JSON yanıt mantığınız (şimdi dile göre bakım noktaları kullanıyor)
319
  response_data = {}
320
+ CARE_POINTS_DB = app_globals["CARE_POINTS_DB_MULTILANG"].get(language, app_globals["CARE_POINTS_DB_MULTILANG"]["tr"])
321
 
322
  if top1_score > cfg.THRESHOLD_HIGH_CONFIDENCE:
323
  care_points = CARE_POINTS_DB.get(top1_label, [])