시작하기 전
오늘은 파이썬을 이용한 음성비서 프로젝트를 해보고자 하였다.
패스트캠퍼스 부트캠프를 수강하면서 프로젝트를 해보라고해서 시작하게 되었는데, 어느정도까지 만들어야하는지 혹은 어떤 기능이 들어가야하는지에 대한 설명이 없었어서, 내가 기획하여 진행했다.
내가 원하는 건 진정한 음성비서였는데, 프로젝트를 시작하기 전 대략적으로 음성비서에 대해서 찾아보니 대부분 어떤 특정 키워드를 말하면 그거에 대한 반응이 오도록 구현 하였다. (예를 들어, 날씨 라고 말하면 날씨를 알려주던지, 주식 이라고 말하면 정해진 주가를 알려주던지 등) 그러나 나는 음성 "비서"이기 때문에 뭔가 대화를 해보고 싶었다.(당연히 이렇게 짧게해서 될 건아니지만..) 아무튼 이런 마음을 가지고 시작하게 되었다.
대략 6일간의 기간이 주어진 프로젝트여서 버전을 나누어, 특별한 기능이 추가될 때마다 버전 숫자를 올렸다(멋있어 보이잖아)
-- 대략적인 프로젝트 과정이랑 개념들만 설명할 것이다~ 나중에 보고 그냥 아 이랬었지 기억날 정도 혹은 누군가 참고할 정도로. 풀 코드는 Github에 버전별로 올려놓을 예정이다.
Ver 1.0.0
Ver 1.0.0 특징
- speech recognition을 이용한 STT (speech-to-text)
- pyttsx3를 이용한 TTS (text-to-speech)
- '날씨'키워드 입력시 날씨 크롤링
우선 음성비서의 핵심인 기능 stt와 tts 부터 알아보자.
1. STT 모델
STT 란, speech to text의 약자로 사용자의 음성 데이터를 입력받아 해당 음성을 텍스트로 변환하는 기능을 말한다.
이러한 STT를 파이썬에서 이용하는 방법은 여러가지가 있었는데, 앞으로 사용하게 될 STT에 대해서 간략하게 나열해보자면,
1. Speech Recognotion 라이브러리
사실 별도의 stt api를 이용하거나, 딥러닝 모델들을 직접 로컬에서 사용하지 않고 가장 쉽게 STT를 해볼 수 있는 라이브러리이다.
위의 링크에서 확인해볼 수 있겠지만, 다양한 API를 지원한다.
그러나, 사전 설치나 API 발급이 필요하고 위에 적힌 지원 목록중 유일하게 Google Speech Recognition만 기본적으로 사용가능하다.(나머지는 로컬에 모델 설치 혹은 api 발급 -유료도포함)
우선 나는 Ver 1.0.0에서는 손쉽게 할 수 있는 Google Speech Recognition만 사용하고자 했다.
(->다른버전들은 추후 틀이 잡히고 마지막에 추가할 예정)
import speech_recognition as sr
def recognize_speech():
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 ""
except sr.RequestError as e:
speak("죄송합니다. 음성을 인식하지 못했습니다.다시 말해주세요")
return "
2. TTS 모델
STT가 사용자의 음성을 텍스트로 반환하는 것이었다면, TTS는 텍스트를 음성으로 반환해준다.
파이썬에서 TTS를 사용하기 위해서 이번에도 가장 손쉽게 사용할 수 있는 라이브러리를 선택했다.
오프라인에서도 동작하는 라이브러리라고 하고, 세밀한 설정들도 할 수 있다.
import pyttsx3
def speak(text):
engine.say(text)
engine.runAndWait()
우선 내가 여기까지 알아보고 생각한 것이, 음성비서의 핵심이 될 이 STT와 TTS중, 사실 TTS는 목소리 변경이라는 옵션만 중요할 뿐 텍스트를 음성으로 바꾸는 것은 어렵지 않을 것 같았다. 다만 사용자의 음성을 텍스트로 변환하는 STT가 성능이 중요할 것 같았다.(사용자가 말하는 것을 제대로 알아들어야 이후 뭐라든 하기 때문에) 그래서 STT를 여러개를 써보고, 잘 맞는 STT를 써보자. 라고 생각했다. 분명 성능 지표들로 이미 어떤 것들이 성능이 좋다 이런게 정해져있겠지만, 우리가 뭐 동영상 번역이나 이런 완벽한 음성을 인식하기보다는 비서를 할 정도의 말만 인식하면 되고, 반응속도도 중요하기 때문에 직접 사용해보고자 하였다. (우선 Ver 1.00 에서는 speech recognition 라이브러리의 Google Speech만 이용했다. )
3. 날씨 안내
다음으로 일반대화는 우선 어려울 것 같아서 제쳐두고, 날씨 기능(뭐 이건 siri, 빅스비,gini 에 다있음)은 필수 일 것 같았다.
어떻게 날씨를 인식하지...했는데, 사실 진짜 대화가 가능한 것도 아니고....단순하게 나도 "날씨"라는 단어가 있으면 크롤링을 진행하여 날씨를 받아왔다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
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 클릭(검색창)
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} 입니다.")
다만 여기에는 이제 논리적 문제점들이 있었다.
1. "날씨"가 들어가면 날씨를 묻는게 아니어도 크롤링을 시도한다.
-> 내가 오늘은 날씨가 참 좋아~ 라고 말해도 이걸 네이버에 검색하여 태그를 통해 크롤링하려니 오류가 발생했다.
2. 다른 지역의 날씨 혹은 날씨를 물을 때 단순하게 "어디어디 날씨 알려줘" 이정도는 네이버에 이렇게 쳐도 날씨에 대한 정보가 나오는데, 말이 길어지면 "어디어디 날씨가 알고싶은데 알려주라" 이런걸 검색창에 검색하면 다른 링크들이 나와 오류가 난다.
이러한 문제점들은 추후에 해결하고자 하였다.
메인코드
speak("안녕하세요, 무엇을 도와드릴까요?")
while True:
user_input = recognize_speech()
if "날씨" in user_input:
speak("어느 지역 날씨를 알려드릴까요?")
user_input = recognize_speech()
speak(get_weather(user_input))
elif "종료" in user_input:
speak("프로그램을 종료합니다.")
break
요약:
- speech recognition 라이브러리의 google speech를 이용한 STT
- pyttsx3를 이용한 TTS
- '날씨' 키워드로 네이버 크롤링
'프로젝트 > 음성비서' 카테고리의 다른 글
Voice secretary 버전 2.0.0 (0) | 2023.11.02 |
---|---|
KT GenieLabs api 이용하기 (0) | 2023.11.02 |
Voice secretary 버전 1.5.0 (0) | 2023.11.02 |
kakao KoGpt 설치 (0) | 2023.10.26 |
Open ai - Whisper 설치 (0) | 2023.10.26 |