OpenAI, Audio Models in the API ์ถ์
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/OpenAI-Audio-Models-in-the-API-์ถ์
์ต๊ทผ OpenAI๋ ํ ์คํธ ๊ธฐ๋ฐ์ ์์ด์ ํธ์์ ๋ ๋์๊ฐ, ์์ฑ ๊ธฐ๋ฐ์ ์์ฐ์ค๋ฝ๊ณ ์ง๊ด์ ์ธ ์ํต์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์์ฑ AI ๋ชจ๋ธ์ ์๋กญ๊ฒ ์ ๋ณด์์ต๋๋ค. ์ด๋ฒ ์ถ์๋ ์์ฑ-ํ ์คํธ ๋ณํ(STT, Speech-to-Text) ๋ชจ๋ธ๊ณผ ํ ์คํธ-์์ฑ ๋ณํ(TTS, Text-to-Speech) ๋ชจ๋ธ์ ํฌํจํ๋ฉฐ, ๊ฐ๋ฐ์๋ค์ด ๋์ฑ ๊ฐ๋ ฅํ๊ณ ๋ง์ถคํ๋ ์์ฑ ์์ด์ ํธ๋ฅผ ์์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
๐ ์ด๋ก์จ ๊ฐ๋ฐ์๋ค์ ๊ณ ๊ฐ ์๋น์ค, ๊ต์ก, ์ฝํ ์ธ ์ ์, ํฌ์ค์ผ์ด ๋ฑ ๋ค์ํ ์ฐ์ ๋ถ์ผ์ ์์ฑ ์ธํฐํ์ด์ค๋ฅผ ์ ๋ชฉ์ํจ ํ์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฝ๊ฒ ์ค๊ณํ ์ ์๊ฒ ๋์์ต๋๋ค.
๐ Reference Links
OpenAI๋ ์์ฑ์ผ๋ก ๋งํ๋ฉด, AI๊ฐ ์์ฑ์ผ๋ก ๋ตํ๋ โVoice Agentโ ์๋๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ด๊ณ ์ ํฉ๋๋ค.
-
Voice Agent๋ ์ฝ๊ฒ ๋งํด, ์์ฑ์ผ๋ก ์ฌ์ฉ์์ ๋ํํ ์ ์๋ ์์ฑ ๊ธฐ๋ฐ์ AI ์์คํ ์ ๋๋ค. ์ฌ์ฉ์์ ๋ง์ ๋ฃ๊ณ , ๊ทธ ์๋ฏธ๋ฅผ ์ดํดํ ๋ค, ๋ค์ ๋ง๋ก ์๋ตํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ฃ .
- ๋จ์ํ
์์ฑ ์ธ์ ๊ธฐ์ (STT)
์ด๋์์ฑ ํฉ์ฑ ๊ธฐ์ (TTS)
์ ๋์ด์, ์ค์ ๋ก ๋ํ๋ฅผ ๋๋๋ ์์ด์ ํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ๋จ์ํ
OpenAI๋ ์ด Voice Agent๋ฅผ ๋๊ตฌ๋ ์์ฝ๊ฒ ๋ง๋ค ์ ์๋๋ก ํ๊ธฐ ์ํด, ์ด๋ฒ ๋ฐํ๋ฅผ ํตํด ์๋ก์ด ์์ฑ ๋ชจ๋ธ๋ค์ ๊ณต๊ฐํ๋ ํํธ, ๊ธฐ์กด์ ํ ์คํธ ๊ธฐ๋ฐ ์์ด์ ํธ๋ฅผ ์์ฑ ๊ธฐ๋ฐ ์์ด์ ํธ๋ก ์์ฝ๊ฒ ํ์ฅํ ์ ์๋ ๊ฐ๋ฐ์ ๋๊ตฌ์ธ Agents SDK๋ ํจ๊ป ์ ๊ณตํ์ต๋๋ค.
-
์ด๋ฒ ๋ฐํ์์ OpenAI๋ ๋จผ์
Voice Agent
๋ฅผ ๋ง๋๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ์์ ์๊ฐํฉ๋๋ค.-
Speech-to-Speech ๋ฐฉ์: ์ฌ์ฉ์์ ์์ฑ์ ๋ฐ๋ก ์ธ์ํด, ์ค์๊ฐ์ผ๋ก ์์ฑ์ผ๋ก ์๋ตํ๋ ๊ตฌ์กฐ์ ๋๋ค. ํ๋ฒ์ ๋น ๋ฅด๊ณ ์์ฐ์ค๋ฌ์ด ๋ํ๋ฅผ ์ง์ํ์ง๋ง, ๋ชจ๋ธ ๊ฐ ์ปค์คํฐ๋ง์ด์ง์ด ์ด๋ ต์ต๋๋ค.
-
Chained ๋ฐฉ์: ์ฌ์ฉ์์ ์์ฑ์ ํ ์คํธ๋ก ๋ฐ๊พธ๊ณ (STT), ํ ์คํธ ๊ธฐ๋ฐ LLM์ด ๋ต์ ์์ฑํ ๋ค, ๋ค์ ์์ฑ์ผ๋ก ๋ฐ๊พธ๋(TTS) ๋ชจ๋ํ ๊ตฌ์กฐ์ ๋๋ค. ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ์์ ๋กญ๊ฒ ์กฐํฉํ ์ ์์ด ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ ํธํ๋ ๋ฐฉ์์ ๋๋ค.
-
OpenAI๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ด Chained ๋ฐฉ์์ ์ค์ฌ์ผ๋ก Voice Agent๋ฅผ ๊ตฌํํ ๊ฒ์ผ๋ก ๋ณด๊ณ , ์ฌ๊ธฐ์ ์ต์ ํ๋ ์๋ก์ด Speech-to-Text(STT) ๋ชจ๋ธ๊ณผ Text-to-Speech(TTS) ๋ชจ๋ธ์ ๋ฐํํ์ต๋๋ค.
์ด ๊ธ์์๋ ์ด๋ฌํ ์์ฑ ๋ชจ๋ธ๋ค์ด ์ด๋ค ์ ์์ ๋ฐ์ ํ๋์ง, ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
-
์๋ก์ด ์์ฑ-ํ ์คํธ(STT) ๋ชจ๋ธ
OpenAI๋ GPT-4o ๊ธฐ๋ฐ์ ์๋ก์ด ์์ฑ-ํ
์คํธ ๋ชจ๋ธ ๋ ๊ฐ์ง
๋ฅผ ์ถ์ํ์ต๋๋ค.
- GPT-4o-transcribe
- GPT-4o-mini-transcribe
์ด ๋ชจ๋ธ๋ค์ Whisper ์๋ฆฌ์ฆ
์ ํ์์์ผ๋ก, ๋ ๋ง์ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ ํ์ต ๊ธฐ๋ฒ์ ํตํด ๋ค์ํ ์ธ์ด์ ํ๊ฒฝ์์ ๋ ๋ฎ์ ์ค๋ฅ์จ๊ณผ ๋ ๋น ๋ฅธ ์๋ต ์๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
(์ฐธ๊ณ ) Whisper๋ OpenAI์์ ๊ฐ๋ฐํ ๋ชจ๋ธ๋ก, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ํ์ฉํด ํ๋ จ๋์์ต๋๋ค. ์ฝ 68๋ง ์๊ฐ ์ด์์ ์์ฑ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋์์ผ๋ฉฐ, ์ด ์ค ์ฝ 2/3๊ฐ ์์ด์ด๊ณ ๋๋จธ์ง๋ ํ๊ตญ์ด, ์ผ๋ณธ์ด, ์ค๊ตญ์ด ๋ฑ ๋ค์ํ ์ธ์ด๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ์ด๊ธฐ ๋ฒ์ (2022๋ 9์ ์ถ์)
- Whisper large-v2 (2022๋ 12์)
- Whisper large-v3 (2023๋ 11์)
GPT-4o-transcribe & GPT-4o-mini-transcribe
GPT-4o-transcribe ๋ชจ๋ธ์ ์ ํ๋ ์ค์ฌ์ ๊ณ ์ฑ๋ฅ ๋ชจ๋ธ์ด๋ฉฐ, GPT-4o-mini-transcribe๋ ๊ฒฝ๋ํ๋ ๋ชจ๋ธ๋ก์ ๋น์ฉ๊ณผ ์๋ ์ธก๋ฉด์์ ์ ๋ฆฌํฉ๋๋ค. ๋ ๋ชจ๋ธ ๋ชจ๋ ์์กฐ ๋จ์์ ์ค๋์ค ํ ํฐ์ผ๋ก ํ์ต๋์์ผ๋ฉฐ, ๊ณ ํ์ง ๋ค๊ตญ์ด ๋ฐ์ดํฐ์ ์ ํ์ฉํ์ฌ ์ต์, ์๋, ์ก์ ๋ฑ ๋ค์ํ ๋ณ์์ ๊ฐ์ธํ ํน์ฑ์ ๋ณด์ ๋๋ค.
ํนํ mini-transcribe ๋ชจ๋ธ์ ์ํ์์๋ ๋ถ๊ตฌํ๊ณ ๋์ ์ ํ๋๋ฅผ ์ ์งํ๋ฉฐ, ์ ์ฌ์ ํ๊ฒฝ์ด๋ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ ๋ฑ์์๋ ํ์ฉ์ด ์ฉ์ดํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ฑ๋ฅ ๋น๊ต ๋ฐ ์ฐ์์ฑ
OpenAI๊ฐ ์งํํ FLEURS(Few-shot Learning Evaluation of Universal Representations of Speech) ๋ฒค์น๋งํฌ ํ ์คํธ ๊ฒฐ๊ณผ, GPT-4o ๊ณ์ด ๋ชจ๋ธ์ Whisper v-2์ v-3๋ ๋ฌผ๋ก , Google์ Gemini, Meta์ Scribe, Anthropic์ Nova ๋ชจ๋ธ๋ค๊ณผ ๋น๊ตํด๋ ์ ๋ฐ์ ์ผ๋ก ๋ ๋ฎ์ Word Error Rate(WER)๋ฅผ ๊ธฐ๋กํ์ต๋๋ค.
- GPT-4o-transcribe์ mini-transcribe๋ ์์ด, ์คํ์ธ์ด, ์ค๊ตญ์ด, ์ผ๋ณธ์ด, ํ๊ตญ์ด, ํ๋์ด ๋ฑ ์ฃผ์ ์ธ์ด ์ ๋ฐ์์ ๋ฎ์ WER์ ๊ธฐ๋กํ๋ฉฐ ๋ค๊ตญ์ด ์ง์ ๋ฅ๋ ฅ์์ ๋ ๋ณด์ ์ธ ๊ฒฝ์๋ ฅ์ ๋ณด์์ต๋๋ค.
Whisper ์๋ฆฌ์ฆ์ ๋น๊ต
ํ์ฌ ์ ํ๊ณผ ๋น๊ต
-
WER (Word Error Rate):
- ๋ฎ์์๋ก ์ฑ๋ฅ์ด ์ข์ ๊ฒ์ ์๋ฏธํฉ๋๋ค (์ฆ, ์ค๋ฅ๊ฐ ์ ์)
-
ํ๋์ ๊ณ์ด:
gpt-4o-transcribe
(์งํ ํ๋)gpt-4o-mini-transcribe
(์ค๊ฐ ํ๋)
-
ํ์ ๊ณ์ด (๊ฒฝ์์ฌ ๋ชจ๋ธ):
gemini-2.0-flash
(ํ์)scribe-v1
(์ง์ ํ์)nova-2 & nova-3
(๋ฐ์ ํ์)
-
ํนํ Whisper-large-v3 ๋ชจ๋ธ๊ณผ ๋น๊ตํ ๋ ์ผ๋ถ ์ธ์ด์์๋ ์ ๋ฐ ์ดํ์ ์ค๋ฅ์จ์ ๊ธฐ๋กํ์์ผ๋ฉฐ, ์ด๋ ๋ค์ํ ์ต์๊ณผ ๋น ๋ฅธ ๋ฐํ๋ฅผ ์ธ์ํ๋ ๋ฐ ํฐ ๊ฐ์ ์ ๋ํ๋ ๋๋ค.
์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ API ์ง์
์ด๋ฒ API๋ ์ค์๊ฐ ์ค๋์ค ์คํธ๋ฆฌ๋ฐ์ ์ง์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ฌ์ฉ์์ ๋ฐํ๊ฐ ๋๋๋ ์์ ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์ฆ์ ํ ์คํธ ๋ณํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์์ผ๋ฉฐ, ์ด ๊ณผ์ ์์ ์ง์ฐ(latency)์ ์ต์ํํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ OpenAI๋ ๋ ๊ฐ์ง ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ์ค์์ต๋๋ค:
- ์ก์ ์ ๊ฑฐ (Noise Cancellation):
- ๋ณต์กํ ๋ฐฐ๊ฒฝ ํ๊ฒฝ์์๋ ์์ ์ ์ธ ์ธ์ ์ฑ๋ฅ ์ ์ง
- ์๋ฏธ ๊ธฐ๋ฐ ์์ฑ ํ๋ ๊ฐ์ง (Semantic Voice Activity Detection):
- ์ฌ์ฉ์์ ๋ฐํ ์ข ๋ฃ ์์ ์ ๋ชจ๋ธ์ด ์ค์ค๋ก ํ์ ํ์ฌ ์ฒ๋ฆฌ
-
์๋ก์ด ํ ์คํธ-์์ฑ(TTS) ๋ชจ๋ธ: GPT-4o-mini-TTS
์ด๋ฒ์ ํจ๊ป ๊ณต๊ฐ๋ ํ ์คํธ-์์ฑ ๋ชจ๋ธ GPT-4o-mini-TTS๋ ๋จ์ํ ํ ์คํธ ๋ญ๋ ๊ธฐ๋ฅ์ ๋์ด, ๊ฐ์ ๊ณผ ์คํ์ผ์ ์ง์ ํ์ฌ ์์ฑ์ ์์ฑํ ์ ์๋ ์ง์ ๊ธฐ๋ฐ ์์ฑ ํฉ์ฑ(Instructable Speech Synthesis) ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, "๊ธฐ์ด์ฐฌ ๋ผ๋์ค DJ์ฒ๋ผ ๋งํ๊ธฐ"
๋๋ "์นจ์ฐฉํ ์๋ด์์ฒ๋ผ ๋งํ๊ธฐ"
์ ๊ฐ์ ํ๋กฌํํธ(prompt)๋ฅผ ์
๋ ฅํ๋ฉด, ๋ชจ๋ธ์ ํด๋น ์ง์์ด์ ๋ง์ถฐ ํค๊ณผ ์ต์, ๊ฐ์ ์ ๋ฐ์ํ ์์ฐ์ค๋ฌ์ด ์์ฑ์ ์์ฑํฉ๋๋ค.
OpenAI๋ ์ด๋ฅผ โ์ด๋ป๊ฒ ๋งํ ๊ฒ์ธ๊ฐ(How to say)โ๊น์ง ์ ์ดํ ์ ์๋ TTS ๋ชจ๋ธ๋ก ์๊ฐํ๊ณ ์์ผ๋ฉฐ, ์ค์ ๋ก ๋ฐํ ๋ฐ๋ชจ์์๋ "๊ฒฉ์ ์ ์ธ ๋ฉ๋ ์ฌ์ด์ธํฐ์คํธ"
, "๋ค์ ํ ์์"
๋ฑ์ ์คํ์ผ์ ์ ์ฉํ ์์ฑ์ ์ค์๊ฐ์ผ๋ก ์ฌ์ํ๋ฉฐ ๋ชจ๋ธ์ ํํ๋ ฅ๊ณผ ๋ค์์ฑ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
- ๋ฟ๋ง ์๋๋ผ, ์ด TTS ๋ชจ๋ธ์ ๊ธฐ์กด์ฒ๋ผ ๊ณ ์ ๋ ๋ชฉ์๋ฆฌ ์คํ์ผ์ด ์๋๋ผ, ๊ธฐ๋ณธ ์์์ ๋ค์ํ ์ฑ๊ฒฉ์ ๋ถ์ฌํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
- ๊ทธ ๋ง์ธ ์ฆ, ๋ชฉ์๋ฆฌ ์์ฒด๋ฅผ ๋ฐ๊พธ๊ธฐ๋ณด๋ค๋, โ๊ฐ์ ๋ชฉ์๋ฆฌ๋ฅผ ๋ค์ํ ์ฑ๊ฒฉ์ด๋ ๊ฐ์ ์ผ๋ก ์กฐ์ โํ ์ ์๋๋ก ์ค๊ณ๋ ๊ฒ์ด ํน์ง์ ๋๋ค.
- ์ด ๋ฐฉ์์ ํ๋์ ์์ฑ ์บ๋ฆญํฐ๋ฅผ ๋ค์ํ ๋งฅ๋ฝ์์ ์ผ๊ด์ฑ ์๊ฒ ํ์ฉํ ์ ์๋๋ก ํด์ค๋๋ค.
ํ์ฌ ์ ๊ณต๋๊ณ ์๋ Voice ์ข ๋ฅ (๋งํฌ)
ํ์ฉ ์ฌ๋ก:
๊ณ ๊ฐ ์๋น์ค
: ์ํฉ์ ๋ฐ๋ผ ๊ณต๊ฐ, ์๋ก, ์๋ด ๋ฑ์ ์ ์ ํํ ๊ฐ๋ฅ๊ต์ก ์ฝํ ์ธ
: ์น์ ํ๊ณ ํฅ๋ฏธ๋ก์ด ์ค๋ช ์คํ์ผ ๊ตฌํ์ฐฝ์/์คํ ๋ฆฌํ ๋ง
: ์บ๋ฆญํฐ๋ณ ๋งํฌ ๊ตฌํ์ผ๋ก ๋ชฐ์ ๊ฐ ๊ฐํ์์ฑ ์ฑ๋ด UX
: ์ฌ์ฉ์ ๊ฐ์ ์ ๋ง๋ ์๋ต ์คํ์ผ ์ ๊ณต
OpenAI๋ ์ด๋ฅผ ์ฒดํํด๋ณผ ์ ์๋๋ก openai.fm์ด๋ผ๋ ์น ๋ฐ๋ชจ ์ฌ์ดํธ๋ฅผ ๊ณต๊ฐํ์ต๋๋ค.
ํด๋น ์ฌ์ดํธ์์๋ ๋ค์ํ ๋ชฉ์๋ฆฌ ์คํ์ผ์ ์ ํํ๊ณ , ์ง์ ํ ์คํธ์ ๋งํฌ๋ฅผ ์ ๋ ฅํด๋ณด๋ฉฐ ์ค์๊ฐ์ผ๋ก ์์ฑ์ ์์ฑํ ์ ์์ต๋๋ค.
์ค์ openai.fm ๋ค์ด๊ฐ์ ์บก์ณํ ํ๋ฉด (๋ค์๊ณผ ๊ฐ์ด API ์ฝ๋๋ฅผ ์ ๊ณตํจ)
๋ํ, Python, JavaScript, curl ๋ฑ์ผ๋ก ๋ฐ๋ก ํธ์ถ ๊ฐ๋ฅํ API ์ฝ๋ ์์ ๋ ์ ๊ณต๋์ด, ๊ฐ๋ฐ์๊ฐ ์์ฝ๊ฒ ์์ ์ ์ฑ์ด๋ ์๋น์ค์ ๋ฐ๋ก ์ ์ฉํ ์ ์๋๋ก ์ง์ํ๊ณ ์์ต๋๋ค.
-
๋ชจ๋ธ์ ๊ธฐ์ ์ ํ์
OpenAI๋ ์ด๋ฒ ์ค๋์ค ๋ชจ๋ธ์ ๊ฐ๋ฐํ๋ฉฐ ์์ฑ AI์ ๊ทผ๋ณธ์ ์ธ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ค์๊ณผ 3๊ฐ์ง์ ์ง์คํ๋ค๊ณ ํฉ๋๋ค.
- Pretraining with authentic audio datasets
- Advanced distillation methodologies
- Reinforcement learning paradigm
https://openai.com/index/introducing-our-next-generation-audio-models/
1) ์ค๋์ค ์ค์ฌ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ ๋๊ท๋ชจ ์ฌ์ ํ์ต
- ๋ค์ํ ์ต์, ์ธ์ด, ํ๊ฒฝ์ ์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ์ ํ๋ จํจ์ผ๋ก์จ, ๋ณด๋ค ์ผ๋ฐํ๋ ์์ฑ ์ธ์ ๋ฅ๋ ฅ์ ํ๋ณดํ์ต๋๋ค.
2) ์ฒจ๋จ Distillation ๊ธฐ๋ฒ
- ๋ํ ๋ชจ๋ธ์ ์ง์์ ์์ ๋ชจ๋ธ์ ํจ๊ณผ์ ์ผ๋ก ์ด์ ํ๋ distillation ๊ธฐ์ ์ ํตํด mini ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์์ผฐ์ต๋๋ค. ์ด๋ ์ฐ์ฐ ๋ฆฌ์์ค๊ฐ ์ ํ์ ์ธ ํ๊ฒฝ์์๋ ์ค์ฉ์ ์ธ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค.
3) ๊ฐํ ํ์ต ์ ์ฉ
- RL(Reinforcement Learning) ๊ธฐ๋ฒ์ ํตํด ๋ชจ๋ธ์ด ์ค๋ฅ๋ฅผ ์ค์ด๊ณ ์ค์ ์ฌ์ฉ์ ๋ฐํ์ ๋ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ ์ ์๋๋ก ํ๋๋์์ต๋๋ค.
-
Agents SDK๋ฅผ ํตํ ์์ฑ ์์ด์ ํธ ๊ตฌํ
OpenAI๋ ๊ธฐ์กด ํ ์คํธ ๊ธฐ๋ฐ ์์ด์ ํธ๋ฅผ ์์ฑ ์ ๋ ฅ๊ณผ ์์ฑ ์๋ต์ด ๊ฐ๋ฅํ Voice Agent๋ก ๋น ๋ฅด๊ฒ ์ ํํ ์ ์๋๋ก Agents SDK์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค. ์ค์ ๋ฐ๋ชจ์์๋ ์ง๋์ฃผ ๊ณต๊ฐ๋ ํ ์คํธ ๊ธฐ๋ฐ ๊ณ ๊ฐ์ง์ ์์ด์ ํธ๋ฅผ ๋ถ๊ณผ 9์ค์ ์ฝ๋ ์์ ๋ง์ผ๋ก ์์ฑ ๊ธฐ๋ฐ ์์ด์ ํธ๋ก ํ์ฅํ๋ ๊ณผ์ ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
๐ฌ ๋ฐ๋ชจ ์๋๋ฆฌ์ค: ํ ์คํธ ๊ธฐ๋ฐ โ ์์ฑ ์์ด์ ํธ๋ก ํ์ฅ
๋ฐ๋ชจ์์ ์ฌ์ฉ๋ ์์๋ ์ฌ์ฉ์์ ์ฃผ๋ฌธ ๋ด์ญ์ ํ์ธํด์ฃผ๋ ๊ณ ๊ฐ์ง์ ์์ด์ ํธ์์ต๋๋ค. ์๋๋ ํ ์คํธ ์ ๋ ฅ์ ๋ฐ๊ณ , ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์์ง๋ง, ์ฌ๊ธฐ์ ์์ฑ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ์๋์ ๊ฐ์ ๋จ๊ณ๊ฐ ์งํ๋์์ต๋๋ค.
๐งฉ ํต์ฌ ๋ณ๊ฒฝ 1: WebSocket ๊ธฐ๋ฐ ์ค๋์ค ์ฒ๋ฆฌ ๋ก์ง ์ถ๊ฐ
UI์์ ์์ฑ ์ ๋ ฅ์ ๋ฐ๊ธฐ ์ํด, ๋ฐฑ์๋์์๋ WebSocket์ ํตํด ์ค๋์ค ์ฒญํฌ(audio chunks)๋ฅผ ์์ ํ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค:
server.py
์websocket_endpoint()
ํจ์ ์์์ ์์ฑ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ก์ง์ด ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐ๋์์ต๋๋ค:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. ์ค๋์ค ์ฒญํฌ ์์
elif is_new_audio_chunk(message):
audio_buffer.append(extract_audio_chunk(message)) # ์ฒญํฌ๋ฅผ ๋ฒํผ์ ์ ์ฅ
# 2. ์ค๋์ค ์
๋ ฅ์ด ์๋ฃ๋์์ ๋ ์ฒ๋ฆฌ
elif is_audio_comp(message):
audio_input = concat_audio_chunks(audio_buffer) # ์ฒญํฌ ํฉ์น๊ธฐ
# 3. voice_pipeline์ ์ค๋์ค ์ ๋ฌ โ ํ
์คํธ ์ฒ๋ฆฌ โ ์์ฑ ์๋ต ์์ฑ
output = await voice_pipeline.run(audio_input)
# 4. ์๋ต ์ค๋์ค ์ด๋ฒคํธ๋ฅผ UI๋ก ์คํธ๋ฆฌ๋ฐ
async for event in output.stream():
await connection.send_audio_chunk(event)
# 5. ๋ฒํผ ์ด๊ธฐํ
audio_buffer = []
- ์ด ๊ตฌ์กฐ ๋๋ถ์, ํด๋ผ์ด์ธํธ๋ ์์ฑ์ ๋ น์ํด์ ์ ์กํ๊ณ , ์๋ฒ๋ ์ด๋ฅผ ๋ถ์ ํ ์์ฑ์ผ๋ก ๋ค์ ์๋ตํ ์ ์๊ฒ ๋ฉ๋๋ค.
๐งฉ ํต์ฌ ๋ณ๊ฒฝ 2: Voice Pipeline ์ ์ฉ
- Voice Pipeline์ด๋ผ๋ ๋ชจ๋์ ํตํด ๊ธฐ์กด ํ ์คํธ ์ํฌํ๋ก์ฐ์ ์๋ค์ STT/TTS๋ฅผ ์๋์ผ๋ก ์ฐ๊ฒฐ
์์ฑ ์ฒ๋ฆฌ๋ฅผ ์ํด ์๋กญ๊ฒ ๋์
๋ voice_pipeline
์ด ๋ฐ๋ก ํต์ฌ์
๋๋ค.
- ํ
์คํธ ๊ธฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑ ์
๋ ฅ ๋ฐ ์ถ๋ ฅ๊น์ง ํ์ฅํ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด
VoicePipeline
์ ํตํด ๊ธฐ์กด ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ธ์ค๋๋ค.
1
2
3
4
5
# ๊ธฐ์กด ํ
์คํธ ์ํฌํ๋ก์ฐ
workflow = build_workflow(...)
# voice_pipeline์ผ๋ก ๊ฐ์ธ์ ์์ฑ ์ง์ ์ถ๊ฐ
voice_pipeline = VoicePipeline(workflow=workflow)
์ด๋ ๊ฒ ๊ฐ์ธ์ค voice_pipeline
๊ฐ์ฒด๋ ์๋์ผ๋ก ๋ค์ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํฉ๋๋ค:
- ์ฌ์ฉ์์ ์ค๋์ค ์ ๋ ฅ โ STT ๋ณํ (gpt-4o-transcribe)
- ํ ์คํธ ์ํฌํ๋ก์ฐ ์คํ โ GPT-4o ๊ธฐ๋ฐ ์๋ต ์์ฑ
- ์์ฑ๋ ํ ์คํธ ์๋ต โ ์์ฑ ๋ณํ (gpt-4o-mini-tts)
๐ง ์ ์ฒด ํ๋ฆ ์์ฝ
1 2 3 4 5 [์ฌ์ฉ์ ์์ฑ] โ [์ฒญํฌ ์์ ๋ฐ ๋ฒํผ๋ง] โ [์๋ฃ๋ ์ค๋์ค โ ํ ์คํธ ๋ณํ] โ [LLM ์ํฌํ๋ก์ฐ ์คํ] โ [์๋ต ํ ์คํธ โ ์์ฑ ๋ณํ] โ [ํด๋ผ์ด์ธํธ๋ก ์์ฑ ์คํธ๋ฆฌ๋ฐ]
์์ฑ์ผ๋ก ์ฑ๋ด๊ณผ ๋ํ์ค ใทใท
๐๏ธ ๋๋ฒ๊น & ํ์ธ: Tracing UI
Voice Agent๋ฅผ ๊ตฌ์ถํ๋ฉด์ โ์ ํํ ์ด๋ค ์์ฑ์ ์ธ์ํ๊ณ , ์ด๋ค ์๋ต์ ์์ฑํ๋์งโ๋ฅผ ํ์ธํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ด๋ฅผ ์ํด OpenAI๋ Tracing UI๋ฅผ ํจ๊ป ์ ๊ณตํฉ๋๋ค.
-
Tracing UI๋ฅผ ํตํด ์์ด์ ํธ์ ๋์ ํ๋ฆ, ์์ฑ ์ ๋ ฅ, ์ฒ๋ฆฌ ๋จ๊ณ, ์ค๋ฅ ๋ฐ์ ๋ฑ์ ์๊ฐ์ ์ผ๋ก ๋ถ์ ๊ฐ๋ฅ
- ์์ฑ ์ ๋ ฅ ๋ด์ฉ (์ฌ์ ๊ฐ๋ฅ)
- STT ๊ฒฐ๊ณผ ํ ์คํธ
- LLM ํธ์ถ ๋ด์ญ ๋ฐ ์ฌ์ฉ๋ ํด
- ์์ฑ๋ ํ ์คํธ ์๋ต
- TTS ์์ฑ ์ถ๋ ฅ
- ์ ์ฒด ์ฒ๋ฆฌ ์๊ฐ ๋ฐ ์ค๋ฅ ๋ก๊ทธ
-
์์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์์ด, ์์ฑ ๊ธฐ๋ฐ UX์ ๋๋ฒ๊น ๊ณผ ํ ์คํธ๊ฐ ๋งค์ฐ ์ฌ์์ง๋๋ค.
โ ์ ๋ฆฌ
- ์ด์ฒ๋ผ Agents SDK์ ์๋ก์ด ์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด,
- ๊ธฐ์กด ํ ์คํธ ๊ธฐ๋ฐ LLM ์๋น์ค์ ๋ถ๊ณผ ๋ช ์ค์ ์ฝ๋๋ก ์์ฑ ์ ์ถ๋ ฅ์ ์ถ๊ฐํ ์ ์๊ณ ,
- ๋ณต์กํ ์์ฑ ์ฒ๋ฆฌ ๋ก์ง์ ์ง์ ๊ตฌํํ์ง ์๊ณ ๋,
- ์ค์๊ฐ ์์ฑ ์์ด์ ํธ ์์ค์ ์ฌ์ฉ์ ๊ฒฝํ์ ์์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๋ฐํ ์๊ฐ ์ ๊ท ๊ธฐ๋ฅ
-
ํฅํ ๊ณํ ๋ฐ ์ ๋ง
OpenAI๋ ์์ฑ ๋ชจ๋ธ์ ์ ํ๋ ๋ฐ ๋ง์ถคํ ๊ธฐ๋ฅ ํ๋์ ์ง์์ ์ธ ํฌ์๋ฅผ ์งํํ ์์ ์ ๋๋ค.
ํนํ, ๋ค์๊ณผ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ธฐ์ ํ์ฅ์ ๊ณํํ๊ณ ์์ต๋๋ค:
- ์ฌ์ฉ์ ์ง์ ์์ฑ(Voice Cloning) ๊ธฐ๋ฅ์ ์์ ํ ๋์ ๋ฐฉ์ ๊ฒํ
- ๋ค๊ตญ์ด TTS ๋ชจ๋ธ์ ์ ๊ตํ ๋ฐ ์ต์ ์ ์ด ํฅ์
- ๋น๋์ค ๋ฑ ๋ฉํฐ๋ชจ๋ฌ ์ ๋ ฅ/์ถ๋ ฅ ๊ธฐ๋ฅ๊ณผ์ ํตํฉ์ผ๋ก ๋์ฑ ํ๋ถํ ์ธํฐํ์ด์ค ์ ๊ณต
์ด๋ฒ ์ค๋์ค ๋ชจ๋ธ์ ์ถ์๋ ๋จ์ํ ์ฑ๋ฅ ํฅ์์ ๋์ด, ์์ฑ์ด๋ผ๋ ์ธ๊ฐ์ ์์ฐ์ค๋ฌ์ด ์ธํฐํ์ด์ค๋ฅผ AI ์์ด์ ํธ์ ์ฐ๊ฒฐํ๋ ์ค์ํ ์ ํ์ ์ด ๋ ๊ฒ์ ๋๋ค.
OpenAI์ ์ต์ ์์ฑ ๋ชจ๋ธ์ API๋ฅผ ํตํด ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํ์ฉํด ๋์ฑ ์ธ๊ฐ ์นํ์ ์ด๊ณ ๊ฐ์ฑ์ ์ธ AI ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ํ OpenAI๋ ์ด ๋ชจ๋ธ์ ๋ ๋ง์ ์ฌ๋๋ค์๊ฒ ์๋ฆฌ๊ณ , ์ฐฝ์์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๋ํ๊ธฐ ์ํด ๊ณต์ ๋ฐ๋ชจ ์ฌ์ดํธ์ธ openai.fm์์ TTS ์ฝํ ์คํธ ์ด๋ฒคํธ๋ฅผ ์งํํ ์์ ์ ๋๋ค. (๋ง๊ฐ์ผ: ํ์ง์๊ฐ ๊ธฐ์ค 2025๋ 3์ 21์ผ, ๊ธ์์ผ)
์ฌ์ฉ์๋ค์ ๋ค์ํ ์์ฑ ์คํ์ผ์ ์คํํด๋ณด๊ณ , ๊ฐ์ฅ ์ฌ๋ฏธ์๊ณ ์ฐฝ์์ ์ธ ์์ฑ ์๋ต์ ์ ์ถํ์ฌ OpenAI ๋ก๊ณ ๊ฐ ์๊ฒจ์ง ํน๋ณ ์ ์ ํ์ ํ ์ค๋์ค ๊ธฐ๊ธฐ๋ฅผ ๋ฐ์ ์ ์๋ ๊ธฐํ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
์โฆ ์ ๊ฑด ์ข ํ๋๋ค ใ ใ ใ
์ด์ ๊ฐ์ ํ๋์ AI ์์ฑ ๊ธฐ์ ์ด ๋จ์ํ ๊ธฐ๋ฅ์ ๋์ด, ์ผ์๊ณผ ์ฐฝ์์ ์์ญ์ผ๋ก ํ์ฅ๋๊ณ ์์์ ๋ณด์ฌ์ฃผ๋ ๋ํ์ ์ธ ์ฌ๋ก๊ฐ ๋ ๊ฒ์ ๋๋ค.
์ด๋ฒ ์ ๋ฐ์ดํธ๋ ์ฌ๋ฐ๊ฒ ์ ๋ดค๋๋ฐ์! ๊ณผ์ฐ ๋จ์ํ whisper๋ณด๋ค ์ข์ stt ๋ชจ๋์์ ๋๋ ์ง ์๋ ์ฌ๋ฐ๋ ์๋๋ฆฌ์ค๊ฐ ๋ ๋์ฌ์ง ๊ถ๊ธํ๊ตฐ์!!๐ค
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)