我們在「【語音合成技術 - GPT-SoVITS】如何架設API伺服器」有分享如何使用Docker來架設GPT-SoVITS的TTS API服務, 但過程中我們卻遇到了一些困難, 相信有深入使用這套TTS服務的朋友應該難免也會遇到這類的問題, 期望透過我們的分享幫助到正在遇到困難的你!
首先我們的docker compose配置檔如下
services:
gpt-sovits-api:
image: breakstring/gpt-sovits:latest # please change the image name and tag base your environment. If the tag contains the word 'elite', such as "latest-elite", it indicates that the image does not include the necessary models such as GPT-SoVITS, UVR5, Damo ASR, etc. You will need to download them yourself and map them into the container.
container_name: gpt-sovits-api
environment:
- is_half=True
- is_share=False
volumes:
...
- ./api_v2.py:/workspace/api_v2.py
command:
- python
- api_v2.py
working_dir: /workspace
ports:
- "9880:9880"
shm_size: 16G
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: "all"
capabilities: [gpu]
stdin_open: true
tty: true
restart: unless-stopped
啟動後的LOG訊息

看起來蠻OK的, 接下來我們就來用瀏覽器連線看看。
嘗試連線
我們使用 http://10.85.2.25:9880/tts 來測試連線, 咦! 怎們會是這樣的畫面呢?

什麼原因?
uvicorn
綁定 host=127.0.0.1
時,只有容器內部的網路可以訪問該地址。外部無法直接訪問 127.0.0.1
,因為這個 IP 只指向容器本身,並不對宿主機公開。要讓外部瀏覽器能夠訪問,請將 host
設置為 0.0.0.0
。這樣做會使容器中的應用程序對所有網卡接口公開,包括 Docker 容器的網絡接口,從而允許從宿主機訪問。
怎麼解決?
原來是預設綁定了 127.0.0.1 導致宿主機無法連線, 而我們可以嘗試配置綁定的主機為 0.0.0.0 會對於所有網卡接口打開的狀態, 至於怎麼做呢?
我們先來看看api_v2.py是否提供了參數化的方式進行設定, 如此一來才不用更動到原始碼, 很幸運的是api_v2.py本身的設計就支援綁定host的參數。
我們可以改改docker compose的配置檔, 在command的部份改成這樣:
command:
- python
- api_v2.py
- --bind_addr=0.0.0.0
再次啟動後:

雖然仍發生Internal Server Error, 但這是因為我們的API入口錯誤, 至少也已經能夠連入了。

結語
雖然只是一個簡單的配置就能夠解決這樣的問題, 但對於背景知識較為薄弱的朋友來說, 或許也會彎彎繞繞一陣子, 期望我們的分享能夠幫助到您!