Voice secretary 버전 2.0.0

2023. 11. 2. 23:12·프로젝트/음성비서

시작하기 전

이번에도 버전을 0.5 올렸다~~ 내 기준 0.5는 좀 시간도 많이 들이고, 메인 기능을 하나 추가한거!! 0.01 올리는건 그냥 음 사소한 코드 리팩토링? 정도로 보면 된다 ㅋㅋ

이번에도 프로젝트 회고를 해보자.

Ver 2.0.0

Ver 2.0.0 특징

- Genie 일상대화 api 이용 -> 일상대화 구현

- 자잘한 오류 수정

1. Genielabs 일상채팅 API

내 음성 비서의 핵심이 될 API이다. 사실 그냥 API라서 갖다가 쓰기만 하면된다. 근데 은근 만줘져야할게 많았다.

우선 genielabs의 일상대화 api key를 발급받아야한다. 이것또한 블로그에 작성해놓았으니, 우선 아래 링크에서 api키를 발급받길 바란다.(사용하고 싶다면..)

 

KT GenieLabs api 이용하기

뭐 이건 genielabs에 들어가면 아주 자세하게 설명되어 있지만, 프로젝트에 사용되는 거라 간단하게 설명해보겠다. 우선 genie labs에 다양한 api들이 있는데, 전부 똑같은 절차로 발급받으면 된다. 1.

changsroad.tistory.com

 

우선 genielabs의 api를 이용할 때 clientkey, signature, timestamp가 사용되는 이 값들은 말그대로 시간에 따라 변하기 때문에 함수로 만들어서 api를 호출할 때마다 값을 바꾸라고, 안내에도 나와있다. 따라서 그 코드를 구현했고, 가장 신경쓰이면서 짜증나게 만들었던게 바로 context와 context_utt_label이라는 두개의 인자이다. 

이 우선 일상채팅 API를 호출할 때, 총 4개의 인자가들어가는데 각 인자에 대한 설명은 홈페이지에 설명되어 있었다.

그래서 내가 생각한 이전대화들을 바탕으로, 답변을하는 음성비서에 적합하다고 생각했다. (맨처음 생각난 건 당연히 핫한 chat gpt api 였지만 유료..) 그런데 아까 말한, context와 context_utt_label은 내가 직접 설정해서 넣어줘야했는데, 이게 api를 호출할 때는 자동으로 sys와, 답변을 넣어주더라...이걸 몰랐어가지고 난 무조건 내가 만든 stt와 tts를 호출할 때 직접 user과 대화, sys와 대화 를 넣어줬는데 계속 sys에 해당하는 내용이 두번씩 들어가서 답답했었다 ...

 

또 하나의 문제는 내가 아직 지식이 얕아서 벌어진 문제 같은데.. 코드를 하나에 구현하지 않고, 추후 수정하기 편하게 모듈화를 시켰는데, 저 지니 대화에서 사용되는 context와 context_utt_label 즉 대화기록, 대화발화자기록 들은 프로그램이 시작 ~ 프로그램 종료 때까지 유지되어야만 했다. 이걸 전역변수?처럼 어떻게 사용해야하지 하다가 이게 최적의 방법은 아니겠지만.. context_manger.py라는 파일을 만들고 거기서 context와 context_utt_label를 정의한다음, 다른 모듈들에서는

from context_manger import context, context_utt_label

 이런식으로 사용하여 그 값이 모든 파일에서 공유되도록 하였다. 

 

-> 지난 버전까지에서 "날씨"키워드가 인식되면 weather함수로 가게 만들어놨고, 그게 아니라면 지니의 일상채팅 api를 호출하도록 만들었다. 이렇게 음성비서의 메인 틀이 또 하나 완성되었다.

(근데 사실 이 일상채팅 api가 이전 대화기록을 바탕으로 답변하는지 전혀 모르겠다....확인, 테스트를 몇번이나 해봤는데 context와 context_utt_label 모두 기록되어 api호출할 때 넘어가는데 사실 대화가 되는 느낌은 전혀 못들었다.. 내 말에 대해서 대충 알아듣고 답변은 하는데 대화라기 보다는 그냥 대답한번. 이 맞는 것 같은데....내가 잘못한 걸 수도 있으니 나중에 더 알아보도록 하겠다. 이를 쓴 예시가 많이 없어서 ..)

더보기
import json
import requests
from datetime import datetime
import hmac, hashlib
from pytz import timezone
import pyttsx3

# personal function
from context_manager import context,context_utt_label
from api_token_list import client_id,client_secret,client_key

def speak(text):
    engine = pyttsx3.init()
    engine.say(text)
    engine.runAndWait()
    context.append(text)
    context_utt_label.append('sys')

def certificate():
    # timestamp 생성
    timestamp = datetime.now(timezone("Asia/Seoul")).strftime("%Y%m%d%H%M%S%f")[:-3] 
    # HMAC 기반 signature 생성
    signature = hmac.new(
        key=client_secret.encode("UTF-8"), msg= f"{client_id}:{timestamp}".encode("UTF-8"), digestmod=hashlib.sha256
    ).hexdigest()
    
    return client_key,signature,timestamp

def giga_genie(user_input):
    print(context,context_utt_label)
    client_key,signature,timestamp = certificate()
     
    url = "https://aiapi.genielabs.ai/kt/nlp/daily-chat"
    headers = {
        "x-client-key":f"{client_key}",
        "x-client-signature":f"{signature}",
        "x-auth-timestamp":f"{timestamp}",
        "Content-Type": "application/json",
        "charset": "utf-8",
    } 
    
    body = json.dumps({"user_id":"User", "context":context, "context_utt_label":context_utt_label, "utterance":user_input}) 
    
    response = requests.post(url, data=body, headers=headers, verify=False)
    if response.status_code == 200:
        try:
            print(response.json())
            speak(response.json()['result'])
        except json.decoder.JSONDecodeError:
            print(f'json.decoder.JSONDecodeError occured.\nresponse.text: "{response.text}"')
    else:
        print(f"response.status_code: {response.status_code}\nresponse.text: {response.text}")

요약

- genielabs의 일상대화 api를 이용

- 오류 수정

 

728x90

'프로젝트 > 음성비서' 카테고리의 다른 글

Voice secretary 버전 3.0.1  (0) 2023.11.03
Voice secretary 버전 3.0.0  (2) 2023.11.02
KT GenieLabs api 이용하기  (0) 2023.11.02
Voice secretary 버전 1.5.0  (0) 2023.11.02
Voice secretary 버전 1.0.0  (0) 2023.11.02
'프로젝트/음성비서' 카테고리의 다른 글
  • Voice secretary 버전 3.0.1
  • Voice secretary 버전 3.0.0
  • KT GenieLabs api 이용하기
  • Voice secretary 버전 1.5.0
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    이분탐색
    이코테
    이것이취업을위한코딩테스트다
    파이썬
    dp
    그리디
    DFS
    BFS
    나동빈
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바