android-ai-sample - 1.0

네이버클라우드플랫폼 AI 상품을 쉽게 사용하기 위한, 안드로이드 버전 Sample 소스와 안드로이드 모바일에서 실행할 수 있는 apk 파일을 제공합니다. 여러 AI API 사용 방법을 알 수 있고, 데모를 실행할 수 있습니다.

사용한 AI API

  • Clova Speech Synthesis(CSS) : 텍스트를 음성으로 읽어주는 음성 합성 API
  • Clova Speech Recognition(CSR) : 사람의 목소리를 텍스트로 바꿔주는 음성 인식 API
  • Papago NMT : 인공 신경망기반 기계 번역 API
  • Chatbot : 자연어 처리를 위한 Chatbot Custom API

관련 API 설명서 및 참조서

시작전 준비사항

  • 네이버클라우드플랫폼 계정 : 네이버클라우드플랫폼 계정 보유 및 회원가입 필요

  • AI·NAVER API Application 등록 (Application 등록 설명서)

    • Application 등록시 Service 선택 : Clova Speech Recognition(CSR), Clova Speech Synthesis(CSS), Papago NMT
    • 데모앱에서 등록가능한 인증키는 하나이므로, 하나의 Application에 CSR, CSS, Papago NMT를 등록
    • Web 서비스 URL : http://localhost
    • Android 앱 패키지 이름 : com.example.user.ncpaidemo
    application_reg application_reg
  • Chatbot 대화시나리오 구현 (Chatbot 퀵스타트 설명서)

    • 대화 시나리오 생성 및 학습 : 도메인 생성 > 대화 시나리오 생성 > 대화모델 빌드 > 테스트
    • 채널 연동 : 도메인 > 빌더 실행 > 챗봇 설정 > 메신저 연동 > Custom 설정(Custom 설정 & API Gateway 설정 설명서)
    • API Gateway 설정 : API Gateway > My Product
    • Chatbot 대화시나리오가 없을 경우, 데모앱의 음성 챗봇 기능은 사용하지 못함 (CSS,CSR,Papago NMT 데모용일 경우 설정하지 않아도 됨)

데모 앱 설치

  • apk 다운로드 폴더 : android-ai-sample/app/release/로 이동후 최신 버전의 apk 파일 다운로드 (NCP-AI-Demo-1.x-yyyymmdd-release.apk)
  • 안드로이드 지원 버전 : 안드로이드 4.4 킷캣 이상
  • 미디어 볼륨이 켜져 있어야 정상적으로 음성 출력
  • 앱 권한 : 앱 설치 후 설정 > 애플리케이션 > 권한 > 마이크, 저장공간 권한 부여(안드로이드 버전마다 다를 수 있음)

default

데모

인증 설정

  • 메뉴 : 우측 상단의 메뉴 선택 후 인증 설정 메뉴 선택

default

  • Application Key 설정
    • 네이버클라우드플랫폼 AI NAVER API > Application에 등록된 Application의 Client ID, Client Secret 복사 후 설정

default

  • Chatbot 접속 정보 설정
    • Secret Key : 네이버클라우드플랫폼 Chatbot > 도메인 > 빌드관리 > Custom의 Secret Key 복사 후 설정
    • API Gateway URL : 네이버클라우드플랫폼 API Gateway > My Products > APIs > Stages의 Invoke URL 복사 후 설정

default

default

Clova Speech Synthesis(CSS)

  • 출력된 음성 언어를 선택 한 후, 텍스트 입력
  • 음성 듣기 버튼을 클릭 후 음성으로 출력되는지 확인

default

Clova Speech Recognition(CSR)

  • 말하기 버튼을 클릭하고 음성으로 입력
  • 음성이 텍스트로 출력되는지 확인

default

Papago NMT

  • 번역 대상 언어를 선택하고, 텍스트 입력
  • 번역하기 버튼 클릭 후 번역 결과가 텍스트로 출력되는지 확인

default

음성번역 (CSR + Papago NMT + CSS)

  • 번역 대상 언어를 선택하고 말하기 버튼을 클릭 후 음성으로 입력
  • 번역된 결과가 음성 및 텍스트로 출력되는지 확인

default

음성챗봇 (CSR + Chatbot + CSS)

  • 말하기버튼을 클릭하고 Chatbot 대화시나리오에 설정한 질문을 음성으로 입력
  • Chatbot 대화시나리오를 통해 학습시킨 답변이 음성 및 텍스트로 출력되는지 확인

default

주요 소스 구조

.
├── ...
├── app                    
│   ├── release                                          [apk 파일]            
│   ├── src              
│       ├── ...          
│       ├── main/java/com/example/user/ncpaidemo         [View]
│           ├── AuthActivity.java                        # 인증정보 설정 Activity
│           ├── BaseActivity.java                        # 공통 메뉴 Activity
│           ├── CsrActivity.java                         # Clova Speech Recognition 데모 Activity
│           ├── CssActivity.java                         # Clova Speech Synthesis 데모 Activity
│           ├── MainActivity.java                        # 홈 Activity
│           ├── NmtActivity.java                         # Papago NMT 데모 Activity
│           ├── NmtActivity2.java                        # 음성번역 데모 Activity (CSS, Papago NMT, CSR)
│           ├── VoiceChatbotActivity.java                # 음성챗봇 데모 Activity (CSS, Chatbot, CSR)
│       ├── main/java/com/ncp/ai/demo/process            [REST API, SDK 호출 모듈]
│           ├── ChatbotProc.java                         # Chatbot Custom API 사용
│           ├── CsrProc.java                             # CSR Android SDK 사용
│           ├── CssProc.java                             # CSS REST API 사용
│           ├── NmtProc.java                             # Papago NMT API 사용
│   └── ...                 
└── ...

API 사용 간단 예제

Clova Speech Synthesis HTTP Request 예제 (source)

  String text = URLEncoder.encode(msg, "UTF-8");
  String apiURL = "https://naveropenapi.apigw.ntruss.com/voice/v1/tts";
  URL url = new URL(apiURL);
  HttpURLConnection con = (HttpURLConnection)url.openConnection();
  con.setRequestMethod("POST");
  con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
  con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
  // post request
  String postParams = "speaker="+speaker+"&speed=0&text="+text;
  System.out.println(postParams);
  con.setDoOutput(true);
  DataOutputStream wr = new DataOutputStream(con.getOutputStream());
  wr.writeBytes(postParams);
  wr.flush();
  wr.close();

Chatbot Custom API HTTP Request 예제 (source)

  URL url = new URL(apiURL);

  String message = getReqMessage(voiceMessage);
  System.out.println("##" + message);

  String encodeBase64String = makeSignature(message, secretKey);

  HttpURLConnection con = (HttpURLConnection)url.openConnection();
  con.setRequestMethod("POST");
  con.setRequestProperty("Content-Type", "application/json;UTF-8");
  con.setRequestProperty("X-NCP-CHATBOT_SIGNATURE", encodeBase64String);

  // post request
  con.setDoOutput(true);
  DataOutputStream wr = new DataOutputStream(con.getOutputStream());
  wr.write(message.getBytes("UTF-8"));
  wr.flush();
  wr.close();

Chatbot Custom API Signature 생성 예제 (source)

  public static String makeSignature(String message, String secretKey) {

        String encodeBase64String = "";

        try {
            byte[] secrete_key_bytes = secretKey.getBytes("UTF-8");

            SecretKeySpec signingKey = new SecretKeySpec(secrete_key_bytes, "HmacSHA256");
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(signingKey);

            byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8"));
            encodeBase64String = Base64.encodeToString(rawHmac, Base64.NO_WRAP);

            return encodeBase64String;

        } catch (Exception e){
            System.out.println(e);
        }

        return encodeBase64String;

    }

Clova Speech Recognition Android SDK 사용 예제 (source)

    private CsrProc naverRecognizer;
    private TextView txtResult;
    private Button btnStart;
    private String mResult;
    private AudioWriterPCM writer;
    // Handle speech recognition Messages.
    private void handleMessage(Message msg) {
        switch (msg.what) {
            case R.id.clientReady: // 음성인식 준비 가능
                txtResult.setText("Connected");
                writer = new AudioWriterPCM(Environment.getExternalStorageDirectory().getAbsolutePath() + "/NaverSpeechTest");
                writer.open("Test");
                break;
            case R.id.audioRecording:
                writer.write((short[]) msg.obj);
                break;
            case R.id.partialResult:
                mResult = (String) (msg.obj);
                txtResult.setText(mResult);
                break;
            case R.id.finalResult: // 최종 인식 결과
                SpeechRecognitionResult speechRecognitionResult = (SpeechRecognitionResult) msg.obj;
                List<String> results = speechRecognitionResult.getResults();
                StringBuilder strBuf = new StringBuilder();
                for(String result : results) {
                    strBuf.append(result);
                    //strBuf.append("\n");
                    break;
                }
                mResult = strBuf.toString();
                txtResult.setText(mResult);
                break;