[안드로이드 음성인식] TextView 에 내 목소리를 담는 예제 (소스 복붙하면 됩니다)

시나리오 : 버튼을 클릭하면 내 목소리를 듣기 시작한다. 그리고 TextView 에 들은 단어들을 표시한다

1. 초기 설정:

안드로이드 스튜디오 실행
새 프로젝트  생성
API 10
Black Activity
다른 모든 것은 그냥 기본 설정대로 하고 finish 버튼 클릭

2. AndroidManifest.xml 파일 수정

<menifest > 태그와 <application> 태그 사이에 공간을 놓고 삽입

<manifest (이하생략)
    <uses-permission android:name="android.permission.INTERNET"/>;
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>;
    <application  (이하생략) ......

3. activity_main.xml 파일 수정

why? : 텍스트뷰를 만들고, id 를 부여하기 위함. 자바 소스에서 이 텍스트 뷰를 참조하기 위함

<TextView
    android:id="@+id/textView" //id 추가했습니다.
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

4. MainActivity.java 파일 수정

전체코드
//package com.happythingsmaker.voicetotextview; 이부분은 여러분들의 환경에 따라 달라집니다.

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    Intent intent;
    SpeechRecognizer mRecognizer;
    TextView textView;
    private final int MY_PERMISSIONS_RECORD_AUDIO = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.RECORD_AUDIO)) {

            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.RECORD_AUDIO}, MY_PERMISSIONS_RECORD_AUDIO
                );
            }
        }

        intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName());
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ko-KR");

        mRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
        mRecognizer.setRecognitionListener(recognitionListener);


        textView = (TextView) findViewById(R.id.textView);

        Button button = (Button) findViewById(R.id.button01);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mRecognizer.startListening(intent);
            }
        });

    }

    private RecognitionListener recognitionListener = new RecognitionListener() {
        @Override
        public void onReadyForSpeech(Bundle bundle) {
        }

        @Override
        public void onBeginningOfSpeech() {
        }

        @Override
        public void onRmsChanged(float v) {
        }

        @Override
        public void onBufferReceived(byte[] bytes) {
        }

        @Override
        public void onEndOfSpeech() {
        }

        @Override
        public void onError(int i) {
            textView.setText("너무 늦게 말하면 오류뜹니다");

        }

        @Override
        public void onResults(Bundle bundle) {
            String key = "";
            key = SpeechRecognizer.RESULTS_RECOGNITION;
            ArrayList<String> mResult = bundle.getStringArrayList(key);

            String[] rs = new String[mResult.size()];
            mResult.toArray(rs);

            textView.setText(rs[0]);
        }

        @Override
        public void onPartialResults(Bundle bundle) {
        }

        @Override
        public void onEvent(int i, Bundle bundle) {
        }
    };
}

6. 결과 확인

 

 

6. 회고

일단 잘 되긴 하지만 세부적으로 어떤 값을 가지고 놀아야 하는지를 아직 정확하게 확인하지 않았다.

세부적인 내용을 확인하고 의도대로 할 수 있도록 확인이 필요하다

7. etc : 내가 원하는 기능에 대한 답변

http://stackoverflow.com/questions/22400462/development-of-application-similar-to-google-now-is-it-possible-to-use-voice

2 Responses

  1. YooHeeSu says:

    안녕하세요! 이 소스코드를 이용해서 음성이 끊기지 않고 연속으로 마치 보이스 타이핑 처럼 하고싶은데 어느코드를 수정해야할지 공부를 하고봐도 모르겠네요 ㅠㅠ , 조언 해주실수 있을까요?

    • HappyThingsMaker says:

      안녕하세요~ 저도 그렇게 해 보려고 시도했는데 잘 안되더라구요.
      아마도 구글홈(스마트스피커) 와 이해관계가 충돌해서 그런 것 같아요.
      감사합니다~

Leave a Reply

Your email address will not be published. Required fields are marked *