0.개요
유튜브를 돌아다니다가 한 영상을 접하게 되었다.
How to Make Your Own AI Waifu Virtual VTUBER or Assistant
(당신만의 AI 버튜버나 Assistant를 만드세요)
최근 LangChain을 배우고 있는 도중이라 보던중 흥미로운 부분을 발견하였다.
TTS 부분을 VoiceVox 프로그램을 통해 해결하고있었다.
VoiceVox는 일본 TTS를 지원하는 무료 프로그램인데 찾아보니 내부적으로 로컬 서버가 하나 열리고 그곳에서 처리하는것을 알게되었다.
그러면 해당 코드를 참고하여 한번 코드를 만들어보자
https://voicevox.hiroshiba.jp/
1.코드
우선 나는 돈이 없기때문에 ChatGPT API 대신 Ollama로 LLama 3.1 8B 모델을 사용하기로했다.
기본적인 구조는 내가 말을 입력하면 LLM 이 답변을 내놓고 그걸 일본어로 번역한다음에 VoiceVox를 통해 음성파일을 만드는것이다.
1-1.llama 사용
LLAMA는 다음과같은 방법으로 설치를 진행하였다.
https://asa9874.tistory.com/569
우선 LLM 부분 코드는 이전에 기본적으로 만들어둔 ChatPromptTempalate구조중 하나를 가져온다음에
나중에 따로 수정하기로하였다.
클래스 구조로 만들어뒀다.
from langchain_core.prompts import ChatPromptTemplate,PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_ollama import OllamaLLM
from time import sleep
class ChatBot:
global chain
global llm
global lastAnswer
global prompt
def __init__(self):
self.llm = OllamaLLM(model="llama3.1")
self.prompt= ChatPromptTemplate.from_messages(
[
("system", "당신은 불친절한 ai입니다. 모든 말은 반말로 하고 문장뒤에 \"흥!\" 을 붙입니다."),
("system","당신은 또한 모든 말 시작부분에 \"나 AI가 말하노니\" 를 붙입니다. "),
("user", "당신은 나의 질문에 대답해줘야해"),
("ai", "나 AI가 말하노니 알았어 흥!"),
("user","{question}")
]
)
self.chain = self.prompt | self.llm | StrOutputParser()
def talk(self, text):
self.lastAnswer=self.chain.invoke({"question": text})
return self.lastAnswer
def writeAnswer(self):
for i in self.lastAnswer:
print(i, end="")
sleep(0.1)
1-2.VoiceVox TTS
VoiceVox의 경우에는 wav 음성파일을 만들고 pyaudio 라이브러리를 추가로 설치하여 wav 파일을 실행한뒤에
음성파일을 삭제하는 식으로 구조를 만들었다.
import os
import requests
import urllib.parse
import pyaudio
import wave
import os
import time
import threading
# https://github.com/ardha27/AI-Waifu-Vtuber
# VoceVox 프로그램 키고 해야함
class TTS:
global voicevox_url
global stop_timer# 타이머 종료용
global file_path # wav 파일 경로
def __init__(self):
self.voicevox_url='http://localhost:50021'
self.file_path="./resource/test.wav"
def voicevox_tts(self,text):
katakana_text = text
params_encoded = urllib.parse.urlencode({'text': katakana_text, 'speaker': 10})
request = requests.post(f'{self.voicevox_url}/audio_query?{params_encoded}')
params_encoded = urllib.parse.urlencode({'speaker': 10, 'enable_interrogative_upspeak': True})
request = requests.post(f'{self.voicevox_url}/synthesis?{params_encoded}', json=request.json())
with open(self.file_path, "wb") as outfile:
outfile.write(request.content)
def play_wav(self):
chunk = 1024
with wave.open(self.file_path, 'rb') as f:
p = pyaudio.PyAudio()
stream = p.open(format = p.get_format_from_width(f.getsampwidth()),
channels = f.getnchannels(),
rate = f.getframerate(),
output = True)
data = f.readframes(chunk)
while data:
stream.write(data)
data = f.readframes(chunk)
stream.stop_stream()
stream.close()
p.terminate()
def timer(self):
start_time = time.time()
while not self.stop_timer:
elapsed_time = time.time() - start_time
print(f"\r경과 시간: {elapsed_time:.2f}초", end="")
time.sleep(0.01)
def play_TTS(self,text="ボイスボックスに問題が発生しました"):
self.stop_timer= False
timer_thread = threading.Thread(target=self.timer)
timer_thread.start()
self.voicevox_tts(text)
self.play_wav()
os.remove(self.file_path)
self.stop_timer = True
timer_thread.join()
1-3.번역 googletrans
번역관련은 googletrans 라이브러리를 활용했다.
from googletrans import Translator
import asyncio
# 비동기적으로 번역을 처리하는 함수
async def translate_text(text):
translator = Translator()
try:
translated = await translator.translate(text, src='ko', dest='ja')
return translated.text
except Exception as e:
print(f"Error translating {text}: {e}")
return text
1-4.메인함수
실행을 위한 메인 코드다
from TTS import TTS
from chatbot import ChatBot
from translate import translate_text
import asyncio
if __name__ == '__main__':
chatbot=ChatBot()
tts=TTS()
while True:
Answer= chatbot.talk(input("질문: "))
print(Answer)
Answer= asyncio.run(translate_text(Answer))
tts.play_TTS(Answer)
2.결론
유튜브에서 영상을 본뒤 바로 코드를 작성해보았는데 코드를 실행하기 이전에
VoiceVox 프로그램을 실행한뒤 실행해야하는 한계점이 명확하였다.
RVC나 VITS 모델로 음성부분을 처리하는 프로젝트들을 본것같은데 추후에 ChatBot의 프롬프트와 해당 부분을 수정하게 될것같다.
'Language > Python' 카테고리의 다른 글
[Python] RVC + LangChain 으로 TTS 챗봇만들기2 (0) | 2025.01.13 |
---|---|
[Python] 애니 데이터 크롤링 (0) | 2024.07.28 |
[Python]카카오톡 단어 분석 프로그램2 (카톡 시간대분석) (0) | 2024.07.16 |