Data Science!

[글또 10기] OpenAI API, Whisper 와 Streamlit 으로 프로토타입 챗봇 만들기

양국남자 2025. 2. 16. 11:53

들어가기 앞서

이 글을 읽으시는 사람이면 어느정도 IT에 관심이 있으실 분들이니 미리 말합니다.

Streamlit 은 프로토타이핑 용도이지, 진짜 배포용이면 Django, Flask 나 허깅페이스, 또는 OpenAI API(이거로 배포해볼 생각입니다) 를 사용하셔야 합니다.

 

기능 설명

1. 맞춤형 챗봇이기 때문에 사용자의 개인정보를 어느정도 받아서 작동합니다.

2. Whisper 를 활용해서 음성인식을 합니다.

3. OpenAI API를 활용해서 부적절한 내용들을 필터링합니다.

 

코드 설명

우선 개발 환경을 설정해줍니다. 필요한 패키지를 pip 로 다 import 해준뒤 파이썬에서는 openai api 키를 넣어줍시다.

pip install openai streamlit sounddevice numpy

import openai
openai.api_key = "YOUR_OPENAI_API_KEY"

 

그 후에는 Streamlit 으로 프로토타입용 UI 를 넣어줍시다.

import streamlit as st

st.title("🗣️ 맞춤형 한국어 대화 연습 챗봇")
if "conversation_history" not in st.session_state:
    st.session_state.conversation_history = []

 

그 뒤에는 맞춤형 대화 주제를 생성하도록 합니다. user_info 딕셔너리를 받는 과정은 생략했습니다.

def generate_custom_prompts(user_info):
    prompt_text = f"""
    사용자의 정보를 기반으로 맞춤형 대화 주제를 생성하세요:
    {user_info}
    """
    response = openai.ChatCompletion.create(
        model="gpt-4-turbo",
        messages=[{"role": "system", "content": prompt_text}]
    )
    return response.choices[0].message.content.split("\n")

 

그 뒤에는 whisper 를 활용해서 음성인식을 하는 기능을 추가해줍니다.

import 중에 tempfile 이라는게 있는데 얘가 꽤 편리합니다. 임시파일을 만들어서 저장할 수 있게 해주니까요.

import sounddevice as sd
import queue
import wave
import tempfile

def record_audio(duration=15, samplerate=16000):
    q = queue.Queue()
    
    def callback(indata, frames, time, status):
        q.put(indata.copy())
    
    with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmpfile:
        filename = tmpfile.name
        with wave.open(filename, 'wb') as wf:
            wf.setnchannels(1)
            wf.setsampwidth(2)
            wf.setframerate(samplerate)
            
            with sd.InputStream(callback=callback, samplerate=samplerate, channels=1, dtype="int16"):
                for _ in range(int(samplerate / 1024 * duration)):
                    wf.writeframes(q.get())
        
    return filename

 

그리고는 Whisper API (이것도 OpenAI와 연동되어 있으니 쓰면 구독 관리등이 편합니다!) 도 넣어줍니다.

def transcribe_audio(audio_path):
    with open(audio_path, "rb") as audio_file:
        response = openai.Audio.transcriptions.create(
            model="whisper-1",
            file=audio_file
        )
    return response.text

 

부적절한 표현 감지

저는 투트랙을 사용했습니다. 일단 제가 아는 자주 쓰이는 비속어 목록과 OpenAI의 Moderation 기능을 둘 다 사용했습니다. 만일 부적절한 표현이 감지되면 경고를 한 뒤에 답변을 줍니다.

 

def check_profanity(text):
    korean_profanity_list = ["불쾌한", "표현들", "써봣자", "안좋아요"]
    flagged_words = [word for word in korean_profanity_list if word in text]
    response = openai.Moderation.create(input=text, model="text-moderation-latest")
    flagged = response['results'][0]['flagged']
    return flagged or flagged_words

 

사용자가 욕하면 좀 더 정중한 표현 써보라고 조언도 합니다.

 

def suggest_better_response(user_input):
    prompt = f"'{user_input}'을 정중한 표현으로 바꿔주세요."
    response = openai.ChatCompletion.create(
        model="gpt-4-turbo",
        messages=[{"role": "system", "content": prompt}]
    )
    return response.choices[0].message.content

 

마지막에 실험해보시고 싶으면 

streamlit run chatbot.py

 

콘솔에 쳐보시면 됩니다.