파이썬으로 음성인식 봇 만들기(1)
음성인식(STT)에 필요한 모듈
pip install SpeechRecognition
pip install Pyaudio
1.SpeechRecognition (사용법)(주의사항들)
2.Pyaudio
Pyaudio는 직접적으로 사용하진 않지만
SpeechRecognition의 Microphone 메서드를
사용하기 위해선 Pyaudio를 설치해주셔야 합니다.
Pyaudio를 다운로드하는데 에러가 생긴다면 이 글을 봐주세요
1. STT(Speech To Text)
import speech_recognition as sr
Recognizer = sr.Recognizer() #인스턴스 생성
mic = sr.Microphone()
with mic as source: #안녕~이라고 말하면
audio = Recognizer.listen(source)
try:
data = Recognizer.recognize_google(audio, language="ko")
except:
print("이해하지 못했음")
print(data) #안녕 출력
listen메서드에 timeout , phrase_time_limit
과 같은 인자로 옵션을 넘겨줄 수 있는데
phrase_time_limit=1은 음성을 1초만 듣겠다는 거고
timeout=1은 1초 동안 음성이 들어오지 않으면 에러를 뱉습니다
듣는 시간을 제한할 수 있다는 거죠
근데 전 둘 다 안 쓰는 게 제일 자연스러운 거 같습니다.
2.TTS(Text To Speech)
pip install gTTS
그리고 mp3를 재생하기 위한 모듈이 필요합니다
mp3재생해주는 playsound라는 모듈이 따로 있긴 한데
저는 맥북이라 os.system("afplay./~")를
사용했습니다. 윈도우도 저렇게 mp3를 재생해주는 명령어가 있다면
사용하셔도 상관없습니다.
def speak(text ,lang="ko", speed=False):
tts = gTTS(text=text, lang=lang , slow=speed)
tts.save("./tts.mp3") #tts.mp3로 저장
os.system("afplay " + "./tts.mp3") #말하기
따로 설명할 게 없을 정로도 직관적입니다.
속도랑 언어를 인자로 줄 수 있는데
속도는 그냥 True로 하든 False로 하든
진짜 조금 달라지긴 하지만 느낄 수 있는 정도 고
언어는 text에 맞는 언어를 정해주셔야 합니다.
근데 대부분 한국어를 쓸 거니까 default값을 ko로 정해줬어요
한국어인데 lang을 영어(en)로 해버리면
구글 번역기 영어 칸에 한국어 넣고 말하기 하는 거처럼
알령하셰요 이렇게 들립니다.
목소리는 구글 번역기랑 똑같고요
3. 대답을 해
이제 말하기, 음성인식 둘 다 되니까
봇의 이름을 정하셔야 합니다
저는 Eris(에리스)라고 지었습니다.
제가 어렸을 때 좋아하던 아이언맨 인공지능 비서 이름이 자비스여서
얼추 비슷하게 만들었어요
근데 약간 있을법한 이름이라 검색해보니까 에리스가 그리스 신화에 등장하는
불화의 신이라고 하더라고요 좀 신기했습니다.
1. 에리스 앨리스 엘리스
여러 번 에리스라고 불러봤는데
자꾸 얘가 에리스를 앨리스 엘리스 이렇게 인식을 해서
노트북 앞에 앉아갖고 에리스~에리스 이러고 있다 보니
현타도 오고 그래서 그냥 에리스라고 들어도 대답
앨리스라고 들어도 대답
엘리스라고 들어도 대답하게 했습니다.
인식된 음성에 에리스, 엘리스, 앨리스 이 세 가지 중 하나라도
부분 일치한다면 대답하면 되겠죠
data = "에리스 야"
data in "에리" = True
data in "에릴" = False
in을사 용해서 포함돼있기만 해도 대답하게 하는 이유는
문장에 에리스가 포함되어있다면 무조건 대답하게 할 거기 때문입니다.
"에리스 야 대답해"
"에리스 야"
"에리스 야 말해봐"
이런 것들도 다 대답하게요
이제 대답을 시켜보겠습니다.
from gtts import gTTS
import os
import speech_recognition as sr
def speak(text ,lang="ko", speed=False):
tts = gTTS(text=text, lang=lang , slow=speed)
tts.save("./tts.mp3")
os.system("afplay " + "./tts.mp3")
Recognizer = sr.Recognizer()
mic = sr.Microphone()
while True:
with mic as source:
audio = Recognizer.listen(source)
try:
data = Recognizer.recognize_google(audio ,language="ko")
except:
speak("이해하지 못하는 말이에요")
print(data)
if "에리스" in data or "엘리스" in data or "앨리스" in data:
speak("넹")
print("에리스 : 넹")
else:
speak("다시 불러주세요")
대답 제대로하네요 알고리즘 하다가 이런거하니까 좀 새롭고 재밌는거같아요