Skip to content

🎀 Ollama-Streaming-Voice-ChatAI: μ‹€μ‹œκ°„ μŒμ„± 인식(STT) + AI λŒ€ν™”(Ollama) + μŒμ„± ν•©μ„±(TTS) Ollama 기반 AI와 GPT-SoVITS TTSλ₯Ό ν™œμš©ν•œ **μ‹€μ‹œκ°„ μŒμ„± 슀트리밍 λŒ€ν™” μ‹œμŠ€ν…œ**

Notifications You must be signed in to change notification settings

Leehyunbin0131/LiveStreaming-AI-VTuber

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

52 Commits
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Live Streaming AI VTuber for VTubeStudio

🎀 Live Streaming AI VTuber: μ‹€μ‹œκ°„ AI λŒ€ν™” + TTS μŒμ„± ν•©μ„± + VTubeStudio 연동

Ollama 기반 AI와 GPT-SoVITS TTS,RealtimeSTTλ₯Ό ν™œμš©ν•œ 슀트리밍 및 VTubeStudio 연동 μŒμ„± AIλ²„νŠœλ²„ μ‹œμŠ€ν…œ

⚠️ 이 μ½”λ“œλŠ” 데λͺ¨ λ²„μ „μœΌλ‘œ μ—¬λŸ¬ λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 계속 μ—…λ°μ΄νŠΈ μ€‘μ΄λ―€λ‘œ μ΅œμ‹  버전을 μœ μ§€ν•΄μ£Όμ„Έμš”.


πŸ“ μ œμž‘μžμ˜ 말

μ•ˆλ…•ν•˜μ„Έμš”! 이 ν”„λ‘œμ νŠΈλ₯Ό κ°œλ°œν•œ μ œμž‘μžμž…λ‹ˆλ‹€.

ν˜„μž¬ κ΅° 볡무 쀑이라 ν”„λ‘œμ νŠΈλ₯Ό ν™œλ°œν•˜κ²Œ μ—…λ°μ΄νŠΈν•˜κΈ° μ–΄λ €μš΄ μƒν™©μž…λ‹ˆλ‹€.
λ‹€μŒ μ£Όμš” μ—…λ°μ΄νŠΈλŠ” μ „μ—­ 후인 2025λ…„ 5μ›” 이후에 κ°€λŠ₯ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

κ·Έλ™μ•ˆ ν”„λ‘œμ νŠΈλ₯Ό ν™œμš©ν•˜μ‹œλ©΄μ„œ λ²„κ·Έλ‚˜ κ°œμ„ μ μ΄ μžˆλ‹€λ©΄ 이슈λ₯Ό λ‚¨κ²¨μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.
λͺ¨λ“  κΈ°μ—¬μžλΆ„λ“€κ»˜ 항상 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! πŸ™


λͺ¨λ“  κΈ°μ—¬μžλ“€μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€ :3


πŸ–₯️ ν™˜κ²½ μš”κ΅¬ 사항

CUDA 12.3
PyTorch 2.2.0 cuda121
Python 3.9+
Ollama 

πŸ“₯ λͺ¨λΈ λ‹€μš΄λ‘œλ“œ 및 μ„€μ •

1️⃣ GPT-SoVITS λ‹€μš΄λ‘œλ“œ

GPT-SoVITS-v2 λ‹€μš΄λ‘œλ“œ

GPT-SoVITS-v2λ₯Ό λ‹€μš΄λ‘œλ“œν•œ ν›„, GPT λͺ¨λΈκ³Ό SoVITSλ₯Ό ν•™μŠ΅ν•˜μ—¬ TTS λͺ¨λΈμ„ μƒμ„±ν•©λ‹ˆλ‹€.

GPT-SoVITS-v2/configs/tts_infer.yaml νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€. t2s_weights_path,vits_weights_path 경둜λ₯Ό ν•™μŠ΅λœ μ‚¬μš©μžμ˜ λͺ¨λΈλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.

βœ… CUDAλ₯Ό μ‚¬μš©ν•˜λŠ” 경우

device: cuda
is_half: true
t2s_weights_path: GPT_weights_v2/MY_TTS_MODEL.ckpt
version: v2
vits_weights_path: SoVITS_weights_v2/MY_TTS_MODEL.pth

βœ… CPUλ₯Ό μ‚¬μš©ν•˜λŠ” 경우

device: cpu
is_half: false
t2s_weights_path: GPT_weights_v2/MY_TTS_MODEL.ckpt
version: v2
vits_weights_path: SoVITS_weights_v2/MY_TTS_MODEL.pth

βœ… 예제 μ„€μ • (default_v2)

default_v2:
  bert_base_path: GPT_SoVITS/pretrained_models/chinese-roberta-wwm-ext-large
  cnhuhbert_base_path: GPT_SoVITS/pretrained_models/chinese-hubert-base
  device: cuda
  is_half: true
  t2s_weights_path: GPT_weights_v2/MY_TTS_MODEL.ckpt
  version: v2
  vits_weights_path: SoVITS_weights_v2/MY_TTS_MODEL.pth

2️⃣ Ollama λͺ¨λΈ λ‹€μš΄λ‘œλ“œ 및 μ„€μ •

Ollama λ‹€μš΄λ‘œλ“œ Ollama Models λ‹€μš΄λ‘œλ“œ

  1. DEMO_test.pyμ—μ„œ Ollama λͺ¨λΈμ΄λ¦„을 λ‹€μš΄λ‘œλ“œν•œ λͺ¨λΈμ˜ μ΄λ¦„μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.
  2. λͺ¨λΈ 이름은 μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
ollama list

예제 μ½”λ“œ (DEMO_test.py μˆ˜μ • λΆ€λΆ„)

class OllamaChat:
    def __init__(self, model: str = "Ollama λͺ¨λΈμ΄λ¦„") -> None:
        self.model = model
        self.system_message = {
            'role': 'system',
            'content': (
                "당신은 인터넷 AI 방솑 ν¬λ¦¬μ—μ΄ν„°μž…λ‹ˆλ‹€. "
                "Ollama 기반의 인곡지λŠ₯ AI이며, μ‹œμ²­μžλ“€κ³Ό μ†Œν†΅ν•˜λŠ” 것을 즐기고 ν„Έν„Έν•œ 성격을 κ°€μ‘ŒμŠ΅λ‹ˆλ‹€. "
                "μ‘΄λŒ“λ§μ„ μ‚¬μš©ν•˜μ§€ 말고, λŒ€ν™”λŠ” μ§§κ³  κ°„κ²°ν•˜κ²Œ ν•˜λ©°, μ •ν™•ν•œ 정보λ₯Ό μ „λ‹¬ν•˜μ„Έμš”."
            )
        }
        self.conversation_history = []

μ°Έμ‘° μ˜€λ””μ˜€ μ„ΈνŒ…

DEFAULT_REF_AUDIO = r"C:\Users\unit6\Documents\Test\My_tts\My_BaseTTS_v2.wav"  # μ°Έμ‘° μ˜€λ””μ˜€ 경둜
DEFAULT_PROMPT_TEXT = ""  # μ°Έμ‘° ν…μŠ€νŠΈ (ν•œκ΅­μ–΄λŠ” 빈칸으둜)
DEFAULT_PROMPT_LANG = "ko"  # μ°Έμ‘° μ–Έμ–΄ μ„€μ •

πŸŽ₯ VTubeStudio μ„€μ •

VTubeStudio μ„€μ •μ—μ„œ VTubeStudio API μ‹œμž‘ μ˜΅μ…˜μ„ ON으둜 ν™œμ„±ν™”ν•©λ‹ˆλ‹€.


πŸš€ μ‹€ν–‰ 방법

1️⃣ VTubeStudio

VTubeStudio μ‹€ν–‰.

2️⃣ GPT-SoVITS API μ‹€ν–‰

cd GPT-SoVITS-v2-240821
python api_v2.py -a 127.0.0.1 -p 9880 -c GPT_SoVITS/configs/tts_infer.yaml

3️⃣ 데λͺ¨ μ‹€ν–‰

python DEMO_test.py

4️⃣ VTubeStudio

VTubeStudio ν™”λ©΄μ˜ κΆŒν•œ μš”μ²­μ„ ν—ˆμš©ν•©λ‹ˆλ‹€.

πŸ“Ή μ˜μƒ https://youtu.be/XH1xBt59EGw

데λͺ¨ μ˜μƒ


⚠️ 문제 ν•΄κ²°

λ§Œμ•½ VTubeStudio λͺ¨λΈμ΄ 움직이지 μ•ŠλŠ”λ‹€λ©΄, DEMO_vts_api_helper.py의 param_idκ°€ μ‹€μ œ ID와 μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”.

def inject_mouth_value(self, mouth_value: float, face_found: bool = True, param_id: str = "MouthOpen"):  # μ‹€μ œ ID 확인
    if not self.authenticated:
        return
    mouth_value = max(0.0, min(1.0, mouth_value))
    req_id = str(uuid.uuid4())[:8]
    payload = {
        "apiName": "VTubeStudioPublicAPI",
        "apiVersion": "1.0",
        "requestID": req_id,
        "messageType": "InjectParameterDataRequest",
        "data": {
            "faceFound": face_found,
            "mode": "set",
            "parameterValues": [
                {"id": param_id, "value": mouth_value}
            ]
        }
    }
    self.send_message(payload)

μž‘μ—… μ˜ˆμ •

-μ±„νŒ… API μ—°κ²° μž‘μ—… μˆ˜ν–‰

-LLM ν™œμš© λ°œν™”μž ꡬ뢄 μ•Œκ³ λ¦¬μ¦˜ 적용

-νŒŒμ΄ν”„λΌμΈ μ΅œμ ν™”,λ ˆμ΄ν„΄μ‹œ μ΅œμ†Œν™”

-WAVνŒŒμΌμ„ 청크 λ‹¨μœ„λ‘œ 슀트리밍 λ°›μ•„ μ‹€μ‹œκ°„ μž¬μƒ

-제3μžμ™€μ˜ λŒ€ν™” 흐름 κΈ°μ–΅


πŸ”— μ°Έκ³  자료


πŸ“œ λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” μ˜€ν”ˆμ†ŒμŠ€λ‘œ μ œκ³΅λ©λ‹ˆλ‹€. μ‚¬μš© μ‹œ λΌμ΄μ„ μŠ€λ₯Ό μ°Έκ³ ν•˜μ„Έμš”.


πŸ“ž 문의

κΆκΈˆν•œ μ μ΄λ‚˜ κ°œμ„  사항이 μžˆλ‹€λ©΄ 이슈λ₯Ό λ‚¨κ²¨μ£Όμ„Έμš”! 😊

leehyunbin0131@gmail.com

Discord : leehyunbin

About

🎀 Ollama-Streaming-Voice-ChatAI: μ‹€μ‹œκ°„ μŒμ„± 인식(STT) + AI λŒ€ν™”(Ollama) + μŒμ„± ν•©μ„±(TTS) Ollama 기반 AI와 GPT-SoVITS TTSλ₯Ό ν™œμš©ν•œ **μ‹€μ‹œκ°„ μŒμ„± 슀트리밍 λŒ€ν™” μ‹œμŠ€ν…œ**

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages