본문 바로가기
언어모델 LLM/프로젝트 예제

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

by General AI 2024. 7. 12.
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
반응형