코딩 교육 TIL

2024-05-16 AI 코딩 TIL

HyunjunPark 2024. 5. 16. 20:21
오늘은 그동안에 문제가 많이 해결이 된 것 같아 기분이 좋군요

STT로 입력을 받아서 AI로 답변을 만들고 TTS로 말해주는 기능을 구현을 할 수 있어서

잘 풀렸구나 라는 생각이 들었고

내가 원하는 방법으로 술술 일이 잘풀리니 팀 프로젝트를 준비하는 것에 기분이 좋아졌습니다 ^^

import os
import time
import speech_recognition as sr
from gtts import gTTS
from openai import OpenAI
import pygame


# 음성 인식 (듣기, STT)
def listen(recognizer, audio):
    try:
        text = recognizer.recognize_google(audio, language='ko-KR')
        print("[고객] : " + text)
        if "종료" in text:
            stop_listening(wait_for_stop=False)
            speak("마이크 입력을 종료 합니다.")
        else:
            answer(text)

    except sr.UnknownValueError:
        print("인식 실패")  # 음성 인식 실패한 경우
    except sr.RequestError as e:
        print("요청 실패 : {0}".format(e))  # API key 오류, 네트워크 단절 등


# 대답
def answer(input_text):
    client = OpenAI(api_key="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")
    menu = ["아메리카노", "카푸치노", "딸기스무디", "블루베리스무디"]
    category = ["시원한", "커피", "따뜻한", "과일", "딸기", "블루베리"]
    system_instructions = f"""
        이제부터 너는 "카페 직원"이야. 
        너는 고객의 말에 따라 음료를 추천해 줘야해 우리가게에는 {menu}가 있어.
        그리고 아래의 카테고리 중에서 고객의 질문과 관련이 있는 항목을 선택해줘:
        {category}
        선택된 항목은 '선택된 항목: [항목]' 형식으로 반환하고, 고객에게 전달할 메시지는 별도로 작성해줘 추가로 메세지는 무조건 존댓말로 적어줘.
    """
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": system_instructions},
            {"role": "user", "content": input_text},
        ],
    )
    ai_response = completion.choices[0].message.content

    # 선택된 항목과 고객 메시지 추출
    selected_choice = None
    customer_message = ""
    for line in ai_response.split('\n'):
        if line.startswith('선택된 항목:'):
            selected_choice = line.split('선택된 항목: ')[1].strip()
        else:
            customer_message += line + '\n'

    # 선택된 항목이 있으면 출력
    if selected_choice:
        print(f"선택된 항목: {selected_choice}")
    else:
        print("관련 항목을 찾지 못했습니다.")

    customer_message = customer_message.strip()
    speak(customer_message)


# 소리내어 읽기 (TTS)
def speak(text):
    print("[AI도우미] : " + text)
    file_name = "voice.mp3"
    if os.path.exists(file_name):
        try:
            os.remove(file_name)
        except PermissionError:
            print(f"파일 {file_name}이(가) 다른 프로세스에 의해 사용 중입니다.")
            return
    tts = gTTS(text=text, lang='ko')
    tts.save(file_name)
    pygame.mixer.init()
    pygame.mixer.music.load(file_name)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():  # 음악이 재생 중인지 확인
        time.sleep(0.1)
    pygame.mixer.quit()
    if os.path.exists(file_name):  # 음성 하고 파일 삭제
        os.remove(file_name)


r = sr.Recognizer()
m = sr.Microphone()

speak("무엇을 도와드릴까요?")
stop_listening = r.listen_in_background(m, listen)  # 처음 인자는 입력 신호, 두번 째 인자는 실행을 하는 함수

while True:
    time.sleep(0.1)

우리가 필요로 하는 기능들을 점점 준비해서 맞추어 갈 수 있는 것에 아주 좋은 것 같습니다!

또한 앞으로 준비해야 하는 기능을 더욱 보완을 해야하는데.

위와 같은 기능들을 조금 더 보완해 가면서 만들면 좋을 것 같다는 생각이 들었습니다.