CD / docs /TTS_ROUTE_GUIDANCE_VALIDATION.md
tkadkghdlf's picture
Sync from GitHub via hub-sync
9c47375 verified
|
Raw History Blame Contribute Delete
5.95 kB
# TTS ๊ธฐ๋Šฅ ๋ฐ ๊ฒฝ๋กœ ์•ˆ๋‚ด ๊ฒ€์ฆ ๊ธฐ์ค€
## 1. ์ œ๊ณต TTS์™€ ์ถœ๋ ฅ ๊ธฐ์ค€
๋ชจ๋“  ๋Ÿฌ๋‹ ์Œ์„ฑ์€ ์›น ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ์Œ์„ฑ์ด ์•„๋‹Œ `myshell-ai/MeloTTS-Korean`์˜ WAV ์‘๋‹ต์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” `POST /api/v1/ai/tts/korean`์— `{ "text": "...", "speed": 1.5 }`๋ฅผ ์š”์ฒญํ•˜๊ณ , ์‘๋‹ต์„ Object URL๋กœ ์บ์‹œํ•œ ๋’ค ํ•˜๋‚˜์˜ ์žฌ์ƒ ๋Œ€๊ธฐ์—ด์—์„œ ์ˆœ์„œ๋Œ€๋กœ ์žฌ์ƒํ•œ๋‹ค. ๋ชจ๋ธ ์˜ค๋ฅ˜ ์‹œ ํ•ด๋‹น ์•ˆ๋‚ด๋งŒ ๊ฑด๋„ˆ๋›ฐ๋ฉฐ OS TTS๋กœ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค.
| ๊ธฐ๋Šฅ | ์ถœ๋ ฅ ๊ธฐ์ค€ | ์Œ์„ฑ ํ…์ŠคํŠธ |
| --- | --- | --- |
| ๊ฒฝ๋กœ ๊ฐˆ๋ฆผ๊ธธ ์•ˆ๋‚ด | ์ƒ์„ฑ๋œ OSM ๋„๋กœ ๊ทธ๋ž˜ํ”„์—์„œ ์ง„์ž… ๋ฐฉํ–ฅ์„ ์ œ์™ธํ•œ ์„ ํƒ์ง€๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๊ณ , ์„ ํƒ ๊ฒฝ๋กœ๊ฐ€ ์ขŒ/์šฐ๋กœ 30~150๋„ ๊บพ์ด๋Š” ์ง€์ ๋งŒ ๋“ฑ๋กํ•œ๋‹ค. ์„ ํƒ ๊ฒฝ๋กœ์—์„œ 250m ์ด๋‚ด์— ๋“ค์–ด์˜ค๋ฉด WAV๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๊ณ , GPS๊ฐ€ ๊ฒฝ๋กœ์—์„œ 45m ์ด๋‚ด์ด๋ฉฐ ํ•ด๋‹น ์ง€์  65m ์ „~12m ์ง€๋‚œ ๋ฒ”์œ„์— ์žˆ์„ ๋•Œ 1ํšŒ ์•ˆ๋‚ดํ•œ๋‹ค. 60m ์ด๋‚ด์— ์—ฐ์†๋œ ๋ถ„๊ธฐ์ ์€ ์ค‘๋ณต ๋“ฑ๋กํ•˜์ง€ ์•Š๋Š”๋‹ค. | `์ž ์‹œ ํ›„ ๊ฐˆ๋ฆผ๊ธธ์—์„œ ์ขŒํšŒ์ „ํ•˜์„ธ์š”.` ๋˜๋Š” `์ž ์‹œ ํ›„ ๊ฐˆ๋ฆผ๊ธธ์—์„œ ์šฐํšŒ์ „ํ•˜์„ธ์š”.` |
| ์‹ค์‹œ๊ฐ„ ์„ผ์„œ ์ฝ”์นญ | ์›Œ์น˜ `live-state`๋ฅผ 5์ดˆ๋งˆ๋‹ค ์ฝ๋Š”๋‹ค. ๊ฐ™์€ ํ•ญ๋ชฉ์€ 120์ดˆ, ๋‹ค๋ฅธ ํ•ญ๋ชฉ์€ 90์ดˆ ์žฌ์•ˆ๋‚ดํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‹ฌ๋ฐ• ์ƒ์Šน โ†’ ์ผ€์ด๋˜์Šค โ†’ ์ขŒ์šฐ ๋น„๋Œ€์นญ โ†’ ์ ‘์ง€ ์‹œ๊ฐ„ โ†’ ์ƒํ•˜ ์›€์ง์ž„ ์ˆœ์„œ๋‹ค. | ์•„๋ž˜ ์„ผ์„œ ์ฝ”์นญ ๋ฌธ๊ตฌ ์ฐธ์กฐ |
| 1km ์™„๋ฃŒ | ์‹ค์ œ/์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ด๋™ ๊ฑฐ๋ฆฌ๋กœ ์ƒˆ ์ •์ˆ˜ km๋ฅผ ๋„˜์„ ๋•Œ ๊ฐ km๋งˆ๋‹ค 1ํšŒ. | `{n}ํ‚ฌ๋กœ๋ฏธํ„ฐ๋ฅผ ์™„๋ฃŒํ–ˆ์–ด์š”. ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์€ {์‹œ๊ฐ„}, ํ‰๊ท  ์†๋„๋Š” {์†๋„}์ž…๋‹ˆ๋‹ค.` |
| ์ ˆ๋ฐ˜ | ์„ ํƒ ์ฝ”์Šค ๋ชฉํ‘œ ๊ฑฐ๋ฆฌ์˜ 50%๋ฅผ ์ฒ˜์Œ ๋„˜์„ ๋•Œ 1ํšŒ. | `์ ˆ๋ฐ˜ ์ง€์ ์— ๋„๋‹ฌํ–ˆ์–ด์š”! ์ง€๊ธˆ์ฒ˜๋Ÿผ๋งŒ ์œ ์ง€ํ•ด์„œ ๋๊นŒ์ง€ ์ด์–ด๊ฐ€๋ณด์„ธ์š”!` |
| ๋ชฉํ‘œ 500m ์ „ | ๋ชฉํ‘œ ๊ฑฐ๋ฆฌ๊ฐ€ 0.5km๋ณด๋‹ค ๊ธธ๊ณ  `๋ชฉํ‘œ - 0.5km`๋ฅผ ์ฒ˜์Œ ๋„˜์„ ๋•Œ 1ํšŒ. | `๋ชฉํ‘œ์น˜์— ๊ฑฐ์˜ ๋‹ค ๋„๋‹ฌํ–ˆ์–ด์š”! ์กฐ๊ธˆ๋งŒ ๋” ํž˜๋‚ด์„ธ์š”!` |
| ๋ชฉํ‘œ ๋‹ฌ์„ฑ | ์„ ํƒ ์ฝ”์Šค ๋ชฉํ‘œ ๊ฑฐ๋ฆฌ๋ฅผ ์ฒ˜์Œ ๋„˜์„ ๋•Œ 1ํšŒ. | `์ถ•ํ•˜๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ–ˆ์–ด์š”! ์ด ๊ฑฐ๋ฆฌ {๊ฑฐ๋ฆฌ}, ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์€ {์‹œ๊ฐ„}, ํ‰๊ท  ์†๋„๋Š” {์†๋„}์ž…๋‹ˆ๋‹ค.` |
์„ผ์„œ ์ฝ”์นญ ๋ฌธ๊ตฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
- ํ˜„์žฌ ์‹ฌ๋ฐ•์ด ํ‰๊ท ๋ณด๋‹ค 12bpm ์ด์ƒ ๋†’๊ณ  ํ‰๊ท ์ด 120bpm ์ด์ƒ: `ํ˜„์žฌ ์‹ฌ๋ฐ•์ด ์ด๋ฒˆ ๋Ÿฌ๋‹ ํ‰๊ท ๋ณด๋‹ค ์˜ฌ๋ผ๊ฐ”์–ด์š”. ๋ณดํญ์„ ์กฐ๊ธˆ ์ค„์ด๊ณ  ํŽธํ•œ ํ˜ธํก์œผ๋กœ ์†๋„๋ฅผ ์กฐ์ ˆํ•ด ๋ณด์„ธ์š”.`
- ํ‰๊ท  ์ผ€์ด๋˜์Šค๊ฐ€ 150spm ๋ฏธ๋งŒ: `๋Ÿฌ๋‹ ๋ฆฌ๋“ฌ์ด ๋А๋ ค์กŒ์–ด์š”. ๋ณดํญ์„ ๋ฌด๋ฆฌํ•˜๊ฒŒ ๋Š˜๋ฆฌ์ง€ ๋ง๊ณ  ๋ฐœ์„ ์งง๊ณ  ๊ฐ€๋ณ๊ฒŒ ์˜ฎ๊ฒจ ๋ณด์„ธ์š”.`
- ์ขŒ์šฐ ๋น„๋Œ€์นญ์ด 8% ์ด์ƒ: `์ขŒ์šฐ ๋ฆฌ๋“ฌ์ด ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์ณ ๊ธฐ๋ก๋˜๊ณ  ์žˆ์–ด์š”. ์†๋„๋ฅผ ์กฐ๊ธˆ ๋‚ฎ์ถ”๊ณ  ๊ท ํ˜• ์žˆ๋Š” ๋ฐœ๊ฑธ์Œ์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.`
- ํ‰๊ท  ์ ‘์ง€ ์‹œ๊ฐ„์ด 310ms ์ด์ƒ: `๋ฐœ์ด ์ง€๋ฉด์— ๋จธ๋ฌด๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์กŒ์–ด์š”. ์ง€๋ฉด์„ ๊ฐ€๋ณ๊ฒŒ ๋ฐ€๊ณ  ๋‹ค์Œ ๋ฐœ๋กœ ๋„˜์–ด๊ฐ€ ๋ณด์„ธ์š”.`
- ํ‰๊ท  ์ƒํ•˜ ์›€์ง์ž„์ด 10.5cm ์ด์ƒ: `์œ„์•„๋ž˜ ์›€์ง์ž„์ด ์ปค์กŒ์–ด์š”. ์‹œ์„ ์€ ์ •๋ฉด์— ๋‘๊ณ  ์•ž์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋‚˜์•„๊ฐ€ ๋ณด์„ธ์š”.`
## 2. ๊ฒฝ๋กœ ์ƒ์„ฑ๋ถ€ํ„ฐ ์ข…๋ฃŒ๊นŒ์ง€์˜ ๊ฒ€์ฆ ์‹œ๋‚˜๋ฆฌ์˜ค
1. `/route-results`์—์„œ 1km ์ด์ƒ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์š”์ฒญ์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ API ๊ฒŒ์ดํŠธ์›จ์ด์˜ ๊ณ ์ • ์‹œ๊ฐ„์œผ๋กœ ์ทจ์†Œ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
2. ์ƒ์„ฑ ์‘๋‹ต์˜ ๊ฐ `routes[].maneuvers`๊ฐ€ `id`, `point`, `turn`, `branch_count`, `distance_from_start_m`์„ ๊ฐ–๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. `branch_count`๋Š” 2 ์ด์ƒ์ด์–ด์•ผ ํ•˜๊ณ  `turn`์€ `left` ๋˜๋Š” `right`์—ฌ์•ผ ํ•œ๋‹ค.
3. ์ถ”์ฒœ ๊ฒฝ๋กœ ์ƒ์„ธ ํ™”๋ฉด์—์„œ `๋‹ฌ๋ฆฌ๊ธฐ ์‹œ์ž‘`์„ ์„ ํƒํ•œ๋‹ค. ์„ ํƒ ๊ฒฝ๋กœ์™€ `maneuvers`๊ฐ€ `sessionStorage`์— ํ•จ๊ป˜ ๋ณด๊ด€๋˜๊ณ , TWA/Wear ์ „๋‹ฌ payload์—๋„ ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
4. ์‹ค์ œ GPS ๋˜๋Š” `simulate=1`์œผ๋กœ ์„ ํƒ ๊ฒฝ๋กœ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ์ฒซ ๊ฐˆ๋ฆผ๊ธธ ์•ฝ 65m ์ „์— ํ•œ ๋ฒˆ๋งŒ ํ•ด๋‹น ์ขŒ/์šฐํšŒ์ „ ์Œ์„ฑ์ด ์žฌ์ƒ๋˜๊ณ , ์ง€๋‚˜๊ฐ„ ๋’ค์—๋Š” ๋Šฆ์€ ์•ˆ๋‚ด๊ฐ€ ์žฌ์ƒ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋‹ค์Œ ๊ฐˆ๋ฆผ๊ธธ๋„ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธํ•œ๋‹ค.
5. ์›Œ์น˜๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ `live-state`๋ฅผ ๋ณด๋‚ด ์„ผ์„œ ์ฝ”์นญ์˜ ์šฐ์„ ์ˆœ์œ„์™€ 90/120์ดˆ ์žฌ์•ˆ๋‚ด ์ œํ•œ์„ ํ™•์ธํ•œ๋‹ค. ๊ฒฝ๋กœ ์•ˆ๋‚ด์™€ ์„ผ์„œ ์•ˆ๋‚ด๊ฐ€ ๊ฒน์น˜๋ฉด WAV ์žฌ์ƒ ๋Œ€๊ธฐ์—ด์—์„œ ์ˆœ์ฐจ ์žฌ์ƒ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
6. 1km, ์ ˆ๋ฐ˜, ๋ชฉํ‘œ 500m ์ „, ๋ชฉํ‘œ ๋‹ฌ์„ฑ ๊ธฐ์ค€์„ ์ฐจ๋ก€๋กœ ๋„˜๊ฒจ ๊ฑฐ๋ฆฌ ์•ˆ๋‚ด ๋ฌธ๊ตฌ์™€ ์‹ค์ œ ํ‘œ์‹œ ๊ฑฐ๋ฆฌ/์‹œ๊ฐ„์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
7. ์ •์ง€ ๋ฒ„ํŠผ์„ ๊ธธ๊ฒŒ ๋ˆŒ๋Ÿฌ ์ข…๋ฃŒํ•œ๋‹ค. TWA/Wear ์‹คํ–‰์€ ์›Œ์น˜์˜ `POST /runs` ์ €์žฅ๋ณธ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ๊ฒฐ๊ณผยท์บ˜๋ฆฐ๋”ยท์‹ค์ œ ์ด๋™ ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•œ `run_id`๋กœ ํ•œ ๋ฒˆ๋งŒ ์ €์žฅ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
## 3. ํ˜„์žฌ ๊ฒ€์ฆ ์ƒํƒœ
- ํ”„๋ŸฐํŠธ์—”๋“œ `npm run build`: ํ†ต๊ณผ.
- ๊ฒฝ๋กœ ์•ˆ๋‚ด ํŒ๋‹จ๊ณผ TTS ํ˜ธ์ถœ ์—ฐ๊ฒฐ: TypeScript ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ํ†ต๊ณผ.
- ๋กœ์ปฌ API ๊ฒŒ์ดํŠธ์›จ์ด ๊ฒฝ๋กœ ์ƒ์„ฑ: `HTTP 200`์œผ๋กœ ๊ฒฝ๋กœ 2๊ฐœ์™€ `maneuvers` 15๊ฐœ๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค. ํ‘œ๋ณธ์˜ ๋ชจ๋“  ๊ฐˆ๋ฆผ๊ธธ์€ `branch_count` 2 ์ด์ƒ, `turn`์€ `left` ๋˜๋Š” `right`์˜€๋‹ค.
- MeloTTS: `์ž ์‹œ ํ›„ ๊ฐˆ๋ฆผ๊ธธ์—์„œ ์šฐํšŒ์ „ํ•˜์„ธ์š”.` ์š”์ฒญ์ด `audio/wav`(222,120๋ฐ”์ดํŠธ)๋กœ ์ •์ƒ ์‘๋‹ตํ–ˆ๋‹ค.
- ๋ฐฐํฌ API ๊ฒŒ์ดํŠธ์›จ์ด ๊ฒฝ๋กœ ์ƒ์„ฑ: `HTTP 200`์œผ๋กœ ๊ฒฝ๋กœ 1๊ฐœ์™€ ์ขŒ 1ยท์šฐ 2, ์ด 3๊ฐœ์˜ ๊ฐˆ๋ฆผ๊ธธ์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค.
- ๋ฐฐํฌ MeloTTS: `์ž ์‹œ ํ›„ ๊ฐˆ๋ฆผ๊ธธ์—์„œ ์ขŒํšŒ์ „ํ•˜์„ธ์š”.` ์š”์ฒญ์ด `audio/wav`(225,192๋ฐ”์ดํŠธ)๋กœ ์ •์ƒ ์‘๋‹ตํ–ˆ๋‹ค.
- ์›Œ์น˜-ํœด๋Œ€ํฐ Data Layer: Galaxy Watch6 ์—ฐ๊ฒฐ, ๋Ÿฌ๋‹ ์‹œ์ž‘ ๋ช…๋ น ๋ฐ ์ง„ํ–‰ ์ƒํƒœ ์ˆ˜์‹ ์„ ์‹ค๊ธฐ๊ธฐ๋กœ ํ™•์ธํ–ˆ๋‹ค.
- ์›Œ์น˜ ์ข…๋ฃŒ: ์ž ๊ธˆ์„ ์šฐํšŒํ•˜์ง€ ์•Š๋Š” ๊ณต์‹ Data Layer ์ œ์–ด ๋”ฅ๋งํฌ๋กœ `stop` ๋ช…๋ น์„ ์ „์†กํ–ˆ๋‹ค. ๋‹ค๋งŒ ํœด๋Œ€ํฐ์ด ๋ณด์•ˆ ์ž ๊ธˆ ์ƒํƒœ๊ฐ€ ๋˜์–ด ์ข…๋ฃŒ ํ™”๋ฉดยท์š”์•ฝ ์—…๋กœ๋“œ ์™„๋ฃŒ ACK์™€ ์‹ค์ œ GPS ๊ฐˆ๋ฆผ๊ธธ์—์„œ์˜ ์Šคํ”ผ์ปค ์ฒญ์ทจ๋Š” ์ด ์„ธ์…˜์—์„œ ํŒ์ •ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. ์ด ๋‘ ํ•ญ๋ชฉ๋งŒ ๋‹ค์Œ ์ž ๊ธˆ ํ•ด์ œ ์ƒํƒœ์˜ ์‹ค์™ธ ๋Ÿฌ๋‹์—์„œ ์œ„ ์‹œ๋‚˜๋ฆฌ์˜ค 4~7๋‹จ๊ณ„๋กœ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.