Skip to content

coding-jhj/VoiceGuide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

964 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

VoiceGuide

μ‹œκ°μž₯애인을 μœ„ν•œ μ˜¨λ””λ°”μ΄μŠ€ AI 보행 보쑰 μ•±

슀마트폰 μΉ΄λ©”λΌλ‘œ μ „λ°© μž₯애물을 μ‹€μ‹œκ°„ νƒμ§€ν•˜κ³ 
진동, ν•œκ΅­μ–΄ μŒμ„± μ•ˆλ‚΄, μ‹€μ‹œκ°„ λŒ€μ‹œλ³΄λ“œλ‘œ 보행 상황을 μ§€μ›ν•©λ‹ˆλ‹€.

Python Android FastAPI Cloud Run

라이브 λŒ€μ‹œλ³΄λ“œ Β· GitHub


λͺ©μ°¨


ν•œλˆˆμ— 보기

VoiceGuideλŠ” 카메라 이미지λ₯Ό μ„œλ²„λ‘œ 보내지 μ•Šκ³ , Android κΈ°κΈ° μ•ˆμ—μ„œ YOLO/TFLite λͺ¨λΈλ‘œ μž₯애물을 κ°μ§€ν•©λ‹ˆλ‹€. 앱은 μœ„ν—˜λ„μ— 따라 진동 νŒ¨ν„΄κ³Ό ν•œκ΅­μ–΄ TTSλ₯Ό μ¦‰μ‹œ 좜λ ₯ν•˜κ³ , μ„œλ²„λŠ” 탐지 JSONκ³Ό GPSλ₯Ό λ°›μ•„ λŒ€μ‹œλ³΄λ“œ, 이λ ₯, 경둜, 곡곡데이터 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ‹œκ°ν™”ν•©λ‹ˆλ‹€.

핡심 κ°€μΉ˜ κ΅¬ν˜„ 방식
κ°œμΈμ •λ³΄ 보호 카메라 ν”„λ ˆμž„μ€ κΈ°κΈ° λ‚΄λΆ€μ—μ„œλ§Œ μΆ”λ‘ ν•˜κ³  μ„œλ²„λ‘œ μ „μ†‘ν•˜μ§€ μ•ŠμŒ
μ¦‰μ‹œ μ•ˆλ‚΄ Android 둜컬 SentenceBuilderκ°€ TTS λ¬Έμž₯을 생성해 μ„œλ²„ 응닡을 기닀리지 μ•ŠμŒ
보행 μ•ˆμ „ μž₯μ• λ¬Ό μœ„ν—˜λ„μ— 따라 NONE, SHORT, DOUBLE, URGENT 진동 νŒ¨ν„΄ 제곡
μ„€λͺ… κ°€λŠ₯ν•œ 데이터 μ‚¬κ³ λ‹€λ°œκ΅¬μ—­, νš‘λ‹¨λ³΄λ„ μ ‘κ·Όμ„±, λ³΄ν–‰μ§€μ›μ‹œμ„€ κ·Όκ±°λ₯Ό λŒ€μ‹œλ³΄λ“œμ— ν‘œμ‹œ
Android CameraX
  -> TFLite YOLO μ˜¨λ””λ°”μ΄μŠ€ μΆ”λ‘ 
  -> 3ν”„λ ˆμž„ νˆ¬ν‘œ ν•„ν„° + IoU 좔적 + EMA ν‰ν™œν™”
  -> μœ„ν—˜λ„ 계산
  -> 진동 / 둜컬 TTS μ¦‰μ‹œ μ•ˆλ‚΄
  -> POST /detect, /gps
  -> FastAPI + DB + SSE
  -> μ‹€μ‹œκ°„ λŒ€μ‹œλ³΄λ“œ

μ£Όμš” κΈ°λŠ₯

μ˜μ—­ κΈ°λŠ₯
μ˜¨λ””λ°”μ΄μŠ€ AI 카메라 ν”„λ ˆμž„μ€ κΈ°κΈ° λ‚΄λΆ€μ—μ„œλ§Œ μΆ”λ‘ ν•˜λ©° μ„œλ²„λ‘œ μ „μ†‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μ»€μŠ€ν…€ λͺ¨λΈ COCO 80개 ν΄λž˜μŠ€μ— 계단, λ¬Έ λ“± 보행 μœ„ν—˜ μš”μ†Œλ₯Ό λ³΄κ°•ν–ˆμŠ΅λ‹ˆλ‹€.
μœ„ν—˜ μ„ ν–‰ μ•Œλ¦Ό κΈ΄κΈ‰ μœ„ν—˜ 감지 μ‹œ 진동/λΉ„ν”„μŒμ„ λ¨Όμ € 좜λ ₯ν•˜κ³  μŒμ„± μ•ˆλ‚΄λ₯Ό μ΄μ–΄κ°‘λ‹ˆλ‹€.
μ°ΎκΈ° λͺ¨λ“œ β€œμ˜μž μ°Ύμ•„μ€˜β€, β€œκ°€λ°© μ–΄λ”” μžˆμ–΄β€μ²˜λŸΌ λŒ€μƒ 물체의 λ°©ν–₯κ³Ό 거리λ₯Ό μ•ˆλ‚΄ν•©λ‹ˆλ‹€.
μ£Όλ³€ 확인 β€œμ§€κΈˆ 뭐가 μžˆμ–΄?” μš”μ²­μ— ν˜„μž¬ ν”„λ ˆμž„κ³Ό 졜근 좔적 μƒνƒœλ₯Ό μš”μ•½ν•©λ‹ˆλ‹€.
곡곡데이터 지도 μ‚¬κ³ λ‹€λ°œκ΅¬μ—­, νš‘λ‹¨λ³΄λ„ μ ‘κ·Όμ„±, λ³΄ν–‰μ§€μ›μ‹œμ„€ κ·Όκ±°λ₯Ό λŒ€μ‹œλ³΄λ“œμ— ν‘œμ‹œν•©λ‹ˆλ‹€.

μ•± λͺ¨λ“œ

λͺ¨λ“œ μŒμ„± μ˜ˆμ‹œ λ™μž‘
μž₯μ• λ¬Ό β€œμ•žμ— 뭐 μžˆμ–΄β€, β€œκΈΈ μ–΄λ•Œβ€ μœ„ν—˜λ„ μƒμœ„ μž₯애물을 μ¦‰μ‹œ μ•ˆλ‚΄
μ°ΎκΈ° β€œμ˜μž μ°Ύμ•„μ€˜β€, β€œκ°€λ°© μ–΄λ”” μžˆμ–΄β€ μ°ΎλŠ” 물체의 λ°©ν–₯κ³Ό 거리 μ•ˆλ‚΄
μ£Όλ³€ 확인 β€œμ§€κΈˆ 뭐가 μžˆμ–΄β€, β€œν˜„μž¬ 상황 μ•Œλ €μ€˜β€ ν˜„μž¬ ν”„λ ˆμž„κ³Ό 졜근 tracker μƒνƒœ μš”μ•½
물건 확인 β€œμ†μ— λ“  게 뭐야”, β€œλ°”λ‘œ μ•ž 뭐야” κ°€κΉŒμš΄ 물체λ₯Ό μš°μ„  λ‹΅λ³€

ν˜„μž¬ κ΅¬ν˜„ μƒνƒœ

κΈ°λŠ₯ μƒνƒœ μ„€λͺ…
μž₯μ• λ¬Ό 탐지 μ™„λ£Œ yolo11n_320.tflite 기반 μ˜¨λ””λ°”μ΄μŠ€ μΆ”λ‘ 
μœ„ν—˜λ„ 진동 μ™„λ£Œ NONE, SHORT, DOUBLE, URGENT νŒ¨ν„΄
ν•œκ΅­μ–΄ TTS μ™„λ£Œ ν™”λ©΄ 없이 상황별 μ•ˆλ‚΄ λ¬Έμž₯ λ°œν™”
μŒμ„± λͺ…λ Ή λͺ¨λ“œ μ™„λ£Œ μž₯μ• λ¬Ό, μ°ΎκΈ°, μ£Όλ³€ 확인, 물건 확인
μ„œλ²„ 전솑 / DB μ €μž₯ μ™„λ£Œ 탐지 JSON, GPS, 졜근 μƒνƒœ μ €μž₯
μ‹€μ‹œκ°„ λŒ€μ‹œλ³΄λ“œ μ™„λ£Œ 탐지 ν˜„ν™©, 경둜, 24μ‹œκ°„ λ‚΄μ—­, μ‚¬κ³ λ‹€λ°œκ΅¬μ—­
μ˜€ν”„λΌμΈ 보쑰 μ•ˆλ‚΄ μ™„λ£Œ μ„œλ²„ 없이 Android λ‚΄μž₯ TTS와 진동 μœ μ§€
곡곡데이터 μ‹œλ‚˜λ¦¬μ˜€ μ™„λ£Œ 보라맀역 -> μ„œμšΈμ‹œλ‚¨λΆ€μž₯애인쒅합볡지관 경둜 비ꡐ

곡곡데이터 ν™œμš© μ‹œλ‚˜λ¦¬μ˜€

μ΅œμ’… λ°œν‘œ/데λͺ¨μš© λ°μ΄ν„°λŠ” data/processed/voiceguide_final/에 μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν‘œ μ‹œλ‚˜λ¦¬μ˜€λŠ” λ³΄λΌλ§€μ—­μ—μ„œ μ„œμšΈμ‹œλ‚¨λΆ€μž₯μ• μΈμ’…ν•©λ³΅μ§€κ΄€κΉŒμ§€ 이동할 λ•Œ, λ‹¨μˆœ μ΅œλ‹¨ κ²½λ‘œλ³΄λ‹€ λ³΄ν–‰μ§€μ›μ‹œμ„€ κ·Όκ±°κ°€ μžˆλŠ” 경둜λ₯Ό μ„ νƒν•˜λŠ” νλ¦„μž…λ‹ˆλ‹€.

ν™œμš©ν•œ 곡곡데이터 ν•­λͺ©

데이터 ν•­λͺ© README/λŒ€μ‹œλ³΄λ“œμ—μ„œ μ“°λŠ” μ—­ν• 
νš‘λ‹¨λ³΄λ„ μœ„μΉ˜ 데이터 λ™μž‘κ΅¬ νš‘λ‹¨λ³΄λ„ 후보λ₯Ό 지도 ν¬μΈνŠΈμ™€ 경둜 비ꡐ κΈ°μ€€μ μœΌλ‘œ μ‚¬μš©
보행등/κ΅ν†΅μ‹ ν˜Έ 정보 νš‘λ‹¨ κ°€λŠ₯ μ‹ ν˜Έ μ•ˆλ‚΄μ˜ 근거둜 μ‚¬μš©
음ν–₯μ‹ ν˜ΈκΈ° 정보 μ‹œκ°μž₯애인 보행 μ•ˆλ‚΄μ— μ€‘μš”ν•œ μ•ˆμ „ μ‹œμ„€ μ—¬λΆ€λ‘œ μ μˆ˜ν™”
λ³΄ν–‰μžμž‘λ™μ‹ ν˜ΈκΈ° 정보 μ‚¬μš©μžκ°€ 직접 μ‹ ν˜Έλ₯Ό μš”μ²­ν•  수 μžˆλŠ” μ‹œμ„€ μ—¬λΆ€λ‘œ μ μˆ˜ν™”
고원식 νš‘λ‹¨λ³΄λ„ 정보 μ°¨λŸ‰ 감속과 λ³΄ν–‰μž 보호 κ°€λŠ₯성을 λ‚˜νƒ€λ‚΄λŠ” 보쑰 점수둜 μ‚¬μš©
κ΅ν†΅μ•ˆμ „μ‹œμ„€ 상세 정보 νš‘λ‹¨λ³΄λ„λ³„ μ„€λͺ… κ°€λŠ₯ν•œ μ•ˆμ „ 근거둜 μ‚¬μš©
λ³΄ν–‰μž μ‚¬κ³ λ‹€λ°œκ΅¬μ—­ λŒ€μ‹œλ³΄λ“œ μ§€λ„μ—μ„œ 주의 ꡬ역 λ ˆμ΄μ–΄λ‘œ ν‘œμ‹œ
μž₯애인 λ³΅μ§€μ‹œμ„€/λͺ©μ μ§€ 후보 데λͺ¨ λͺ©μ μ§€μ™€ μ ‘κ·Όμ„± μ‹œλ‚˜λ¦¬μ˜€ ꡬ성에 μ‚¬μš©
이동지원센터 후보 λͺ©μ μ§€ μ ‘κ·Όμ„± μ„€λͺ…κ³Ό fallback μ•ˆλ‚΄ ν›„λ³΄λ‘œ μ‚¬μš©

데이터 처리 흐름

원본 곡곡데이터
  -> λͺ©μ μ§€ / νš‘λ‹¨λ³΄λ„ / λ³΄ν–‰μ§€μ›μ‹œμ„€ / 이동지원센터 뢄리
  -> μ’Œν‘œ μ •κ·œν™”
  -> νš‘λ‹¨λ³΄λ„ μ£Όλ³€ 30m μ‹œμ„€ λ§€μΉ­
  -> 보행등, 음ν–₯μ‹ ν˜ΈκΈ°, μž‘λ™μ‹ ν˜ΈκΈ°, 고원식, 상세정보 μ μˆ˜ν™”
  -> preferred / recommended / basic / insufficient λ“±κΈ‰ν™”
  -> λŒ€μ‹œλ³΄λ“œμš© CSV, GeoJSON, JSON, HTML μ‚°μΆœ
파일 μš©λ„
final_route_comparison.csv 보라맀역 -> μ„œμšΈμ‹œλ‚¨λΆ€μž₯애인쒅합볡지관 A/B 경둜 비ꡐ
final_scenario_dataset.json λŒ€μ‹œλ³΄λ“œκ°€ μ½λŠ” λŒ€ν‘œ μ‹œλ‚˜λ¦¬μ˜€ JSON
final_crosswalk_accessibility.csv λ™μž‘κ΅¬ νš‘λ‹¨λ³΄λ„ μ ‘κ·Όμ„± μ μˆ˜ν‘œ
final_crosswalk_accessibility.geojson 지도 λ ˆμ΄μ–΄μš© νš‘λ‹¨λ³΄λ„ 포인트
final_tts_guidance.csv λ°œν‘œ/μ•± μ•ˆλ‚΄ λ¬Έμž₯
final_data_usage_refined.html 데이터 ν™œμš© κ·Όκ±° μ„€λͺ… HTML

λŒ€ν‘œ μ‹œλ‚˜λ¦¬μ˜€λŠ” μ΅œλ‹¨ 후보 A(06-0000016344)보닀 보행등, 음ν–₯μ‹ ν˜ΈκΈ°, λ³΄ν–‰μžμž‘λ™μ‹ ν˜ΈκΈ° κ·Όκ±°κ°€ μžˆλŠ” B(06-0000032157)λ₯Ό μ„ νƒν•˜λŠ” νλ¦„μž…λ‹ˆλ‹€. λŒ€μ‹œλ³΄λ“œμ—μ„œλŠ” 이 κ²°κ³Όλ₯Ό 경둜 μΉ΄λ“œ, μ ‘κ·Όμ„± λ“±κΈ‰, 보강 μ œμ•ˆ 지점, 데이터 ν™œμš© κ·Όκ±° 링크둜 ν‘œμ‹œν•©λ‹ˆλ‹€.

ν˜„μž¬ A/B 경둜의 κ±°λ¦¬λŠ” 지도 경둜 API 기반 μ‹€μ œ 보행 λ„€νŠΈμ›Œν¬ 거리가 μ•„λ‹ˆλΌ λŒ€ν‘œ νš‘λ‹¨λ³΄λ„ 경유 직선거리 ν•© 기반 데λͺ¨κ°’μž…λ‹ˆλ‹€. λ°œν‘œμ—μ„œλŠ” β€œκ³΅κ³΅λ°μ΄ν„° 기반 μ‹œλ‚˜λ¦¬μ˜€ λ°μ΄ν„°β€λ‘œ μ„€λͺ…ν•˜κ³ , μ‹€μ œ μ΅œλ‹¨ 보행거리 검증은 λ‹€μŒ λ‹¨κ³„λ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€.

μž¬μƒμ„±:

python tools/build_voiceguide_final_dataset.py

ν”„λ‘œμ νŠΈ ꡬ쑰

VoiceGuide/
β”œβ”€β”€ android/app/src/main/
β”‚   β”œβ”€β”€ assets/
β”‚   β”‚   β”œβ”€β”€ yolo11n_320.tflite
β”‚   β”‚   β”œβ”€β”€ yolo26n_float32.tflite
β”‚   β”‚   └── policy_default.json
β”‚   └── java/com/voiceguide/
β”‚       β”œβ”€β”€ MainActivity.kt
β”‚       β”œβ”€β”€ TfliteYoloDetector.kt
β”‚       β”œβ”€β”€ MvpPipeline.kt
β”‚       β”œβ”€β”€ SentenceBuilder.kt
β”‚       β”œβ”€β”€ VoiceGuideConstants.kt
β”‚       β”œβ”€β”€ VoicePolicy.kt
β”‚       └── Detection.kt
β”‚
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ api/
β”‚   β”‚   β”œβ”€β”€ main.py
β”‚   β”‚   β”œβ”€β”€ routes.py
β”‚   β”‚   β”œβ”€β”€ db.py
β”‚   β”‚   β”œβ”€β”€ tracker.py
β”‚   β”‚   └── events.py
β”‚   β”œβ”€β”€ nlg/
β”‚   β”‚   β”œβ”€β”€ sentence.py
β”‚   β”‚   └── templates.py
β”‚   └── config/
β”‚       β”œβ”€β”€ policy.json
β”‚       └── policy.py
β”‚
β”œβ”€β”€ templates/dashboard.html
β”œβ”€β”€ data/processed/voiceguide_final/
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ reports/
β”‚   β”‚   β”œβ”€β”€ current_status.html
β”‚   β”‚   └── model_tuning_issue.html
β”‚   └── status/
β”œβ”€β”€ tools/
β”‚   β”œβ”€β”€ build_voiceguide_final_dataset.py
β”‚   └── build_business_plan.js
β”œβ”€β”€ tests/
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ package.json
└── requirements.txt

λΉ λ₯Έ μ‹œμž‘

μ„œλ²„ μ‹€ν–‰

pip install -r requirements.txt
cp .env.example .env
uvicorn src.api.main:app --host 0.0.0.0 --port 8000

μ„œλ²„μ—λŠ” YOLO λͺ¨λΈμ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ¨λΈ 좔둠은 Android κΈ°κΈ°μ—μ„œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

Android μ•± μ‹€ν–‰

  1. Android Studioμ—μ„œ android/ 폴더 μ—΄κΈ°
  2. Gradle Sync
  3. USB κΈ°κΈ° μ—°κ²° 및 USB 디버깅 ν™œμ„±ν™”
  4. Run (Shift+F10)
  5. μ•± μ„€μ •μ—μ„œ μ„œλ²„ URL μž…λ ₯
cd android
.\gradlew.bat assembleDebug

ν™˜κ²½ λ³€μˆ˜

λ³€μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
DATABASE_URL SQLite PostgreSQL/Supabase μ—°κ²° URL
API_KEY μ—†μŒ Bearer λ˜λŠ” X-API-Key 인증
PORT 8000 μ„œλ²„ 포트

ν…ŒμŠ€νŠΈ

python -m pytest tests/ -v -m "not integration"

μ΅œμ’… 곡곡데이터/API 검증:

python -m pytest tests/test_api.py tests/test_voiceguide_final_dataset.py

배포

ν˜„μž¬ Cloud Run μ„œλΉ„μŠ€:

https://voiceguide-1063164560758.asia-northeast3.run.app

μ£Όμš” ν™”λ©΄:

GET /health
GET /dashboard
GET /voiceguide-final/summary
GET /voiceguide-final/crosswalks.geojson
GET /voiceguide-final/data-usage.html

배포 μ˜ˆμ‹œ:

cd C:\VoiceGuide\VoiceGuide
gcloud run deploy voiceguide --source . --region asia-northeast3 --project project-d9b26ccb-c174-4820-b16

μ£Όμš” API

λ©”μ„œλ“œ 경둜 μ„€λͺ…
POST /detect 탐지 κ²°κ³Ό JSON μˆ˜μ‹ , DB μ €μž₯, tracker μ—…λ°μ΄νŠΈ
POST /detect_json κ΅¬ν˜• ν˜Έν™˜ 탐지 JSON μˆ˜μ‹ 
POST /question 졜근 tracker/DB μƒνƒœ 기반 μ£Όλ³€ 확인 응닡
POST /gps Android μœ„μΉ˜ μ—…λ°μ΄νŠΈ
GET /api/policy Android μ •μ±… 동기화, ETag 캐싱
GET /status/{session_id} μ„Έμ…˜ ν˜„μž¬ μƒνƒœ
GET /events/{session_id} SSE μ‹€μ‹œκ°„ 슀트림
GET /history/{session_id} μ„Έμ…˜λ³„ 탐지 이λ ₯
GET /heatmap/{session_id} μœ„ν—˜ 히트맡
GET /routes/{session_id} μ €μž₯된 GPS 경둜
GET /pedestrian-hotspots/nearby GPS 기반 λ³΄ν–‰μž μ‚¬κ³ λ‹€λ°œκ΅¬μ—­
GET /voiceguide-final/summary μ΅œμ’… μ‹œλ‚˜λ¦¬μ˜€ μš”μ•½
GET /voiceguide-final/crosswalks.geojson νš‘λ‹¨λ³΄λ„ μ ‘κ·Όμ„± GeoJSON
GET /voiceguide-final/data-usage.html 데이터 ν™œμš© κ·Όκ±° HTML
GET /dashboard μ‹€μ‹œκ°„ λŒ€μ‹œλ³΄λ“œ

κ΄€λ ¨ λ¬Έμ„œ

λ¬Έμ„œ μœ„μΉ˜ λ‚΄μš©
ν˜„μž¬ 상황 λ³΄κ³ μ„œ docs/reports/current_status.html μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜, 핡심 이슈, μ„œλ²„ μ—”λ“œν¬μΈνŠΈ, λ‘œλ“œλ§΅
λͺ¨λΈ νŠœλ‹ 이슈 뢄석 docs/reports/model_tuning_issue.html νŒŒμΈνŠœλ‹ λͺ¨λΈ μ˜€μΈμ‹ 원인과 κ°œμ„  λ°©ν–₯
디버그 리포트 docs/debug_report.md μ„œλ²„, 트래컀, λŒ€μ‹œλ³΄λ“œ 디버깅 기둝
μƒνƒœ λ³΄κ³ μ„œ docs/status/CURRENT_STATUS_REPORT.md Markdown 기반 ν”„λ‘œμ νŠΈ μƒνƒœ μš”μ•½
μ΅œμ’… 데이터 μ„€λͺ… data/processed/voiceguide_final/README.md μ΅œμ’… 곡곡데이터 μ‚°μΆœλ¬Ό κΈ°μ€€κ³Ό μ£Όμ˜μ‚¬ν•­

AI HUMAN 4κΈ° 3νŒ€ Β· 2026