December 22, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[61호]파파고 API를 이용한 점자 번역기

Cap 2020-10-23 16-55-48-488

2020 ICT 융합 프로젝트 공모전 최우수상

파파고 API를 이용한 점자 번역기

글 | 국민대학교 이동윤

1. 심사평
칩센 점자 변환 장치는 다수 본 경험이 있지만, 이 작품처럼 번역이 가능한 장치는 처음 접하는 듯 합니다. 온전히 새로운 것을 만드는 것도 대단하지만, 작품과 같이 기존의 보유 시스템의 융합을 통해 새로운 것을 내보이는 것 또한 굉장한 것으로 생각합니다. 사용 대상자가 될 시각 장애인이 인지 가능한 단위로 점자판의 요철을 촘촘히 가져간다면 충분히 멋진 제품으로 진행이 가능할 것으로 보입니다.
펌테크 작품의 아이디어와 창의성이 돋보이며 추후 작품 완성도를 높일 경우 실제 시각장애인을 위한 의사소통 장치로도 충분히 활용이 가능할 작품이라고 생각합니다. 작품의 기획의도, 기술 구현도, 완성도 등에서 우수한 작품으로 생각됩니다.
위드로봇 높은 완성도를 보이는 작품입니다. 점자를 표시하는 부분은 실제 시각 장애인이 사용하기에는 부족하지만 별도의 햅틱 장치와 연동이 된다면 더욱 완성도가 올라갈 것으로 보입니다.

2. 작품 개요
2.1. 제작동기
시각장애인이 세상과 소통하면서 가장 의존하고 있는 수단이 점자이다. 그로 인해 많은 책들이 점자책으로 출판되기도 했고 시각장애인을 위해 점자 키보드가 나오기도 하였다.
시각장애인을 위해 점자를 활용한 다양한 제품이 발명되고 출시되고 있지만, 아직 비장애인들과 같은 편리함을 느끼지 못하는 것이 현실이다. 특히 영어 점자와 한글 점자의 체계가 다르기 때문에 영어 점자에 대해 따로 배우지 않는다면 전혀 다른 의미로 해석하는 등 많은 불편함이 존재했다.
그래서 영어 점자로 만들어진 점자를 한글 점자로 바꾸는 프로젝트를 구상하게 되었다.
우리나라의 시각장애인의 수는 2018년 통계청에서 발표한 자료에 따르면 252,957명에 이른다. 하지만 시각장애인에 대한 교육방식은 점자책과 오디오를 통해 이루어지고 있다. 특히 언어교육에서 영어점자와 한글점자의 체계가 다르기 때문에 비장애인과는 다르게 영어점자와 영어를 함께 배워야하는 이중고를 겪어 많은 시각장애인들이 어려움을 겪고 있다.
더욱 심각한 것은 대학이나 대학원 과정의 점자책은 소설이나 교양서적에 비하여 턱없이 부족하다는 것이다. 또한 전공서적을 점자책으로 만들기 위해서는 3~4개월의 시간이 들기 때문에 시각장애인의 향학열을 꺾고 있다.

Cap 2020-10-23 16-56-03-180

이러한 상황에서 비교적 우리나라 보다 점자책의 폭이 넓고 수요가 많은 외국서적을 직접 번역해 주는 점자 번역기는 시각장애인들의 전문지식을 넓히는 데 도움이 될 것이라고 생각한다.
또한 점자 번역기는 학업에만 적용되지 않고 다양한 분야에서 적용될 것으로 보인다.
현재 여행객들을 위한 번역기나 스마트폰 애플리케이션이 많이 개발되고 있다. 반면에 시각장애인들은 소리로 번역된 언어를 듣는 방법 외에는 대안이 없다. 하지만 표지판이나 손잡이 심지어 화장실에도 점자로 표시되어 있어 소리로만 모든 정보를 얻는 데 어려움이 있다. 이러한 상황에서 점자 번역기를 사용한다면 비장애인들의 도움 없이 여행이 가능할 것으로 보인다.

2.2. 관련 특허 분석

Cap 2020-10-23 16-56-09-717

본 발명은 점자를 변환하여 출력하는 장치에 있어서, 사용자의 조작에 의 해 한국어 단어/문장에 해당하는 키 또는 명령을 입력받은 후 한국어 점자 패턴을 생성하는 점자 입력부; 오디오 데이터를 가청음으로 변환하여 출력하는 오디오 출력부; 및 상기 장치의 전반적인 동작을 제어하는 제어 수단으로서, 상기 점자 입력부로부터 상기 한국어 점자 패턴을 입력받아 인식한 후 상기 한국어 특정 단어/문장으로 변환하며, 상기 한국어 특정 단어/문장을 기 설정된 외국어로 번역하여 외국어 단어/문장을 생성하고, 상기 외국어 단어/문장을 외국어 오디오 데이터 변환한 후 상기 오디오 출력부로 출력하도록 제어하는 제어부를 포함하는 것을 특징으로 하는 한글에 대한 점자를 외국어로 번역하여 오디오로 출력하는 장치를 제공한다.

Cap 2020-10-23 16-56-16-429

본 발명은 지능형 점자 번역 장치에 관한 것이다. 보다 상세하게는 시각 및 청각장애인들이 쉽고 편리한 점자문자사용을 할 수 있도록 지능형 점자 번역 장치를 제공하여 점자를 스캔하는 경우, 점자를 인식한 후 점자를 DB에 저장된 점자정보와 매칭하여 음성으로 변환하여 출력함으로써, 시각 및 청각장애인들이 보다 편리하게 점자정보를 읽을 수 있도록 하는 지능형 점자 번역 장치에 관한 것이다.

3. 작품 설명
3.1. 주요 동작 및 특징
· 영문점자를 카메라로 영상을 받아 노트북으로 전송한다.

Cap 2020-10-23 16-56-21-328

· 노트북에서 영상처리를 통해 영문점자를 영문으로 변환한다.
· 파파고 API를 이용해 영문을 한글로 번역한다.
· 한글을 각각의 자모에 맞게 변환을 한다.
· 변환한 데이터를 노트북에서 아두이노로 시리얼통신을 이용해 전송한다.
· 전송받은 데이터를 이용해 아두이노가 서보모터를 제어한다.

영상처리에서의 점자 판독부
· 요철확인 : 점자 명도영상 획득, 잡음제거, 점자판독
· 좌표 가로줄 정렬 : 컨투어, 컨투어 좌표 중심값, 가로줄 정렬 및 기울기 교정
· 점자판별 : 세로줄 정렬 및 근사화, 6점 단위 구성

영상처리 결과

Cap 2020-10-23 16-56-28-445

3.2. 전체 시스템 구성
3.2.1. 제어부
카카오 api를 이용하여 점자를 해석한 후 이를 pc가 시리얼 통신으로 아두이노에 정보를 넘겨준다. 아두이노에서 수신된 값에 해당하는 소모터를 동작시킴으로써 점자를 표기한다.
3d 모델링을 통해 서보모터로 요철을 표현하였다.

Cap 2020-10-23 16-56-33-563

3.2.2. 작품 결과

Cap 2020-10-23 16-56-40-328

3.2.3. 기능 및 제한 사항
· 테블릿의 영문 점자를 한글 점자로 변환하여 물리적으로 표현할 수 있다.
· 한 번에 카메라에 들어오는 영상의 제한이 있기 때문에 문장 단위로 해석이 가능하다.

Cap 2020-10-23 16-56-54-110

3.2.4. 개발환경
· Python , C 언어 사용
· Arduino : 점자 표현
· Visual: 기본적인 영상처리 툴
· PyCham: 파이선 에디터
· pyqt5 desinger: UI 제작 툴
· inventor :3D 모델링
· cura : 3D 모델 출력
· 사용 노트북 사양 : CPU : i5-7200, RAM : 8GB, OS : Windows

4. 단계별 제작과정
4.1. 일자별
2019년 11월 14일 : 영상처리를 이용하여 사회적으로 많은 도움이 될 작품을 구상했다. 영상처리 기술을 사용하여 고가의 점자 번역기를 저렴하게 구현하기로 했다. 파이썬 기반으로 영상처리를 하고 아두이노와 시리얼 통신을 하기로 했다.
2019년 11월 21일 : 조사한 내용을 바탕으로 실제 작품을 구현할 수 있는지 Flow Chart를 만들어 보았다. 파파고 API를 노트북과 연동하였다.
2019년 11월 26일 : 시리얼 통신을 할 때, 아스키코드를 이용하여 상황별 분류를 좀 더 간단히 하였다.
2019년 11월 28일 : 3D 프린터를 이용하여 하드웨어를 제작했다. 하드웨어는 고장 시, 점검에 용의하도록 개패식으로 제작하였다. 수월한 영상처리가 가능하게 하도록 UI에서 ROI가 보이도록 수정했다.
2019년 11월 30일 : 사람이 손으로 점자를 인식하기 좋게 모터 값을 조절했다.
2019년 12월 3일 : 영상처리 시, 점과 점 사이의 간격을 계산하는 기준 값을 조절하여 영어 번역을 할 때 띄어쓰기가 되지 않는 문제를 해결했다. 최적화를 위해 한글 점자에서 사용하지 않는 자음 ‘ㅇ’는 생략하도록 데이터를 처리했다.

4.2. 제작 고려요소 및 변경사항
· 원가 : 기존의 점자 정보 단말기는 450만원을 호가할 정도로 비싸다. 이를 비교적 저렴한 MCU와 모터를 사용하고 영상처리 기술을 이용하여 경제성이 있는 결과물을 향상시켰다.
· 신뢰성 : 점자를 인식하기 쉽게 점자 블록의 튀어나오는 정도를 조절했다. 각 서보모터의 내구도와 성능의 차이가 있었기 때문에 서보모터의 각도를 모터마다 설정해주었다.
· 하드웨어를 만들 때 3D프린터를 사용하여 좀 더 정밀하고 깔끔한 외관을 만들었다.

Cap 2020-10-23 17-04-40-920

· 노트북 전원으로 아두이노와 6개의 서보모터를 동작할 때, 전력이 부족할 것을 우려했지만 동작하는데 무리가 없어 별도의 전원장치는 사용하지 않기로 했다.
· 영어 점자를 해석하는 과정에서 띄어쓰기한 부분이 인식이 잘 되지 않아 띄어쓰기의 여부를 결정하는 기준 값을 조절하여 띄어쓰기 인식률을 높혔다.

Cap 2020-10-23 17-04-50-571

· 알고리즘의 속도를 높이기 위해서 불필요한 형변환 부분을 삭제하였다.

Cap 2020-10-23 17-04-56-553

· 점자에서 자음 ‘ㅇ’은 존재하지 않기 때문에 이를 무시하는 방향으로 알고리즘을 수정했다.

elif(korean_to_be_englished(response_text [cnt:cnt+1]).pop(O).pop(pp)==’o’):
print(‘넘기기’)

5. 기타
5.1. 아두이노 코드
5.1.1. 셋업부

void setup() {
Serial.begin(9600); // 보오레이트를 9600으로 설정한다.

myservo2.attach(2); // 서보ㅅ모터를 동작할 수 있게 설정한다. 2,3,4,5,6,7 같은 방식으로 지정
ser2(1); // 서보모터의 각도를 정해주는 함수이다.
pinMode(8,OUTPUT); // 셋업이 되었으면 8번 핀에 빛을 낸다.
}

5.1.2. 서보모터 각도 설정부

void ser2(int a){
if(a==0)
myservo2.write(100); // low값이 들어오면 서보모터의 각도를 100으로 설정한다.
else
myservo2.write(75); // high값이 들어오면 서보모터의 각도를 75으로 설정한다.
}// 위와 같은 방식으로 나머지 서보모터도 지정

5.1.3. 동작부

void loop() {
if(Serial.available()) // 시리얼 통신의 신호가 들어오면 동작한다.
{
int swt = (int)Serial.read(); // swt 변수에 시리얼 통신으로 수신된 값을 저장한다.
if(swt==97) // 수신된 값이 ‘a’라면 아래와 같이 서보모터를 동작한다.
{

ser2(0);
ser3(1);
ser4(0);
ser5(0);
ser6(0);
ser7(0);
}

// 이후 수신된 값에 따라 서보모터를 동작하게 한다.

}

5.2. Python 코드
5.2.1. 영상처리부

img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) #gray 이미지 변경
ret, img_binary = cv.threshold(img_gray, 127, 255, 0) #이미지 이진화
Contours, hierarchy = cv.findContours(img_binary, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE) #컨투어 찾기
Str=[] Contours.pop()
For cnt in contours:
cv.drawContours(img_color, [cnt], 0, (255, 0, 0), 3) #컨투어 그리기 blue

times=0
STACK=[] #location _stack
x_dot=[] #x _location stack
y_dot=[] #y _location stack
for cnt in contours:

M = cv.moments(cnt) #중심모멘트
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
STACK.append([cx,cy])
x_dot.append(cx) #x 중심 모멘트
y_dot.append(cy) #y 중심 모멘트
cv.circle(img_color, (cx, cy), 10, (0,0,255), -1)
times=times+1

y_max=STACK[len(STACK)-1][1] y_min=STACK[0][1] y_gap=y_max-y_min # 판단을 위한 거리측정
y_avg=int(y_max+y_min)/2
x_dot=list(set(x_dot))
x_dot.sort()
no_need_x=[] change_x=[] x_gap=int(y_gap/2) #x_gap 구함
last_gap=int(y_gap*10/12) #단어 사리 거리 구함

for count in range(0 ,len(x_dot)) : #X 좌표 보정
if x_dot[count]-x_dot[count-1]<x_gap/3 and count>0 : # 차이 얼마 안나는 x값
no_need_x.append(x_dot[count]) # 대체 해 줄 x값 저장
change_x.append(x_dot[count-1])
if count+1<len(x_dot)-2 :
if x_dot[count+1]-x_dot[count-1]<x_gap/3 :
no_need_x.append(x_dot[count+1])
change_x.append(x_dot[count-1])

y_top=[] y_middle=[] y_bottom=[]

for count in range(0 ,times) : #Y 값에 따라 X 좌표 저장
if STACK[count-1][1]<y_avg-y_gap/4: #TOP
if no_need_x.count(STACK[count-1][0])>0:
location=no_need_x.index(STACK[count-1][0])
y_top.append(change_x[location])
if x_dot.count(STACK[count-1][0])>0:
x_dot.remove(STACK[count-1][0])
else :
y_top.append(STACK[count-1][0])
elif STACK[count-1][1]>y_avg+y_gap/4: #BOTTOM
if no_need_x.count(STACK[count-1][0])>0:
location=no_need_x.index(STACK[count-1][0])
y_bottom.append(change_x[location])
if x_dot.count(STACK[count-1][0])>0:
x_dot.remove(STACK[count-1][0])
else :
y_bottom.append(STACK[count-1][0])
else :
if no_need_x.count(STACK[count-1][0])>0: #MIDDLE
location=no_need_x.index(STACK[count-1][0])
y_middle.append(change_x[location])
if x_dot.count(STACK[count-1][0])>0:
x_dot.remove(STACK[count-1][0])
else :
y_middle.append(STACK[count-1][0])

for count in range(1 ,len(x_dot)) : # X값들 사이의 거리를
if x_dot[count-1]<x_gap: #단어 시작점 구함 first_line.append(x_dot[count-1])
cv.rectangle(img_color,(int(x_dot[count-1]),int(y_min)),(int(x_dot[count-1]+x_gap),int(y_max)),(255,0,0),1)
elif x_dot[count]-x_dot[count-1]<(last_gap+x_gap)/2:
first_line.append(x_dot[count-1])
cv.rectangle(img_color,(int(x_dot[count-1]),int(y_min)),(int(x_dot[count]),y_max),(255,0,0),1)
elif x_dot[count]-x_dot[count-1]<last_gap+(x_gap)/2:
first_line.append(x_dot[count])
cv.rectangle(img_color,(int(x_dot[count]),int(y_min)),(int(x_dot[count]+x_gap),int(y_max)),(255,0,0),1)
cv.rectangle(img_color,(int(x_dot[count-1]-x_gap),int(y_min)),(int(x_dot[count-1]),int(y_max)),(255,0,0),1)
elif (first_line.count(x_dot[count-1])>0) and (x_dot[count]-x_dot[count-1] <last_gap+3*(x_gap)/2):
first_line.append(x_dot[count])
cv.rectangle(img_color,(int(x_dot[count]),int(y_min)),(int(x_dot[count]+x_gap),int(y_max)),(255,0,0),1)

first_line=list(set(first_line))
first_line.sort()

second_line=set(x_dot)-set(first_line) #시작 줄 아니면 2번째 줄
second_line=list(second_line)
second_line.sort()

for count in range(0 ,len(first_line)) :
if count==0 :
if(first_line[count+1]>second_line[index_second]):
number=int(y_top.count(first_line[count]))*100000+int(y_top.count(second_line[index_second]))
*10000+int(y_middle.count(first_line[count]))*1000+int(y_middle.count(second_line[index_second]))
*100+int(y_bottom.count(first_line[count]))*10+int(y_bottom.count(second_line[index_second]))
dot_num.append(number)
index_second+=1
else :
number=int(y_top.count(first_line[count]))*100000+int(y_middle.count(first_line[count]))
*1000+int(y_bottom.count(first_line[count]))*10
dot_num.append(number)
elif( count< len(first_line)-1):
if (first_line[count]-first_line[count-1]>+x_gap*2+last_gap*2) :
dot_num.append(-1)
if(first_line[count+1]>second_line[index_second]):
number=int(y_top.count(first_line[count]))*100000+int(y_top.count(second_line[index_second]))
*10000+
int(y_middle.count(first_line[count]))*1000+int(y_middle.count(second_line[index_second]))
*100+int(y_bottom.count(first_line[count]))*10+int(y_bottom.count(second_line[index_second]))
dot_num.append(number)
index_second+=1
else :
number=int(y_top.count(first_line[count]))*100000+int(y_middle.count(first_line[count]))
*1000+int(y_bottom.count(first_line[count]))*10
dot_num.append(number)
else :
last_in=x_dot.pop()
if(last_in==first_line[count]) :
number=int(y_top.count(first_line[count]))*100000+int(y_middle.count(first_line[count]))
*1000+int(y_bottom.count(first_line[count]))*10
dot_num.append(number)
else :
number=int(y_top.count(first_line[count]))*100000+int(y_top.count(second_line[index_second]))
*10000+int(y_middle.count(first_line[count]))*1000+int(y_middle.count(second_line[index_second]))
*100+int(y_bottom.count(first_line[count]))*10+int(y_bottom.count(second_line[index_second]))
dot_num.append(number)
index_second+=1
Alpa=[100000,101000,110000,110100,100100,111000,11100,101100,11000,11100,100010,101010,110010,110110,
100110,111010,111110,101110,11010,11110,100011,101011,11101,110011,110111,100111] sen_str=[] for count_dot_num in range(0,len(dot_num)):
for count_alpa in range(0 ,len(Alpa)) :
if dot_num[count_dot_num]==Alpa[count_alpa]:
dot_num[count_dot_num]=Alpa.index(Alpa[count_alpa])
if(dot_num[count_dot_num]==-1) :
sen_str.append(‘ ‘)
elif(dot_num[count_dot_num]==0) :
sen_str.append(‘a’)
elif(dot_num[count_dot_num]==1) :
sen_str.append(‘b’)
elif(dot_num[count_dot_num]==2) :
sen_str.append(‘c’)
elif(dot_num[count_dot_num]==3) :
sen_str.append(‘d’)

5.3. 동작부

/* 초성,중성,종성의 리스트를 만들어준다. */
CHOSUNG_LIST = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'] JUNGSUNG_LIST = ['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'] JONGSUNG_LIST = [' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']

def korean_to_be_englished(korean_word): // 번역함수입니다.
r_lst = [] for w in list(korean_word.strip()):
## 영어인 경우 구분해서 작성함.
if ‘가’<=w<=’힣’:
## 588개 마다 초성이 바뀜.
ch1 = (ord(w) – ord(‘가’))//588
## 중성은 총 28가지 종류
ch2 = ((ord(w) – ord(‘가’)) – (588*ch1)) // 28
ch3 = (ord(w) – ord(‘가’)) – (588*ch1) – 28*ch2
r_lst.append([CHOSUNG_LIST[ch1], JUNGSUNG_LIST[ch2], JONGSUNG_LIST[ch3]])
else:
r_lst.append([w])
return r_lst

PORT = ‘COM6′ // 포트를 설정해줍니다.
BaudRate = 9600 // 보오레이트를 9600으로 설정합니다.
ARD= serial.Serial(PORT,BaudRate) // ARD를 시리얼통신 변수로 설정한다.
client_id = “P6ynPpUq#######” // NAVER API의 ID를 입력해준다.
client_secret = “g##########0″ // NAVER API의 PassWard를 입력해준다.

/* Naver API로 영어 문자를 전송하고 변역한다. */
encText = urllib.parse.quote(str_alpa)
data = “source=en&target=ko&text=” + encText
url = “https://openapi.naver.com/v1/papago/n2mt”
request = urllib.request.Request(url)
request.add_header(“X-Naver-Client-Id”,client_id) request.add_header(“X-Naver-Client-Secret”,client_secret)
response = urllib.request.urlopen(request, data=data.encode(“utf-8″))
rescode = response.getcode()

/* 번역된 수신값에 필요한 값만 뽑아낸다. */
if(rescode==200):
response_body = response.read()
response_text = response_body.decode(‘utf-8′)
response_text = json.loads(response_text)
response_text = response_text['message']['result']['translatedText'] print(response_text)
t = 0
cnt = 0
pp = 0
send = ‘a’
while(t == 0):
pp = 0
tim = 2
/* 번역된 값이 필요없는 값이면 넘겨준다 */
if(response_text[cnt:cnt+1]==’ ‘):
print(‘넘기기’)
elif(response_text[cnt:cnt+1]==’,'):
print(‘넘기기’)
elif(response_text[cnt:cnt+1]==’.'):
print(‘끝’)
t=1
elif(response_text[cnt:cnt+1]==’!'):
print(‘끝’)
t=1
else:
/* 이후 뽑아진 초성 값에 따라 정해진 알파벳을 전송한다. */
if(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(0)==’ ‘):
pp+=1
print(‘넘기기’)

elif(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(0)==”):
pp+=1
print(‘넘기기’)
elif(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp)==’ㅇ’):
pp+=1
print(‘넘기기’)

else:
print(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp))

if(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp)==’ㄱ’):
send = ‘a’
pp+=1

time.sleep(2) // 2초의 delay를 넣는다.
Trans = send
#Trans = str(Trans)
Trans = Trans.encode(‘utf-8′)
ARD.write(Trans) // utf-8로 인코딩하여 전송한다.
/* 이후 뽑아진 종성 값에 따라 정해진 알파벳을 전송한다. */ if(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp)==”):
pp+=1
print(‘넘기기’)
else:
print(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp))

time.sleep(2)
Trans = send
#Trans = str(Trans)
Trans = Trans.encode(‘utf-8′)
ARD.write(Trans)
/* 이후 뽑아진 종성 값에 따라 정해진 알파벳을 전송한다. */
if(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp)==”):
pp+=1

else:
print(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp))
if(korean_to_be_englished(response_text[cnt:cnt+1]).pop(0).pop(pp)==’ㄱ’):
send = ‘o’
#pp+=1

time.sleep(tim)
Trans = send
#Trans = str(Trans)
Trans = Trans.encode(‘utf-8′)
ARD.write(Trans)

cnt+=1

else:
print(“Error Code:” + rescode)

Leave A Comment

*