개발

파이썬으로 음성인식 봇 만들기(1)

Zeta050525 2021. 12. 30. 05:54
728x90

음성인식(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("다시 불러주세요")

 

대답 제대로하네요 알고리즘 하다가 이런거하니까 좀 새롭고 재밌는거같아요

 

 

728x90