■ 제 목 : Naver 오픈api-android-tran-20160529
■ 주제 : 네이버 오픈API를 활용한 안드로이드 통역앱 만들기
■ 내용 :
- 통역앱 개발을 위한 네이버 오픈API 소개
- 통역앱 안드로이드 화면 구성
- 안드로이드앱에서 각 API 호출 및 처리
- 통역앱 작동을 위한 애플리케이션 처리 노하우
■ 난이도 수준: 초급
■ 발표자 소개: 옥상훈 강사
- 現 표준프레임워크 오픈커뮤니티 에반젤리스트
- 現 네이버 랩스 D2에반젤리스트
- 現 네이버 개발자센터 & 오픈 API 담당
- 前 한국Adobe 시스템즈 컨설턴트
- 前 한국 자바 개발자협의회 회장
■ 일시: 2016. 5. 31(화) 19:00~21:00(120분)
■ 장소: 디캠프 6층 다목적홀 (선정릉역 위치)
7. 새로운API추가(beta)
[음성합성]
텍스트를 아나운서 음성으로들
으실수있습니다. 현재4개언어
(한국어,영어,일본어,중국어)를
지원합니다.
[음성인식]
음성 데이터를 텍스트로 변
환해 줍니다. 현재 2개 언어
(한국어, 영어)를 지원합니
다.
[기계번역]
영어<->한국어, 중국어<->
한국어, 일본어<->한국어 번
역을 지원합니다.
[캡차]
자동 입력 방지를 위해 보안
문자가 포함된 이미지를 전
송하고 입력 값을 검증합니
다.
8. 개발자의상식이통하는API
( * 일부 API 들은 추후 개선 예정입니다. )
RESTful 하게동작
JSON으로결과리턴
ErrorCode는httpstatus코드에맞게
if (errorCode == 200) {
// success
} else if (errorCode >= 400) {
// error
}
{"message":{"@type":"response","@service":"naverservice.labs.api","@v
ersion":"1.0.0","result":{"translatedText":"I love you."}}}
https://openapi.naver.com/v1/language/translate
9. (기존) 14개의 사항 입력 (변경) 4개의 필수 사항 입력
제휴신청간소화
기존에 제휴 신청을 하려면 회사명부터 담당자 연락처 까지 14개의 항목을 입력해야 했지만, API 사용 목적과 예상
사용량, 활용화면만 올려 주시면 됩니다. 또한 제휴 진행 상황을 확인하는 화면도 함께 추가하였습니다.
[기존] [변경]
10. (기존) 각 API 별로 API키를 발급 받아 사용 (변경) API 이용신청 또는 애플리케이션 등록 후
API 권한 설정화면에서 사용할 API 체크
API키대신API이용신청
기존에는 각 API별로 API 키를 발급받아 사용하였지만, 이제는 API 이용 신청 또는 애플리케이션을 등록한 다음, API 권
한 설정화면에서 사용하려는 API를 체크해 주시면 됩니다. API를 호출할 때는 API 키 대신 애플리케이션 등록 시 발급 받
은 클라이언트아이디와 시크릿 값을 HTTP헤더에 전송하는 것으로 변경되었습니다.
[기존] [변경]
11. API호출방법
[비로그인 오픈API] [로그인오픈API]
• 방법
– REST API 호출
– HTTP 헤더에 클라이언트 아이디와
시크릿값 포함해서 호출
• 대상
– 지도, 검색, 좌표변환, 단축 URL
– 음성인식, 기계번역, 음성합성, 캡차
• 주의 사항
– 클라이언트 아이디와 시크릿은 반드시
헤더값에 포함해야 함
– http method 일치 여부 확인 (예: 검색
은 GET, 기계번역은 POST)
– 텍스트는 대부분 UTF-8로 인코딩 필요
(예: 검색 쿼리, 기계번역 텍스트 값)
• 방법
– REST API 호출
– 로그인 인증 후 발급 받은 접근 토큰
값을 Authorization 헤더에 포함해서
호출
• 대상
– 회원 프로필 조회, 블로그 글쓰기, 카페
가입 및 글쓰기, 캘린더 일정 담기
• 주의 사항
– 단체아이디는 네이버 로그인이 지원되
지 않으므로 개인아이디로 호출해야함
– 카페 글쓰기 API에서 텍스트는 UTF-8
-> MS949로 이중 인코딩을 해야 한글
이 깨지지 않음
25. <uses-permission android:name="android.permission.INTERNET" />
<!-- 오픈API 호출 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 음성인식을 위한 녹음 입력값 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
<!-- 음성 파일 저장 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
/>
<!-- 음성합성 파일 재생-->
권한 설정
30. 음성인식 클라이언트 주요 클래스
• MainActivity extends Activity
– onCreate : 음성인식 서버 연결(NaverRecognizer는 쓰레드로 작동하며, 여기에 대한 핸들러 선언 )
– onResume: 음성인식 서버 다시 연결 naverRecognizer.getSpeechRecognizer().initialize();
– onPause: 음성인식 서버 접속 종료 naverRecognizer.getSpeechRecognizer().release();
– handleMessage: 음성인식 서버 이벤트에 따른 처리
• NaverRecognizer implements SpeechRecognitionListener
– 개발자센터에서 발급받은 클라이언트 아이디값을 이용해 음성인식 서버에 소켓 연결
– 네이버 음성인식 SDK의 SpeechRecognitionListener 인터페이스를 구현한 클래스
– 인터페이스의 필수 구현 함수들은 서버 동작에 따라 호출
• utils.AudioWriterPCM
– 지정된 경로에 음성 녹음 파일을 생성, 저장하는 util 클래스
– 음성 녹음 파일은 음성인식 서버 소켓으로 전송하기 위한 용도
39. 기계번역 API 호출은 Thread에서
• Thread를 생성해서 API를 호출
– API 호출 처리를 하는 동안에도 UI는 조작 가능
– Thread에서 호출한 결과값을 화면으로 업데이트 하려면 runOnUiThread() 이용
new Thread(new Runnable() {
@Override
public void run() {
//TO-DO 기계번역 API 호출
runOnUiThread(new Runnable() {
@Override
public void run() {
//TO-DO UI업데이트
}
});
}
}).start();
40. 기계번역 API – Request전송
private static final String CLIENT_ID = "개발자센터-내애플리케이션-클라이언트아이디";
private static final String CLIENT_SECRET = "개발자센터-내애플리케이션-클라이언트시크릿";
private String callTranslateAPI(String src) {
String result = null;
try {
String param = "source=ko&target=en&text=" + URLEncoder.encode(src, "UTF-8");
URL url = new URL("https://openapi.naver.com/v1/language/translate");
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("X-Naver-Client-Id", CLIENT_ID);
con.setRequestProperty("X-Naver-Client-Secret", CLIENT_SECRET);
con.setDoOutput(true);
con.setDoInput(true);
// API 호출
OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
wr.write(param);
wr.flush();
//TO-DO API 서버 응답 처리 구현 필요
con.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
41. 기계번역 API - Response처리
String trsData = "";
int responseCode = con.getResponseCode();
if(responseCode==200) {
InputStream is = con.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = "";
trsData = "";
while ((line = br.readLine()) != null) {
trsData += line;
}
br.close();
is.close();
result = trsData;
} else {
Log.d("callTranslateAPI", "###### responseCode:" + responseCode);
}
42. 기계번역 API – JSON파싱
JSONObject json = new JSONObject(trsData);
try {
JSONObject json1 = json.getJSONObject("message");
JSONObject json2 = json1.getJSONObject("result");
result = json2.getString("translatedText");
} catch (Exception e) {
e.printStackTrace();
}
44. 기계번역 API 메소드 –호출은 음성인식 완료 시점
case R.id.finalResult:
// Extract obj property typed with String array.
// The first element is recognition result for speech.
String[] results = (String[]) msg.obj;
mResult = results[0];
txtResult.setText(mResult);
//TO-DO 음성인식이 완료된 시점에 기계번역 API 호출
48. 음성합성 API 호출 결과 처리 개요
• InputStream은 byte 단위로 읽어서 File로 저장
– InputStream is = con.getInputStream();
int read = 0;
byte[] bytes = new byte[1024];
– OutputStream outputStream = new FileOutputStream(f);
while ((read = is.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
• 호출 결과는 File() 객체로 저장
– 파일경로는 Environment.getExternalStorageDirectory().getAbsolutePath();
– File f = new File(”임시파일이름”);
– f.createNewFile();
• MediaPlayer를 이용한 mp3파일 재생
– 파일재생 준비 mp.setDataSource(f.getAbsolutePath()); mp.prepare();
– 파일은 즉시 재생하면 안되고, 준비 완료시 재생되도록, setOnPreparedListener에서 재생
– 파일재생이 완료되면 MediaPlayer 자원을 반환하도록 setOnCompletionListener에서 종
54. UX 개선을 하려면
• API가 호출 되는 동안은 ProgressBar 를 보여 주도록
• 버튼 click이 아니라 touch 이벤트를 이용해서 조작하도록
<ProgressBar
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/progressBar"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
btnVoice.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int key = event.getAction();
switch (key) {
case MotionEvent.ACTION_DOWN:
//TO-DO 음성인식 시작
naverRecognizer.recognize();
break;
case MotionEvent.ACTION_UP:
//TO-DO 음성인식 중지
naverRecognizer.getSpeechRecognizer().stop();
break;
}
return false;
}
});
55. 정리하며
- Open API 호출
- HTTP 핸들링
- JSON 파싱
- File 처리
- Thread 활용
- MediaPlayer 컨트롤
- 앱은 각 요소 기술에 대한 섬세한 컨트롤이 중요
(MediaPlayer, 버튼 제어, 데이터 호출 후 화면 처리 등
등...)
56. API마이그레이션FAQ
• 마이그레이션 해야 하는 이유
– 2016년 1월 26일에 개편된 개발자센터를 오픈하면서 API 인증체계를 개선하였습니다.
– 이에 따라 API 호출하는 방식도 함께 변경하였습니다. .
• 누가 마이그레이션 대상인가요?
– 네이버와 별도의 제휴키를 발급받아 사용하는 개발사
– 구 개발자센터에서 API 키를 발급받아 사용하는 개발사
• 언제까지 마이그레이션 해야 하나요?
– 기존 API 호출 방식은 2016년 12월 말까지만 지원합니다.
– 따라서 2016년 12월 중순까지 마이그레이션 완료해야 하며, 이는 제휴신청 승인까지 포함이므로 2주 이
상 여유를 두시는 것이 좋습니다.
• 마이그레이션 작업은 어떻게 해야 하나요?
– 네이버 개발자센터에서 처리할 것들
• 애플리케이션 정보 등록 및 설정
• 제휴 신청
– 애플리케이션에서 해야할 것들
• API 호출 방법 변경
• 서비스 URL과 애플리케이션 등록 정보 확인