시작하기 전
이번에도 버전을 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키를 발급받길 바란다.(사용하고 싶다면..)
우선 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를 이용
- 오류 수정
'프로젝트 > 음성비서' 카테고리의 다른 글
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 |