언어모델 LLM/프로젝트 예제

Streamlit과 Langchain으로 TTS 지원 챗봇 만들기

General AI 2024. 7. 12. 23:39
728x90
반응형

Streamlit과 Langchain으로 TTS 지원 챗봇 만들기

Streamlit과 Langchain을 이용해 음성 지원 기능이 있는 대화형 AI 챗봇을 만드는 방법을 알아보겠습니다. 이 프로젝트를 통해 우리는 텍스트 기반의 대화뿐만 아니라 AI의 응답을 음성으로도 들을 수 있는 챗봇을 구현할 것입니다.

Streamlit과 Langchain으로 TTS 지원 챗봇 만들기

1. 프로젝트 개요

이 포스팅에서 소개할 챗봇은 다음과 같은 특징을 가집니다:

  • Streamlit을 사용한 웹 기반 사용자 인터페이스
  • Langchain을 이용한 대화 관리 및 AI 모델 연동
  • 실시간 토큰 생성 속도 표시
  • TTS(Text-to-Speech) 기능으로 AI 응답을 음성으로 변환

2. 환경 설정

먼저, 프로젝트를 위한 가상 환경을 만들어 봅시다:

python -m venv chatbot_env
source chatbot_env/bin/activate  # Windows: chatbot_env\Scripts\activate

3. 필요한 라이브러리 설치

다음 명령어로 필요한 라이브러리들을 설치합니다:

pip install streamlit langchain langchain-community ollama TTS

4. 코드 구현

이제 app.py 파일을 만들고 다음 코드를 작성합니다:

import streamlit as st
from langchain_community.llms import Ollama
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
import time
import torch
from TTS.api import TTS

# Ollama 모델 초기화
llm = Ollama(model="llama2")

# 대화 체인 초기화
conversation = ConversationChain(
    llm=llm, 
    memory=ConversationBufferMemory()
)

# TTS 모델 초기화
device = "cuda" if torch.cuda.is_available() else "cpu"
tts = TTS("tts_models/en/ljspeech/tacotron2-DDC", progress_bar=False).to(device)

# Streamlit 앱 구성
st.title("AI 챗봇 with TTS")

# 세션 상태 초기화
if "messages" not in st.session_state:
    st.session_state.messages = []

# 이전 대화 표시
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# 사용자 입력 처리
if prompt := st.chat_input("무엇이 궁금하신가요?"):
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    with st.chat_message("assistant"):
        message_placeholder = st.empty()
        full_response = ""

        start_time = time.time()
        token_count = 0

        # 토큰별 출력
        for chunk in llm.stream(prompt):
            full_response += chunk
            token_count += 1
            elapsed_time = time.time() - start_time

            # 토큰 속도 계산 (tokens per second)
            token_speed = token_count / elapsed_time if elapsed_time > 0 else 0

            # 응답과 함께 토큰 속도 표시
            message_placeholder.markdown(f"{full_response}▌\n\n---\n토큰 수: {token_count} | 속도: {token_speed:.2f} 토큰/초")

        # 최종 응답 표시
        message_placeholder.markdown(f"{full_response}\n\n---\n최종 토큰 수: {token_count} | 평균 속도: {token_speed:.2f} 토큰/초")

        # TTS로 음성 생성
        tts.tts_to_file(text=full_response, file_path="response.wav")

        # 음성 재생 버튼 추가
        st.audio("response.wav")

    st.session_state.messages.append({"role": "assistant", "content": full_response})

5. 실행 및 테스트

터미널에서 다음 명령어로 앱을 실행합니다:

streamlit run app.py

브라우저가 자동으로 열리고 챗봇 인터페이스가 표시됩니다. 질문을 입력하고 AI의 응답을 확인해보세요. 응답 아래에 있는 오디오 플레이어를 통해 TTS로 변환된 음성을 들을 수 있습니다. 아래 파일을 테스트 예시 입니다.

다운로드

6. 문제 해결 팁

  1. Ollama 연결 오류:
    • Ollama 서버가 실행 중인지 확인합니다. (ollama serve 명령어로 실행)
    • 방화벽 설정을 확인합니다.
    • Ollama 모델이 설치되어 있는지 확인합니다. (ollama list)
  2. TTS 모델 다운로드 오류:
    • 인터넷 연결을 확인합니다.
    • TTS 캐시 폴더를 정리하고 다시 시도합니다.
    • TTS 라이브러리를 재설치합니다.
  3. 메모리 부족 오류:
    • 더 작은 모델을 사용하거나 시스템 리소스를 확인합니다.
    • 가상 환경을 재시작합니다.

이 프로젝트를 통해 우리는 Streamlit과 Langchain을 사용하여 TTS 기능을 갖춘 대화형 AI 챗봇을 만들어 보았습니다. 이 챗봇은 텍스트 기반의 대화뿐만 아니라 음성 응답도 제공하여 사용자 경험을 한층 더 향상시킵니다. 이 프로젝트는 AI, 웹 개발, 음성 처리 기술의 결합을 보여주는 좋은 예시입니다. 여러분은 이를 기반으로 더욱 발전된 기능을 추가하거나, 실제 비즈니스 요구사항에 맞게 커스터마이징할 수 있습니다. AI 기술은 계속해서 발전하고 있으며, 이런 프로젝트들을 통해 우리는 그 발전의 최전선에 서 있습니다. 여러분만의 독특하고 혁신적인 AI 애플리케이션을 만들어 보세요!

728x90
반응형