[1]
https://chlduswns99.tistory.com/40
[2]
https://chlduswns99.tistory.com/41
[3]
https://chlduswns99.tistory.com/42
3편에 이어서 STT, TTS 기능에 Llama2를 연동하여 언어모델의 응답을 보이스로 출력하는걸 구현해보겠습니다.
3편에 적어 놓았듯이 아래와 같은 순서를 거치게 될 것입니다.
음성 입력 -> 텍스트 출력 -> 텍스트를 llama2한테 입력 -> llama2 응답 출력 -> 텍스트를 tts에 입력 -> 음성으로 출력
Llama2를 코드상으로 불러와서 이용하는 방법은 여러가지입니다. 하지만 저는 노트북 CPU에서 진행하기 때문에 어느정도 언어모델의 크기와 속도 등 많은 부분에서 타협을 해야합니다. 제가 이용한 방법은 이렇습니다.
- 양자화된 Llama2 GGUF 형식의 파일을 이용한다. (참고: https://velog.io/@ttogle918/Quantization-%EC%96%91%EC%9E%90%ED%99%94)
- ollama를 이용해 언어모델을 로컬에 설치한다.
- 이를 코드에서 불러와 사용한다.
말이 쉽지 이 부분에서 굉장히 어려움을 겪었습니다. 일단 단계별로 진행해보면서 제가 겪은 어려움을 적어나가 보겠습니다.
HuggingFace에서 적절한 Llama2 언어모델 찾기
- 1편에서 나와있듯 이 프로젝트의 목적은 무인상점에서 Llama 언어모델을 사용하는 것입니다.
- 예를 들어 "막대 아이스크림 얼마에요?" 고객이 물어보면 언어모델을 거쳐 "기본 막대 아이스크림은 600원입니다. " 와 같은 응답이 출력되어야 하겠죠.
- 언어모델을 커스텀 해야겠지만 이는 잠시 뒤로하고 기능 구현에 집중하기 위해 미리 한국어로 파인튜닝된 언어모델을 사용하겠습니다.
허깅페이스에서 양자화된 gguf 파일의 형식을 Llama 언어 모델을 먼저 찾으시면 됩니다. 제가 이용한 모델은 4bit 양자화된 모델을 사용했습니다. 같은 모델을 사용하시려면 아래 링크로 접근하시면 됩니다.
https://drive.google.com/drive/folders/1-bJqCfwYNZeyvp0zqWjwe9yzfZLc-LUI?usp=sharing
CMD 상에서 언어 모델 설치
먼저 Modelfile을 작성해주어야 합니다. 응답을 어떤 식으로 출력할 것인지 템플릿?을 지정해놓는다고 생각하시면 됩니다. Modelfile의 작성 형식은 여러가지이고 모델 파일에 따라 다릅니다. 아래 링크에서 보고 작성하면 되고 작성이 어렵다면 그냥 위 공유 드라이브의 Modelfile 형식을 먼저 이용해보시고 차차 더 나은 응답을 위해 수정하시면 될 것 같습니다.
https://github.com/ollama/ollama/blob/main/docs/modelfile.md
먼저 Modelfile을 작성해보겠습니다. 언어모델 파일과 같은 경로에 따로 확장자 없이 만들어주시면 되고 오른쪽 클릭해서 '메모장으로 편집' 클릭하셔서 편집하시면 됩니다.
위와 같은 경로로 구성해주시면 됩니다.
다음은 Ollama를 통해서 로컬에 언어모델을 설치해보겠습니다. Ollama 설치에 대해서는 맨 위에 [1]편을 참고하시면 됩니다.
1. 먼저 cmd를 열고 언어모델 경로로 이동해줍니다. (cd '언어모델 파일 경로')
2. ollama create (이름지정) -f Modelfile
- (이름지정) 부분은 원하는 이름으로 마음대로 하시면 됩니다.
- 이제 로컬에 커스텀 언어모델을 설치해보겠습니다.
- 조금 기다려주시고 success가 나온다면 완료된 것입니다.
- 전 그냥 테스트를 위해 zzz로 이름을 지정했습니다.
3. cmd 상에서 먼저 실행해보자.
- ollama run (모델이름)
- 저는 안녕이라고 해보았는데 한글로 잘 응답을 하네요.
- 그럼 이걸 파이썬에서 실행이 되어야 하겠죠?
파이썬 코드로 언어 모델 사용하기
- ollama 라이브러리를 이용하겠습니다.
- chat 메서드를 이용하면 간단하게 구현이 가능합니다.
import ollama
def chat_with_model(message):
response = ollama.chat(model='test_model5', messages=[
{
'role': 'user',
'content': message,
},
])
return response['message']['content']
q = '안녕 라마야'
response_content = chat_with_model(q)
print(response_content)
- 코드를 실행하면 아래처럼 결과가 출력됩니다.
- 그냥 아무 모델이나 가져왔기에 결과가 완벽하진 않습니다..
STT, TTS 기능과 연동
- [3]편에서 구현했던 STT, TTS 기능을 이제 연동해보겠습니다.
- 실행 할때마다 모델을 다시 로드하면 너무 오래걸리니 q를 누르면 계속되게 간단하게 작성했습니다.
- 알아두셔야 할 점은 cmd상에서 llama가 꼭 실행중이어야 합니다!
import speech_recognition as sr
import pyttsx3
import ollama
def speechToText():
global q
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("Say something!")
audio = recognizer.listen(source, timeout=5, phrase_time_limit=10)
q = recognizer.recognize_google(audio, language='ko-KR')
print("You said: " + q)
def textToAudio(text):
engine = pyttsx3.init()
# 한국어로 pytts 설정
voices = engine.getProperty('voices')
for voice in voices:
if 'korean' in voice.name.lower() or 'ko_' in voice.id:
engine.setProperty('voice', voice.id)
break
engine.say(text)
engine.runAndWait()
# 모델 로드 (한 번만 실행하게)
def chat_with_model(message):
response = ollama.chat(model='test_model5', messages=[
{
'role': 'user',
'content': message,
},
])
return response['message']['content']
while True:
# 음성 인식 시작
speechToText()
# 모델과 대화
response_content = chat_with_model(q)
print(response_content)
# 텍스트를 음성으로 변환
textToAudio(response_content)
# 계속할지 물어보기
print('계속하려면 n, 종료하려면 q를 입력하세요.')
tmp = input().strip().lower()
if tmp == 'q':
break
- 그럼 아래와 같은 결과물이 나옵니다. 적절한 언어모델은 아니지만 카드로 결제한다는 질문을 던져보았습니다.
STT, TTS 기능을 탑재한 언어모델 기능을 모두 구현했습니다.
다음은 이걸 앱에서 구현할 수 있게 만들고 챗지피티와 같이 사용할 수 있게 만들어 보겠습니다.
제가 작성한 코드 및 기능들은 절대 정답이 아님을 다시 알려드립니다ㅠㅠ 포스팅하기도 부끄러울 정도의 수준이지만 기록을 위해 남깁니다..!
'프로젝트' 카테고리의 다른 글
Llama3 한국어 파인튜닝(FIne-Tuning) - 2024 ICT 한이음 멘토링[5] (0) | 2024.08.06 |
---|---|
2024 ICT 한이음 멘토링[3] - STT,TTS 기능 구현 (온디바이스 보이스챗봇) (0) | 2024.06.25 |
2024 ICT 한이음 멘토링[2] - 한이음 장비 신청, Ollama 설치 (온디바이스 보이스챗봇) (0) | 2024.04.11 |
2024 ICT 한이음 멘토링[1] - 프로젝트 선정 및 지원 (온디바이스 보이스챗봇) (0) | 2024.02.29 |