본문 바로가기
AI/AI 부트캠프

[AI 부트캠프] DAY 19 - 파이썬 프로젝트 4

by HOHHOH 2023. 8. 11.

[오늘의 일지]

파이썬 프로젝트 - 새로 추가할 기능들 만들기

오늘 한 작업 - 번역 기능 만들기, 미세먼지 기능 만들기, 끝말잇기 만들기 도전

[상세 내용]

파이썬 프로젝트

번역 기능 완성

- 어제 말했던 기존에 만든 영한, 한영 함수를 사용하면 번역 기능은 편하게 만들 수 있을 거라고 생각하고 시작했는데 여기서도 STT를 접목하는 상황에서 원하는 문장이나 단어의 번역을 하기 위해 입력을 받는 과정에서 오류가 많이 났고 직접 음성을 입력받아서 번역을 하는 것은 힘들다고 판단하여 택스트로 입력을 받는 것으로 완성시켰습니다. 아래 코드를 보면 중간에 '영한'을 입력받는 if문에 '0 1'이 있는 것을 확인할 수 있습니다. 이 부분은 음성인식을 실행하는 과정에서 여러 번 시행착오 끝에 계속해서 '0 1'로 출력이 나왔기 때문에 추가시켰습니다.

import speech_recognition as sr
from tts import speak
from googletrans import Translator


# 인식을 위한 객체 생성
r = sr.Recognizer()
# 마이크 사용을 위한 객체 생성
mic = sr.Microphone()

def trans_ko_en(x):
    translator = Translator()
    return translator.translate(x, src='ko', dest='en').text
def trans_en_ko(x):
    translator = Translator()
    return translator.translate(x, src='en', dest='ko').text

class translator():
    def __init__(self) -> None:
        pass
    def tran_voice(self):
        speak('''
              번역기 기능은 두 가지 선택이 있습니다.
              영한번역기를 선택하려면 영한을 말하면 되고
              한영번역기를 선택하려면 한영을 말하면 됩니다.
              ''')
        while True:
            try:
                with mic as source: 
                    speak('원하는 선택을 말해주세요(영한, 한영)')
                    print('인식 중...')
                    audio = r.listen(source, timeout=2, phrase_time_limit=2) 
                try:
                    trans = r.recognize_google(audio, language = "ko-KR") 
                    print('명령어 인식 완료 : ' + trans) 
                    if trans == '영한' or trans == '0 1':
                        speak('''
                            영한번역기를 선택했습니다.
                            번역을 원하는 단어 또는 문장을 입력해주세요.
                            ''')
                        some = input('번역을 원하는 단어 또는 문장 입력 : ')
                        speak('번역을 시작합니다.')
                        print(f'번역된 내용 : {trans_en_ko(some)}')
                        return speak('번역이 완료되었습니다. 번역기능을 종료합니다.')
                    elif trans == '한영' :
                        speak('''
                            한영번역기를 선택했습니다.
                            번역을 원하는 단어 또는 문장을 입력해주세요.
                            ''')
                        some = input('번역을 원하는 단어 또는 문장 입력 : ')
                        speak('번역을 시작합니다.')
                        print(f'번역된 내용 : {trans_ko_en(some)}')
                        return speak('번역이 완료되었습니다. 번역기능을 종료합니다.')
                    else:
                        speak('잘못된 선택입니다.')
                except sr.UnknownValueError:
                    speak("음성 인식 실패!")
                except sr.RequestError:
                    speak("서버 에러 발생!")
                except sr.WaitTimeoutError:
                    speak("인식 실패!")
                except TypeError:
                    speak("호출 에러 발생!") 
            except sr.exceptions.WaitTimeoutError:
                speak("시간 초과!")

 

미세먼지 기능 만들기

- 미세먼지 기능을 설명드리겠습니다. 미세먼지 기능은 공공데이터포털이라는 국가에서 운영하고 있는 사이트가 있는데 여기에 가입하면 실시간으로 업데이트되는 정보를 공짜로 얻을 수 있는 open API입니다. 사이트에 가입해서 개인 API 키를 만든 후 원하는 정보를 신청하면 받을 수 있는 시스템인데 저는 수업시간에 진행된 과제에서 전국 미세먼지 정보를 받아서 사용했습니다. 이 정보를 이용해서 미세먼지 기능을 만드는 것입니다. 데이터를 크롤링하는 과정은 사이트에서 준 API 키와 url 그리고 파라미터를 이용해서 정보를 json 파일로 받아서 텍스트화해서 리스트로 만들어서 사용하는 것입니다. 여기서 저는 처음에 그냥 지역이름을 음성으로 받았다가 다시 제공된 도시를 찾아서 리스트에 넣고 if문으로 제약을 주는 것으로 마무리했습니다. 출력할 때는 많은 양의 데이터를 음성으로 내보내려고 하니까 딜레이가 생기는 것을 확인했습니다. 딜레이가 생기는 상황은 텍스트를 이용하면 해결됩니다. 공공데이터 포털 링크 납깁니다.

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

- 미세먼지 기능 코드

import speech_recognition as sr
import requests
import json
from tts import speak
from googletrans import Translator
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 인식을 위한 객체 생성
r = sr.Recognizer()
# 마이크 사용을 위한 객체 생성
mic = sr.Microphone()


class airinfo():
	def __init__(self) -> None:
		pass
	def airinfo_voice(self):		
		speak('''
			미세먼지 기능은 다음과 같습니다.
			한국에 있는 원하는 지역을 입력하면 
			그 지역에 있는 모든 측정소에서 
			가장 최근에 측정한 미세먼지 수치와 등급을 출력합니다.
			''')		
		while True:
			sido_all = ['전국', '서울', '부산', '대구', '인천', '광주', '대전', '울산', '경기', '강원', '충북', '충남', '전북', '전남', '경북', '경남', '제주', '세종']
			try:
				with mic as source: 
					speak('원하는 지역를 말해주세요.')
					print('인식 중...')
					audio = r.listen(source, timeout=3, phrase_time_limit=3) 	
				try:
					sidoName = r.recognize_google(audio, language = "ko-KR")	
					print('명령어 인식 완료 : ' + sidoName)
					params = {
						'serviceKey': '주어진 자신의 api 키',
						'returnType': 'json',
						'numOfRows': '100',
						'pageNo': '1',
						'sidoName': sidoName,
						'ver': '1.0',
					}
					response = requests.get('http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty', params=params)
					json_data = json.loads(response.text)
					airinfo_list = json_data['response']['body']['items']
					result_list = []
					for airinfo in airinfo_list:
						result_list.append([airinfo['sidoName'],airinfo['stationName'],' airinfo['pm25Value'], airinfo['pm25Grade']])				
					if sidoName in sido_all:
						print(result_list)
						return speak(f'''
									현재 {sidoName}의 미세먼지 정보 입니다.
									{result_list}
									미세먼지 정보였습니다.
									미세먼지 기능을 종료합니다.
									''')
					else:
						speak('죄송합니다. 잘못된 도시명 입니다.')
						continue

				except sr.UnknownValueError:
					speak("음성 인식 실패!")
				except sr.RequestError:
					speak("서버 에러 발생!")
				except sr.WaitTimeoutError:
					speak("인식 실패!")
				except TypeError:
					speak("호출 에러 발생!")              
				except KeyError:
					speak("죄송합니다. 지역명을 제대로 말해주세요.")
			except sr.exceptions.WaitTimeoutError:
				speak("시간 초과!")

 

끝말잇기 게임 만들기

- 끝말잇기 게임은 우리말샘이라는 국립국어원에서 운영하는 open API를 사용해서 만들 수 있습니다. 저는 데이터를 불러오는 과정에서 json 파일을 인코딩하는 과정에서 계속 에러가 나는 바람에 아직 완성을 못하는 상황입니다. 내일이 마지막인데 꼭 마무리 짓고 싶습니다.

 

[마무리]

 오늘은 여러 가지 기능들을 만드는데 시간을 보냈습니다. 기능들을 만드는 것이 단순하게 코드만 짜면 끝나는 게 아니라 계속해서 실행을 반복하기 때문에 시간이 꽤 많이 걸리는 것을 느꼈습니다. 그리고 한번 에러가 나오면 이것을 어떻게든 검색을 해서라도 해결하려고 했는데 이마저도 검색 정보가 부족하면 해결하지 못한 다는 것을 느꼈습니다. 내일이 프로젝트 제출일인데 아직 끝말잇기 게임을 만들지 못한 게 너무 아쉽게 느껴집니다. 제출 전까지 최선을 다해서 마무리할 수 있도록 노력해 봐야겠습니다.

반응형

댓글