시작하기 전
오늘은 버전을 0.5나 올린!!!!!!!!! (사실 내맘대로임) Ver 1.5.0에 대한 리뷰이다~
저번 버전과 동일하게 아래 버전을 누르면, github에서 코드를 볼 수 있다.
다시한번 말하지만, 코드에 대한 아주 자세한 설명이나, 개념에 대한 자세한 설명, 폴더 구조 등은 설명하지 않는다.
본 글들은 그냥 프로젝트 회고 느낌으로 작성하기 때문에 다만 github를 보고 코드에 대해서 물어볼 것이 있거나 추가해
으면 하는 기능, 오류가 있다면 언제든 환영입니다.!!!!!!!!!!!!!!!!!!!!!!
Ver 1.5.0
Ver 1.5.0 특징
- STT 모델 추가 -> ETRI api, Openai Whisper 로컬 설치
- 코드 모듈화
1. STT 모델
저번 Ver 1.0.0에서 말했듯이, 음성 비서에서 중요한 점은 사용자의 음성을 잘 알아듣느냐, 단순 정확도가 아닌 반응속도? 등도 고려하여 잘 알아들어야 유용하게 사용할 수 있을 것이다.
그래서 STT 기능을 구현할 수 있는 여러가지를 알아봤었는데, 최종적으로 이번 모델에 추가한건 ETRI의 api를 이용한 stt와 Openai에서 만든 Whisper모델을 로컬에 설치하여 추가로 넣어봤다.
이것외에도, kt 지니랩스의 E2E STT api, 네이버의 clova speech api, 카카오 클라우드의 speech to Text api, open ai의 whisper api 등 사실 성능이 이미 좋고 한국어에 특화된 api가 많았으나, 유료이거나 사용하기가 복잡하여 추후에 추가하기로 하고 접근성 좋은 (사실 whipser 로컬설치는 설치과정이 있고, 컴이 좋아야하나, 사용해보고싶어서) 모델들을 추가해봤다.
1- 1 ETRI api
우선 stt api들을 찾다가 발견한 ETRI -한국전자통신연구원의 api를 이용해봤다.
아래 링크에서 API Key 발급을 눌러서 간단하게 발급받을 수 있고 사용법 또한 나와있다. 음성인식 API말고도 엄청나게 다양한 API들이 있으니, 나중에 참고하면 좋을 것 같다~ (참고로 일일 제한이 걸려있다.)
아래 리턴제로라는 기업에서 관리하는 github에서 이런 stt모델들의 성능을 비교한 실험이 있어서 잠깐 살펴보니 etri도 준수한 성능을 보이는 것으로 보였다. ( CER? 이라는 지수로 계산했다고 하는데,, 잘 모른다. 그냥 숫자가 낮을수록 좋다고한다.)
아무튼 이런 ETRI API를 이용하기 위해서 STT 모델들을 불러오는 것을 모듈화를 시켜서 만들었다.
(참고로 api key는 코드에 보이는 api_token_list라는 파일에 저장해두고 불러왔다.) 코드는 더보기에~
# ver_1.5.0/stt_module/stt-etri.py
import urllib3
import json
import base64
import json
import speech_recognition as sr
import pyttsx3
# personal function
from api_token_list import etri_accessKey
def speak(text):
engine = pyttsx3.init()
engine.say(text)
engine.runAndWait()
def module2(type):
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("말하세요:")
audio = recognizer.listen(source, timeout=30)
print("음성 녹음이 완료되었습니다.")
with open("tmp.wav", "wb") as f:
f.write(audio.get_wav_data())
file = open("tmp.wav", "rb")
audioContents = base64.b64encode(file.read()).decode("utf8")
file.close()
requestJson = {
"argument": {
"language_code": "korean",
"audio": audioContents
}
}
http = urllib3.PoolManager()
response = http.request(
"POST",
"http://aiopen.etri.re.kr:8000/WiseASR/Recognition",
headers={"Content-Type": "application/json; charset=UTF-8","Authorization": etri_accessKey},
body=json.dumps(requestJson)
)
try:
data = json.loads(response.data.decode("utf-8", errors='ignore'))
text= data['return_object']['recognized']
print(f"인식된 텍스트: {text}")
return text
except:
speak("죄송합니다. 음성을 인식하지 못했습니다.다시 말해주세요")
return module2()
1- 2 Whisper 로컬 설치
다음으로 chatgpt를 만든 회사로 유명한 openai!!!!!의 whisper이라는 모델이다.(이 모델을 내 컴퓨터에서 돌릴 수 있다니 컴퓨터 산 보람이 나는구만.) whisper은 api도 제공하고, local에 직접 설치할 수 있도록 모델도 제공한다.
api는 유료이기때문에 나중에 도입하기로 하고, 우선은 무료인! 로컬에다가 설치해서 사용하였다.
whisper 설치법은 내 블로그에 정리된 글을 참고하길 바란다.
이렇게 whisper을 설치하고 난 후에는 whisper의 경우에는 총 5개의 모델 타입이 있다.
tiny.base.small.mediumlarge 이렇게 5개가 있고 large는 진짜 동영상 하나를 넣었을 때 엄청나게 정확했다.
아무튼 이 whisper도 선택할 수 있게 만들어줬다.
# ver_1.5.0/stt_module/stt_whisper.py
import torch
import whisper
import speech_recognition as sr
import warnings
warnings.filterwarnings("ignore", category=UserWarning, module="torch.functional")
def module3(whisper_type='medium'):
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("말하세요:")
audio = recognizer.listen(source, timeout=30)
print("음성 녹음이 완료되었습니다.")
with open("tmp.wav", "wb") as f:
f.write(audio.get_wav_data())
model = whisper.load_model(whisper_type)
result = model.transcribe("tmp.wav",fp16=False)
text=result["text"]
return text
1- 3 Speech recognition 로컬 설치
speech recognition은 저번이랑 달라진게 없지만 따로 파일을 만들어 모듈화 시켰다.
# ver_1.5.0/stt_module/stt_speech_recognition.py
import speech_recognition as sr
import pyttsx3
context=[]
def speak(text):
engine = pyttsx3.init()
engine.say(text)
engine.runAndWait()
def module1(type):
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("말하세요:")
audio = recognizer.listen(source, timeout=30)
try:
text = recognizer.recognize_google(audio, language="ko-KR") # 한국어 인식
print(f"인식된 텍스트: {text}")
return text
except sr.UnknownValueError:
speak("죄송합니다. 음성을 인식하지 못했습니다.다시 말해주세요")
return module1(type)
except sr.RequestError as e:
speak("죄송합니다. 음성을 인식하지 못했습니다.다시 말해주세요")
return module1(type)
여기까지 이렇게 stt모델을 3개를 이용하여서 사용자가 선택하여 이용할 수 있도록 만들었다.
역시나 아직은 날씨 키워드밖에 안되지만, whipser을 사용할 수 있게되었어서 기쁘다.
글에는 슉슉 진행한 것 같지만, 아무것도 없는 상태에서 이렇게 모듈화도 시키고, whisper도 설치하고 파이토치 이런 버전 맞추느라 고생 참 많이했다. 이제 이걸 기반으로 기능들 좀 추가해가야지. 그리고 내가 진짜 사용한다는 마인드로 편의성도 높이고 있다.(예를 들어 음성을 인식하지 못했으면 인식하지 못했다 알림 이런~~)
메인코드
import speech_recognition as sr # Speech-to-text
import pyttsx3 # Text-to-speech
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keyss
# personal function
from stt_module.stt_speech_recognition import module1
from stt_module.stt_etri import module2
from stt_module.stt_whisper import module3
def speak(text):
engine.say(text)
engine.runAndWait()
def get_weather(user_input):
# 네이버 날씨 웹페이지에서 날씨 정보 가져오기
browser = webdriver.Chrome()
browser.get("https://www.naver.com")
browser.find_element(By.ID, 'query').click() # 해당 id 클릭(검색창)
browser.find_element(By.ID, 'query').send_keys(user_input) # 키보드 입력(날씨)
browser.find_element(By.ID, 'search-btn').click() # 해당 id 클릭(검색창)
try:
weather_data = browser.find_element(By.CLASS_NAME, 'summary_list').text
temp = weather_data.split(" ")[1]
hum = weather_data.split(" ")[3]
wind = weather_data.split(" ")[5]
return (f"기온은 {temp}이며, 습도는 {hum}이고 바람은 {wind} 입니다.")
except:
speak("제가 잘못된 정보를 찾은 것 같습니다. 다시 한번 말씀해주세요.")
user_input = stt_recorder(type)
return speak(get_weather(user_input))
def stt_module(stt_type):
whisper_type=None
if(stt_type==1):recorder=module1
elif(stt_type==2):recorder=module2
elif(stt_type==3):
recorder=module3
print("medium이상을 권장합니다.")
whisper_type=input("SELECT TYPE: tiny / base / small / medium / large: ")
return recorder,whisper_type
stt_type=int(input("1. speech_recognition / 2. etri / 3. whisper 중 선택하세요: "))
stt_recorder, type=stt_module(stt_type)
speak("안녕하세요, 무엇을 도와드릴까요?")
while True:
user_input = stt_recorder(type)
print(user_input)
if "날씨" in user_input:
speak("어느 지역 날씨를 알려드릴까요?")
user_input = stt_recorder(type)
speak(get_weather(user_input))
elif "종료" in user_input:
speak("프로그램을 종료합니다.")
break
speak("계속 진행하시겠습니까?")
요약:
- STT 모델 총 3개로 구성(Speech recognition, ETRI api, Openai Whisper 로컬)
- 코드 모듈화
'프로젝트 > 음성비서' 카테고리의 다른 글
Voice secretary 버전 2.0.0 (0) | 2023.11.02 |
---|---|
KT GenieLabs api 이용하기 (0) | 2023.11.02 |
Voice secretary 버전 1.0.0 (0) | 2023.11.02 |
kakao KoGpt 설치 (0) | 2023.10.26 |
Open ai - Whisper 설치 (0) | 2023.10.26 |