์ด ํํ ๋ฆฌ์ผ์ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ์ด๋ฉฐ Open WebUI ํ์์ ์ง์ํ์ง ์์ต๋๋ค. ์ด ํํ ๋ฆฌ์ผ์ ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ Open WebUI๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๋ ๋ฐฉ๋ฒ์ ์์ฐํ๋ ์ฉ๋๋ก๋ง ์ ๊ณต๋ฉ๋๋ค. ๊ธฐ์ฌํ๊ณ ์ถ์ผ์ ๊ฐ์? ๊ธฐ์ฌ ํํ ๋ฆฌ์ผ์ ํ์ธํ์ธ์.
Docker๋ฅผ ์ฌ์ฉํ์ฌ Open WebUI์ openedai-speech
ํตํฉํ๊ธฐ
openedai-speech
๋ ๋ฌด์์ธ๊ฐ์?โ
openedai-speech๋ OpenAI ์ค๋์ค/์์ฑ API์ ํธํ๋๋ ํ ์คํธ-์์ฑ ๋ณํ ์๋ฒ์ ๋๋ค.
์ด ์๋น์ค๋ /v1/audio/speech
์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ง์ถคํ ์์ฑ ๋ณต์ ๊ธฐ๋ฅ์ ๊ฐ์ถ ๋ฌด๋ฃ ๋ฐ ๊ฐ์ธ์ ์ธ ํ
์คํธ-์์ฑ ๋ณํ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ์ด ์๋น์ค๋ OpenAI์ ์ ํด๋์ง ์์์ผ๋ฉฐ OpenAI API ํค๊ฐ ํ์ํ์ง ์์ต๋๋ค.
ํ์ ์๊ฑดโ
- ์์คํ ์ Docker ์ค์น๋จ
- Docker ์ปจํ ์ด๋์์ ์คํ ์ค์ธ Open WebUI
- Docker ๋ฐ Docker Compose์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด
์ต์ 1: Docker Compose ์ฌ์ฉโ
1๋จ๊ณ: openedai-speech
์๋น์ค๋ฅผ ์ํ ์ ํด๋ ์์ฑโ
docker-compose.yml
๋ฐ speech.env
ํ์ผ์ ์ ์ฅํ ์๋ก์ด ํด๋, ์๋ฅผ ๋ค์ด openedai-speech-service
,๋ฅผ ์์ฑํฉ๋๋ค.
2๋จ๊ณ: GitHub์์ openedai-speech
๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ โ
git clone https://github.com/matatonic/openedai-speech.git
์ด ๋ช
๋ น์ openedai-speech
๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ก์ปฌ ๋จธ์ ์ ๋ค์ด๋ก๋ํ๋ฉฐ, Docker Compose ํ์ผ(docker-compose.yml
, docker-compose.min.yml
, ๋ฐ docker-compose.rocm.yml
)๊ณผ ๊ธฐํ ํ์ํ ํ์ผ์ด ํฌํจ๋ฉ๋๋ค.
3๋จ๊ณ: sample.env
ํ์ผ์ speech.env
๋ก ์ด๋ฆ ๋ณ๊ฒฝ (ํ์ ์ ์ฌ์ฉ์ ์ง์ )โ
openedai-speech
๋ฆฌํฌ์งํ ๋ฆฌ ํด๋์์ ๋ค์ ๋ด์ฉ์ ๊ฐ์ง speech.env
๋ผ๋ ์ ํ์ผ์ ์์ฑํฉ๋๋ค:
TTS_HOME=voices
HF_HOME=voices
#PRELOAD_MODEL=xtts
#PRELOAD_MODEL=xtts_v2.0.2
#PRELOAD_MODEL=parler-tts/parler_tts_mini_v0.1
#EXTRA_ARGS=--log-level DEBUG --unload-timer 300
#USE_ROCM=1
4๋จ๊ณ: Docker Compose ํ์ผ ์ ํโ
๋ค์ Docker Compose ํ์ผ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
- docker-compose.yml: ์ด ํ์ผ์
ghcr.io/matatonic/openedai-speech
์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉฐ Dockerfile์์ ๋น๋ํฉ๋๋ค. - docker-compose.min.yml: ์ด ํ์ผ์
ghcr.io/matatonic/openedai-speech-min
์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉฐ Dockerfile.min์์ ๋น๋ํฉ๋๋ค. ์ด ์ด๋ฏธ์ง๋ Piper ์ง์๋ง ํฌํจ๋ ์ต์ ๋ฒ์ ์ผ๋ก GPU๊ฐ ํ์ํ์ง ์์ต๋๋ค. - docker-compose.rocm.yml: ์ด ํ์ผ์
ghcr.io/matatonic/openedai-speech-rocm
์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉฐ ROCm ์ง์์ด ํฌํจ๋ Dockerfile์์ ๋น๋ํฉ๋๋ค.
4๋จ๊ณ: ์ ํํ Docker ์ด๋ฏธ์ง ๋น๋โ
Docker Compose ํ์ผ ์คํ ์ ์ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด์ผ ํฉ๋๋ค:
- Nvidia GPU(CUDA ์ง์):
docker build -t ghcr.io/matatonic/openedai-speech .
- AMD GPU(ROCm ์ง์):
docker build -f Dockerfile --build-arg USE_ROCM=1 -t ghcr.io/matatonic/openedai-speech-rocm .
- CPU ์ ์ฉ, GPU ์์(Piper๋ง ์ง์):
docker build -f Dockerfile.min -t ghcr.io/matatonic/openedai-speech-min .
5๋จ๊ณ: ์ฌ๋ฐ๋ฅธ docker compose up -d
๋ช
๋ น ์คํโ
- Nvidia GPU(CUDA ์ง์):
openedai-speech
์๋น์ค๋ฅผ ๋ฐํฏ ๋ชจ๋์์ ์์ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์:
docker compose up -d
- AMD GPU(ROCm ์ง์):
openedai-speech
์๋น์ค๋ฅผ ๋ฐํฏ ๋ชจ๋์์ ์์ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์:
docker compose -f docker-compose.rocm.yml up -d
- ARM64(Apple M-series, Raspberry Pi): ์ฌ๊ธฐ์๋ XTTS๊ฐ CPU ์ง์๋ง ๋ฐ์ผ๋ฉฐ ๋งค์ฐ ๋๋ฆฝ๋๋ค. XTTS๋ฅผ ์ฌ์ฉํด CPU(๋๋ฆผ)๋ก Nvidia ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ Piper๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค:
docker compose -f docker-compose.min.yml up -d
- CPU ์ ์ฉ, GPU ์์(Piper๋ง ์ง์): Piper ์ง์๋ง ํฌํจ๋ ์ต์ docker ์ด๋ฏธ์ง ์ฌ์ฉ - ํฌ๊ธฐ๊ฐ ์ฝ 1GB(< 1GB vs. 8GB):
docker compose -f docker-compose.min.yml up -d
์ด ๋ช
๋ น์ openedai-speech
์๋น์ค๋ฅผ ๋ฐํฏ ๋ชจ๋์์ ์์ํฉ๋๋ค.
์ต์ 2: Docker Run ๋ช ๋ น ์ฌ์ฉโ
๋ค์์ Docker ์คํ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ openedai-speech
์๋น์ค๋ฅผ ๋ถ๋ฆฌ๋ ๋ชจ๋๋ก ์์ํ ์ ์์ต๋๋ค:
- Nvidia GPU (CUDA): ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ
openedai-speech
์๋น์ค๋ฅผ ๋น๋ํ๊ณ ์์ํ์ธ์:
docker build -t ghcr.io/matatonic/openedai-speech .
docker run -d --gpus=all -p 8000:8000 -v voices:/app/voices -v config:/app/config --name openedai-speech ghcr.io/matatonic/openedai-speech
- ROCm (AMD GPU): ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ
openedai-speech
์๋น์ค๋ฅผ ๋น๋ํ๊ณ ์์ํ์ธ์:
ROCm ์ง์์ ํ์ฑํํ๋ ค๋ฉด
speech.env
ํ์ผ์์#USE_ROCM=1
์ค์ ์ฃผ์์ ํด์ ํ์ธ์.
docker build -f Dockerfile --build-arg USE_ROCM=1 -t ghcr.io/matatonic/openedai-speech-rocm .
docker run -d --privileged --init --name openedai-speech -p 8000:8000 -v voices:/app/voices -v config:/app/config ghcr.io/matatonic/openedai-speech-rocm
- CPU ์ ์ฉ, GPU ์์ (Piper๋ง ์ฌ์ฉ): ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ
openedai-speech
์๋น์ค๋ฅผ ๋น๋ํ๊ณ ์์ํ์ธ์:
docker build -f Dockerfile.min -t ghcr.io/matatonic/openedai-speech-min .
docker run -d -p 8000:8000 -v voices:/app/voices -v config:/app/config --name openedai-speech ghcr.io/matatonic/openedai-speech-min
6๋จ๊ณ: Open WebUI์ TTS์ openedai-speech
๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ๊ธฐโ
Open WebUI ์ค์ ์ ์ด๊ณ ๊ด๋ฆฌ ํจ๋ > ์ค์ > ์ค๋์ค์ TTS ์ค์ ์ผ๋ก ์ด๋ํ์ธ์. ์๋ ์ค์ ์ ์ถ๊ฐํ์ธ์:
- API ๊ธฐ๋ณธ URL:
http://host.docker.internal:8000/v1
- API ํค:
sk-111111111
(์ด๊ฒ์ ์์ API ํค์ด๋ฉฐ,openedai-speech
๋ API ํค๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ด ํ๋์ ๋ฌด์์ด๋ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค.)
7๋จ๊ณ: ๋ชฉ์๋ฆฌ ์ ํํ๊ธฐโ
TTS Voice
์์ Admin Panel์ ์ค๋์ค ์ค์ ๋ฉ๋ด์์ ์๋์ ์ ํ์ง ์ค์์ ์ฌ์ฉํ TTS ๋ชจ๋ธ
์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ๋ชจ๋ธ์ ๋ชฉ์๋ฆฌ๋ ์์ด์ ์ต์ ํ๋์ด ์์ต๋๋ค.
tts-1
๋๋tts-1-hd
:alloy
,echo
,echo-alt
,fable
,onyx
,nova
, ๊ทธ๋ฆฌ๊ณshimmer
(tts-1-hd
๋ ์ค์ ๊ฐ๋ฅํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก OpenAI ์ํ์ ์ฌ์ฉ)
8๋จ๊ณ: ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋ค๋ฆฌ๋ ๋ชฉ์๋ฆฌ๋ฅผ ์์ํ์ธ์โ
์ ์ฅ
๋ฒํผ์ ๋๋ฌ Open WebUI ์ค์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ธ์. ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์ณ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ํ ์ ์ฉ๋๋๋ก ํ๊ณ openedai-speech
ํตํฉ์ ์ฌ์ฉํ์ฌ ์์ฐ์ค๋ฌ์ด ์์ฑ์ผ๋ก ํ
์คํธ ์๋ต์ ์ฝ์ด์ฃผ ๋ ํ
์คํธ ์์ฑ ๋ณํ์ ์ฆ๊ธฐ์ธ์.
๋ชจ๋ธ ์ธ๋ถ ์ฌํญ:โ
openedai-speech
๋ ๊ฐ๊ฐ ๊ณ ์ ํ ๊ฐ์ ๊ณผ ์๊ตฌ ์กฐ๊ฑด์ ๊ฐ์ง ์ฌ๋ฌ ํ
์คํธ ์์ฑ ๋ณํ ๋ชจ๋ธ์ ์ง์ํฉ๋๋ค. ์๋ ๋ชจ๋ธ์ด ์ ๊ณต๋ฉ๋๋ค:
- Piper TTS (๋งค์ฐ ๋น ๋ฅด๊ณ CPU์์ ์คํ๋จ):
voice_to_speaker.yaml
๊ตฌ์ฑ ํ์ผ์ ํตํด Piper ๋ชฉ์๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ชจ๋ธ์ ๋ฎ์ ์ง์ฐ ์๊ฐ๊ณผ ๋์ ์ฑ๋ฅ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค. Piper TTS๋ ๋ค๊ตญ์ด ๋ชฉ์๋ฆฌ๋ ์ง์ํฉ๋๋ค. - Coqui AI/TTS XTTS v2 (๋น ๋ฅด์ง๋ง ์ฝ 4GB GPU VRAM๊ณผ CUDA๋ฅผ ์ฌ์ฉํ๋ Nvidia GPU ํ์): ์ด ๋ชจ๋ธ์ Coqui AI์ XTTS v2 ์์ฑ ๋ณต์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๊ณ ํ์ง ๋ชฉ์๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ๋ ๊ฐ๋ ฅํ GPU๊ฐ ํ์ํ์ง๋ง ํ๋ฅญํ ์ฑ๋ฅ๊ณผ ๊ณ ํ์ง ์ค๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. Coqui๋ ๋ค๊ตญ์ด ๋ชฉ์๋ฆฌ๋ ์ง์ํฉ๋๋ค.
- Beta Parler-TTS Support (์คํ์ ์ด๊ณ ๋๋ฆผ): ์ด ๋ชจ๋ธ์ Parler-TTS ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชฉ์๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ํ์ฌ ๋ฒ ํ ์ํ์ด์ง๋ง ์คํผ์ปค ๋ชฉ์๋ฆฌ์ ๊ธฐ๋ณธ ํน์ง์ ์ค๋ช ํ ์ ์์ต๋๋ค. ์ ํํ ๋ชฉ์๋ฆฌ๋ ์์ฑ๋ง๋ค ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์ง๋ง ์ ๊ณต๋ ์คํผ์ปค ์ค๋ช ๊ณผ ์ ์ฌํด์ผ ํฉ๋๋ค. ๋ชฉ์๋ฆฌ๋ฅผ ์ค๋ช ํ๋ ์๊ฐ์ ์ป์ผ๋ ค๋ฉด Text Description to Speech๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ฌธ์ ํด๊ฒฐโ
openedai-speech
๋ฅผ Open WebUI์ ํตํฉํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ, ์๋ ๋ฌธ์ ํด๊ฒฐ ๋จ๊ณ๋ฅผ ๋ฐ๋ผ์ฃผ์ธ์:
openedai-speech
์๋น์ค ํ์ธ:openedai-speech
์๋น์ค๊ฐ ์คํ ์ค์ด๊ณ docker-compose.yml ํ์ผ์ ์ง์ ๋ ํฌํธ๊ฐ ๋ ธ์ถ๋์ด ์๋์ง ํ์ธํ์ธ์.- host.docker.internal์ ๋ํ ์ ๊ทผ ํ์ธ: Open WebUI ์ปจํ
์ด๋ ๋ด์์
host.docker.internal
ํธ์คํธ ์ด๋ฆ์ด ํด์ ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์. ์ด๋openedai-speech
๊ฐ PC์localhost
๋ฅผ ํตํด ๋ ธ์ถ๋์ง๋งopen-webui
๋ ์ผ๋ฐ์ ์ผ๋ก ์ปจํ ์ด๋ ๋ด์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ํฉ๋๋ค. ํธ์คํธ์์ ํ์ผ์ ์ปจํ ์ด๋์ ๋ง์ดํธํ๊ธฐ ์ํด ์๋ฅผ ๋ค์ด openedai-speech๊ฐ ์ ๊ณตํ ๋๋ ํ ๋ฆฌ์ ๋ณผ๋ฅจ์ ์ถ๊ฐํ๋ ค๋ฉด docker-compose.yml ํ์ผ์ ์์ ํ ์ ์์ต๋๋ค. - API ํค ์ค์ ๊ฒํ :
openedai-speech
๋ API ํค๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก API ํค๊ฐ ๋๋ฏธ ๊ฐ์ผ๋ก ์ค์ ๋์๊ฑฐ๋ ์ฒดํฌ ํด์ ๋์๋์ง ํ์ธํ์ธ์. - ์์ฑ ์ค์ ํ์ธ: TTS์ ์ฌ์ฉํ ์์ฑ์ด
voice_to_speaker.yaml
ํ์ผ์ ์กด์ฌํ๋ฉฐ, ํด๋น ํ์ผ(์: ์์ฑ XML ํ์ผ)์ด ์ฌ๋ฐ๋ฅธ ๋๋ ํฐ๋ฆฌ์ ์๋์ง ํ์ธํ์ธ์. - ์์ฑ ๋ชจ๋ธ ๊ฒฝ๋ก ํ์ธ: ์์ฑ ๋ชจ๋ธ ๋ก๋์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ,
voice_to_speaker.yaml
ํ์ผ์ ๊ฒฝ๋ก๊ฐ ์ค์ ์์ฑ ๋ชจ๋ธ ์์น์ ์ผ์นํ๋์ง ๋ค์ ํ์ธํ์ธ์.
์ถ๊ฐ ๋ฌธ์ ํด๊ฒฐ ํโ
- openedai-speech ๋ก๊ทธ์์ ๋ฌธ์ ์ ์์ธ์ ๋ํ๋ด๋ ์ค๋ฅ ๋๋ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ์๋์ง ํ์ธํ์ธ์.
docker-compose.yml
ํ์ผ์ด ํ๊ฒฝ์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธํ์ธ์.- ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด
openedai-speech
์๋น์ค๋ ๋์ปค ํ๊ฒฝ ์ ์ฒด๋ฅผ ์ฌ์์ํด ๋ณด์ธ์. - ๋ฌธ์ ๊ฐ ์ง์๋๋ฉด
openedai-speech
GitHub ์ ์ฅ์๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ๊ด๋ จ ์ปค๋ฎค๋ํฐ ํฌ๋ผ์์ ๋์์ ์์ฒญํ์ธ์.
FAQโ
์์ฑ๋ ์ค๋์ค์ ๊ฐ์ ๋ฒ์๋ฅผ ์ด๋ป๊ฒ ์ ์ดํ ์ ์๋์?
์์ฑ๋ ์ค๋์ค์ ๊ฐ์ ์ถ๋ ฅ์ ์ง์ ์ ์ผ๋ก ์ ์ดํ๋ ๋ฉ์ปค๋์ฆ์ ์์ต๋๋ค. ๋๋ฌธ์ ์ฌ์ฉ์ด๋ ๋ฌธ๋ฒ ๊ฐ์ ํน์ ์์๋ ์ถ๋ ฅ ์ค๋์ค์ ์ํฅ์ ๋ฏธ์น ์ ์์ง๋ง, ๋ด๋ถ ํ ์คํธ ๊ฒฐ๊ณผ๋ ํผ์ฌ๋์ด ์์ต๋๋ค.
์์ฑ ํ์ผ์ ์ด๋์ ์ ์ฅ๋๋์? ์ค์ ํ์ผ์ ์ด๋์ ์๋์?
์ฌ์ฉ ๊ฐ๋ฅํ ์์ฑ ๋ฐ ํด๋น ์์ฑ์ ์ ์ํ๋ ์ค์ ํ์ผ์ config ๋ณผ๋ฅจ์ ์ ์ฅ๋ฉ๋๋ค. ๊ธฐ๋ณธ ์์ฑ์ voice_to_speaker.default.yaml์ ์ ์๋์ด ์์ต๋๋ค.
์ถ๊ฐ ๋ฆฌ์์คโ
openedai-speech
๋ฅผ ์ฌ์ฉํ๋๋ก Open WebUI๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ(ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ ํฌํจ)์ ๋ํ ์์ธํ ๋ด์ฉ์ Open WebUI ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
openedai-speech
์ ๋ํ ์์ธํ ๋ด์ฉ์ GitHub ์ ์ฅ์๋ฅผ ๋ฐฉ๋ฌธํ์ธ์.
openedai-speech์ ์๋ก์ด ์์ฑ ์ถ๊ฐ ๋ฐฉ๋ฒ: Custom-Voices-HowTo
docker-compose.yml
ํ์ผ์์ ํฌํธ ๋ฒํธ๋ฅผ ์ด๋ ค ์๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ํฌํธ๋ก ๋ณ๊ฒฝํ ์ ์์ง๋ง, Open WebUI ๊ด๋ฆฌ์ ์ค๋์ค ์ค์ ์์ API Base URL์ ํด๋น ์ฌํญ์ ๋ง๊ฒ ์
๋ฐ์ดํธํ์ธ์.