νμλ΄μ©
1.
Recording β CSR β chatbot β TTS
a.
μ°μ Recording β CSR β chatbot β TTS κΈ°λ₯μ ꡬνν ν,
μ΄ κΈ°λ₯μ λ°λ³΅ 쑰건μ μ€μ νλ κ²μ ꡬννκΈ°
b.
Eventκ° λ°μνλ©΄, chatbot β TTS κΈ°λ₯μ ꡬννλ κΈ°λ₯μ μΆκ°νκΈ°
β μν μν© μΈμ§νλ©΄, λ°λ‘ chatbotμ΄ νμν λνλ₯Ό μμ±νκΈ° μν¨
2.
Dialogue Manager κ° 1λ² κΈ°λ₯μ κ΄λ¦¬νλλ‘ κ΅¬ννκΈ°
3.
Controller classλ₯Ό μμ±νμ¬ Clientκ° RESTful API μλ²(Flask)λ₯Ό ν΅ν΄ getInfo()μ²λΌ μμ²μ νλ©΄, ν΄λΉ κΈ°λ₯μ΄ μ€νλλλ‘ κ΅¬νν΄μΌ ν¨.
μ°Έκ³
Recording
pip install playsound==1.2.2
pip install speech_recognition
pip install pyaudio
# νμν λΌμ΄λΈλ¬λ¦¬ import
import speech_recognition as sr
from playsound import playsound
import os
# Recognizer κ°μ²΄ μμ±
r = sr.Recognizer()
# λ§μ΄ν¬λ₯Ό μ€λμ€ μμ€λ‘ μ¬μ©
mic = sr.Microphone()
# μ μ₯ν μ€λμ€ νμΌμ μ΄λ¦
folder_name = "./data"
file_name = os.path.join(folder_name, "recorded_audio.wav")
if not os.path.exists(folder_name):
os.makedirs(folder_name)
# μμ± λ
Ήμ ν¨μ
def record_audio():
with mic as source:
print("λ
Ήμ μμ...")
# audio_data = r.listen(source, phrase_time_limit=5)
audio_data = r.listen(source)
print("λ
Ήμ μλ£!")
with open(file_name, "wb") as f:
f.write(audio_data.get_wav_data())
print("λ
Ήμ νμΌμ΄ μ μ₯λμμ΅λλ€.")
# μ€λμ€ νμΌ μ¬μ ν¨μ
def play_audio():
playsound(file_name)
"""
if __name__ == "__main__":
# μμ± λ
Ήμ
audio_data = record_audio()
# μ€λμ€ νμΌλ‘ μ μ₯
with open(file_name, "wb") as f:
f.write(audio_data.get_wav_data())
# μ€λμ€ νμΌ μ¬μ
play_audio()
"""
Python
볡μ¬
CSR(CLOVA Speech Recognition)
import requests
import json
Python
볡μ¬
class ClovaSpeechClient:
# Clova Speech invoke URL
invoke_url = 'https://clovaspeech-gw.ncloud.com/external/v1/8983/54d5b161d3da62f82f3592398295d44524110cfef1b81e5ca3dae43e79f634d0'
secret = 'b256e2de4b3a4898b3f020894236934f'
# μΈλΆ URLμ textλ‘ μ ν
def req_url(self,url, completion, callback=None, userdata =None, forbiddens=None,boostings=None, wordAlignment=True, fullText=True, diarization=None, sed=None ):
request_body = {
'url': url,
'language': 'ko-KR',
'completion': completion,
'callback': callback,
'userdata': userdata,
'wordAlignment': wordAlignment,
'fullText': fullText,
'forbiddens': forbiddens,
'boostings': boostings,
'diarization': diarization,
'sed': sed,
}
headers = {
'Accept': 'application/json;UTF-8',
'Content-Type': 'application/json;UTF-8',
'X-CLOVASPEECH-API-KEY': self.secret
}
return requests.post(headers=headers,
url=self.invoke_url + '/recognizer/url',
data=json.dumps(request_body).encode('UTF-8'))
# ν΄λΌλμΌ μ€ν 리μ§μ μ μ₯λμ΄ μλ νμΌμ textλ‘ μ ν
def req_object_storage(self, data_key, completion, callback=None, userdata=None, forbiddens=None, boostings=None,
wordAlignment=True, fullText=True, diarization=None, sed=None):
request_body = {
'dataKey': data_key,
'language': 'ko-KR',
'completion': completion,
'callback': callback,
'userdata': userdata,
'wordAlignment': wordAlignment,
'fullText': fullText,
'forbiddens': forbiddens,
'boostings': boostings,
'diarization': diarization,
'sed': sed,
}
headers = {
'Accept': 'application/json;UTF-8',
'Content-Type': 'application/json;UTF-8',
'X-CLOVASPEECH-API-KEY': self.secret
}
return requests.post(headers=headers,
url=self.invoke_url + '/recognizer/object-storage',
data=json.dumps(request_body).encode('UTF-8'))
# λ‘컬 μ μ₯μμ μλ νμΌμ textλ‘ μ ν
def req_upload(self, file, completion, callback=None, userdata=None, forbiddens=None, boostings=None,
wordAlignment=True, fullText=True, diarization=None, sed=None):
request_body = {
'language': 'ko-KR',
'completion': completion,
'callback': callback,
'userdata': userdata,
'wordAlignment': wordAlignment,
'fullText': fullText,
'forbiddens': forbiddens,
'boostings': boostings,
'diarization': diarization,
'sed': sed,
}
headers = {
'Accept': 'application/json;UTF-8',
'X-CLOVASPEECH-API-KEY': self.secret
}
print(json.dumps(request_body, ensure_ascii=False).encode('UTF-8'))
files = {
'media': open(file, 'rb'),
'params': (None, json.dumps(request_body, ensure_ascii=False).encode('UTF-8'), 'application/json')
}
response = requests.post(headers=headers, url=self.invoke_url + '/recognizer/upload', files=files)
return response
Python
볡μ¬
if __name__ == '__main__':
# res = ClovaSpeechClient().req_url(url='http://example.com/media.mp3', completion='sync')
# res = ClovaSpeechClient().req_object_storage(data_key='data/media.mp3', completion='sync')
""" fileμ μΈμνκ³ μ νλ νμΌμ κ²½λ‘λ₯Ό μ
λ ₯νκΈ° """
res = ClovaSpeechClient().req_upload(file='./data/recorded_audio.wav, completion='sync')
print(res.text)
Python
볡μ¬
Chatbot (CLOVA Studio API)
Maria DBλ‘ λ³κ²½νκΈ°
import json
import requests
import pandas as pd
import mysql.connector
import time
Python
볡μ¬
class CompletionExecutor:
def __init__(self, host, api_key, api_key_primary_val, request_id):
self._host = host
self._api_key = api_key
self._api_key_primary_val = api_key_primary_val
self._request_id = request_id
# completion_request : {"role" : "user","content" : f"{question}"}
# POST μμ²μ 보λ΄κ³ , μ€μκ°μΌλ‘ μλ΅μ μ²λ¦¬νμ¬ λν λ΄μ©μ μμ±ν¨
def execute(self, completion_request):
headers = {
'X-NCP-CLOVASTUDIO-API-KEY': self._api_key,
'X-NCP-APIGW-API-KEY': self._api_key_primary_val,
'X-NCP-CLOVASTUDIO-REQUEST-ID': self._request_id,
'Content-Type': 'application/json; charset=utf-8',
'Accept': 'text/event-stream'
}
content = ""
with requests.post(self._host + '/testapp/v1/tasks/4ce94y7k/chat-completions', headers=headers, json=completion_request, stream=True) as r:
for line in r.iter_lines():
if line:
decoded_line = line.decode("utf-8")
if decoded_line.startswith("data:"):
json_data = decoded_line[5:] # 'data:' μ΄νμ JSON λ°μ΄ν° μΆμΆ
try:
parsed_data = json.loads(json_data)
if 'message' in parsed_data and 'content' in parsed_data['message']:
if content == parsed_data['message']['content']:
pass
else:
content += parsed_data['message']['content']
except json.JSONDecodeError:
# JSON νμμ΄ λ§μ§ μμ κ²½μ° λ¬΄μ
continue
return content
Python
볡μ¬
def get_user_info(user_id):
connection = mysql.connector.connect(
host = 'localhost',
user = 'hanshin',
password = 'hanshin2024',
database = 'user_data')
cur = connection.cursor()
cur.execute("""
SELECT name, gender, date_of_birth, contact_number, address,
photo, disability_types, disability_grade, special_notes
FROM users
WHERE user_id = %s
""", (user_id,))
user_info = cur.fetchone()
connection.close()
if user_info:
return {
'name': user_info[0],
'gender': user_info[1],
'date_of_birth': user_info[2],
'contact_number': user_info[3],
'address': user_info[4],
'photo': user_info[5], # BLOB νμ
μ΄λ―λ‘ μ μ ν μ²λ¦¬κ° νμν μ μμ
'disability_type': user_info[6],
'disability_grade': user_info[7],
'special_notes': user_info[8]
}
else:
return None
Python
볡μ¬
if __name__ == '__main__':
completion_executor = CompletionExecutor(
host='https://clovastudio.stream.ntruss.com',
api_key='NTA0MjU2MWZlZTcxNDJiY5OgY4I/+eAv267dQbt+9aDUE0J6DJ/sL2uIey9+AkMG',
api_key_primary_val='dn7QeKh9ZQNxR782O4jPEUU02ae6esNz3DhLUsF2',
request_id='fc9998a2-5db4-4661-bbfe-887a78a6be7a'
)
path = r"C:\Users\sook3\OneDrive\λ°ν νλ©΄\something\νμ΅\DEL κ³Όμ \κ΅λ¦½μ¬νμ°κ΅¬μ_2408\chatbot λ§λ€κΈ°\data\datasets.csv"
df = pd.read_csv(path)
questions_lst = df['Text']
# preset_text = [{"role":"system","content":"λΉμ μ μΈμ§μ μ₯μ κ° μλ μ₯μ μΈλ€μ΄ μΌμμνμμ κ²ͺλ μ΄λ €μμ ν΄κ²°ν΄μ£Όλ μ±λ΄μ
λλ€\n λΉμ μ μΈμ§μ μ₯μ κ° μλ μ₯μ μΈλ€μ΄ μΌμμνμμ κ²ͺλ μ΄λ €μμ ν΄κ²°ν΄μ£Όλ μ±λ΄μ
λλ€. \n ### λ΅λ³ μμ± λ°©λ² ### \n - λνμ²΄λ‘ μμ±νλ€.\n - λ΅λ³μ μΈμ§ μ₯μ μΈλ€μ΄ κ²ͺλ μ΄λ €μκ³Ό κ΄λ ¨ μκ² μμ±νλ€.\n - μμ€, μ°¨λ³μ μμ, λΆμ μ ν μΈμ΄λ€μ μ μΈνλ€.\n - ν΄λΉ λ€λ³μ λ°λμ 리μ€νΈλ λ°°μ΄μ μ¬μ©ν μ μλλ‘ λ€μκ³Ό κ°μ νμμΌλ‘ μΆλ ₯νλ€.\n"}]
for idx,question in enumerate(questions_lst):
user_info = get_user_info(user_id = 1)
if not user_info:
print("User info not found for user_id ")
continue
preset_text = [{"role":"system", "content" : f"""λΉμ μ {user_info['name']}λμ λμμ£Όλ μ±λ΄μ
λλ€. {user_info['name']}λμ {user_info['disability_type']}μ κ°μ§κ³ μμ΅λλ€. λ€μ λνμμλ μ΄ μ 보λ₯Ό λ°νμΌλ‘ λννμΈμ.\n
- μ νΈλ: {user_info['preferences']} \n
### λ΅λ³ μμ± λ°©λ² ### \n
- λνμ²΄λ‘ μμ±νλ€.\n
- λ΅λ³μ μ¬μ©μμ disability_typeκ³Ό κ΄λ ¨λ μ΄λ €μμ κ΄λ ¨ μκ² μμ±νλ€.\n
- μμ€, μ°¨λ³μ μμ, λΆμ μ ν μΈμ΄λ€μ μ μΈνλ€.\n
- ν΄λΉ λ΅λ³μ λ°λμ 리μ€νΈλ λ°°μ΄μ μ¬μ©ν μ μλλ‘ μΆλ ₯νλ€.\n
- λ΅λ³μ μ¬μ©μμ μ΄λ¦μ λΆλ¬μ£Όλ μν μ μΆκ°νλ€.\n
- λ΅λ³μ μ¬μ©μμ μ νΈλλ₯Ό λ°μνμ¬ μ μ ν λ΅λ³μ μμ±νλ€."""}
]
preset_text.append({"role" : "user","content" : f"{question}"})
print(preset_text)
request_data = {
'messages': preset_text,
'topP': 0.8,
'topK': 0,
'maxTokens': 256,
'temperature': 0.5,
'repeatPenalty': 5.0,
'stopBefore': [],
'includeAiFilters': True,
'seed': 0
}
content = completion_executor.execute(request_data)
print(f"λ΅λ³ μμ± κ²°κ³Ό: {content}")
print("----------------------------------")
df.loc[idx,'Completion'] = content
time.sleep(1)
del preset_text[-1]
#print(df)
df.to_csv(path, index =False, encoding="utf-8-sig")
Python
볡μ¬
TTS
Dialogue_Manager
import record_play
import CSR
if __name__ == "__main__":
# μμ± λ
Ήμ
audio_data = record_play.record_audio()
# μ€λμ€ νμΌλ‘ μ μ₯
with open(record_play.file_name, "wb") as f:
f.write(audio_data.get_wav_data())
# μ€λμ€ νμΌ μ¬μ
record_play.play_audio()
res = CSR.ClovaSpeechClient().req_upload(file='./data/recorded_audio.wav', completion='sync')
print(res.text)
Python
볡μ¬






