이번엔 android 에서 음성인식과 음성출력 기능을 구현하고 싶어서 공부하여 구현했고
또 포스팅으로 끄적끄적 하자면, 먼저 음성인식부터 구현하는 방법에 대해 적는다...
* STT : Speech-To-Text *
음성인식 : 마이크로 유저의 목소리를 판독하여 String화함
* TTS : Text-To-Speech *
음성출력 : 문자열을 음성화 하여 유저에게 들려줌
* 음성인식 구현방법 *
1. AndroidManifest.xml 에서 음성인식에 필요한 권한을 선언한다
1 2 | <!-- 음성인식에 필요함 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> | cs |
2. 전역변수로 intent 와 음성인식에 필요한 SpeechRecognizer 를 선언하고,
1 2 | Intent i; SpeechRecognizer mRecognizer; | cs |
3. onCreate() 메소드에서 앞서 전역변수로 선언한 intent 와 SpeechRecognizer 를 초기화해준다
1 2 3 4 5 6 | //음성인식 i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); i.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getContext().getPackageName()); i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR"); mRecognizer = SpeechRecognizer.createSpeechRecognizer(getContext()); mRecognizer.setRecognitionListener(listener); | cs |
4. 그리고 버튼클릭시 실행될 수 있도록 mRecognizer.startListening(i) 을 하면 되지만, 권한강화로 인해 권한체크를 한번 더 해야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //음성인식 버튼 ((ImageView)getView().findViewById(R.id.home_record)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { System.out.println("-------------------------------------- 음성인식 시작!"); if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.RECORD_AUDIO)!=PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO); //권한을 허용하지 않는 경우 } else { //권한을 허용한 경우 try { mRecognizer.startListening(i); } catch(SecurityException e) { e.printStackTrace(); } } } }); | cs |
5. 마지막으로 오버라이드 메소드들을 정의해서 커스텀하면 끝!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /* * 음성인식을 위한 메소드 */ private RecognitionListener listener = new RecognitionListener() { @Override public void onReadyForSpeech(Bundle params) { System.out.println("onReadyForSpeech........................."); } @Override public void onBeginningOfSpeech() { Toast.makeText(getContext(), "지금부터 말을 해주세요!", Toast.LENGTH_SHORT).show(); } @Override public void onRmsChanged(float rmsdB) { System.out.println("onRmsChanged........................."); } @Override public void onBufferReceived(byte[] buffer) { System.out.println("onBufferReceived........................."); } @Override public void onEndOfSpeech() { System.out.println("onEndOfSpeech........................."); } @Override public void onError(int error) { Toast.makeText(getContext(), "천천히 다시 말해주세요.", Toast.LENGTH_SHORT).show(); } @Override public void onPartialResults(Bundle partialResults) { System.out.println("onPartialResults........................."); } @Override public void onEvent(int eventType, Bundle params) { System.out.println("onEvent........................."); } @Override public void onResults(Bundle results) { String key= ""; key = SpeechRecognizer.RESULTS_RECOGNITION; ArrayList<String> mResult = results.getStringArrayList(key); String[] rs = new String[mResult.size()]; mResult.toArray(rs); Toast.makeText(getContext(), rs[0], Toast.LENGTH_SHORT).show(); mRecognizer.startListening(i); //음성인식이 계속 되는 구문이니 필요에 맞게 쓰시길 바람 } }; | cs |
* 음성출력 사용방법 *
1. AndroidManifest.xml 에서 음성인식에 필요한 권한을 선언한다
1 2 | <!-- 음성인식에 필요함 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> | cs |
2. 전역변수로 음성출력에 필요한 TextToSpeech 를 선언하고,
1 2 | TextToSpeech tts; | cs |
3. onCreate 나 onActivityCreated 에서 음성출력(tts)을 생성하고 리스너를 초기화한다. 한국어 사용을 위해 Locale.KOREAN 으로~
1 2 3 4 5 6 7 8 9 | //음성출력 생성, 리스너 초기화 tts = new TextToSpeech(getContext(), new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if(status!=android.speech.tts.TextToSpeech.ERROR) { tts.setLanguage(Locale.KOREAN); } } }); | cs |
4. 버튼 클릭시 음성이 출력되도록 메소드 설정해주면 끝!
1 2 3 4 5 6 7 8 9 10 11 12 | //음성출력 버튼 ((ImageView)getView().findViewById(R.id.home_speak)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { System.out.println("-------------------------------------- 음성출력 시작!"); String totalSpeak = "안녕하세요 음성인식입니다!"; tts.setPitch(1.5f); //1.5톤 올려서 tts.setSpeechRate(1.0f); //1배속으로 읽기 tts.speak(totalSpeak, TextToSpeech.QUEUE_FLUSH, null); } }); | cs |
아, 마지막엔 내가 설정한 객체들을 닫아주는 편이 좋다 :) 이렇게
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * 음성인식/출력 객체가 남아있다면 실행을 중지하고 메모리에서 제거 */ @Override public void onDestroy() { super.onDestroy(); if(tts != null){ tts.stop(); tts.shutdown(); tts = null; } if(mRecognizer!=null){ mRecognizer.destroy(); mRecognizer.cancel(); mRecognizer = null; } } | cs |
'MOBILE > Android' 카테고리의 다른 글
안드로이드 앱 안에서 외부 앱 열기 (0) | 2018.08.08 |
---|---|
안드로이드 RollingText 사용법 (0) | 2018.08.08 |
안드로이드 카카오 API 로그인 추가하기 (0) | 2018.08.07 |
안드로이드 Firebase 사용방법 (0) | 2018.08.07 |
안드로이드 위도,경도로 주소값 가져오는 방법 (0) | 2018.08.06 |
댓글